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
  LED-Bilnker: Wechsel durch Interrupt djculture2001 10 543 04.10.2017 19:23
Letzter Beitrag: djculture2001
  Interrupt und I2C gibt das Probleme? Badger1875 5 283 03.10.2017 23:26
Letzter Beitrag: GuaAck
  Problem mit externem Interrupt manfred474 13 1.060 13.08.2017 08:54
Letzter Beitrag: MicroBahner
  Taster an Interrupt - Prellen geschickter vermeiden als millis() zu prüfen? Flap 19 2.271 04.08.2017 08:10
Letzter Beitrag: Binary1
  Timer lernen AnjinSan 14 958 26.06.2017 13:25
Letzter Beitrag: Tommy56
  Münzeinwurf mit Timer KBLc 11 812 26.04.2017 21:21
Letzter Beitrag: KBLc
  Brauche Zeitverzögerung delay/millis/timer? Spiecky 17 1.401 15.04.2017 09:41
Letzter Beitrag: hotsystems
  Interrupt und Software Serial BennIY 6 712 29.03.2017 22:25
Letzter Beitrag: BennIY
  Über drei Taster zwei externe Timer steuern Sidamo 23 1.529 09.01.2017 20:12
Letzter Beitrag: Tommy56
  while Schleife nach sleep mode interrupt tklaus 13 1.178 23.11.2016 17:40
Letzter Beitrag: Tommy56

Gehe zu:


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