![]() | ![]() |
DescriptionA first and very simple demonstration of our
PIC 16C84 microcontroller simulation model.
The program loaded into the microcontroller just drives a few LEDs
connected to its port B outputs in 'nightrider' fashion.
This design is also a very good start to play with a real
PIC16C84 microcontroller on a prototyping bread-board.
Just program the microcontroller with the
walk.hex file,
add some LEDs, and switch on the power!
If the applet seems to be running very slowly,
you might want to switch-off glow-mode in the Hades editor,
because the simulator performance will often be limited
by the frequent repaint requests to the clock signal.
Use the popup-menu (popup, edit-component) to open the microcontroller
user-interface and watch the program execution.
You can also edit the data and program memories while the simulation
is running.
The following image shows a screenshot of the PIC microcontroller
user-interface:
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
; ----------------------------
END
Run the applet | Run the editor (via Webstart)