www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Clear Timer on Compare Match (CTC) Atmega32


Autor: johnny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!
Ich möchte mit einem
Clear Timer on Compare Match (CTC) eine zyklisch eine ISR ausführen, die 
z.B. eine LED toggelt.

Ich möchte aber den Comparewert gerne über Tasten ändern und damit die 
Blinkfrequenz. So habe ich es versucht, passiert aber irgendwie nix, 
wenn ich den Knopf drücke

  TCCR1A = (1<<WGM01);    // CTC Modus
  TCCR1B |= (1<<CS01);    // Prescaler 8

  OCR1AH = (unsigned char) (variable >> 8);
  OCR1AL = (unsigned char) variable; 

 
  // Compare Interrupt erlauben
  TIMSK |= (1<<OCIE1A);
  // Global Interrupts aktivieren
  sei();

while(1)
{
  OCR1AH = (unsigned char) (variable >> 8);
  OCR1AL = (unsigned char) variable; 
if ((PINA & (1<<PINA0)) == 0x00)
{
  variable = 1000;
}
if ((PINA & (1<<PINA0)) == 0x00)
{
  variable = 100;
}
}


oben hab ich es einmal zum initialiersieren drinne und denn dachte ich 
wenn ich in der Schleife bin, kontrolliert er halt immer den aktuellen 
Wert
Funzt aber irgendwie nicht.

Autor: Chris D. (myfairtux) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo ist die ISR?

Autor: johnny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so würd ich denken, oben in der Schleife fehlt noch die LED wieder 
auszumachen. Hab ich nich mit hin geschrieben.

ISR (TIMER1_COMPA_vect)
{
  PORTB = 0x01;
}


Autor: johnny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und ein delay von ein paar ms is noch in der Schleife :)

Ich stelle mir dass so vor: ISR --> LED ein paar ms ein, dann zurück in 
die while Schleife --> LED aus --> bis 1000 zählen, in die ISR --> LED 
ein;

und die 1000 möchte ich halt auch auf 100 stellen können mit einer Taste

Autor: Chris D. (myfairtux) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So kann das auch nicht funktionieren: die beiden If-Bedingungen sind 
identisch.

Wenn Du immer nur Bruchstücke Deines Codes "freigibst", dann kann Dir 
keiner vernünftig helfen.

Autor: johnny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab den Quelltext grade nicht zur Hand und das aus dem Gedächtnis noch 
einmal hingeschrieben.

Aber die Änderung des Compareregisters ist soweit doch in Ordnung oder?

Autor: Nn Nn (jaytharevo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ganz schlau werd ich aus deinem Programm nicht.

In der ISR schaltest du zb. die LED die ganze Zeit ein. Was, wenn sie 
schon ein ist? Außerdem denk ich, dass du den Falschen Namen der ISR 
verwendest.
Möchtest du denn nicht beim erreichen des Wertes die ISR ausführen und 
dann wieder bei 0 beginnen zu zählen? Eventuell schau dir noch ein mal 
den Part des Datenblatts an, kann nicht schaden ;).
Wenn ja müsstest du den Overflow Interrupt aktivieren.

Also so:

ISR (TIMER1_OVF_vect)
{
  PORTB ^= (1<<PB0);
}

Weiter gehts. Welcher Datentyp ist die Variable "variable" denn, dass du 
sie vorher casten musst in einen char?
Bedenke: Char ist nur 8 Bit lang, kann also maximal 256 sein. 1000 ist 
definitiv zu groß!

So, jetzt optimiere mal und stelle danach den gesamten Sourcecode hier 
rein. Ich glaub wir sind noch nicht fertig :D ;).

MfG

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

Bewertung
0 lesenswert
nicht lesenswert
johnny schrieb:
> und ein delay von ein paar ms is noch in der Schleife :)
>
> Ich stelle mir dass so vor: ISR --> LED ein paar ms ein,

schon falsch.
Mach aus den Millisekunden ein paar Mykrosekunden (Millionstel Sekunden)

> dann zurück in
> die while Schleife --> LED aus

Nope.
Das LED aus muss ebenfalls in der ISR passieren.

 --> bis 1000 zählen, in die ISR --> LED
> ein;
>
> und die 1000 möchte ich halt auch auf 100 stellen können mit einer Taste

Und du denkst, dass du so schnell eine Taste drücken und wieder 
loslassen kannst, dass du kontrollieren kannst, welche der beiden if
  if ((PINA & (1<<PINA0)) == 0x00)
  {
    variable = 1000;
  }
  if ((PINA & (1<<PINA0)) == 0x00)
  {
    variable = 100;
  }

denn jetzt das letzte Wort hat.
Zu deiner Info: Dein µC arbeitet diese beiden Anweisungen (und den Rest 
deiner Schleife) viele hundertausendmal in der Sekunde durch. Wenn du da 
gezielt die Taste so loslässt, dass entweder das erste if oder das 2.te 
if den Vorzug bekommt, dann ist das ein Wunder!

Autor: Freak (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für eure Mühen!
Das casten hängt einfach damit zusammen, dass ich direkt in die Register 
geschrieben hab. Das macht jetzt der Compiler für mich.

zur Info:
Das hat weiter keine Bewandnis die LED zu toggeln, ich will einfach auf 
dem OSZI die Zeit sehen, in der die ISR auftreten.

Bei der Taste hab ich mich verschrieben. Das natürlich nicht der gleiche 
Pin.

Ich habe gelesen, dass der CompareTimer genau ist, als der OVerflow, 
darum nehme ich den.

Allerdings bleit die Zeit bis die ISR auftritt bei mir konstant, egal 
welcher Wert grade anliegt, daher bin ich verwirrt. Ich hab das Gefühl 
das holt der µC sich einmal und guckt denn gar nich wie es steht !?

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

Bewertung
0 lesenswert
nicht lesenswert
Freak schrieb:

> Bei der Taste hab ich mich verschrieben. Das natürlich nicht der gleiche
> Pin.

Genau deswegen kann man sich im Forum viele Freunde machen, indem man 
nicht seinen wirklichen Code postet sondern nur etwas was so ähnlich ist 
:-)



PS: Das war jetzt ein Hinweis!

Autor: Freak (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
habs selber gefunden, hatte gar nicht als CTC initialisiert :)
danke trotzdem :)

Autor: Nn Nn (jaytharevo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rofl, Trollalarm....

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.