ATmega8 macht was er will...?

  • Hallo


    Ich habe neulich bei Experimenten mit dem Timer bei meinem ATmega8 ein äußerst merkwürdiges Verhalten bemerkt.
    Eigentlich sollte der Käfer nur eine LED dimmen (jaja, nix Neus ;)).
    Änderungen, die ich im Code vorgenommen habe, hat er jedoch entweder dann erst ausgeführt wenn ich den Code bereits wieder umgeschrieben und den Controller neu beschrieben habe, oder der Käfer hat was völllig anderes gemacht...


    Beispiel:
    Mit dem nop-Befehl in der Warteschleife (rot markiert) tut der Käfer endlich, was er soll: die LED blinken lassen.
    Wenn ich den nop-Befehl jedoch entferne leuchtet die LED durchgehend....nix Blinker.
    Dabei hat nop doch gar keine Funktion als eben "nichts" zu tun...?


    Wenn ich PORT D definiere, aber nicht auf Low (grün markiert) setze (das ändert die Interruptschleife später ja ständig), dann funktioniert der Blinker
    brav...aber warum so, und nicht wenn ich PORTD auf low setze?








    Noch ein Programm:
    Dieses Programm erzeugt mit zwei LEDs einen Wechselblinker: Eine LED ein, die andere aus, und das eben im Wechsel.
    Dabei ist das Wechseln im Code gar nicht vorgesehen, der Käfer soll beide LEDs gleichzeitig schalten.
    Warum wechselt er aber trotzdem?





    Zu guterletzt noch etwas äußerst Merkwürdiges.
    Ich habe folgenden Code in den ATmega8 geflasht. Der Controller scheint den Code aber jedesmal einen Gang schneller abzuspielen. Anstatt die LED und den Summer regelmäßig zu betätigen schaltet er völlig unregelmäßig (wenn auch rythmisch, kann man gut an den kurzen Piepstönen vom Summer erkennen wo er am Anfang sonst nur brummt) und wird nach und nach immer schneller...klingt fast wie ein tuckernder Diesel der anläuft.
    Egal was er auch macht-warum macht er es nichtregelmäßig?


    Das ist der Code:


    Und hier könnt ihr euch ansehen was der Käfer aus dem Code macht:
    http://ul.to/kr8k66wy

    Das Erfolgskonzept von Windows ist eine gelungene Mischung aus Marketing, Korruption, Kartellmißbrauch und der erfolgreichen Spekulation auf das Naturgesetz, daß Scheiße oben schwimmt.


    Auch aus Steinen, die einem in den Weg gelegt werden,
    kann man Schönes bauen.
    Johann Wolfgang von Goethe

    Einmal editiert, zuletzt von White_Fox ()

  • da (letztes Beispiel) ist der Fall klar: Du hast ja keine Schleife vor dem Unterprogramm, also läuft er da immer rein, springt dann beim reti (da nix auf den Stapel gelegt wurde) an ne zufällige Adresse, macht also letztlich irgendnen Blödsinn...


    und k.A. was das immer mit dem TCNT0 soll, das Register zählt er ja selbst hoch, wenn Du da zu nem zufäligen Zeitpunkt irgendnen Wert rein schreibst, dann kann ja nur Mist rauskommen (hatte ich Dir schon mal irgendwo erklärt, bei ner PWM, wenn ich mich recht erinnere....)


    Dabei ist das Wechseln im Code gar nicht vorgesehen, der Käfer soll beide LEDs gleichzeitig schalten.
    Warum wechselt er aber trotzdem?

    Weil die Register nach dem Reset "zufällige" Werte haben, aber eben meistens *nicht* 00000000! - wenn da nun also z.B. 01010101 drin steht, und Du machst com, dann kommt eben ein Wechselblinker bei raus...


    das ist mir schon aufgefallen, auch das RAM, da sind nach dem Strom einschalten irgendwelche Werte drin - hatte mir schon überlegt, das als "Zufallszahlen" zu nehmen, aber die Werte sind immer gleich, jedoch von µC zu µC verschieden - liegt wohl an Toleranzen, die eine Speicherzelle kippt in die eine, die andere in die andere Richtung, wenn Strom angelegt wird...


    also: immer in die benutzten Register erst mal Startwerte schreiben, wenn es nötig ist, dass da ne bestimmte Zahl drin steht - nicht davon ausgehen, dass die nach dem Reset 0 sind!


    das mit dem nop ist seltsam, muss ich nachher noch mal genauer gucken - 0b00000101 ist aber übrigens kein Vorteiler 1, da würde nix blinken, weil bei nem Prescaler von 1 die Timer-ISR alle 256 Takte aufgerufen würde....

    It's only light - but we like it!


    Da es sich in letzter Zeit häuft: Ich beantworte keine PNs mit Fragen, die sich auch im Forum beantworten lassen!
    Insbesondere solche von Mitgliedern mit 0 Beiträgen, die dann meist auch noch Sachen fragen, die bereits im entsprechenden Thread beantwortet wurden.
    Ich bin keine private Bastler-Hotline, technische Tipps etc. sollen möglichst vielen Lesern im Forum helfen!

  • Hm, TCNT0 hab ich doch nur einmal im Programm beschrieben, um den Timer zu initialisieren.


    Das eine im letzten Code war nur eine Notiz, weil ich das Programm später erweitern wollte und etwas ausprobieren wollte...da waren aber keine ausführbaren Befehle (Habs der ÜBersicht halber mal ganz rausgenommen).


    Danke für den Hinweis mit den zufäligen Registerwerten...macht die Sache erheblich einfacher.:)

    Das Erfolgskonzept von Windows ist eine gelungene Mischung aus Marketing, Korruption, Kartellmißbrauch und der erfolgreichen Spekulation auf das Naturgesetz, daß Scheiße oben schwimmt.


    Auch aus Steinen, die einem in den Weg gelegt werden,
    kann man Schönes bauen.
    Johann Wolfgang von Goethe