Hallo, ich habe folgendes Problem mit einem Arduino UNO, wenn ich in dem Sketch (siehe Anhang) noch eine Zeile in die Funktion ISR(TIMER0_COMPA_vect) einfüge wird diese nicht ausgeführt. Weiß jemand warum das so ist und wie man das Lösen kann? Danke im vorraus
Einige volatile vergessen Serielle Ausgaben in der ISR ist eine tödliche Falle.
ich schrieb: > Weiß jemand warum das so ist und wie man das Lösen kann? row_cnt = 1; Serial.println(row_cnt); //Wird nicht ausgeführt Die Verwendung von Serial.print ist in ISRs verboten, das haengt typischerweise, da es selbst Interrupts verwendet. Besser ein LED blinken oder so. Die Variablen wie row_cnt brauchen ein volatile in der Deklaration. leo
Ich habe mal das Serial.println rausgeworfen und will Pin A0 anstelle an und ausschalten. Ich habe bis jetzt damit auch keinen Erfolg.
ich schrieb: > Ich habe mal das Serial.println rausgeworfen und will Pin A0 anstelle an > und ausschalten. Ich habe bis jetzt damit auch keinen Erfolg. Das digitalWrite(rowClkPin,!digitalRead(rowClkPin)); sollte natürlich in die Funktion ISR(TIMER0_COMPA_vect).
Uff Basse schrieb: > ich schrieb: >> Ich habe bis jetzt damit auch keinen Erfolg. > > Wie stellst du das fest? In dem ich mit einem Logic analyzer den Zustand (LOW/HIGH) beobachte.
bisschen Pseudo..
1 | boolean isrtrigger=false; |
2 | |
3 | ISR(){ |
4 | isrtrigger=true; |
5 | }
|
6 | |
7 | loop(){ |
8 | if(isrtrigger){ |
9 | //TU WAS SOLL
|
10 | isrtrigger=false; |
11 | }
|
12 | }
|
:
Bearbeitet durch User
Uff Basse schrieb: > Philipp K. schrieb: >> bisschen Pseudo.. > > Fehlt auf jeden Fall ein volatile. Geht auch mit einem volatile nicht.
ich schrieb: > Geht auch mit einem volatile nicht. Ich sehe gerade, du nutzt unter Arduino Environment den Timer0. Das kann nicht gehen denn Arduino benutzt den schon. (Einschränkung: habe mir den Code nicht genau angeschaut, in Ausnahmefällen mag das gehen. Für den Anfänger ist das zu vermeiden, es gibt ja noch den Timer 1)
ich schrieb: > Danke, jetzt geht es. ... aber die Funktionalität die die Arduino-Umgebung bezüglich Timer0 voraussetzt ist ausgeschaltet bzw eliminiert. Das mag noch die eine oder andere Überraschung bringen ...
Hallo, wenn er im gesamten Sketch Timer 0 gegen Timer 1 getauscht hat, passiert gar nichts, rein absolut nichts. Nur seine Timer Initialisierung sollte er nochmal überdenken. Mit Register-Veroderung anfangen ist selten gut. Hier lautert die echte Falle. Ich lösche bei der Initialisierung grundsätzlich immer zuerst TCCRnB. Damit ist der Timer gestoppt und kann keinen weiteren "Unsinn" machen. Auch setze ich die Prescaler erst ganz zum Schluss der Initialisierung. Ansonsten würde er zu zeitig loslaufen mitten in der noch unvollständigen Konfiguration. Alle Bits der anderen Register werden Zeilenweise verodert, dann kann man weniger Blödsinn machen. Schon rein optisch wegen. Außer man möchte jedes Bit kommentieren. Aber selbst da fängt man ohne Veroderung an.
1 | TCCR1A = (1<<COM1B1) // Kommentar |
2 | | (1<<WGM11) // Kommentar |
3 | | (1<<WGM10) // Kommentar |
4 | ;
|
Man darf auch nicht vergessen Register zu löschen die man selbst gerade nicht benötigt, z.Bsp. TIMSKn.
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.