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

Re: Auswertung Drehimpulsgeber ohne Interrupt und Delay Kategorie: Programmierung Basic (von PeterS - 12.11.2008 9:50)
Als Antwort auf Auswertung Drehimpulsgeber ohne Interrupt und Delay von Montelucon - 11.11.2008 20:33


Hallo,

> da ich leider immer noch nicht weiÃ?, wie man auf Port C.5 der C-Contol Pro Mega 32 einen Interrupt legt,
> bzw. wie man diesen daran  auswertet, habe ich mir meinen eigenen Code geschrieben.

das geht auch nicht. Wie im Kapitel Bibliothek->Interrupt beschrieben, kann man die externen Interrupts
und die Timer Interrupts selektieren. Für die externen Interrupts mu� man einen Portpin wählen der in
der Tabelle Pinzuordnung mit INT0 bis INT2 (bei Mega128 INT0 - INT7) bezeichnet ist.

Gruss Peter


> Hallo zusammen,
>
> da ich leider immer noch nicht weiÃ?, wie man auf Port C.5 der C-Contol Pro Mega 32 einen Interrupt legt,
> bzw. wie man diesen daran  auswertet, habe ich mir meinen eigenen Code geschrieben.
>
> Der Code ist getestet und funktioniert sehr gut.
> Vor allem da er ohne Delay auskommt, kann der Geber sehr schnell oder sehr langsam gedreht werden und
> funktioniert dennoch.
>
> Ich weiÃ? aber nicht, ob er nicht noch optimiert werden kann.
> Falls also jemand eine bessere Idee hat, immer her damit.
>
> �ber einen Schalter, der im Inkrementalgeber integriert ist, wird die Impulszählung aktiviert und auch wieder
> deaktiviert. Am LCD wird der Zählerstand angezeigt und die beiden LEDs kennzeichnen die Aktivierung, bzw.
> Deaktivierung.
>
> Und falls der Code oder eine Abwandlung davon von jemanden verwendet wird, würde mich eine Nachricht
> hier freuen. Mich interessiert schon, ob der Beitrag hier jemanden helfen konnte.
>
> Hier noch ein Link zu einem Beitrag, bei dem das gleiche Problem mit Interrupt auf Port C.4 gelöst wurde.
> gehe zu Beitrag »
>
>
> GruÃ?
>
> Monte
>
>
> Hier der Code für die CC-Pro Mega 32:
>

>
> ' PORTBELEGUNG:
> ' Ausgang A wird auf Port C.5, Ausgang B auf Port C.6 gelegt
> ' Der extra Schalter liegt auf Port C.7
> ' TECHNIK:
> ' Signale des Gebers (Conrad Best.Nr. 705538):
> ' Ausgang B:    ----____----____----____----____----____-
> ' Ausgang A:    _----____----____----____----____----____
> ' RastPos.:      _|___|___|___|___|___|___|___|___|_
> '                 1   2   3   4   5   6   7   8   n
> ' Es wird gegen Masse geschaltet => gedrückt=0 / nicht gedrückt=1 (invertierte Logik)
> ' SONSTIGES:
> ' Benötigte Bibliotheken: IntFunc_Lib.cc & LCD_Lib.cc
> ' Bei Drehrichtung "links" geht das erste Bit leider verloren.
> ' ACHTUNG: Die internen PullUp sind deaktiviert! Bitte Geber gemä� Schaltplan
> ' des Herstellers anschlie�en. (Kondensatoren, Widerstände, +5V, Masse)
>
>
>
> ' -----------------------------------------------------------------------
> ' Ports für Inkremenatalgeber definieren
> '
> #define SW_P  Port_ReadBit(23)     ' Port C.7 Eingabeport
> #define SW_B  Port_ReadBit(22)     ' Port C.6 Eingabeport
> #define SW_A  Port_ReadBit(21)     ' Port C.5 Eingabeport
>
> ' -----------------------------------------------------------------------
> ' Ports für LEDs definieren
> '
> #define LED1_Aus  Port_WriteBit(31,1)  ' Port D.7 aus
> #define LED1_Ein  Port_WriteBit(31,0)  ' Port D.7 an
> #define LED2_Aus  Port_WriteBit(30,1)  ' Port D.6 aus
> #define LED2_Ein  Port_WriteBit(30,0)  ' Port D.6 an
>
> ' -----------------------------------------------------------------------
> ' Variablen für Inkremenatalgeber definieren
> '
> Dim counter As Integer      ' Zähler
>
> ' -----------------------------------------------------------------------
> ' Variablen für LCD definieren
> '
> Dim zahlalstext(9) As Char  ' Charakter für LCD definieren  (Zahl als Text)
>
>
> ' -----------------------------------------------------------------------
> ' Hauptprogramm
> '
> Sub main()
>
>     Port_DataDirBit(31,1)     ' Port D.7 auf Ausgang = LED1 an
>     Port_DataDirBit(30,1)     ' Port D.6 auf Ausgang = LED2 an
>
>     LCD_Reset()               ' LCD initialisieren
>     counter = 35              ' Zähler initialisieren
>
>     requestInput()            ' Gehe zu: warten bis Schalter "P" gedrückt
>
> End Sub
>
> ' -----------------------------------------------------------------------
> ' Endlosschleife zum Abfragen des Schalterausgang "P" (quasi Standby)
> '
> Sub requestInput()
>
>     Do While SW_P = 0         ' Quasi Entprellen
>     End While
>
>     LED2_Ein                  ' LED 2 einschalten
>     LED1_Ein                  ' LED 1 einschalten
>
>     Do While 1                ' Endlosschleife, bis Schalter gedrückt
>
>        If SW_P = 0 Then       ' Wenn Schalter gedrückt, Schleife beenden
>           Exit
>        End If
>

