Interrupt und Portabfrage mit PIC

Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 06 10 2024  21:28:41      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Osziloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Microcontroller        Microcontroller : Hardware - Software - Ideen - Projekte


Autor
Interrupt und Portabfrage mit PIC
Suche nach: pic (2055)

    







BID = 447204

derDavid

Gerade angekommen


Beiträge: 6
Wohnort: Jülich
 

  


Hallo,

bei der Programmierung eines PIC16F690 ist bei mir folgendes Problem aufgetreten:

Ich möchte mehrere bedingte Sprünge, abhängig von digitalen Porteingängen einrichten. Das funktioniert auch soweit und wurde folgendermaßen gelöst:

btfsc PORTA, 4 ; überspringe nächst Befehl wenn RA4=0
goto CW ; Sprung -> LED an
goto ManuClock
CW
bsf PORTC,0 ; Hau die Lampe an
goto ManuClock

Ich frage also einen Taster mittels zuvor als digitalen Eingang deklarierten Ports ab und schalte zur Überprüfung eine LED an.

Nun möchte ich Ports aber innerhalb eines Interrupts abfragen. Die Interruptroutine funktioniert. Auch die Ausgabe über PORTC innerhalb des Interrupts. Allerdings nicht abhängig von der Tasterabfrage.

Kann ich innerhalb eines Interrupts Ports abfragen?
So habe ich es versucht:

IntStart
movwf w_copy ; w retten
swapf STATUS, w ; STATUS retten
bcf STATUS, RP0 ; Bank 0
movwf s_copy
Abfrage
btfsc PORTA, 4 ; überspringe nächst Befehl wenn RA4=0
goto CCW ; Sprung -> LED an
goto ManuClock
CW
bsf PORTC,0 ; Hau die Lampe an
goto ManuClock
...
...
...
IntEnd
bcf INTCON, T0IF ; Interupt-Flag löschen
swapf s_copy, w ; STATUS zurück
movwf STATUS
swapf w_copy, f ; w zurück mit flags
swapf w_copy, w

retfie

Hat jemand ne Idee was da nicht stimmen könnte? Ich hab gestern den ganzen Tag rumprobiert und bin ein wenig verzweifelt.

Bin dankbar für alle Idee!

BID = 447208

Racingsascha

Schreibmaschine



Beiträge: 2247
Wohnort: Gundelsheim
ICQ Status  

 

  


Zitat :
IntStart
[...]
goto ManuClock
Ports innerhalb der Interrupt Sevice Routine abfragen ist kein Problem. Wenn ManuClock allerdings außerhalb der ISR steht, kannst du nicht direkt dorthin springen. Du könntest am Ende der ISR eine Zahl in ein Register schreiben, und dann vom Hauptprogramm ab und zu mal nachkucken lassen was da steht, denn es weiß ja nicht ob zwischendurch mal ein Interrupot stattgefunden hat. Wenn eine gewisse Zahl drinsteht, wird zu ManuClock gesprungen. Man könnte auch jedes Bit in diesem Register zu einem "Flag" machen die das Programm abfrägt.

_________________
Fnord ist die Quelle aller Nullbits in deinem Computer.
Fnord ist die Angst, die Erleichterung, und ist die Angst.
Fnord schläft nie.

BID = 447215

derDavid

Gerade angekommen


Beiträge: 6
Wohnort: Jülich

Danke Sascha für die schnelle Antwort.

ManuClock liegt allerdings auch innerhalb der ISR und ist auch nicht so wichtig da PORTC,0 direkt in CW gesetzt wird.
Der Befehl "goto CW" wird allerdings in der ISR immer übersprungen, egal was an PORTA,4 anliegt.

btfsc PORTA,4 ; überspringe nächst Befehl wenn RA4=0
goto CW ; Sprung -> LED an
goto irgenwoanders(innerhalbISR)
CW
bsf PORTC,0 ; Hau die Lampe an


Der Interrupt wird durch den Timer0 im 8Hz Takt ausgelöst. Innerhalb der ISR soll der Port abgefragt werden und die LED angeschaltet werden. Im nächsten Interrupt wird sie wieder ausgeschaltet. Die LED soll also blinken solange ich den Taster gedrückt halte.

Ohne Abfrage funtioniert das, nicht aber abhängig davon.

Du sagt:
"Ports innerhalb der Interrupt Sevice Routine abfragen ist kein Problem."
Genau das ist mein Problem.

BID = 447245

stepp64

Gesprächig


Avatar auf
fremdem Server !
Hochladen oder
per Mail an Admin

Beiträge: 162

Hallo,

grundsätzlich funktioniert das schon so, wie du es programmiert hast. Allerdings wird die LED immer an sein, solange du den Taster betätigst (sofern der Taster HIGH-aktiv ist) oder halt immer aus, wenn der Taster LOW-aktiv ist. Aus deinem Programm geht ja nicht hervor, wo du die LED wieder zurückschaltest.

