Binäres Zählen im Sekundentakt
processor pic16f877a
include p16f877.inc
__config _HS_OSC & _WDT_OFF & _PWRTE_ON
ZAEHL1 equ 0x20 ; Hilfsvariable für Warte-Routine
ZAEHL2 equ 0x21 ; Hilfsvariable für Warte-Routine
ZAEHL3 equ 0x22 ; Hilfsvariable für Warte-Routine
org 0x00
RESET: clrf STATUS
movlw 0x00
movwf PCLATH
goto main
org 0x10
;-----------------------------------------------
;Warte-Routine 1,000537 ms bei 8,867238 MHz
wait1ms: movlw d'223'
movwf ZAEHL1
movlw d'3'
movwf ZAEHL2
tloop1ms decfsz ZAEHL1
goto tloop1ms
decfsz ZAEHL2
goto tloop1ms
return
;------------------------------------------------
;Warte-Routine 1,000001 s bei 8,867238 MHz
wait1s: movlw d'239'
movwf ZAEHL1
movlw d'63'
movwf ZAEHL2
movlw d'12'
movwf ZAEHL3
tloop1s decfsz ZAEHL1
goto tloop1s
decfsz ZAEHL2
goto tloop1s
decfsz ZAEHL3
goto tloop1s
return
;------------------------------------------------
main:
;Port-Setup
bsf STATUS,5 ; wechsle zu Bank1
movlw b'00000000' ; setze Port B, Bit 0-7
movwf TRISB ; als Ausgang
bcf STATUS,5 ; wieder in Bank 0 wechseln
;Port auf 0
movlw 0x0
movwf PORTB
;Zählschleife
start:
;warten
call wait1s
;Port B hochzählen
incf PORTB
;Sprung zum Start
goto start
end
In diesem Programm wird eine hochpräzise Warte-Routine verwendet, die mit Hilfe der Debugger-Stoppuhr kalibriert wurde.
Eigene Wartezeiten kann man durch entsprechende Vorbelegung der Register ZAEHL1, ZAEHL2, ZAEHL3 erreichen.
Neu in diesem Programm:
include (p16f877.inc),
call, return,
Konfiguration des PIC mit __config.
Die angeführten Links führen zu dem
Assembler-Kurs von Jörg Bredendiek.