Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

Re: Auswertung Inkrementaldrehgeber Kategorie: Programmierung C (von UlliS - 15.07.2008 16:00)
Als Antwort auf Re: Auswertung Inkrementaldrehgeber von Hannes - 15.07.2008 15:40
Ich nutze:
C-Control Pro Mega32, C-Control Pro Mega128, CC-Pro 32 Application Board, CC-Pro 128 Application Board, eigenes Board
> 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


    Antwort schreiben


Antworten:

Re: Auswertung Inkrementaldrehgeber (von Hannes - 16.07.2008 7:53)
    Re: Auswertung Inkrementaldrehgeber (von UlliS - 16.07.2008 15:16)
        Re: Auswertung Inkrementaldrehgeber (von Endress - 22.07.2008 14:04)