-
        

Ergebnis 1 bis 5 von 5

Thema: timerhandler macht probleme

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    05.03.2005
    Ort
    Bozen
    Beiträge
    41

    timerhandler macht probleme

    Anzeige

    hallo ich habe eine routine für den AVR 8515 geschrieben. die interuptroutine wird bei erreichen des timer1 overflow angesprungen.

    leider macht die routine nicht das was sie soll.

    in der routine wird ein register(count) hochgezählt welches bei erreichen gewisser werte den port b ein und ausschaltet. bei erreichen des maxwertes wird das register wieder auf 0 gesetzt und die schleife beginnt von vorne.

    dir routine funktioniert in einem testprogramm innerhalb einer endlosschleife wunderbar nur im interrupthandler nicht.

    kann mir jemand helfen?

    kann man interruptroutinen direkt debuggen?


    danke für eure hilfe


    crishy
    Angehängte Dateien Angehängte Dateien

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    Hallo,
    ich habe was gefunden und zwar in der interruptroutine machst Du rcalls :
    rcall schreibe_bit
    rcall loeschebit.....
    in den obengenannten routinen sehe ich aber keine rets
    also bleiben die Adressen die bei dem Sprung mit rcall auf dem stack geschrieben gerden
    auch drin,
    damit holst Du dir mit pop am Ende der Routine völlig falsche Werte rein,
    ich denke es kommt auch irgenwann dazu daß der ram überläuft.
    Ich hoffe daß ich Dein Programm nicht zu schnell überflogen habe, und daß ich damit recht habe.
    Gruß Sebastian

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    05.03.2005
    Ort
    Bozen
    Beiträge
    41
    hallo sebastian, danke für deine hilfe. ich habe das behoben. leider funktioniert die routine noch immer nicht. es ist wahrscheinlich ein fehler in der logischen abfolge. ich habe die procedur in einem testprogramm getestet und sie funktionierte, nur im timerhander macht sie nicht was sie soll.

    crishy

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    Kein Problem,
    Wenn ich solche Probleme habe, gehe ich volgendermaßen vor:
    Alles in der Interruptroutine auskomentieren, und nur eine LED toggeln lassen,
    also wenn Interrupt ausgelöst wird , prüfen, ob LED an, wenn ja dann ausschalten, und andersherum, ist die einfachste Möglichkeit sowas zu debuggen...
    Wenn Deine LED dann am blinken ist, kannst Du Dir sicher sein, daß die Routine richtig angesprungen wird, und daß der Fehler woanders zu suchen ist.

    Gruß Sebastian

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    01.06.2005
    Beiträge
    13
    Hallo crishy,

    wie Christian oben schon beschrieben hat, rufst Du die die Funktionen SchreibeBit und LoescheBit über Calls auf, aber diese Funktionen werden nicht über eine Return-Anweisung wieder verlassen, sondern Du springst mit einem rjmp wieder zurück. Deshalb bleibt die Rücksprungadresse auf dem Stack und beim reti am Ende der Interruptroutine wird zu einer falschen Adresse gesprungen. Irgendwann wird dann der Stack überlaufen.

    Abhilfe: entweder, den Code für die Funktionen SchreibeBit und LoescheBit gliech an den Stellen einbauen, an denen sie gebraucht werden (ist ja nur eine Instruktion, da lohnt sich kein Unterprogrammaufruf); oder an das Ende der Funktionen kein rjmp, sondern einen ret einsetzen.

    Gruß, M@nni

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •