INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
attachInterrupt, Timer2 im 328p
24.02.2020, 23:28
Beitrag #1
attachInterrupt, Timer2 im 328p
Hallo,
ich möchte einen 328P (UNO in meinem ersten Versuch) zeitweise in den PowerSave Mode versetzten und zyklisch wecken. Das geht mit Timer 2. In einem ersten Schritt experimentiere ich also mit Timer2, der einen Interrupt auslösen soll.

In meinem Sketch (s.u.) passiert aber Merkwürdiges:
Nach Reset erscheint ordentlich die Zeile mit Compilezeit, dann 5 s Pause. Aber dann wird als Dauerfeuer ausgegeben "Programm PowProgramm PowProgramm Pow...".

Die Zeile "attachInterrupt" hat darauf in den verschiedenen Versionen keinen Einfluss.

Wenn ich die Zeile " TIMSK2 = 0x02; // IR auf OCR2A" auskommentiere, dann erscheint einmalig meine Headerzeile, Timer2 löst also IRs aus, das ist plausibel. (CHANGE hier nur als Test, muss m. e. RAISING sein, aber CHANGE ist allgemeiner.)

In den Register-Zuweisungen mögen Fehler sein, ok, aber es wird ja anscheinend das Setup unterbrochen. Wie kann das sein?

Mieine These: Timer2-IR feuert, findet aber keine ISR. Aber warum nicht und was passiert dann?

Vielleicht hat ja jemand einen Tipp,
Gruß GuaAck


Code:
/*
  Test: PowerSave
*/
bool IRpassiert;
word z;
void setup() {
  Serial.begin(115200);
  Serial.print("Programm PowerSave: ");
  Serial.print(F(__DATE__));
  Serial.print(' ');
  Serial.println(F(__TIME__));
  IRpassiert = false;
  z = 0;
  delay(5000);
  SetTimer2();
}

void Timer2ISR() {
  if (z++ == 0) IRpassiert = true;
}

void SetTimer2() {
  attachInterrupt(TIMER2_COMPA_vect_num, Timer2ISR, CHANGE);
  // attachInterrupt(7, Timer2ISR, CHANGE); // geht auch nicht
  // attachInterrupt(8, Timer2ISR, CHANGE); // geht auch nicht
  TCCR2A = 0x02; // CTC-Mode
  TCCR2B = 0x04; // Prescaler=1/64
  OCR2A = 0x80; // Compare
  TIMSK2 = 0x02; // IR auf OCR2A
}

