Forum: Mikrocontroller und Digitale Elektronik Arduino ignoriert Code


von ich (Gast)


Angehängte Dateien:

Lesenswert?

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

von Einer K. (Gast)


Lesenswert?

Einige volatile vergessen
Serielle Ausgaben in der ISR ist eine tödliche Falle.

von leo (Gast)


Lesenswert?

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

von ich (Gast)


Lesenswert?

Danke für die Hinweise.

von ich (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe mal das Serial.println rausgeworfen und will Pin A0 anstelle an 
und ausschalten. Ich habe bis jetzt damit auch keinen Erfolg.

von ich (Gast)


Lesenswert?

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).

von Uff Basse (Gast)


Lesenswert?

ich schrieb:
> Ich habe bis jetzt damit auch keinen Erfolg.

Wie stellst du das fest?

von ich (Gast)


Lesenswert?

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.

von Philipp K. (philipp_k59)


Lesenswert?

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
von leo (Gast)


Lesenswert?

ich schrieb:
> und will Pin A0 anstelle an
> und ausschalten.

Wie schnell willst du das sehen?

von ich (Gast)


Angehängte Dateien:

Lesenswert?

Philipp K. schrieb:
> bisschen Pseudo..

Damit habe ich aber auch keinen Erfolg.

von Uff Basse (Gast)


Lesenswert?

Philipp K. schrieb:
> bisschen Pseudo..

Fehlt auf jeden Fall ein volatile.

von ich (Gast)


Lesenswert?

Uff Basse schrieb:
> Philipp K. schrieb:
>> bisschen Pseudo..
>
> Fehlt auf jeden Fall ein volatile.

Geht auch mit einem volatile nicht.

von Philipp K. (philipp_k59)


Lesenswert?

Versuch mal im Setup Vorweg:
TCCR0A =0;
TCCR0B =0;
//TIMSK0 =0; Optional

von Uff Basse (Gast)


Lesenswert?

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)

von ich (Gast)


Lesenswert?

Danke, jetzt geht es.

von Uff Basse (Gast)


Lesenswert?

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 ...

von Veit D. (devil-elec)


Lesenswert?

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
Noch kein Account? Hier anmelden.