PIC Interrupt auslösen

Gast
Taster direkt als Interruptquelle zu nutzen ist nicht sinnvoll, da man 
sie vorher per Hardware entprellen müsste. Frage die Taster in einem 
Timerinterrupt oder einem schon vorhandenen, regelmäßigen Interrupt ab 
und setze Flags, auf die das Hauptprogramm dann reagieren kann.
Gast
ok, ich richte also einen Timer gesteuerten Interrupt ein, der z.B. alle 
10tel Sekunde die Taster abfragt. Wenn der Taster aber gerade während 
der Abfrage "prellt" sodass er am Port als nicht gedrückt aufscheint, 
regiert die Abfrage nicht oder?
Gast
ok ich hab nun folgendes:

#pragma interrupt check
void check (){
   if(INTCONbits.TMR0IF==1){     //flag überprüfen
      if (led==1) led=0;
      else led=1;
      INTCONbits.TMR0IF=0;       //flag rücksetzen
   }
}


in der main funktion wird folgendes aufgerufen um die interrupts zu 
initialisieren:

void Interrupt_enable(){
  T0CON=0b10000111;     //TMR0 enable, prescaler 256
  INTCON=0b10100000;    //enable interrupts, enable TMR0 overflow 
interrupt
}

Ziel wäre es vorerst mal, die Led blinken zu lassen, tut sie aber noch 
nicht
PIC ist ein 18f4685 mit 25Mhz. Sieht jemand wo der Fehler liegt?
Gast
Ich hab jetzt die Speccs der Timer der 18F-Serie nicht im Kopf, aber 
wenn TMR0 immernoch ein 8bit-Timer ist, dann blinkt die LED schon, nur 
viel zu schnell um es zu sehen. Falls du ein Oszi hast, halt es mal an 
den LED-Ausgang dran.
Gast
ne, TMR0 ist als 16 bit Timer eingestellt. Ich kann den Timer auch 
auslesen, ebenfalls das INTCONbits.TMR0IF bit wird bei Überlaufen 
gesetzt. Nur eben der Interrupt wird nicht ausgelöst
Servus alle,

also das mit den Tasten entprellen mach ich so:
interupptfähigen Eingang nehmen ,
in Interruptroutine nen Teimer starten und wieder weiter im Programm,
Interrupt vom teimer abwarten und jetzt die gewünschte Funktion 
ausführen.

Mit der Variante verbraucht man sehr wenig Rechenzeit, weil man die 
Peripherie ja Stark parallel nutzt.

Ist nur ein Vorschlag!
mist jetzt hab ich aber ein wenig umständlich beschrieben. man braucht 
natürlich keinen interrupt für den Taster der den Timer Startet.

Aber im Interuppt die entsprechenden Ports abfragen.

PS: ich mach bei ner Tastenabfrage einfach immer 50µs Pause bei 
Matrixtastatur. Und das geht sehr gut! ist so einfacher und mit dem 
Timer eleganter.
also interupptvektoren hast du auch frei gelassen, also org 100 fürs 
normale Programm?
also GIE,TMR0IE und TMROIP müssen auf 1 stehen, dann springt er bei 
Überlauf zu 008. das jetzt selber auszuprobieren hab ich aber kein Bock.
TMR0=1100XXXX. das muss funzen!

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.