-         

Ergebnis 1 bis 6 von 6

Thema: Probleme bei TMR0

  1. #1

    Probleme bei TMR0

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Hallo zusammen,
    Hätte da ein kleines PROBLEM mit meinem Timer und den dazugehörigen Interrupt.
    Möchte erstmal nichts anderes tun als mit dem Interrupt eine LED zum leuchten bringen.
    Habe dazu einen PIC 16F628 mit dem internen takt konfiguriert und möchte das bei jedem Überlauf ein Interrupt ausgelöst wird.
    Mein Problem ist jetzt das da leider nichts passiert, wenn ich die Hex Datei auf den Pic brenne.
    Hier ist dazu mein Quellcode.
    Danke schonmal im Vorraus.


    void Timer_ini()
    {
    OPTION_REG = 0b11000000;
    TMR0 = 0;
    INTCON = 0b10100000;
    }
    unsigned counter ;
    void Interrupt()
    {
    GIE_bit = 0;
    T0IF_bit = 0;
    counter++;
    GIE_bit = 1;
    return;

    }

    void main()
    {
    TRISB.RB5 = 0;
    CMCON = 0x07;
    Timer_ini();
    if(counter >= 50)
    {
    PORTB.RB5 = ~PORTB.RB5;

    }

    while(1);
    }

  2. #2
    RN-Premium User Roboter-Spezialist Avatar von witkatz
    Registriert seit
    24.05.2006
    Ort
    NRW
    Alter
    47
    Beiträge
    458
    Blog-Einträge
    16
    Welcher Compiler wird benutzt? Wie sind die CONFIG Flags gesetzt?
    Code:
     // Und warum benutzt du nicht das CODE Tag zum lesbaren Code Einfügen?
    Hier ein paar Bemerkungen zu deinem Codeschnipsel
    1. Schreiben auf RB5 muss in der Endlosschleife passieren, sonst passiert endlos nichts
    2. Das Rücksetzen des Counters auf 0 fehlt, ist das beabsichtigt?
    3. Das Handling des GIE_bit wird normallerweise vom Compiler erledigt, das manuelle Setzen innerhalb der Interruptroutine ist überflüssig, kann sogar zu Fehlern führen, deswegen nochal die Frage, welcher Compiler wird benutzt? Was steht im Compilerhandbuch zu Interruptroutinen?

    Gruß
    witkatz

    - - - Aktualisiert - - -

    Noch was, C ist Casesensitiv. Wenn der Compiler
    Code:
    void interrupt(void);
    als spezielle Interruptroutine deklariert, dann wird
    Code:
    void Interrupt(void);
    gar nicht aufgerufen!

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.03.2011
    Beiträge
    1.401
    Zitat Zitat von witkatz Beitrag anzeigen
    3. Das Handling des GIE_bit wird normallerweise vom Compiler erledigt, das manuelle Setzen innerhalb der Interruptroutine ist überflüssig, kann sogar zu Fehlern führen, deswegen nochal die Frage, welcher Compiler wird benutzt? Was steht im Compilerhandbuch zu Interruptroutinen?
    Das erledigt nicht der Compiler, das macht der Chip selbst. Bevor man also nicht ganz genau weiß, was man tut, sollte man an diesem Bit im Handler nicht spielen.

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

  4. #4
    RN-Premium User Roboter-Spezialist Avatar von witkatz
    Registriert seit
    24.05.2006
    Ort
    NRW
    Alter
    47
    Beiträge
    458
    Blog-Einträge
    16
    Zitat Zitat von Klebwax Beitrag anzeigen
    Das erledigt nicht der Compiler, das macht der Chip selbst.
    Ja, hast recht. Der Compiler übersetzt die Interruptroutine richtig mit RETFIE und der PIC macht den Rest. Mir schwante da was aus dem XC8 Handbuch dazu. Hier der entspr. Auszug:
    Never re-enable interrupts inside the interrupt function itself. Interrupts are
    automatically re-enabled by hardware on execution of the RETFIE instruction.
    Re-enabling interrupts inside an interrupt function may result in code
    failure.
    Nachtrag:
    Im MikroC Manual habe ich diesbezüglich keinen Hinweis gefunden. Das ist mMn eine Schwachstelle der MikroC-Dokumentation.
    Geändert von witkatz (12.07.2015 um 23:21 Uhr)

  5. #5
    Vielen Dank für die Hilfe. Habe den Code etwas umgeschrieben und jetzt funktioniert es. Benutze den Compiler von Micro C.
    Einen Blick ins Handbuch erleichtert Fehleranalyse. In Assembler hab ich das GIE Bit immer im Code manuell gesetzt oder gelöscht. Hab es hier deshalb wahrscheinlich noch hingeschrieben. Leuchtet jetzt natürlich ein das es überflüssig ist.
    Danke nochmal
    Gruß Chipo

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.03.2011
    Beiträge
    1.401
    Zitat Zitat von chipo78 Beitrag anzeigen
    In Assembler hab ich das GIE Bit immer im Code manuell gesetzt oder gelöscht. Hab es hier deshalb wahrscheinlich noch hingeschrieben. Leuchtet jetzt natürlich ein das es überflüssig ist.
    Es ist nicht überflüssig, es ist sehr gefährlicher Code, ob in C oder in Assembler. Wenn man nicht wirklich weiß, was man tut, sollte man weder in C noch in Assembler im Interrupthandler das Interrupt-Enable Bit anfassen.

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

Ähnliche Themen

  1. Atmega32u4 Timer 3 Probleme; PWM Probleme
    Von Mons im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 01.03.2014, 11:47
  2. probleme mit I2C
    Von {;} 2be im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 10.01.2007, 16:11
  3. [ERLEDIGT] TMR0-Problem
    Von michel f. im Forum PIC Controller
    Antworten: 8
    Letzter Beitrag: 15.11.2004, 08:27
  4. TMR0 auf 131 setzen
    Von D.Stolarek im Forum PIC Controller
    Antworten: 5
    Letzter Beitrag: 28.09.2004, 08:04
  5. Analogverarbeitung und TMR0 Interrupt am 12F675
    Von Steffen35 im Forum PIC Controller
    Antworten: 1
    Letzter Beitrag: 09.09.2004, 22:05

Berechtigungen

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