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
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
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.
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
lies doch erst mal bei sprut nach, wie das mit den Interrupts beim PIC geht http://sprut.de/electronic/pic/int/int.htm
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
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.