Forum: Mikrocontroller und Digitale Elektronik PIC Interrupt auslösen


von SuperBastler (Gast)


Lesenswert?

Hey

Ich arbeite mit einem PIC 18F4685. An den Pins E0,1,2 sind jeweils 
Taster angeschlossen. Können die einen Interrupt auslösen? Soweit ich es 
kapiere, können es lediglich INT0,1,2 respektive RB0,1,2...

Gruß
Bastler

von Sascha (Gast)


Lesenswert?

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.

von SuperBastler (Gast)


Lesenswert?

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?

von SuperBastler (Gast)


Lesenswert?

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?

von SuperBastler (Gast)


Lesenswert?

niemand einen Rat?

von Sascha (Gast)


Lesenswert?

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.

von SuperBastler (Gast)


Lesenswert?

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

von Maik W. (werner01)


Lesenswert?

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!

von Maik W. (werner01)


Lesenswert?

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.

von SuperBastler (Gast)


Lesenswert?

ich bring den Timer-Interrupt immer noch nicht zum auslösen. Hat niemand 
eine Idee?

von Maik W. (werner01)


Lesenswert?

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!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.