PDA

View Full Version : 50mS counter on Timer0 (18F4550 on Lab X1)



Demon
- 16th April 2015, 03:07
7795


'************************************************* **************************
'* Name : RHTimer0.pbp *
'* Author : Demon *
'* Date : Apr 15 2015 *
'* Version : 1.0 *
'* Notes : 50mS counter on Timer0 *
'* Hardware : PIC 18F4550, 20mhz crystal *
'* MeLabs U2 Programmer v4.32 *
'* Lab X1 board *
'* Software : PIC Basic Pro v2.60C *
'* MicroCode Studio Plus v2.2.1.1 *
'* MPASM v5.46 *
'************************************************* **************************
'--- if you use these, you must comment the ones in the .inc file ---
@ __CONFIG _CONFIG1L, _PLLDIV_5_1L & _CPUDIV_OSC1_PLL2_1L & _USBDIV_2_1L
@ __CONFIG _CONFIG1H, _FOSC_HSPLL_HS_1H
@ __CONFIG _CONFIG2L, _PWRT_OFF_2L & _BOR_ON_2L & _BORV_1_2L & _VREGEN_ON_2L
@ __CONFIG _CONFIG2H, _WDT_OFF_2H
@ __CONFIG _CONFIG3H, _CCP2MX_ON_3H & _PBADEN_OFF_3H & _LPT1OSC_OFF_3H & _MCLRE_ON_3H
@ __CONFIG _CONFIG4L, _STVREN_ON_4L & _LVP_OFF_4L & _ICPRT_OFF_4L & _XINST_OFF_4L

;--- Oscillator speed ----------------------------------------------------------

DEFINE OSC 48

;--- Setup Registers -----------------------------------------------------------

ADCON1 = %00001111 ' A/D CONTROL REGISTER 1
' Bit 7-6 Unimplemented: Read as ‘0’
' Bit 5 VCFG1: Voltage Reference Configuration bit (VREF- source)
' 1 = VREF- (AN2)
' 0 = VSS
' Bit 4 VCFG0: Voltage Reference Configuration bit (VREF+ source)
' 1 = VREF+ (AN3)
' 0 = VDD
' Bit 3-0 PCFG3:PCFG0: A/D Port Configuration Control bits:
' 1111 = All digital on Port A
' See datasheet for table

INTCON2 = %00000000 ' INTERRUPT CONTROL REGISTER 2
' Bit 7 RBPU: PORTB Pull-up Enable bit
' 1 = All PORTB pull-ups are disabled
' 0 = PORTB pull-ups are enabled by individual port latch values
' Bit 6 INTEDG0: External Interrupt 0 Edge Select bit
' 1 = Interrupt on rising edge
' 0 = Interrupt on falling edge
' Bit 5 INTEDG1: External Interrupt 1 Edge Select bit
' 1 = Interrupt on rising edge
' 0 = Interrupt on falling edge
' Bit 4 INTEDG2: External Interrupt 2 Edge Select bit
' 1 = Interrupt on rising edge
' 0 = Interrupt on falling edge
' Bit 3 Unimplemented: Read as ‘0’
' Bit 2 TMR0IP: TMR0 Overflow Interrupt Priority bit
' 1 = High priority
' 0 = Low priority
' Bit 1 Unimplemented: Read as ‘0’
' Bit 0 RBIP: RB Port Change Interrupt Priority bit
' 1 = High priority
' 0 = Low priority

T0CON = %10000011 ' TIMER0 CONTROL REGISTER
' Bit 7 TMR0ON: Timer0 On/Off Control bit
' 1 = Enables Timer0
' 0 = Stops Timer0
' Bit 6 T08BIT: Timer0 8-Bit/16-Bit Control bit
' 1 = Timer0 is configured as an 8-bit timer/counter
' 0 = Timer0 is configured as a 16-bit timer/counter
' Bit 5 T0CS: Timer0 Clock Source Select bit
' 1 = Transition on T0CKI pin
' 0 = Internal instruction cycle clock (CLKO)
' Bit 4 T0SE: Timer0 Source Edge Select bit
' 1 = Increment on high-to-low transition on T0CKI pin
' 0 = Increment on low-to-high transition on T0CKI pin
' Bit 3 PSA: Timer0 Prescaler Assignment bit
' 1 = Timer0 prescaler is NOT assigned. Timer0 clock input
' bypasses prescaler.
' 0 = Timer0 prescaler is assigned. Timer0 clock input comes from
' prescaler output.
' Bit 2-0 T0PS2:T0PS0: Timer0 Prescaler Select bits
' 111 = 1:256 Prescale value
' 110 = 1:128 Prescale value
' 101 = 1:64 Prescale value
' 100 = 1:32 Prescale value
' 011 = 1:16 Prescale value
' 010 = 1:8 Prescale value
' 001 = 1:4 Prescale value
' 000 = 1:2 Prescale value

;--- Setup Interrupts ----------------------------------------------------------

INCLUDE "DT_INTS-18.bas" ' Base Interrupt System
INCLUDE "ReEnterPBP-18.bas" ' PBP interrupts

ASM
INT_LIST macro ; IntSource, Label, Type, ResetFlag?
INT_Handler TMR0_INT, _EndTimer, PBP, yes
endm
INT_CREATE ; Creates the interrupt processor
ENDASM

;--- Setup Port directions -----------------------------------------------------

TRISA = %00000000
TRISB = %11110000 ' Set columns to input, rows to output
TRISC = %00000000
TRISD = %00000000
TRISE = %00000000

;--- Pins ----------------------------------------------------------------------

Column1 VAR PORTB.4
TimerLed VAR PORTD.1

;--- Variables (Constants) -----------------------------------------------------

Row1 CON %00001110 ' Set selected row to VSS, others to VDD

;--- Initialize variables ------------------------------------------------------

LOW TimerLed
PORTB = Row1 ' Set selected row to VSS, others to VDD

;--- Subroutines ---------------------------------------------------------------

goto ProgramStart ' Jump over sub-routines

;---- Start Timer0 -------------------------------------------------------------
StartTimer:
TMR0H = 109 ' 50 mS Timer
TMR0L = 144
HIGH TimerLed
@ INT_ENABLE TMR0_INT ; enable Timer 0 interrupts
RETURN

;---- Stop Timer0 --------------------------------------------------------------
EndTimer:
LOW TimerLed
@ INT_RETURN

;---- Scan only top left button on 4 x 4 keypad --------------------------------
KeypadInput:
IF PORTB.4 = 0 THEN ' Column 1
GOSUB StartTimer
WHILE PORTB.4 = 0: WEND
ENDIF
RETURN

;--- Program Start -------------------------------------------------------------

ProgramStart:
GOSUB KeypadInput ' Scan button

GOTO ProgramStart
END

Robert