Arduino ignoriert Code

Gast #6133566
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
Angehängte Dateien:
Gast
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
Gast
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).
Gast
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)
Gast
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.