Forum: Mikrocontroller und Digitale Elektronik ATmega16 Problem mit TimerInterrupt


von Zwitschi (Gast)


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.

von Zwitschi (Gast)


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

von Falk B. (falk)


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#Steuersignale_zwischen_ISR_und_Hauptprogramm


MFG
Falk

von spess53 (Gast)


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

von Luge (Gast)


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!

von Ich (Gast)


Lesenswert?

Zum Abtippen: USB-Stick  Diskette  ähnliches verwenden

von Karl H. (kbuchegg)


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);
}

von Ich (Gast)


Lesenswert?

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

von Stefan E. (sternst)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.