www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC16F84 RB5 Interrupt


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Thomas M. (Gast)
Datum:
Angehängte Dateien:

Diesen Beitrag bewerten:
lesenswert
nicht 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

Autor: M. John (manfred-64)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hi,

schau Dir doch mal die von Microchip gelieferten Templates an. Vor allem 
musst Du deinen Interrupt auch in dessen Vektor legen, beim 16F84 ist 
das 0x004

ORG     0x000             ; processor reset vector
goto    main              ; go to beginning of program


ORG     0x004             ; interrupt vector location

Autor: M. John (manfred-64)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Kein Name (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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

Autor: bingo (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
lies doch erst mal bei sprut nach, wie das mit den Interrupts beim PIC 
geht http://sprut.de/electronic/pic/int/int.htm

Autor: Ottmar K. (wil1)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net