Hallo Leute!!! Hab mir vor ein paar tagen einen RP6 roboter bei conrad gekauft. Der arbeitet mit einem ATMEGA32L µC. Es sind zwar viele funktionen mitgeliefert, aber ich versuch alles selber zu programmieren, währ ja sonst nur der halbe spass :-) Also ich versuche gerade die Radumdrehungen zu messen und das ganze läuft über die externen interrups INT0 und INT1. der roboter soll eine gewisse strecke zurücklegen und dann stehen bleiben. Mein problem ist, dass das programm nicht in die ISR springt. der Code: #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> int encl = 0; int encr = 0; ISR (INT0_vect) { PORTB &= (0<<PB0); encl++; } ISR (INT1_vect) { encr++; } int main (void) { DDRB |= (1<<DDB0); //led zum test PORTB |= (1<<PB0); DDRD |= (1<<DDD4) | (1<<DDD5); PORTD |= (1<<PD4) | (1<<PD5); //beide räder einschalten //interrupt initialisieren MCUCR = (0 << ISC11) | (1 << ISC10) | (0 << ISC01) | (1 << ISC00); GICR = (1 << INT1) | (1 << INT0); sei(); while(1) { if (encl == 1000) { PORTD |= (0<<PD4); encl = 0; } if (encr == 1000) { PORTD |= (0<<PD5); encr = 0; } } } hab ich irgend etwas vergessen, oder falsch initialisiert?? Vielleicht hat oder hatte jemand das selbe problem?? bitte um hilfe!!! danke martin91
Ich denke schon, dass in die ISR gesprungn wird (es spricht im Programm eigentlich nichts dagegen), allerdings hat das, was in der ISR gemacht wird, keinen Einfluss auf den Rest des Programms, weil die Zählvariable nicht volatile deklariert ist und dementsprechend im Hauptprogramm vermutlich die Abfrage wegoptimiert wurde... Variablen, die sowohl im Hauptprogramm als auch in Interrupt Handlern verwendet werden, müssen volatile sein.
Danke, hat aber leider auch nicht geholfen...ich könnt mir sonst nur vorstellen, dass kein ordentliches rechtecksignal an den ports für die externen interrupst liegt. hab nur leider kein oszi um das zu überprüfen...
> PORTD |= (0<<PD4); Das ist aua! Überlege mal, was passiert, wenn man irgendetwas mit einer 0 verODERt! Und dann lies Dir den Artikel Bitmanipulation gründlich durch. Da steht, wie man Bits setzt und v.a. löscht.
stimmt 0 or 1 ist natürlich 1! habs verUNDet, hilft aber leider auch nichts...
hey Martin S ;-) also dein ISR aufruf in die dazugehörige init funktioniert einwandfrei. die ISR (INT0_vect) {} wird bei nem HIGH-Pegel an pin PD2 aufgerufen. also der code sollte passen... gruß Martin S.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.