www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATMega128 Timer zu langsam


Autor: kalhou (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi..

Ich habe folgendes Problem. Und zwar versuche ich einen einen Timer 
einzustellen, der alle 25ms einen Interrupt auslöst.Im Betrieb ist der 
Timer allerdings zu langsam und mir schenint nicht klar warum.

Der Controller wird mit 14745600 Hz betrieben
#include <avr\io.h>
#include <avr\interrupt.h>

//Interrupt definieren
#define system_tick()  ISR(TIMER1_OVF_vect) 

system_tick()  {  
  
  //LEDS invertieren
  PORTA ^= 0xFF;  
}

int main(void){

  DDRA  = 0xFF;  
  PORTA = 0;
  
  //Timer Register auf 360 setzen
  TCNT1H = 0x01;
  TCNT1L = 0x68;
  
  //Overflow Interrupt aktivieren
  TIMSK |= (1<<TOIE1); 
  
  //TIMER1 Prescaler von 1024 einstellen und starten
  TCCR1B  |= (1<<CS12) | (1<<CS10); 
  
  //Interrupts Enable
  sei();
  
  for(;;){
  }
  
  //Interrupts Disable
  cli();

}

Wie man sieht ist der Prescaler auf 1024 eingestellt.

14745600  / 1024  = 14400
14400  / 360 = 40
1 / 40 = 0.025[s]

also sollte das soweit stimmen. Jedoch ist die Dauer im Test ca. 1 
Sekunde lang.

Hat Jemand eine Ahnung woran das liegen könnte?

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erstens zählt der Timer aufwärts und macht also bei einem Preload von 
360 immerhin 65536 - 360 = 65176 Schritte bis zum Überlauf, was ungefähr 
dem 180-fachen des gewünschten Wertes entspricht. Zweitens macht man 
sowas beim AVR nicht mit Timer-Vorladen, sondern mit der Compare-Einheit 
im CTC-Modus. So wie es oben steht wird das ganze sowieso nur einmal mit 
der gewünschten Zeit laufen, weil Du in der ISR das Timer-Zählregister 
nicht wieder lädst. Und da steht dann sowieso Null drin. Mit CTC 
brauchst Du nur einmal den Wert ins Compare-Register zu schreiben, den 
Rest macht der µC selbst.

BTW:
Weiß der µC überhaupt, dass er mit dem Quarz arbeiten soll (Fusebits 
korrekt gesetzt)?

Autor: kalhou (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include <avr\io.h>
#include <avr\interrupt.h>

//Interrupt definieren
#define system_tick()  ISR(SIG_OUTPUT_COMPARE1A)  //Compare Interrupt

system_tick()  {  
  //Timer zurücksetzen
  TCNT1H = 0x00;
  TCNT1L = 0x00;
  
  //LEDS invertieren
  PORTA ^= 0xFF;  
  
}

int main(void){

  DDRA  = 0xFF;  
  PORTA = 0;
  
  //Compare Register A  auf 360 setzten
  OCR1AH = 0x01;
  OCR1AL = 0x68;
  
  
  //Compare Interrupt aktivieren
  TIMSK |= (1<<OCIE1A);
  
  //TIMER1 Prescaler von 1024 einstellen und starten
  TCCR1B  |= (1<<CS12) | (1<<CS10); 
  
  //Interrupts Enable
  sei();
  
  for(;;){
  }
  
  //Interrupts Disable
  cli();

}

hat sich erledigt ;)

vielen dank

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kalhou wrote:
>
> system_tick()  {
>   //Timer zurücksetzen
>   TCNT1H = 0x00;
>   TCNT1L = 0x00;
> 
Timer Zurücksetzen kannst Du Dir sparen (und solltest Du auch, weil 
dadurch die Genauigkeit leidet). Im CTC-Modus wird der Timer automatisch 
beim Compare-Ereignis zurückgesetzt.

>
>   //Compare Register A  auf 360 setzten
>   OCR1AH = 0x01;
>   OCR1AL = 0x68;
> 
Warum so kompliziert? Ein einfaches
OCR1A = 360;
tut's auch. Und vor allem nimmt der Compiler Dir dabei die Sache mit der 
richtigen Reihenfolge ab.

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.