![]()  | 
			|||
| 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.