mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATmega16 Problem mit TimerInterrupt


Autor: Zwitschi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Abend :)

Erstmal, das ist meine erste Begegnung mit Interrupts und Timer.
Ich denke das Prinzip hab ich nach wiederholten Lesen des Tuts und des 
Forums verstanden, trotzdem happerts.

Wollt nur mal eine LED in der ISR dauerhaft anschalten.
Da die ISR ja sofort nach 16000000 / 1024 Taktzyklen das erste mal 
durchlaufen wird (bei 16MhZ CPU, ja, läuft mit externem Quarz, und 
Prescaler von 1024) müsste sie ja praktisch "immer" leuchten, ausser 
Reset wird gedrückt gehalten :)

Hier mal mein Code:

#include <avr/io.h>
#include <avr/interrupt.h>

int mainvoid){
    DDRA = 0xFF;              //Port A soll verwendet werden
    sei();
    TIMSK |= (1<<TOIEO);
    TCCR0 = (1<<CS02) | (1<<CS00);        //Presacler 1024
    while(1);
}

ISR (TIMER0_OVF_Vect){
    PORTA = |= (1<<0)        //ersten Pin des Portes anschalten
}


Ich durchforste jetz echt scho 3 Stunden das Forum. Bei allen  Beiträge 
die ich finde sieht der Code genauso aus.

Im Prinzip müsste doch nach dem flashen sofort die Led an Pin0 Port A 
dauerhaft leuchten? Wird ja nie wieder auf 0 geschaltet.
Vielleicht is heute einfach scho zu spät, sich in Timer und Interrupts 
einzuarbeiten :)

Vielleicht weis ja jemand weiter :)

Achja, nochmal als Info: Ich verwende den ATmega16 mit 16Mhz.
Der externe Takt wird verwendet, getestet durch Spielereichen mit 
_delay_ms(); usw.

Autor: Zwitschi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, ich hab grad nochmal den Beitrag überflogen.
Die Zeile in der ISR lautet natürlich PORTA |= usw...

Das zweite "=" ist ein Tippfehler, sowas kommt dabei raus wenn man am 
ProgrammierPC noch koa Inet hat und den Code abtippt :)
Ist aber natürlich richtig in der .c Datei

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Zwitschi (Gast)

>Wollt nur mal eine LED in der ISR dauerhaft anschalten.

Was nicht sinnvoll ist. Lass sie blinken, auf neudeutsch togglen.

>Da die ISR ja sofort nach 16000000 / 1024 Taktzyklen das erste mal
>durchlaufen wird (bei 16MhZ CPU, ja, läuft mit externem Quarz, und
>Prescaler von 1024)

Nöö, der erste Timertakt dauert 1024 CPU Takte. Der Timer überlauf 
passiert beim Timer 0 (8 Bit) nach 256 Timertakten. Was beim Vorteile 
von 1024 gleich 262144 CPU Takte sind.

>Hier mal mein Code:

>Die Zeile in der ISR lautet natürlich PORTA |= usw...

>Das zweite "=" ist ein Tippfehler, sowas kommt dabei raus wenn man am
>ProgrammierPC noch koa Inet hat und den Code abtippt :)
>Ist aber natürlich richtig in der .c Datei

Solchen Bullshit kannst du dir sparen. Und vor allem dem Forum!
Abtippen von Quelltext ist SINNLOS!!!

Ein Funktionierendes Beispiel findest du im Artikel Interrupt.

http://www.mikrocontroller.net/articles/Interrupt#...


MFG
Falk

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Im Prinzip müsste doch nach dem flashen sofort die Led an Pin0 Port A
>dauerhaft leuchten? Wird ja nie wieder auf 0 geschaltet.

Kommt darauf an, wie die LED angesteuert wird. Leuchtet sie, wenn du den 
Pin einfach auf H setzt?

MfG Spess

Autor: Luge (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1. Ich lasse sie leuchten und nicht blinken weil ich nur ein zeichen 
sehen will dass die isr überhaupt durchlaufen wird. Toggeln etc wäre 
mein nächster schritt.

2. Das tut kenn ich. Damit hab ich mich eingearbeitet. Erstmal musste 
ich im datenblatt die richtigen registerbezeichnungen finden. Laut x 
forenbeiträgen stimmen alle. Ich würde keon neues thema aufmachen wenn 
das tut mir weitergeholfen hätte. Forensuche natürlich auch benutzt, was 
mich nur bestätigt dass mein code funken müsste.

3. Zum quelltext abtippen: tja anders gehts halt ned. Hab nen alten 
athlon ausgegraben damit ich ne echte serielle habe, wlan stick is noch 
ned da. Aber nach 2 stunden drüberschauen kann ich tippfehler 
ausschliesen. Der code is ja auch ned wirklich lang...

4. Ja, in der whileschleife lässt sich die led richtig ansteuern, 
weswegen ich vermute dass die isr nicht ausgeführt wird.

Grüße und danke für die ersten antworten!

Autor: Ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zum Abtippen: USB-Stick  Diskette  ähnliches verwenden

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

Bewertung
0 lesenswert
nicht lesenswert
Luge schrieb:
> 1. Ich lasse sie leuchten und nicht blinken weil ich nur ein zeichen
> sehen will dass die isr überhaupt durchlaufen wird. Toggeln etc wäre
> mein nächster schritt.

Mach das mal.
Lass sie blinken.
OK, sie wird ein wenig schnell blinken. Mit 61Hz. Aber darum gehts 
nicht.

ISR (TIMER0_OVF_Vect)
{
    PORTA ^= (1<<0);
}

Autor: Ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wegen den 61 Hertz.
Nimm 1Mhz internen Takt dann hast du knapp 4Hz

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Luge schrieb:
> Aber nach 2 stunden drüberschauen kann ich tippfehler
> ausschliesen.

Tatsächlich?
Also ich sehe da zwei weitere Fehler (zusätzlich zum "= |="). Der erste 
ist ganz sicher nur ein Tippfehler in der "Abtipp-Version", denn der 
würde dafür sorgen, dass das ganze erst gar nicht kompiliert. Der zweite 
jedoch würde nur eine Warnung erzeugen und würde exakt zu dem 
Fehlverhalten führen, dass die ISR nicht ausgeführt wird.

Nachtrag:
Es gibt sogar noch einen dritten und vierten (also insgesamt vierten und 
fünften) Fehler, die auch in die Kategorie "ganz sicher Tippfehler in 
der Forumsversion" fallen. Und das trotz
> Der code is ja auch ned wirklich lang...
Ein wirklich gutes Beispiel für die Sinnlosigkeit des "Code-Eintippens" 
hast du da abgeliefert.

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.