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 > > 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. > > <a href="http://ccpro.cc2net.de/forum/index.php?show=2034" target="_top"> gehe zu Beitrag »</a> > > > > > > Gruß > > > > Monte > > > > > > <b><i>Hier der Code für die CC-Pro Mega 32:</i></b> > > <hr> > > > > '<i> PORTBELEGUNG:</i> > > ' Ausgang A wird auf Port C.5, Ausgang B auf Port C.6 gelegt > > ' Der extra Schalter liegt auf Port C.7 > > ' <i>TECHNIK:</i> > > ' 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) > > ' <i>SONSTIGES:</i> > > ' Benötigte Bibliotheken: IntFunc_Lib.cc & LCD_Lib.cc > > ' Bei Drehrichtung "links" geht das erste Bit leider verloren. > > ' <i><u>ACHTUNG:</u></i> 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 > > > > > > > >