Interrupts werden nicht aktiviert / interrupt.h nicht gefunden



  • Hallo,

    ich bin gerade dabei auf einem 8051 (AT89C5131) ein Programm zu schreiben - zum ersten mal mit C, davor hab ich nur ASM benutzt. Mein Problem: Ich schaffe es einfach nicht unter C einen Timer-Interrupt auszulösen. Dieser sollte beim setzten des Timer-Overflows gesetzt werden, was aber nicht passiert - der Timer macht ganz normal bei 0 weiter. Unter ASM hab ich den Timer-Interrupt immer so freigegeben:

    mov  TMOD,#00000010b
    mov  TL0,#0
    mov  TH0,#0
    setb  EA
    setb  ET0
    clr  TF0
    setb  TR0
    

    Das gleiche unter C funktioniert aber nicht:

    TMOD = 0x01;
    TH0 = 0x00;
    TL0 = 0x00;
    EA = 1;
    ET0 = 1;
    TF0 = 0;
    TR0 = 1;
    

    Ich hab jetzt so eine Funktion namens sei() gefunden, die in interrupt.h liegen soll - da bekomme ich vom Linker aber die Fehlermeldung, dass die Datei nicht gefunden wurde - existiert wohl nicht (hab sie auch per Hand nicht gefunden).
    Verwende die IDE uVision von Keil. Kann mir da jemand weiterhelfen?

    EDIT: hab die avr-lib jetzt im Internet gefunden und in mein Projekt eingebunden. Das sei() funktioniert zwar, macht aber nicht das was es soll(wiederholt die jeweilige Funktion immer und immer wieder).



  • Was mir auffällt:

    TMOD,#00000010b
    

    ist nicht gleich:

    TMOD = 0x01;
    


  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum ANSI C in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Totur schrieb:

    ... hab die avr-lib jetzt im Internet gefunden und in mein Projekt eingebunden. Das sei() funktioniert zwar, macht aber nicht das was es soll(wiederholt die jeweilige Funktion immer und immer wieder).

    Bist Du sicher, daß Du weißt, was Du tust? Die AVRs haben nämlich GAR NICHTS mit den 8051er- Derivaten zu tun.
    Zudem braucht der Compiler den Hinweis, daß es sich dabei um einen Interrupt handelt, meist mit #pragma INTERRUPT funcname, um den korrekten Call&Returncode zu erzeugen.

    Drei Möglichkeiten des Schiefgehens:
    - Timer nicht initialisiert
    - Interrupt nicht scharfgeschaltet
    - Interruptroutine ins Nirvana gerichtet oder
    - Interrupt nach erstem Aufruf blockiert

    Gibt noch mehr, aber das mußt Du erstmal klären.



  • Hallo,

    ich hab es jetzt hinbekommen. Das Programm hat eigentlich richtig funktioniert. Jetzt geht es nämlich. Kann aber nicht genau sagen woran es lag. Wahrscheinlich hab ich beim Debuggen immer die falsche Taste gedrückt (Step-over statt step-in) und den Interrupt somit immer übersprungen.

    Und die AVR-libs hab ich jetzt wieder rausgeschmissen. War eigentlich nur zum testen...


Log in to reply