The right part of the window shows the program memory with addresses, raw memory data, and disassembled instructions. You can click the leftmost column to set and clear program breakpoints. The current intruction is highlighted in green color. The left part of the window shows (from top to bottom) the data memory, on-chip EEPROM memory, internal subroutine stack, and the current values of the four most important registers (work register, program-counter, status register, interrupt control). All special-function registers in the PIC architecture are directly memory-mapped into the data-memory. If you want to change the memory contents or a register value, just type-in new hex-values into the data memory.
However, note that the simulation runs very slowly while the PIC GUI window is open and enabled, because most of the processor time is spent redrawing the processor register and memory windows. Uncheck the 'update' checkbox to disable redrawing of the registers to watch the simulation at normal speed.
The speed of the nightrider animation depends on the wait loops in the PIC microcontroller program, whose limits were set during assembly. If the simulation runs too slow (or fast :-)), you can edit the assembly code and re-assemble, or open the microcontroller GUI and change the values of the wait loop initialization manually. The correspondingmovlw C8
instructions are
at program addresses 00F and 001
and load the value C8
first into the W register.
You can change those instructions to something like movlw 10
to reduce the wait counter initialization value,
which makes the animation much faster.
For reference, here is the original program:
;******************************************************************* ; walk.asm ; ; This code walks LEDs backwards and forwards on port b. ; Couldn't be simpler. ;******************************************************************* LIST P=16C84;f=inhx8m _CP_OFF equ H'3FFF' ;code protect off _PWRTE_ON equ H'3FFF' ;Power on timer on _WDT_OFF equ H'3FFB' ;watch dog timer off _XT_OSC equ H'3FFD' ;crystal oscillator __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC ;configure programmer directive w equ 0 ; register destination numbers. f equ 1 same equ 1 z equ 2 ; status flags zero equ 2 c equ 0 carry equ 0 count1 equ 0C ; wait counter ls digit file register C count2 equ 0D ; wait counter ms digit file register D portb equ 06 ; port b I/O register f6 porta equ 05 ; port a I/O register f5 status equ 03 ; status register f3 ; ; ; org 0 ; origin ; init movlw 0 tris portb ; set portb as outputs movwf portb ; set portb levels all low start bsf portb,0 ; set portb bit 0 high rot_L call wait ; wait for a bit bcf status,c ; clear carry bit rlf portb,same ; rotate left portb, store result portb btfss portb,7 ; skip next line if top bit set goto rot_L rot_R call wait ; wait for a bit bcf status,c ; clear carry bit rrf portb,same ; rotate right portb, store in portb btfss portb,0 ; skip next line if bottom bit set goto rot_R goto rot_L ; do it all again ; ---------------------------- ; wait subroutine ; ---------------------------- wait movlw .200 ; load count1 with decimal 200 movwf count1 d1 movlw .200 ; load count2 with decimal 200 movwf count2 ; shorten these for the simulator d2 decfsz count2,same ; decrement and skip next line if zero goto d2 ; if not zero decfsz count1 ; decrement count1 if count2 is zero goto d1 ; do inside loop again if count2 nz retlw 00 ; ---------------------------- ENDRun the applet | Run the editor (via Webstart)