HSG |
|
STATUS equ 0x03 PCLATH equ 0x0a PORTB equ 0x06 ZAEHL1 equ 0x20 ZAEHL2 equ 0x21 TRISB equ 0x06 ;Adresse des Tristate-Registers für Port B in Bank 1 org 0x00 RESET: clrf STATUS movlw 0x00 movwf PCLATH goto main org 0x10 main: ;Port-Setup bsf STATUS,5 ; wechsle zu Bank1 movlw b'11111110' ; setze Port B, Bit 0 movwf TRISB ; als Ausgang, Bit 1-7 als Eingang bcf STATUS,5 ; wieder in Bank 0 wechseln ;LED anschalten start: movlw 0x01 movwf PORTB ;Warteschleife loop1 decfsz ZAEHL1 goto loop1 decfsz ZAEHL2 goto loop1 ;LED ausschalten movlw 0x0 movwf PORTB ;Warteschleife loop2 decfsz ZAEHL1 goto loop2 decfsz ZAEHL2 goto loop2 ;Sprung zum Start goto start end
Mit diesem Programm sollen einige 'Pseudo-Befehle' (wie equ, org, end), die Bankumschaltung, einige Assemblerbefehle (clrf, movlw, movwf, goto, bsf, bcf, decfsz) erlernt werden. Die angeführten Links führen zu dem Assembler-Kurs von Jörg Bredendiek.
Die Warteschleife im Programm soll nun näher betrachtet werden:
Nachdem mit der rechten Maustaste ein Breakpoint gesetzt und die Stoppuhr mit Debugger/Stopwatch eingeschaltet wurde, ergab die Messung rund 178 ms für die Periodendauer des Blinkens. Ein Nachmessen der realen Periodendauer mit dem Oszilloskop (3% Fehler) ergab 178 ms. Wir wollen versuchen, das nachzurechnen: Jeder Befehl benötigt ein 'instruction cycle' mit Ausnahme der Befehle, die den PC verändern, wie z.B. ein 'goto', die 2 'cycles' benötigen. Wenn das Register ZAEHL1 zu Beginn den Inhalt 0 hat, so muss man es 256-mal dekrementieren, um wieder zu 0 zu kommen. Dabei wird 255-mal der goto-Befehl ausgeführt und einmal der skip-Befehl als Folge des 'Nullwerdens' von ZAEHL1. Das ergibt 255*(1+2)+2=767 cycles. Jetzt wird das Register ZAEHL2 dekrementiert und anschließend wieder zur Dekrementierung von Register ZAEHL1 gesprungen, das sind 3 cycles zusätzlich. Insgesamt also 770 cycles, die 255-mal durchlaufen werden, bis ein letztes Mal ZAEHL1 in 767 cycles heruntergezählt wird, dann wird ZAEHL2 auch zu 0 und es erfolgt der skip. Es sind insgesamt also 255*770+767+2=197119 cycles in der Warteschleife vergangen. Eine Periodendauer errechnet sich dann zu 2+197119+2+197119+2=394244 cycles. Ein 'instruction cycle' dauert 1/8,867238 * 4 s = 0,451098752*10-6s. Damit errechnet sich die Periodendauer zu 177,8429766 s.