PIC16F88 06 TMR0IF Polling |
|
This program uses the shoestring programmer to flash the LED at 10Hz, accurately timed. If necessary, remember to power the board from the USB cable.
It uses XORWF, not mentioned in the WJEC/Eduqas sample assessment material. XOR is useful for inverting selected bits and leaving others unchanged.
Here is the measured 10.08 Hz, less than 1% out.
; PIC16F88 Configuration Bit Settings ; CONFIG1 and CONFIG2 #include "p16F88.inc" __CONFIG _CONFIG1, _FOSC_INTOSCIO & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _BOREN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF & _CCPMX_RB0 & _CP_OFF __CONFIG _CONFIG2, _FCMEN_ON & _IESO_ON RES_VECT CODE 0x0000 ; processor reset to vector address zero GOTO START ; go to beginning of program MAIN_PROG CODE ; let linker place main program START: ; INITIALISATION bcf STATUS, RP0 ; Select bank 0. movlw b'00000000' ; Clear PORTA and PORTB (Never leave this to chance) movwf PORTA movwf PORTB bsf STATUS, RP0 ; Select bank 1. movlw b'00000000' ; Set all port pins to output / Disable ADC / Set for digital i/o movwf ADCON1 ; Disble ADC module (Never leave this to chance) movwf ANSEL ; Set analog i/o for digital i/o (Never leave this to chance) movwf TRISA ; Set porta for output - RA5 is input only so this bit is ignored movwf TRISB ; Set portb for output ; SET CLOCK TO 4 MHz or One Instruction per Microsecond movlw b'01100000' ; <<<< Set Oscillator to 4 MHz or movwf OSCCON ; <<<< one microsecond per line of code. CLRWDT ; Clear the Watchdog Timer and prescaler movlw b'00000111' ; 1:256 prescaler for a delay of: (insruction-cycle * 256-counts)*prescaler = ((1uS * 256)*256) =~ 65.5 mS ; ----0--- means the prescaler is assigned to Timer0 ; -----111 means the prescaler is set to 1:256 movwf OPTION_REG ; The prescaler settings are stored here bcf STATUS, RP0 ; Select bank 0. PollingLoop: NOP NOP ; Do a whole lot more work here. But the timed event might happen late. NOP btfss INTCON, TMR0IF ; did TMR0 roll over yet? goto PollingLoop ; NO - Go back and repeat the PollingLoop. bcf INTCON, TMR0IF ; YES - Remember to clear the TMR0IF flag MOVLW d'61' ; 61 was calculated to get 10 Hz Flash from the LED MOVWF TMR0 ; TMR0 now counts from 61 to 256 before setting the timer flag ; 1 us * (256 - 61) * 256 = 49.9 ms =~50 ms MOVLW 0xFF ; XOR with b'11111111' inverts all the bits (except RA5 which is input only) XORWF PORTA ; Invert PORTA 50 ms ON time plus 50 ms OFF time XORWF PORTB ; Invert PORTB Period = 50 + 50 = 100 ms Freq = 10 Hz GOTO PollingLoop ; continue forever end
Contact, Copyright, Cookies and Legalities: C Neil Bauers - reviseOmatic V4 - © 2016/17
Hosted at linode.com - London
Please report website problems to Neil