mikrocontroller.net

Forum: Compiler & IDEs Timer1 und _delay_ms


Autor: Martin Uxxxxxx (martinu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
hängt die Funktion _delay_ms() irgendwie mit dem Timer zusammen?
void delay_ms(int delay) {
        int i;
        for (i=0;i<=delay;i++) {
                _delay_ms(1);
        }
}

int main(void) 
{

int i=0;

sei();

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


uart_init(UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) ); 
  

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

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


while(1)
{
  i++;
  char test[20] = "";
  delay_ms(100);
  PORTB ^= (1<<PB4);
  PORTD ^= (1<<PD7);
  uart_puts("hallo\n");  
}
return 0;
}
Wenn ich die TIMSK Zeile auskommentiere erhalte ich im Terminal "hallo", 
ansonsten nicht.
Grüße
Martin

Autor: Justus Skorps (jussa)
Datum:

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

wo ist die ISR für den Timer?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Martin Uxxxxxx (martinu)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf Degen (rolfdegen)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Martin Uxxxxxx (martinu)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Rolf Degen (rolfdegen)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.