Timer1 und _delay_ms

OP #1659336
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
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.
Gast
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.
OP
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?
Gast
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.
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
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.