Forum: Mikrocontroller und Digitale Elektronik Timer1: nach 1. Sekunde Interrupt auslösen


von Mischa L. (mischamv)


Lesenswert?

Hallo Leute,
kann mir jemand bitte helfen den Fehler zu finden.

Ich will nach 1. Sekunde einen Overflow Interrupt auslösen.
Dabei verwende ich 16-Bit Timer1 und einen Arduino mini mit Atmega328P.

Wegen dem ARduino habe ich hier einen Hybridcode.
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
 
4
bool counter = false;
5
int pin = 13;
6
7
8
int main(void)
9
{
10
 //pin 13 als LED
11
  pinMode(pin,OUTPUT);
12
  
13
14
  //Serialübertragung einstellen
15
  Serial.begin(9600);
16
  
17
 //TCCR1 mit null intialisieren
18
  TCCR1A = 0x00;
19
  TCCR1B = 0x00;
20
  
21
  TCCR1B |= (1<<WGM12) | (1<<WGM13); //CTC Modus aktivieren
22
  TCCR1B |= (1<<CS12); //Prescaler 256
23
  
24
  //Vergleichswert
25
  OCR1A = 62500;
26
  
27
  //Interrupts aktivieren und damit Timer starten
28
  TIMSK1 = (1<<OCIE1A);
29
  sei();
30
  
31
  while(1)
32
  {
33
   
34
    /*
35
   if(counter == true){
36
     digitalWrite(pin, HIGH);
37
   }
38
    else{
39
      digitalWrite(pin,LOW);
40
    }
41
      
42
    /* Sonstige Aktionen */
43
  
44
  }
45
}
46
 
47
/*Interrupt wird nach 1 sekunde aufgerufen*/
48
 
49
ISR (TIMER1_OVF_vect)
50
{
51
  Serial.println("test");
52
  counter ^= counter;
53
}

schöne Grüße aus Dieburg

Mischa

von spess53 (Gast)


Lesenswert?

Hi

>TIMSK1 = (1<<OCIE1A);

>ISR (TIMER1_OVF_vect)

Du solltest dich für einen Interrupt entscheiden.

MfG Spess

von Knut (Gast)


Lesenswert?

Mischa L. schrieb:
> pinMode(pin,OUTPUT);
> Serial.println("test");
Was ist das?

> ISR (TIMER1_OVF_vect)
Hier musst du den Kompare Vektor nehmen



Knut

von Helfer (Gast)


Lesenswert?

>> pinMode(pin,OUTPUT);
>> Serial.println("test");
>Was ist das?

Das sind Funktionen aus der Arduino-Bibliothek.

>  TCCR1B |= (1<<WGM12) | (1<<WGM13); //CTC Modus aktivieren
>  TCCR1B |= (1<<CS12); //Prescaler 256
>
>  //Vergleichswert
>  OCR1A = 62500;

Arduino Mini mit 16 MHz?

16000000 Hz durch Prescaler 256 ergibt 62500 Takte pro Sekunde. Den 
Vergleichswert musst du aber um Eins vermindern: OCR1A = 62500-1;

von Mischa L. (mischamv)


Lesenswert?

Danke für die Hilfe,
wieder bei so einer Kleinigkeit gescheitert :-|.


Ja das ist Arduino Mini 16 MHz.

Warum muss ich noch 62500-1 machen?


schöne Grüße aus Dieburg

Mischa

von spess53 (Gast)


Lesenswert?

Hi

>Warum muss ich noch 62500-1 machen?

Weil ein Takt benötigt wird um den Timer auf Null zu setzen.

MfG Spess

von Mischa L. (mischamv)


Lesenswert?

Danke für die Antwort.
Hat mir sehr, sehr geholfen.

grüße aus Dieburg

Mischa

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.