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
Timer Interrupt Anfängerprobleme
02.03.2016, 13:27
Beitrag #1
Timer Interrupt Anfängerprobleme
Moin...

Ich bin ein Neuling in der MC-Programmierung, wie man im Betreff ja schon vermuten kann.

Ich habe ein Arduino UNO mit einem Atmega328P und versuche verzweifelt einen Timer-Interrupt auszulösen.

Hier der Sketch:
Code:
//ARDUINO UNO Board
//Atmega328P 16MHz

void setup() {  
  //Portkonfiguration
  DDRB |= (1<<5);   //PB5 Ausgang   ArduinoUNO-PIN 13   Chip-PIN 19 (LED)
  DDRD |= (1<<6);   //PD6 Ausgang   ArduinoUNO-PIN 6    Chip-PIN 12 (OC0A)

  //Timerkonfiguration Timer0
  TCCR0A |= (1<<WGM01);   //CTC - Mode
  TCCR0A |= (1<<COM0A0);  //Toggle OC0A output on compare match (non-PWM)

  TCCR0B |= (1<<CS00) | (1<<CS02);  //PRESCALER 1/1024

  OCR0A = 250;   //Compare match value 255 (8-Bit-Register)
  
  TIMSK0 |= (1<<OCIE0A);  //Interrupt on compare match

  sei();
}

ISR (TIMER0_COMPA) {
  PORTD ^= (1<<6);
  PORTB |= (1<<5);
}

void loop() {

}

Der Timer0 soll über einen PRESCALER (1/1024) hochlaufen und bei einem Vergleichswert von 250 in die ISR springen. Aber da springt nix. Habe zur Kontrolle in der ISR die Onboard-LED angesteuert. Bleibt duster.

Wenn ich im Loop-Teil den TCNT0 mit 'Serial.println(TCNT0)' auslese, dann bleibt der Wert konstant auf 12, wenn ich den Serialmonitor starte.

Hat jemand eine Idee, was ich da falsch mache?

Gruß Maddin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.03.2016, 20:19
Beitrag #2
RE: Timer Interrupt Anfängerprobleme
Hi,
mal so als Hinweis....da der Arduino einen Timer mit der millis() und microSecond() Funktion zur Verfügung stellt sind wohl die Timer mindestens teilweise davon belegt...
lese doch einfach mal die Timerregiste zyklisch aus und lass es dir anzeigen... also ohne selber da was zu initialisieren...dann siehste das da schon was läuft.
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
02.03.2016, 21:01
Beitrag #3
RE: Timer Interrupt Anfängerprobleme
Ja wenn ich TCNTx direkt auslese, zählt der Timer. Mit dem Code von oben zählt da nix. Bin da aber inzwischen schon ein kleines Stück weiter. Im Moment sieht der Code so aus, und er funktioniert soweit

Code:
void setup()
{  
  //Portkonfiguration
  DDRB |= (1<<5);   //PB5 Ausgang   ArduinoUNO-PIN 13   Chip-PIN 19 (LED)
  DDRD |= (1<<6);   //PD6 Ausgang   ArduinoUNO-PIN 6    Chip-PIN 12 (OC0A)

  TCCR1A |= (1<<WGM11);   //CTC - Mode
  //TCCR1B |= (1<<CS12) | (1<<CS11) | (1<<CS10);  //PRESCALER 1/1024
  OCR1A = 500;   //Compare match value 250 (8-Bit-Register)
  TIMSK1 |= (1<<OCIE1A);  //Interrupt on compare match
  sei();
}

ISR (TIMER1_COMPA_vect)
{
  PORTD ^= (1<<6);
  PORTB |= (1<<5);
}

void loop()
{
}

Hab da noch einen Tipp bekommen. Aber warum der Code läuft, ist nicht nachvollziehbar. Die CS-Bits im TCR1B-Register sind jetzt alle nicht gesetzt, und der Code läuft. Laut Datenblatt ein Unding.

Ich studier das mal und werde das Ergebnis hier posten.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.03.2016, 23:02
Beitrag #4
RE: Timer Interrupt Anfängerprobleme
...schau dir auch mal diese Seiten von arduino.cc an

Timer2 Interrupt

PWM Secret

Übersicht der Librarys

...also bei solchen Themen ist die Mutterseite arduino.cc schon eine gute Fundgrube...leider nicht auf Deutsch...aber so ist die Welt der Elektronik nun mal.
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
05.03.2016, 02:28 (Dieser Beitrag wurde zuletzt bearbeitet: 05.03.2016 02:30 von Fox.)
Beitrag #5
RE: Timer Interrupt Anfängerprobleme
So... das Problem ist gelöst.

Ich hab mal die Register für Timer1 unmittelbar nach dem Reset ausgelesen, also noch bevor irgendwas programmiert wird. Da kommt dann das hier raus.

Timer1-Register nach RESET
==========================

TCCR1A-Register
---------------
COM1A1 COM1A0 COM1B1 COM1B0 WGM11 WGM10
0 0 0 0 0 1

TCCR1B-Register
---------------
ICNC1 ICES1 WGM13 WGM12 CS12 CS11 CS10
0 0 0 0 0 1 1

TCCR1C-Register
---------------
FOC1A FOC1B
0 0

TIMSK1-Register
---------------
ICIE1 OCIE1B OCIE1A TOIE1
0 0 0 0

Wenn im Register TCCR1B CS11 und CS10 gesetzt sind, bedeutet das Prescaler = 1/64. Für Prescaler 1/1024 müsseten die Bits so gesetzt werden:

CS12=1, CS11=0, CS10=1

Wenn ich aber nur das CS12-Bit auf 1 setze, die anderen Bits aber nicht lösche, dann kommt da 1 1 1 raus. Und da heist es im Datenblatt:

"External clock source on T1 pin. Clock on rising edge."

Gleiches Problem für den TCCR1A-Register. Da steht nacht dem Start das Bit WGM10 auf 1. Wenn ich jetzt das WGM12-Bit für den CTC-Modus auf 1 setze ohne WGM10 zu löschen, dann habe ich einen unerlaubten Zustand. Dieser Modus ist laut Datenblatt als "Reserved" deklariert.

Damit ist dann auch klar, warum der CTC-Mode nicht geklappt hat.

Vorher alles löschen, dann Bits richtig setzen, klappt.

Fall gelöst.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  while Schleife nach sleep mode interrupt tklaus 13 238 23.11.2016 17:40
Letzter Beitrag: Tommy56
  NRF24L01 Interrupt MeisterQ 22 512 02.11.2016 15:50
Letzter Beitrag: MeisterQ
  Countdown Timer Uwe1475 23 723 19.10.2016 18:33
Letzter Beitrag: Uwe1475
  Interrupt matthias3579 5 219 15.10.2016 13:23
Letzter Beitrag: hotsystems
  Interrupt und Sicherung der Prozessorregister MKc 5 224 31.08.2016 11:17
Letzter Beitrag: MKc
  Interrupt bei Serieller Übertragung Binatone 8 356 21.06.2016 14:09
Letzter Beitrag: Scheams
  (Mega) Timer 3 A, B & C Scheams 0 227 04.06.2016 17:09
Letzter Beitrag: Scheams
  Interrupt wenn softwareSerial Daten BennIY 3 440 01.05.2016 18:39
Letzter Beitrag: tiny85fan
  Arduino MEGA2560 Timer PWM Einsteiger94 3 654 04.04.2016 10:38
Letzter Beitrag: RMR
  Problem mit Pin Change Interrupt in Library Retian 0 319 10.02.2016 23:37
Letzter Beitrag: Retian

Gehe zu:


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