void loop() {
  if (IRpassiert) {
    Serial.println(millis());
    IRpassiert = false;
    delay(1000);
  }
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.02.2020, 06:54 (Dieser Beitrag wurde zuletzt bearbeitet: 25.02.2020 06:55 von georg01.)
Beitrag #2
RE: attachInterrupt, Timer2 im 328p
Hallo GuaAck,
die Selbe Probleme habe ich damals, … und wen es passiert dann immer bei UNO.
Vor einem Jahr war hier auch eine Diskussion darüber.
Probiermal die andere modis. Kann ich mir vorstellen – ICH WILL ABER CHANGE
Glaube mein Kompromiss war mit RISING. Kann ich mich jetzt aber nicht mehr erinnern.
Mit CHANGE ging bei mir damals auch NICHT.

Gruß Georg

Sorry für mein nicht korrektes Deutsch. Sad
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.02.2020, 08:53 (Dieser Beitrag wurde zuletzt bearbeitet: 25.02.2020 09:07 von MicroBahner.)
Beitrag #3
RE: attachInterrupt, Timer2 im 328p
Ich glaube Du verwechselst da was. 'attachInterrupt' hat nichts mit Timer-Interrupts zu tun. Das funktioniert nur mit externen Interrupts an Eingangspins. Beim UNO auch nur an den Pins 2 und 3 ( Interruptnr 0 und 1 ). Das geht zwar auch, wenn der Pin als Ausgang geschaltet ist, und der Statuswechsel am Pin von innen ausgelöst wird. Pin 3 könntest Du über OCR2B beeinflussen. Das ist aber eigentlich nicht der Sinn der Sache bei Timerinterrupts.

Wenn Du Timerinterrupts verwenden willst, musst Du eine entsprechende ISR mit dem spezifischen Namen des Timerinterrupts erstellen. An diesem Namen erkennt der Compiler dann, dass das es ein Timerinterrupt ist, und trägt das auch entsprechend in der Vektor-Tabelle ein.

z.B.:
Code:
ISR ( TIMER2_COMPA_vect) {
...
}

P.S. ausserdem solltest Du, während Du die Timerregister änderst, die Interrupts abschalten und erst wenn der Timer komplett konfiguriert ist, wieder einschalten.

P.P.S Wenn Du mit attachInterrupt einen Interrupt auf einen offenen Eingang setzt, passieren da die wildesten Dinge. Da der offene Eingang beliebig zwischen LOW und HIGH hin- und herspringt, werden auch beliebig Interrupts erzeugt.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.02.2020, 09:29
Beitrag #4
RE: attachInterrupt, Timer2 im 328p
Das über den Timer-1 ist bekannt ?
lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.02.2020, 10:36
Beitrag #5
RE: attachInterrupt, Timer2 im 328p
Wen die Funktion attachInterrupt(… schon "in der Quelle Kaput ist", kann man die Register schieben … IR auf XYZ Adressen verschieben / portieren, wird aber gar nicht helfen. (? nur Vermutung ?)
Gruß Georg

Sorry für mein nicht korrektes Deutsch. Sad
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.02.2020, 11:12
Beitrag #6
RE: attachInterrupt, Timer2 im 328p
Danke,

genau so funktioniert es jetzt!!

Viele Grüße
GuaAck

(25.02.2020 08:53)MicroBahner schrieb:  Ich glaube Du verwechselst da was. 'attachInterrupt' hat nichts mit Timer-Interrupts zu tun. Das funktioniert nur mit externen Interrupts an Eingangspins. Beim UNO auch nur an den Pins 2 und 3 ( Interruptnr 0 und 1 ). Das geht zwar auch, wenn der Pin als Ausgang geschaltet ist, und der Statuswechsel am Pin von innen ausgelöst wird. Pin 3 könntest Du über OCR2B beeinflussen. Das ist aber eigentlich nicht der Sinn der Sache bei Timerinterrupts.

Wenn Du Timerinterrupts verwenden willst, musst Du eine entsprechende ISR mit dem spezifischen Namen des Timerinterrupts erstellen. An diesem Namen erkennt der Compiler dann, dass das es ein Timerinterrupt ist, und trägt das auch entsprechend in der Vektor-Tabelle ein.

z.B.:
Code:
ISR ( TIMER2_COMPA_vect) {
...
}

P.S. ausserdem solltest Du, während Du die Timerregister änderst, die Interrupts abschalten und erst wenn der Timer komplett konfiguriert ist, wieder einschalten.

P.P.S Wenn Du mit attachInterrupt einen Interrupt auf einen offenen Eingang setzt, passieren da die wildesten Dinge. Da der offene Eingang beliebig zwischen LOW und HIGH hin- und herspringt, werden auch beliebig Interrupts erzeugt.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Atmega 328p und reset Hbc 9 1.357 20.11.2019 20:35
Letzter Beitrag: Tommy56
  Sketch laden Arduino Pro Mini 5V ATmega 328P Herberto 6 1.220 13.01.2019 14:20
Letzter Beitrag: hotsystems
  ATMega 328P Bootloader funktioniert nur 1x Gelegenheitsbastler 4 1.911 08.04.2018 16:09
Letzter Beitrag: Chopp
  328P geht nicht mehr [gelöst] Harry 37 12.131 04.03.2018 19:57
Letzter Beitrag: Harry
  328P sleep, wecken und Batterie überwachen Harry 25 9.116 04.02.2018 22:14
Letzter Beitrag: Chopp

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste