I have received several emails asking for PBP code examples for using some of the newer 18F series with independent I/O mapping of onboard hardware peripherals, and for working with the new built-in RTCC hardware, so I'm posting a simple example here showing how to use the RTCC, and how to assign PWM to several pins.
These newer PICs that allow you to assign onboard peripherals like hardware PWM, USART, and a lot more, to different pins, are really nifty, and a lot like using the higher-end 24 series.
This shows how to re-map PWM output to RA0, RC4 and RC3 pins, and use the built-inCode:'**************************************************************** '* Name : TST_25J11_RTC.BAS * '* Author : B. Reynolds * '* Notice : Copyright (c) 2009 http://www.Rentron.com * '* : All Rights Reserved * '* Date : 1/25/2010 * '* Version : 1.0 * '* Notes : Testing 18F25J11 RTCC & remappable pin options. * '* : * '**************************************************************** ' NOTE: CONFIG options below are placed in the PBP 18F25J11.INC file with ' default config options commented out. ' CONFIG OSC=INTOSC, LPT1OSC=OFF, CP0=OFF, WDTEN=ON, XINST=OFF, IOL1WAY=OFF ' CONFIG STVREN=OFF, T1DIG=ON, FCMEN=OFF, WDTPS=512, RTCOSC=T1OSCREF ' Connect a 32.768 kHz watch crystal between pins 11 & 12 T1CKI & T1OSI ' with caps to match your crystal load capacitance. ' 11 12 ' |---||---| ' | xtal | ' _|_ _|_ ' ___ ___ 2 x 12pF caps ' | | ' gnd gnd DEFINE DEBUG_REG PORTB DEFINE DEBUG_BIT 3 ' RB3 sends serial data to PC DEFINE DEBUG_BAUD 19200 ' 19200 bps DEFINE DEBUG_MODE 0 ' 1 = inverted, 0 = true DEFINE OSC 8 X VAR BYTE Hours VAR BYTE Minutes VAR BYTE Seconds VAR BYTE Year VAR BYTE Month VAR BYTE Day VAR BYTE Weekday VAR BYTE Duty VAR WORD OSCCON = %01110000 ' using 8MHz internal osc ' // A/D disable & setup Timer1 for RTCC // ANCON0 = $ff ANCON1 = $1f ' disable A/D on all analog pins T1CON = %10001001 ' external xtal, 1:1 prescale, no synch, 8-bit, timer1 on ' // PWM & port setup // Duty = 400 ' 50-50 PWM duty-cycle T2CON = %00000100 ' timer2 on, 1:1 prescale PORTA = 0 PORTB = 8 ' RB3 debug pin idles high PORTC = 0 ' PWM outputs low at POR TRISA = 0 TRISB = 0 TRISC = 0 CCP1CON = %00001100 ' setup for single-ended PWM output PR2 = 199 ' setup for 10kHz PSTR1CON = %00000001 ' P1A is driven by PWM CCP1CON.4 = Duty.0 ' load 10-bit duty cycle into CCP1CON.5 = Duty.1 ' duty registers CCPR1L = Duty >> 2 ' // re-map PWM output to RA0, RC4 and RC3 pins // RPOR0 = 14 ' RA0, RP0 = P1A output RPOR15 = 14 ' RC4. RP15 = P1A output RPOR14 = 14 ' RC3, RP14 = P1A output ' // set initial time/date at POR // GOSUB WRT_Enable ' run unlock sequence to enable RTCC writes GOSUB LoadTime ' setup RTCC time/date GOSUB WRT_Disable ' disable RTC writes after initial time & date setup Main: RTCCFG = 3 ' set pointer to Year Year = RTCVALL ' read Year RTCCFG = 2 ' set pointer to Month & Day Day = RTCVALL ' read Day Month = RTCVALH ' read Month & decrement pointer Hours = RTCVALL ' read Hours Weekday = RTCVALH ' read Weekday & decrement pointer Seconds = RTCVALL ' read Seconds Minutes = RTCVALH ' read Minutes (pointer already at 0) PAUSE 990 ' // date/time serial output format // ' Time: 03:33:00 ' Monday: ' Date: 01:25:2010 ' // display Hours, Minutes, Seconds // DEBUG "Time: ",DEC (Hours>>4),DEC Hours & $0F,":", DEC (Minutes>>4),_ DEC Minutes & $0F,":", DEC (Seconds>>4),DEC Seconds & $0F,13,10 ' // display day of week // SELECT CASE Weekday CASE 0 DEBUG "Sunday: ",13,10 CASE 1 DEBUG "Monday: ",13,10 CASE 2 DEBUG "Tuesday: ",13,10 CASE 3 DEBUG "Wednesday: ",13,10 CASE 4 DEBUG "Thursday: ",13,10 CASE 5 DEBUG "Friday: ",13,10 CASE 6 DEBUG "Saturday: ",13,10 END SELECT ' // display Month, Day, Year // DEBUG "Date: ",DEC2 Month & $1F,":", DEC (Day>>4), DEC Day & $0F,":",_ "20",DEC (Year>>4), DEC Year & $0F,13,10,13,10,13,10 GOTO Main LoadTime: ' // NOTE: time & date is in BCD format // RTCCFG = %00100011 ' set pointer to Year RTCVALL = %00010000 ' set Year to 2010 RTCCFG = %00100010 ' set pointer to Month & Day RTCVALL = %00100101 ' set Day to the 25rd RTCVALH = 1 ' set Month to Jan (decrements pointer to Weekday & Hours) RTCVALL = %00000011 ' set Hour to 3 RTCVALH = 1 ' 0=Sun, 6=Sat. set Weekday (decrements pointer to Minutes & Seconds) RTCVALL = 0 ' set Seconds to 0 RTCVALH = %00110011 ' set Minutes to 33 RTCCFG.7 = 1 ' RTCC enabled RETURN WRT_Enable: ' enable writes to RTCC registers EECON2 = $55 ' unlock sequence EECON2 = $AA ' RTCCFG.5 = 1 ' write enable RTCC register RETURN WRT_Disable: ' disable writes to RTCC registers EECON2 = $55 EECON2 = $AA RTCCFG.5 = 0 RETURN END
RTCC clock functions. These PICs are definitely worth looking at, so have fun...;o)
It does take a bit of time to learn how to use these guys, but it's very cool. You can re-
map almost every onboard hardware peripheral to work on any pin.
Bookmarks