Es könnte aber auch noch daran liegen, dass du den RA4 falsch initialisiert hast. RA4 ist nach dem Einschalten ein Analogeingang! Um ihn digital nutzen zu können muss er im Register ANSEL auf 0 gesetzt werden!

Poste doch mal das ganze Prog. eventuell findet sich ja was.

Gruß
Sven

BID = 447691

derDavid

Gerade angekommen


Beiträge: 6
Wohnort: Jülich

Hallo,

vielen Dank erstmal für die Tips. Mittlerweile funktioniert das Programm. ich weiß zwar nicht woran es lag, aber egal.

wen´s interessiert, hier nochmal der programmtext.

Funktion:
im 8Hz takt wird innerhalb eines interrupt ein taster abgefragt, und davon abhängig eine LED zum blinken gebracht.



#include <p16F690.inc>
__config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)

w_copy equ 0x20 ; Backup für Akkuregister
s_copy equ 0x21 ; Backup für Statusregister
anaus equ 0x22 ; Status der LED

org 0
nop
goto Init
org 04 ; Einsprungadresse Interrupt
goto IntStart
org 05 ; ohne diese Zeitel kommt die Fehlermeldung:
; Error - section '.org_1' can not fit the absolute section.
; Section '.org_1' start=0x00000004, length=0x00000056

; *************** Initialisierungen ********************************
Init
bsf STATUS,RP0 ; Bank 1
movlw 0xFF
movwf TRISA ; PortA input
clrf TRISC ; PortC output

bcf STATUS,RP0 ; Bank 2
bsf STATUS,RP1
movlw 0x00 ; PortA digital
movwf ANSEL
bcf STATUS,RP0 ; Bank 0
bcf STATUS,RP1

;**************** Timer-Interupt einstellen ******************************

bsf STATUS, RP0 ; auf Bank 1 umschalten
movlw B'10000111' ; internen Takt zählen, Vorteiler zum Timer0, 32:1
movwf OPTION_REG
bcf STATUS, RP0 ; auf Bank 0 zurückschalten
clrf TMR0 ; ((32,768 kHz : 32 ): 256 = 8 Hz) ?

bsf INTCON, T0IE ; Timer0 interupt erlauben
bsf INTCON, GIE ; Interupt erlauben

loop
nop
goto loop

;************ Interrupt Einsprung *************************************
IntStart
movwf w_copy ; w retten
swapf STATUS, w ; STATUS retten
bcf STATUS, RP0 ; Bank 0
movwf s_copy ;

;************* Interrupt-Routine **************************************

btfsc PORTA, 5 ; RA5 = 0 (0V) -> überspringe nächsten Befehl
goto LED_AN ; lass die LED blinken

goto LED_AUS

LED_AN
btfsc anaus, 1 ; LED beim letzten Interrupt schon an?
goto LED_AUS

movlw 0x04 ; LED an
movwf PORTC

movlw 0x02 ; setze Status auf an
movwf anaus

goto IntEnd

LED_AUS
clrf PORTC ; LED aus
clrf anaus ; setze Status auf aus
goto IntEnd

IntEnd
bcf INTCON, T0IF ; Interupt-Flag löschen
swapf s_copy, w ; STATUS zurück
movwf STATUS
swapf w_copy, f ; w zurück mit flags
swapf w_copy, w

retfie

end

BID = 447693

Ltof

Inventar



Beiträge: 9324
Wohnort: Hommingberg


Zitat :
derDavid hat am  3 Aug 2007 14:04 geschrieben :

...ich weiß zwar nicht woran es lag...

Kontaktprellen?

_________________
„Schreibe nichts der Böswilligkeit zu, was durch Dummheit hinreichend erklärbar ist.“
(Hanlon’s Razor)

[ Diese Nachricht wurde geändert von: Ltof am  3 Aug 2007 14:12 ]

BID = 447707

derDavid

Gerade angekommen


Beiträge: 6
Wohnort: Jülich

Dürfte bei gedrückthalten des Tasters und 8 Abfragen pro Sekunge kein Problem sein oder?


Zurück zur Seite 1 im Unterforum          Vorheriges Thema Nächstes Thema 


Zum Ersatzteileshop


Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum       Datenschutz       Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland       

gerechnet auf die letzten 30 Tage haben wir 19 Beiträge im Durchschnitt pro Tag       heute wurden bisher 4 Beiträge verfasst
© x sparkkelsputz        Besucher : 182136549   Heute : 4923    Gestern : 5445    Online : 762        6.10.2024    21:28
4 Besucher in den letzten 60 Sekunden        alle 15.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.028883934021