www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Mal wieder Timer (Forum-Suche nicht Lösungsgleich!)


Autor: Diplomand_A (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Mikrocontroller-Gemeinde,

ich bin gerade auf der Suche nach einem vermutlich banalen Fehler. GGf. 
könnt ihr mir ja weiter helfen. Ich versuche derweil für eine weitere 
Funktion einen Timer einzubinden. Hierzu gebe ich zum testen eine LED 
zum Blinken am PORTC aus. Der Code sieht aus wie folgt:
#include<avr/io.h>
#include<avr/interrupt.h>

#define QRGFREQ 8    //Angabe in Mhz
#define IRQT 100    // IRQ in t=x sec. (IRQTIME *10ms) (also eig. 1s!)


volatile unsigned int get_ADC =1,tenhsec=0;    

void main(void)
{

DDRC = 0xFF,
PORTC = 0xff;
// initialisation of timer and interrupts


TCCR1A = 0;  //Timer innerhalb des uC, keine externe Hardware


TCCR1B =0x01;   // Kein Prescaler  (Freq/1)

//Vergleichswert
OCR1AH = (QRGFREQ *1000) >>8;    // 10ms
OCR1AL = (QRGFREQ *1000) & 0xff;  // 10ms


// IRQ Enable
TIMSK1  = (1<<OCIE1A);//|(1<<TOIE3);

//Global freigeben
sei();    
  while(1)
    {
    
    }
}

//-------------------------------------------------------
ISR (TIMER1_COMPA_vect) 
{//Jede 10ms aufgerufen

tenhsec++;
if (tenhsec ==IRQT) 
  {tenhsec =0;
  get_ADC ^= 1;
  PORTC = get_ADC;
  }
}

Eigentlich sollte ja nach 1s der CompareValue erreicht sein und die LED 
entsprechend blinken. Dies macht sie ja auch! Allerdings ändere ich den

//Vergleichswert
OCR1AH = (QRGFREQ *1000) >>8;    // 10ms
OCR1AL = (QRGFREQ *1000) & 0xff;  // 10ms

auf andere Werte so ergibt sich die gleiche Geschwindigkeit des Taktes 
der LED. Das heißt also, dass der Compare-Wert woandersraus gebildet 
wird?
(Forum etc schon nachgestöbert!)

Ggf. banale Lösung ??

Danke schonmal

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

Bewertung
0 lesenswert
nicht lesenswert
Diplomand_A wrote:

> auf andere Werte so ergibt sich die gleiche Geschwindigkeit des Taktes
> der LED.

Das wundert mich nicht weiter.
Du hast keinen Timer Modus eingestellt. Das bedeutet so viel wie der 
Timer zählt munter vor sich hin. Immer von 0 bis 65536

Das eine mal kriegst du halt deinen Interrupt, wenn der Timer bei 300 
angelangt ist, das andere mal kriegst du ihn wenn er bei 28000 angelangt 
ist. Aber immer noch braucht der Timer exakt 65536 Zyklen bis er die 300 
bis 28000 das nächste mal wieder erreicht.

Nur weil du den OCIE1A Interrupt eingeschaltet hast, fängt der Timer ja 
nicht beim Auslösen des Interrupts wieder bei 0 an zu zählen. Der 
Interrupt macht genau das was er aussagt: Eine Information darüber, dass 
der Zählerstand einen bestimmten Wert erreicht hat. Nicht mehr und nicht 
weniger. Und wenn du sonst nichts tust, dann dauert es genau 65536 
Timerticks bis dieser Wert wieder erreicht wird.

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Diplomand_A wrote:

> Ggf. banale Lösung ??

Ja, Timer auf CTC Modus einstellen.

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

Bewertung
0 lesenswert
nicht lesenswert
Übrigens kann man in C sehr komfortabel auf 16-Bit-I/O-Register als 
ganzes zugreifen, ohne den ganzen Rotz mit (z.B.) OCR1AH und OCR1AL und 
Bitgeschiebe. Schreib einfach den Wert in OCR1A und sei glücklich, dass 
der Compiler sich höchstselbst um die Zugriffsreihenfolge und das 
Bitgepfriemel kümmert.

Autor: Diplomand_A (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jungs,

ich danke auch bestens für die Antwort von allen :-)

der Vollständigkeithalber für ggf. weiter hilfesuchende Personen:

TCCR1B =(1<<CS10)|(1<<WGM12);  


Manchmal kann es so einfach sein :-)

gruß

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.