Gast
#22399
Also hier ist erst mal der assembler code für den PIC16f84 , unten sag
ich was da nicht so richtig geht :
um es besser lesen zu können am besten in einen Assembler-Tool kopieren
list p=16f84
;**************************************************************
;*
;* Pinbelegung
;* ----------------------------------
;* PORTA: 0
;* 1
;* 2
;* 3
;* 4
;* PORTB: 0 LED
;* 1
;* 2 LED
;* 3
;* 4
;* 5
;* 6
;* 7
;*
;*********** Beschreibung ********************************
;
; 2 blinkende LEDs die eine wird durch ein LED zum blinken gebracht und
; in der Interrupbehandlungsroutine gibt es eine Verzögerung
;
;
; Taktquelle: 4MHz
;
;**************************************************************
; Includedatei für den 16F84 einbinden
;
#include <P16f84.INC>
;
; Configuration festlegen
;
; bis 4 MHz: Power on Timer, kein Watchdog, XT-Oscillator
__CONFIG _PWRTE_ON & _WDT_OFF & _XT_OSC
;
;**************************************************************
; Variablennamen vergeben
loops Equ 0x22 ; Zähler für Warteschleife
loops2 Equ 0x23 ; Zähler für Warteschleife
invert Equ 0x24
w_copy Equ 0x25
s_copy Equ 0x26
invertA Equ 0x27
MAinvert Equ 0x28
;**************************************************************
; los gehts mit dem Programm
org 0x00
goto Init ; Sprung zum Hauptprogramm
;**************************************************************
; die Interuptserviceroutine
org 0x04
intvec
bcf INTCON, GIE ; Interrups micht zulassen
movwf w_copy ; w retten
swapf STATUS, w ; STATUS retten
movwf s_copy
;-------------------------------------------------------------
btfsc MAinvert,0 ; schauen ob MAinvert 1 ist dann
bsf PORTB,2 ; LED an an RB2 an
btfss MAinvert,0 ; schauen ob MAinvert 0 ist dann
bcf PORTB,2 ; LED an an RB2 aus
comf MAinvert,1 ; invertieren von MAinvert
call Wait ; Springen zur warte schleife
;======== Timerladen =========
; MOVLW D'250' ; Timer neu laden
; MOVWF TMR0 ; immernoch Timer neu laden
;-------------------------------------------------------------
Int_end
; bcf INTCON, T0IE ; RB0-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
bcf INTCON, T0IF ; Timeüberlauf flag löschen
bsf INTCON, GIE ; Interrups zulassen
retfie ; aus der interrupgehandlung wieder
zurückspringen
;===================== Hauptprogramm =========================
Init
bsf STATUS, RP0 ; auf Bank 1 umschalten
movlw B'00000000' ; PortB alle output
movwf TRISB
movlw B'00000111'
movwf OPTION_REG ; Vorteiler auf 256 setzen
bcf STATUS, RP0 ; auf Bank 0 zurückschalten
clrf PORTB ; PORTB ausschalten
bsf INTCON, T0IE ; durch Timerüberlauf Interrup zulassen
bsf INTCON, GIE ; Interrups zulassen
; -------- endlos Schleife -------
Loop
call Wait ; Springen zur warte schleife
call inver ; spring in die LED invertierteil
; btfsc INTCON,T0IF
; bsf PORTB,3 ;aktion 1
; btfss INTCON,T0IF
; bcf PORTB,3 ;aktion 2
; btfsc INTCON,T0IF
; bcf INTCON,T0IF
goto Loop
;---------------------------------------------------------
inver
btfsc invertA,0 ; schauen ob invertA 1 ist dann
bsf PORTB,0 ; LED an an RB0 an
btfss invertA,0 ; schauen ob invertA 0 ist dann
bcf PORTB,0 ; LED an an RB0 aus
comf invertA, F ; invertA invertieren
retlw 0
;**********************************************************
; Warteschleife 250 ms
Wait
movlw D'250' ; 250 ms Pause
movwf loops
Wai
movlw D'100' ; Zeitkonstante für 1ms
movwf loops2
Wai2 nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
decfsz loops2, F ; 1 ms vorbei?
goto Wai2 ; nein, noch nicht
;
decfsz loops, F ; 250 ms vorbei?
goto Wai ; nein, noch nicht
retlw 0 ; das Warten hat ein Ende
end
So also das Problem ist, es wird nur die interruproutin abgearbeitet.
Das hab ich mir so gedacht weil die LED an RB0 nicht blinkt.
Wäre nett wenn mir jemand helfen kann (ich häng schon extrem lang an dem
Problem und als Anfänger ist das voll deprie :(
gruß Tim