PIC16F84 RB5 Interrupt

Gast #2644547
Lesenswert?

Hallo,

Ich habe hier ein kleines Entwicklungsboard.
Möchte aber gerne an RB5 ein Interrupt durch Flanken wechsel über einen 
Taster auslösen.

Leider komme ich der Lösung nicht umbedingt näher.
Wollte also fragen ob mir vllt jemand helfen kann.

Hab die assembler Datei einfach mal angehängt.


Zur Info:
- Es handelt sich um ein durch meine Firma entwickeltes Board
- Nein möchte nicht in C Programmieren ...


Bin für jede Hilfe dankbar.

Gruß Thomas
Angehängte Dateien:
#2644835
Lesenswert?

Ups hab da, weil auskommentiert, was übersehen :/

Was mir (nach etwas genauerer Betrachtung) auffällt ist Du machst einen 
CALL im Interrupt und dann in diesem NUR einen RETFIE. Da bleiben noch 
ne "Leiche" auf dem Stack! da der CALL nicht mit einem RETURN beendet 
wird.


Präzisiere doch mal bitte Dein Problem. Was läuft nicht, welche 
Fehler(meldungen) treten auf.
Gast #2644838
Lesenswert?

Das "ORG 0x004 Call  LED_an" ... "retfie" wird so nicht klappen.

Besser wäre

ORG       0x004

movwf   w_temp
swapf   STATUS,w
movwf   status_temp

call interruptverarbeitung //endet mit normalem return

bcf    INTCON, INTF

swapf   status_temp,w
movwf   STATUS
swapf   w_temp,f
swapf   w_temp,w
retfie
#2645371
Lesenswert?

Hallo Thomas,

...aller Anfang ist schwer :-), es müßte ja nicht gerade Einschalten per 
Interrupt sein...

Wie hast Du die LEDs geschaltet? Wohl vom PIN mittels Vorwiderstand nach 
+5V? Dann musst Du aber die Ausgänge an PORTB zum Einschalten der LEDs 
auf Low (0) setzen. Bei H also logisch 1 wären die LEDs dann AUS.

Bitte strukturiere Dein Programm, damit machst Du Dir vieles leichter! 
Nimm doch einfach eines der mitgelieferten Beispiele.

Im Pfad "MPLAB\MPASM Suite\Template\Code\16F84ATEMP.ASM" findest Du ein
gutes "Gerüst für künftige Projekte

Du kannst auf keinen Fall INTCON,RBIE (Bit3), bzw. das Flag RBIF - 
Interrupt on Change PORTB - verwenden! Jeder Wechsel an irgendeinem 
PORTB-Pin würde einen Interrupt auslösen. Für Deinen Zweck ist nur Pin 
RB0/INT geeignet (wenn auch für einen Taster, wegen des Prellens, nicht 
gerade empfehlenswert!).

Angenommen Du möchtest an RB0 einen Impuls, sei es per Signal oder 
meinetwegen auch mit Taster anlegen, dann kannst Du mit dem Wechsel der 
Signalflanken einen Interrupt auslösen.

Konfiguriert wird dieser Interrupt so (schau dazu auch ins Datenblatt):
INTCON,INTE (Bit4)=1
OPTION_REG, INTEDG 1 oder 0 bestimmen ob der Interrupt mit steigender 
oder fallender Flanke ausgelöst werden soll.
INTCON,INTF = 1 signalisiert dass der Interrupt ausgelöst wurde und muss 
zu Beginn der ISR auf 0 gesetzt werden um die Auslösung von Interrupts 
während Ausführung der ISR zu verhindern.
Du kannst Deinen Prozessor mit SLEEP in den Tiefschlaf schicken, der 
nächste Tastendruck lässt ihn dann sofort aufwachen und die ISR 
ausführen.

Mein Tip zum Testen:

Verwendest Du MPLAB? Wenn ja, dann aktiviere bitte unter "View" WATCH. 
Damit kannst Du alle PORTS und Register überwachen.

Dann gehst Du einen Schritt weiter und lädst noch unter "Debugger" den 
"STIMULIS" hinzu -> New Workbook. Mit diesem kannst Du die Portpins 
beeinflussen, also auch Deinen "Taster" virtuell betätigen.

Klicke dazu in das Feld direkt unter der Spalte Pin/SFR,
wähle dort RB0
Klicke unter "Action",
Wähle PULSE LOW
Comments: Interrupt RB0 mit neg/pos Flanke.
Dann mit "APPLY" die Funktion zum Testen hinzufügen.

Es gibt im Netz hierzu auch noch ausführlichere Tutorials, google 
einfach danach.
Den Tip zur Seite von SPRUT brauche ich nicht zu wiederholen. Mit dieser 
Seite hat sich für mich die Welt der PICs geöffnet!

mfG Ottmar

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren