Forum: Compiler & IDEs Timer1 und _delay_ms


von Martin U. (martinu)


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

von Justus S. (jussa)


Lesenswert?

Martin Uxxxxxx schrieb:
> Wenn ich die TIMSK Zeile auskommentiere erhalte ich im Terminal "hallo",

wo ist die ISR für den Timer?

von Karl H. (kbuchegg)


Lesenswert?

Welche UART Funktionen sind das?

Normalerweise hängen Timer und _delay_ms (das ist doch die Funktion aus 
der gcc-Library) nicht zusammen. OK. Der Timer kann die angegebene Zeit 
ein wenig verlängern, aber da ISR normalerweise kurz sind, ist das 
meistens nicht viel.

von Rolf Magnus (Gast)


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.

von Martin U. (martinu)


Lesenswert?

Die UART Funktionen sind denke ich weitgehend Standard, wollte hier 
nicht unnötig viel posten -  aber einen Timer Interrupt Handler habe ich 
gar nicht - im Interrupt wird doch hardwaremäßig der Pin getoggelt, 
inwiefern kommt da eine ISR ins Spiel?

von Rolf Magnus (Gast)


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.

von Rolf D. (rolfdegen)


Lesenswert?

Martin Uxxxxxx schrieb:
> Hallo,
> hängt die Funktion _delay_ms() irgendwie mit dem Timer zusammen?

Hallo Martin

Nein, die Delay-Funktion _delay_ms(x) hat keinen Einfluss auf die 
Timer-Funktion im ATmega, da sie per Software erzeugt wird.

Gruß Rolf

von Martin U. (martinu)


Lesenswert?

Danke euch, ich hab jetzt auch gemerkt dass ich für mein 200hz Rechteck 
keinen Interrupt brauche, ich dachte zuerst man müsste da pro Forma was 
aktivieren. Danke nochmal!

von Rolf D. (rolfdegen)


Lesenswert?

Martin Uxxxxxx schrieb:
> Hallo,
> hängt die Funktion _delay_ms() irgendwie mit dem Timer zusammen?

Hallo Martin

Die Funktionen _delay_ms(x) und _delay_us(x) sind unabhängig von den 
Timern im AVR, weil die Verzögerung per Software erzeugt wird.

Gruß Rolf

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.