Timer1 und _delay_ms

OP #1659336
Lesenswert?

Hallo,
hängt die Funktion _delay_ms() irgendwie mit dem Timer zusammen?
1
void delay_ms(int delay) {
2
        int i;
3
        for (i=0;i<=delay;i++) {
4
                _delay_ms(1);
5
        }
6
}
7

8
int main(void) 
9
{
10

11
int i=0;
12

13
sei();
14

15
DDRD |= 0b11110000;           //Port D 4 mit 7 als Ausgang
16
DDRB |= 0xFF;               //Port B komplett Ausgang
17

18

19
uart_init(UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) ); 
20
  
21

22
MCUCR |= (1<<ISC11) | (1<<ISC01);  //Interrupts enable
23
GICR |= (1<<INT1) | (1<<INT0);
24

25
TCCR1A |= (1<<COM1A0) | (1<<COM1B0);  //Toggle OCA/B on Compare Match
26
TCCR1B |= (1<<CS10) | (1<<CS12) | (1<<WGM12);     //Prescaler 1024
27
OCR1A = 78;
28
OCR1B = 78;
29
TIMSK |= (1<<OCIE1A) | (1<<OCIE1B);  //Timer Itnerrupt enable
30

31

32
while(1)
33
{
34
  i++;
35
  char test[20] = "";
36
  delay_ms(100);
37
  PORTB ^= (1<<PB4);
38
  PORTD ^= (1<<PD7);
39
  uart_puts("hallo\n");  
40
}
41
return 0;
42
}
Wenn ich die TIMSK Zeile auskommentiere erhalte ich im Terminal "hallo", 
ansonsten nicht.
Grüße
Martin
Gast #1659416
Lesenswert?

Dein Code ist unvollständig. Abgesehen von der Funktion uart_init und 
den Header-Includes fehlt die Implementation des 
Timer-Interrupt-Handlers. Letztere wäre interessant, weil da 
wahrscheinlich der Fehler ist.
Gast #1659449
Lesenswert?

Martin Uxxxxxx schrieb:

> aber einen Timer Interrupt Handler habe ich gar nicht

Dann ist das das Problem. Einen Interrupt darfst du nicht einschalten, 
wenn du keinen Handler dafür hast.

> - im Interrupt wird doch hardwaremäßig der Pin getoggelt,

Nein, im Interrupt wird die ISR aufgerufen, sonst nichts. Wenn du den 
Timer hardwaremäßig einen OC-Pin toggeln lassen willst, kannst du das 
tun, aber das hat nichts mit dem Interrupt zu tun.

> inwiefern kommt da eine ISR ins Spiel?

Wenn ein Interrupt ausgelöst wird, wird eine ISR aufgerufen. Das ist der 
Zweck von Interrupts.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren