Kommentar: Einfügen von HTML im Kommentar: Link einfügen: <a href="LINKURL" target="_blank">LINKTITEL</a> Bild einfügen: <img src="BILDURL"> Text formatieren: <b>fetter Text</b> <i>kursiver Text</i> <u>unterstrichener Text</u> Kombinationen sind auch möglich z.B.: <b><i>fetter & kursiver Text</i></b> C Quellcode formatieren: <code>Quellcode</code> BASIC Quellcode formatieren: <basic>Quellcode</basic> (Innerhalb eines Quellcodeabschnitts ist kein html möglich.) Wichtig: Bitte mache Zeilenumbrüche, bevor Du am rechten Rand des Eingabefeldes ankommst ! -> I > > Hi, > > > > ich hab bei meinem Mega32 einen Drehimpulsgeber (z.B Conrad 705538 - 62) angeschlossen, > > der funktioniert sehr gut. Schaltbild siehe Datenblatt! > > > > In dem Programm kann man Stunden und Minuten der Echtzeituhr mit dem Drehimpulsgeber einstellen. > > > > > > Gruss > > > > > > > > > > > > > > > > > > #define OK_button Port_ReadBit(21) // Drehimpulsgeber OK_Taster Port C.5 > > #define Drehimpg_SWAC Port_ReadBit(27) // Drehimpulsgeber Switch_AC Port D.3 > > #define Drehimpg_SWBC Port_ReadBit(20) // Drehimpulsgeber Switch_BC Port C.4 > > #define LED1_Ein Port_WriteBit(30,1) // Port D.6 > > #define LED1_Aus Port_WriteBit(30,0) > > > > // ------------ globale Variablen ------------------ > > byte cnt1; // Uhrzeit > > int Stunde, Minute, Sekunde; // Uhrzeit > > byte forward, reward; // Drehimpulsgeber: Zähler vorwärts, Z. rückwärts > > > > > > void main(void) // --------------- Hauptprogramm ------------------- > > { > > cnt1=0; // RTC, alle 10ms +1 > > Stunde=0; Minute=0; Sekunde=0; // Startzeit festlegen > > > > LCD_Init(); // Display initialisieren > > LCD_ClearLCD(); // Display löschen > > LCD_CursorOff(); // Display Cursor ausschalten > > > > Port_DataDirBit(27,0); // PortD.3 auf Eingang = INT1 = Switch_AC > > Port_DataDirBit(20,0); // PortD.4 auf Eingang = Switch_BC > > Port_DataDirBit(21,0); // PortD.5 auf Eingang = OK_Taster > > Port_DataDirBit(30,1); // Port D.6 auf Ausgang = LED1 > > > > Irq_SetVect(INT_1, Drehimpulsgeber); // INT1 setzen für Drehimpulsgeber > > Ext_IntEnable(1,1); // INT1: Mode 1 = steigende + fallende Flanke > > > > Irq_SetVect(INT_TIM2COMP,INT_10ms); // Interrupt Service Routine für RTC definieren > > > > Uhrzeit_einstellen(); > > > > } > > > > > > > > //-------------------------------------- Uhrzeit einstellen ---------------------------------------- > > > > void Uhrzeit_einstellen(void) > > { > > char text[3], text1[5], text2[5]; > > byte Stunde_alt, Minute_alt; > > > > text1 ="Std:"; > > text2 ="Min:"; > > > > do // Endlosschleife > > { > > LCD_WriteString(0x40, text1); // "Std:" aufs LCD Zeile 2, Spalte 1 ausgeben > > Stunde_alt=24; // "24" um aktuelle Stunde aufs LCD zu schreiben > > do > > { > > if (forward) // wenn forwärts gedreht wurde > > { > > forward=0; // wieder löschen für nächsten IRQ > > Stunde++; // Stunde +1 > > if (Stunde>23) Stunde=23; // Stunde (max) = 23 > > } > > if (reward) // wenn rückwärts gedreht wurde > > { > > reward=0; > > Stunde--; // Stunde -1 > > if (Stunde < 0) Stunde = 0; // Stunde (min) = 0 > > } > > > > if ( Stunde != Stunde_alt) // Stunde nur aufs LCD schreiben > > { // wenn sich der Wert geändert hat > > Str_WriteWord(Stunde,10,text,0,2); > > LCD_WriteString(0x44, text); > > Stunde_alt = Stunde; > > } > > > > } > > while(OK_button); // weiter wenn OK_Taster gedrückt, > > // sonst Schleife erneut ausführen > > while(!OK_button); // weiter wenn OK_Taster losgelassen > > > > LCD_WriteString(0x40, text2); // "Min:" aufs LCD Zeile 2, Spalte 1 ausgeben > > Minute_alt=60; > > > > do // die selbe Schleife für Minute > > { > > > > if (forward) > > { > > forward=0; > > Minute++; > > if (Minute > 59) Minute = 59; // Minute (max) = 59 > > } > > if (reward) > > { > > reward=0; > > Minute--; > > if (Minute < 0) Minute = 0; // Minute (min) = 0 > > } > > > > if ( Minute != Minute_alt) > > { > > Str_WriteWord(Minute,10,text,0,2); > > LCD_WriteString(0x44, text); > > Minute_alt = Minute; > > } > > > > } > > while(OK_button); > > while(!OK_button); > > > > } > > while(1); > > } > > > > > > /*----------------------------------------- LCD: WriteString --------------------------------------- > > > > Ausgabe eines Textes aufs LCD-Display an LCD-Position. > > Übergabe der Parameter LCD-Position und des Textes. > > > > */ > > > > void LCD_WriteString(byte LCD_Pos, char text[]) > > { > > LCD_CursorPos(LCD_Pos); > > LCD_WriteText(text); > > } > > > > > > > > /*------------------------------------------ Drehimpulsgeber --------------------------------------- > > > > Die Funktion wird immer dann aufgerufen, sobald der Drehimpulsgeber links oder rechts gedreht > > wird. Schalter AC liegt an INT1, bei einer steigenden oder fallenden Flanke wird diese Funktion > > aufgerufen, und es werden die Schalter AC und BC eingelesen und verglichen ob vorwärts oder > > rückwärts gedreht wurde. Wurde vorwärts (rechts) gedreht wird die globale Variable forward um > > 1 erhöht, entsprechend reward bei rückwärts (links). > > > > */ > > > > void Drehimpulsgeber(void) > > { > > Ext_IntDisable(1); // INT1 sperren > > byte in1, in2; > > int irqcnt1; > > // Drehimpulsgeber > > in1 = Drehimpg_SWAC; // Switch_AC = PortD.3 einlesen > > in2 = Drehimpg_SWBC; // Switch_BC = PortC.4 einlesen > > > > if (in1 != in2) // es wurde vorwärts gedreht > > forward++; > > > > else reward++; // es wurde rückwärts gedreht > > > > Ext_IntEnable(1,1); // INT1 freigeben > > irqcnt1=Irq_GetCount(INT_1); > > > > } > > > > > > > > //-------------------------------------- Echtzeituhr ----------------------------------------------- > > > > void RTC(void) > > { > > cnt1++; > > > > if (cnt1==50) > > LED1_Ein; > > > > if (cnt1==100) > > { > > Display_Time(); > > Sekunde++; > > if (Sekunde==60) > > { > > Sekunde=0; > > Minute++; > > if (Minute==60) > > { > > Minute=0; > > Stunde++; > > if (Stunde==24) Stunde=0; > > } > > } > > cnt1=0; > > LED1_Aus; > > } > > } > > > > > > // Ausgabeformat der Uhr festlegen > > > > void Display_Time(void) > > { > > Write2Digits(0,Stunde); // Stunde > > LCD_WriteChar(':'); > > Write2Digits(3,Minute); // Minute > > LCD_WriteChar(':'); > > Write2Digits(6,Sekunde); // Sekunde > > } > > > > // Zeichenausgabe > > > > void Write2Digits(byte pos,byte val) > > { > > char num[3]; > > > > LCD_CursorPos(pos); // LCD Cursor positionieren > > Str_WriteWord(val,10,num,0,2); // Zahl mit Basis 10, Offset 0, 2 stellig in String schreiben > > LCD_WriteText(num); // String ausgeben > > } > > > > > > > > //--------------------------------- Interrupt alle 10ms --------------------------------------------- > > > > void INT_10ms(void) > > { > > int irqcnt; > > RTC(); // Funktionsaufrauf: RTC > > irqcnt=Irq_GetCount(INT_TIM2COMP); // Interrupt Request Counter > > } > > > > > > Hallo Hannes, > > ich würde gerne das Programm auf die C-Control Webseite stellen, nach einer > Prüfung wenn du nix dagegen hast. Wenn du mir mal deine Email schickst > können wir uns mal unterhalten. > > Grüße Ulli