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
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.
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?
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?
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.
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.
ich bring den Timer-Interrupt immer noch nicht zum auslösen. Hat niemand eine Idee?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.