Hier nochmal die richtige Version.
Code:
;*************************************
;
; Includedatei für den PIC16F628A
list p=16f628a
include "p16f628a.inc"
;*************************************
; Configuration festlegen
; 8Mhz Resonator: Brown out Reset on, Data Protection off, Power up Timer on, Watchdog off, LV-Programmierung off
__CONFIG _BODEN_ON & _CP_OFF & _DATA_CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_OFF & _HS_OSC & _LVP_OFF
;***** VARIABLEN******************
w_temp EQU 0x70 ; context saving
status_temp EQU 0x71 ; context saving
Flags equ H'0072' ;
count equ H'0020'
tempa equ H'0021'
tweek equ H'0022'
;*********************************
; Pinfunktion festlegen
org 0x0000 ;Programmstart
goto INIT
org 0x004 ; Interruptbehandlung
INTSERV movwf w_temp ; W register retten
movf STATUS,w ; status register nach W register
movwf status_temp ; STATUS register retten
bcf STATUS,RP0 ; Bank0
bcf STATUS,RP1
; hier kommt später Code hin
; für eventuelle Interrupts
IntEnd movf status_temp,w ; STATUS register
movwf STATUS ; wieder herstellen
swapf w_temp,f
swapf w_temp,w ; W register wieder herstellen
; ( Inhalt wie vor Interrupt)
retfie ; Rücksprung aus Interruptbehandlung
;****************************************************************
INIT clrf INTCON ; keine Interrupts zulassen
bcf STATUS,IRP
bcf STATUS,RP0
bcf STATUS,RP1 ; Bank0
movlw 0x07 ;Comperators off
movwf CMCON ;I/O Funktion ermöglichen
clrf PORTA
clrf PORTB ; alle Ausgänge Low
BCF STATUS, RP1 ;Bank 1 auswählen
BSF STATUS, RP0
movlw 0x3F ;Pins config
movwf TRISA ;PORTA 0-5 Input
movlw 0x00 ;PortB Output
movwf TRISB
bcf STATUS, RP0 ;Bank 0 auswählen
; hier bei Bedarf andere Register
; für Timer,CCP,EEprom,Usart,Vref
; initialisieren
;***********************************************
;Taster abfragen , Led ausgeben
;Hier steht das eigentliche Programm
;
Start btfss PORTA,0 ; "überspringe nächsten Befehl,wenn Taster nicht gedrückt
goto LedAn
bcf PORTB,0 ; Led aus
;andere Aufgaben hier
goto Start
LedAn bsf PORTB,0 ; Led an
goto Start
;**********SUB _Routinen*************************
DEL1MS movlw D'198' ;t=(n-1)*5+2(call)+6(ret)+7(Kopf)
movwf count
nop
goto $+1
goto $+1
DLY1MS goto $+1
decfsz count,f
goto DLY1MS
return
DEL200MS movlw D'199'
movwf tempa
DLY200 call DEL1MS
decfsz tempa,f
goto DLY200
movlw D'132'
movwf count
TWEEK200 decfsz count,f
goto TWEEK200
nop
return
DELAY500 movlw D'250'
movwf tempa
DLY500 call DEL1MS
decfsz tempa,f
goto DLY500
movlw D'64'
movwf tweek
TWEEK500 decfsz tweek,f
goto TWEEK500
movlw D'250'
movwf tempa
DLY501 call DEL1MS
decfsz tempa,f
goto DLY501
movlw D'64'
movwf tweek
TWEEK501 decfsz tweek,f
goto TWEEK501
return
end
Die Delay-Zeiten sind für 8Mhz angepasst, kann man
immer wieder mal gebrauchen.
Ansonsten hat das Programm bei mir im Simulator(MPLAB)
funktioniert.
Viel Erfolg!
Digger
Lesezeichen