>     End While
>
>     requestGeber()            ' Wenn Schalter gedrückt, frage den Geber ab
>
> End Sub
>
>
> ' -----------------------------------------------------------------------
> ' Endlosschleife zum Abfragen des Inkrementalgebers Schalter "A" + "B"
> '
> Sub requestGeber()
>
>     Do While SW_P = 0         ' Quasi Entprellen
>     End While
>
>     LED2_Aus                  ' LED 2 ausschalten
>     LED1_Aus                  ' LED 1 ausschalten
>
>     LCD_print(counter)        ' "counter" am LCD anzeigen
>
>     Do While 1                ' Endlosschleife, bis Schalter "P" gedrückt wird
>
>        If SW_P = 0 Then       ' Wenn Schalter "P" gedrückt -> Abbruch
>           requestInput()
>           Exit
>        End If
>
>
>        If SW_B <> SW_A Then            ' Mache nur, wenn Schalter in Bewegung
>
>           If SW_B = 1 Then             ' Nur wenn Schalter "B" nicht gedrückt
>              Do                        ' Warte auf Zustandsänderung
>                If SW_P = 0 Then        ' Wenn Schalter "P" gedrückt -> Abbruch
>                   requestInput()
>                End If
>              Loop While SW_B
>
>              If SW_A = 1 Then          ' Auswertung "rechts" / "links"
>                 counter = counter - 1
>              Else
>                 counter = counter + 1
>              End If
>
>              LCD_print(counter)        ' Am LCD anzeigen
>
>           End If
>
>        End If
>
>
>        ' Dieser Teil ist nur nötig, wenn die Periodendauer eines Schaltzyklus
>        ' zwei Restpositionen dauert. Bei Periode = Rastposition kann der Teil
>        ' gelöscht werden.
>        ' --------------------------------------------------------------------
>        If SW_B <> SW_A Then
>           If SW_B = 0 Then
>              Do                        ' Warte auf Zustandsänderung
>                If SW_P = 0 Then        ' Wenn Schalter "P" gedrückt -> Abbruch
>                   requestInput()
>                End If
>              Loop While SW_B = 0
>
>              If SW_A = 0 Then          ' Auswertung "rechts" / "links"
>                 counter = counter - 1
>              Else
>                 counter = counter + 1
>              End If
>
>              LCD_print(counter)        ' Am LCD anzeigen
>           End If
>        End If
>        ' --------------------------------------------------------------------
>
>     End While
>
> End Sub
>
>
> ' -----------------------------------------------------------------------
> ' LCD-Ausgabe
> '
> Sub LCD_print(zahl As Integer)
>     LCD_ClearLCD()              ' LCD Display löschen
>
>     Str_WriteWord(zahl,10,zahlalstext,0,1)    ' Zahl in Text wandeln
>
>     LCD_CursorPos(&H0)          ' Cursor auf Zeile 1 Pos 0
>     LCD_WriteText(zahlalstext)  ' Text schreiben
> End Sub
>
> ' -----------------------------------------------------------------------
> ' LCD Initialisieren
> '
> Sub LCD_Reset()
>     LCD_Init()          ' LCD high-level Initialisierung
>     LCD_ClearLCD()      ' LCD Display löschen
>     LCD_CursorOff()     ' Curser ausschalten
> End Sub
>
>
>
>


    Antwort schreiben


Antworten:

Re: Auswertung Drehimpulsgeber ohne Interrupt und Delay (von Montelucon - 12.11.2008 12:50)