wolf***
20.01.2007, 12:43
Ein Hallo an alle Experten,
ich will ein kleines Assembler - Programm schreiben und sehe den Fehler nicnt!
Es sollte mal ein Programm werden, welches durch jeden Interrupt eine beliebige Zeit aufaddiert. 1. Interrupt=5 Min., kommt in der Zeit der 2. Interrupt dann 10 Min.usw. Wie ein retriggerbares Mono-Flipflop.
Der RC Takt= 4,8kHz durch 4=1,2kHz für lange Zeiten.
Ich habe jetzt TEST Punkte eingebaut, so dass nur UP-timer2 PORTA,1 eine LED einschaltet, dann loop1 abarbeitet, dann die LED wieder ausschaltet und in l4 hängenbleibt.
Die LED blinkt, warum nur warum????? https://www.roboternetz.de/phpBB2/images/smiles/eusa_wall.gif
Brick wall
Ist die Zeitschleife falsch????
mfg wolf
list p=16f84a ;PIC type auswählen
;------------------------------------
;
; Pinbelegung
; ----------------------------------
; PORTA: 0 LED
; 1
; 2
; 3
; 4
; PORTB: 0 Eingang Interrupt
; 1
; 2
; 3
; 4
; 5
; 6
; 7
;----------------------------------
;Dr. Ver: 2.1 20.01.2007
;Interrupt
;Takt: RC
;0-1-Flanke an RB0 ändert LED an RA0
;-----------------------------------
;Includedatei für den 16f84 einbinden
#include <P16f84a.INC>
;Configuration festlegen
;4Mhz, Power On Timer, kein Watchdog, RC-Oszillator
;A C H T U N G : R C - O S Z I L L A T O R
__config _PWRTE_ON & _WDT_OFF & _RC_OSC
;-------------------------------
;init
;Variablennamen vergeben
s_copy equ 0x20
w_copy equ 0x21
verz equ 0x22
loop1 equ 0x23
loop2 equ 0x24
loop3 equ 0x25
;--------------------------------------------
org 0x00
goto Init ; Sprung zum Hauptprogramm
;-------------------------------------------------
; die Interuptserviceroutine
org 0x04
intvec
movwf w_copy ; w retten
swapf STATUS, w ; STATUS retten
movwf s_copy
;-----------------------------------------------------;
incf verz, f ; verz + 1
bsf PORTA,0 ;LED einschalten
;---------------------------------------------------------
Int_end
bcf INTCON, INTF ; 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
retfie
;------------------------------------------------------
; das Hauptprogramm
Init
beginn clrf verz ;verz aus
;-----------------------------------------------------
; Port RA0 auf Ausgabe stellen
bsf STATUS, RP0 ; auf Bank 1 umschalten
movlw B'11111100' ; PortA RA0+RA1= output
movwf TRISA
bcf STATUS, RP0 ; auf Bank 0 zurückschalten
bcf PORTA,0 ; LED aus
call time2 ;TEST TEST!
;-------------------------------------------------------
; RB0-Interrupt einstellen
bsf STATUS, RP0 ; auf Bank 1 umschalten
bsf OPTION_REG, INTEDG ; 0-1-Flanke an RB0
bcf STATUS, RP0 ; auf Bank 0 zurückschalten
;
bsf INTCON, INTE ; RB0-interupt erlauben
bsf INTCON, GIE ; Interupt generell erlauben
;------------------------------------------------------
; movlw 0x01
; movwf PORTA
; movlw 0x2
; movwf verz
;-------------------------------------------------------
m1 movf verz,f ;Verz=0, Z=1
btfsc STATUS,Z
goto m1 ;wenn Z=1
call time2 ;wenn Z=0
;----------------------------------------------
movf verz,f ;verz=0 dann Z=1
btfsc STATUS,Z ;
bcf PORTA,0 ;wenn Z=1, LED Aus
goto m1 ;wenn Z=0
;--------------------------------------------
time2 bsf PORTA,1 ;TEST TEST
time1 movlw d'1'
movwf loop3
l3 movlw d'1'
movwf loop2
l2 movlw d'2'
movwf loop1
l1 decfsz loop1,f
goto l1
bcf PORTA,1
l4 nop
goto l4 ;TEST TEST
decfsz loop2,f
goto l2
decfsz loop3,f
goto l3
decfsz verz,f
goto time1
Return
end
](*,) ](*,) ](*,) ](*,) ](*,)
ich will ein kleines Assembler - Programm schreiben und sehe den Fehler nicnt!
Es sollte mal ein Programm werden, welches durch jeden Interrupt eine beliebige Zeit aufaddiert. 1. Interrupt=5 Min., kommt in der Zeit der 2. Interrupt dann 10 Min.usw. Wie ein retriggerbares Mono-Flipflop.
Der RC Takt= 4,8kHz durch 4=1,2kHz für lange Zeiten.
Ich habe jetzt TEST Punkte eingebaut, so dass nur UP-timer2 PORTA,1 eine LED einschaltet, dann loop1 abarbeitet, dann die LED wieder ausschaltet und in l4 hängenbleibt.
Die LED blinkt, warum nur warum????? https://www.roboternetz.de/phpBB2/images/smiles/eusa_wall.gif
Brick wall
Ist die Zeitschleife falsch????
mfg wolf
list p=16f84a ;PIC type auswählen
;------------------------------------
;
; Pinbelegung
; ----------------------------------
; PORTA: 0 LED
; 1
; 2
; 3
; 4
; PORTB: 0 Eingang Interrupt
; 1
; 2
; 3
; 4
; 5
; 6
; 7
;----------------------------------
;Dr. Ver: 2.1 20.01.2007
;Interrupt
;Takt: RC
;0-1-Flanke an RB0 ändert LED an RA0
;-----------------------------------
;Includedatei für den 16f84 einbinden
#include <P16f84a.INC>
;Configuration festlegen
;4Mhz, Power On Timer, kein Watchdog, RC-Oszillator
;A C H T U N G : R C - O S Z I L L A T O R
__config _PWRTE_ON & _WDT_OFF & _RC_OSC
;-------------------------------
;init
;Variablennamen vergeben
s_copy equ 0x20
w_copy equ 0x21
verz equ 0x22
loop1 equ 0x23
loop2 equ 0x24
loop3 equ 0x25
;--------------------------------------------
org 0x00
goto Init ; Sprung zum Hauptprogramm
;-------------------------------------------------
; die Interuptserviceroutine
org 0x04
intvec
movwf w_copy ; w retten
swapf STATUS, w ; STATUS retten
movwf s_copy
;-----------------------------------------------------;
incf verz, f ; verz + 1
bsf PORTA,0 ;LED einschalten
;---------------------------------------------------------
Int_end
bcf INTCON, INTF ; 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
retfie
;------------------------------------------------------
; das Hauptprogramm
Init
beginn clrf verz ;verz aus
;-----------------------------------------------------
; Port RA0 auf Ausgabe stellen
bsf STATUS, RP0 ; auf Bank 1 umschalten
movlw B'11111100' ; PortA RA0+RA1= output
movwf TRISA
bcf STATUS, RP0 ; auf Bank 0 zurückschalten
bcf PORTA,0 ; LED aus
call time2 ;TEST TEST!
;-------------------------------------------------------
; RB0-Interrupt einstellen
bsf STATUS, RP0 ; auf Bank 1 umschalten
bsf OPTION_REG, INTEDG ; 0-1-Flanke an RB0
bcf STATUS, RP0 ; auf Bank 0 zurückschalten
;
bsf INTCON, INTE ; RB0-interupt erlauben
bsf INTCON, GIE ; Interupt generell erlauben
;------------------------------------------------------
; movlw 0x01
; movwf PORTA
; movlw 0x2
; movwf verz
;-------------------------------------------------------
m1 movf verz,f ;Verz=0, Z=1
btfsc STATUS,Z
goto m1 ;wenn Z=1
call time2 ;wenn Z=0
;----------------------------------------------
movf verz,f ;verz=0 dann Z=1
btfsc STATUS,Z ;
bcf PORTA,0 ;wenn Z=1, LED Aus
goto m1 ;wenn Z=0
;--------------------------------------------
time2 bsf PORTA,1 ;TEST TEST
time1 movlw d'1'
movwf loop3
l3 movlw d'1'
movwf loop2
l2 movlw d'2'
movwf loop1
l1 decfsz loop1,f
goto l1
bcf PORTA,1
l4 nop
goto l4 ;TEST TEST
decfsz loop2,f
goto l2
decfsz loop3,f
goto l3
decfsz verz,f
goto time1
Return
end
](*,) ](*,) ](*,) ](*,) ](*,)