pic16F777 and ds1302 RTC


+ Reply to Thread
Results 1 to 3 of 3
  1. #1
    Join Date
    Mar 2011
    Location
    cape town, south africa
    Posts
    19

    Default pic16F777 and ds1302 RTC

    Hi All,

    I cannot make a ds1302 RTC work with a pic16F777.

    I have used the RTC before with a smaller pic and that worked fine. For this project I need the 3 x HWPWM capabilities of the 16F777. I believe there is something wrong with the config settings - but I'm at a total loss for what the might be. Any help would be gratefully appreciated.

    In the code below, I've stripped it down so it should just be displaying the secondsLSB on a seven segment display

    Many Thanks,
    orjon.
    Name:  cicuit.jpg
Views: 1211
Size:  194.4 KB


    Code:
    @ DEVICE PIC16F777, INTRC_OSC_NOCLKOUT, WDT_OFF, BOREN_0 & BORSEN_0, MCLR_OFF
    
    DEFINE  OSC 8
    
    OSCCON = %01110010 'see data sheet for INTRC speed setting
    ADCON1 = 15	 ' All I/O pins digital
    INTCON.7 = 0 ' tunr off all interuppts
    
    TRISA = %00000000
    TRISB = %00000000
    TRISC = %00000000
    TRISD = %00000000
    TRISE = %00000000
    
    
    'Set CCPx pins to outputs
    TRISC.2=0 ' CCP1 output
    TRISC.1=0 ' CCP2 output (could also be assigned to RB3)
    TRISB.5=0 ' CCP3 output
    
    ' Set CCP modules to PWM mode
    CCP1CON = %00001100 ' Mode select = PWM
    CCP2CON = %00001100 ' Mode select = PWM
    CCP3CON = %00001100 ' Mode select = PWM
    
    ' Set period up for 1.22kHz PWM freq
    PR2 = $FF
    
    pie2.0 = 0
    pie2.1 = 0
    pie1.2 = 0
    
    ' Set TMR2 up for 1:16 prescale & turn it on
    T2CON = %00000110 ' TMR2 ON 1:16 prescale
    
    A var portd.4
    B var portd.5
    C var portd.6
    D var portd.7
    
    '-------------------------- Clock Variables ---------------------------------
    DS1302_CLK var portc.4 ' DS1302 Clock Pin
    DS1302_DQ var portc.5 ' DS1302 Data Pin
    DS1302_RST var portc.6 ' DS1302 Reset Pin
    '----------------------- Write Commands For DS1302 --------------------------
    writectrl con $8E ' Control byte
    writeram con $80 ' Write to RAM
    writeprotect con $00 ' Write-protect DS1302
    writesec con $80 ' Write seconds
    writemin con $82 ' Write minutes
    writehour con $84 ' Write hour
    writedate con $86 ' Write date
    writemonth con $88 ' Write month
    writeyear con $8C ' Write year
    '------------------------- Read Commands For DS1302 -------------------------
    readsec con $81 ' Read seconds from DS1302
    readmin con $83 ' Read minutes from DS1302
    readhour con $85 ' Read hours from DS1302
    readdate con $87 ' Read date from DS1302
    readyear con $8D ' Read year from DS1302
    readmonth con $89 ' Read month from DS1302
    '------------------------------ Time Variables ------------------------------
    mem var byte ' Temporary data holder
    outbyte var byte ' Second byte to ds1302
    reg_adr var byte ' First byte to DS1302
    date var byte ' Date variable
    
    mo var byte ' Month variable
    yr var byte ' Year variable
    xx var byte  ' temp hold of above possible bytes
    yy var byte
    
    Seconds var byte
    Minutes Var Byte
    Hours var byte
    
    SecondsLSB VAR byte
    MinutesLSB VAR byte
    HoursLSB VAR byte
    SecondsMSB VAR byte
    MinutesMSB VAR byte
    HoursMSB VAR byte
    
    BCDSeconds var byte
    BCDMinutes VAR Byte
    BCDHours Var byte
    
    Seconds =0
    Minutes =0
    Hours =0
    
    SecondsLSB =0
    MinutesLSB =0
    HoursLSB =0
    SecondsMSB =0
    MinutesMSB =0
    HoursMSB =0
    
    BCDSeconds =0
    BCDMinutes =0
    BCDHours =0
    
    ControlSeconds var byte
    
    low DS1302_RST ' Set reset pin low
    low DS1302_CLK ' Set clock pin low
    
    
    gosub setclock
    
    '--------- intro 1-2-3 --------------------------------------------------------
    xx=0
    gosub DisplayNumber
    pause 500
    xx=1
    gosub DisplayNumber
    pause 500
    xx=2
    gosub DisplayNumber
    pause 500
    xx=3
    gosub DisplayNumber
    pause 500
    
    '------main prog ---------------------------------------------------------------
    
    mainprog:
    gosub gettime
    xx=SecondsLSB
    gosub DisplayNumber
    pause 50
    goto mainprog
      
    
    '-------------------------------------------------------------------------------
    Setclock:
    reg_adr = writectrl ' Set to control byte
    outbyte = writeprotect ' Set turn off protection
    gosub w_out ' Send both bytes
    reg_adr = writesec ' Set to write seconds register
    outbyte = $00 ' Set to write 00 to seconds register
    gosub w_out
    reg_adr = writemin
    outbyte = $00
    gosub w_out
    reg_adr = writehour
    outbyte = $00
    gosub w_out
    reg_adr = writedate
    outbyte = $01
    gosub w_out
    reg_adr = writemonth
    outbyte = $01
    gosub w_out
    reg_adr = writeyear
    outbyte = $00
    gosub w_out
    reg_adr = writectrl
    outbyte = writeprotect
    gosub w_out
    return
    '-----creates xDec from xBCD --------------------------------------------------
    BCD_to_Decimal:
    SecondsMSB=BCDSeconds & $70 
    SecondsMSB=SecondsMSB>>4              
    SecondsLSB=BCDSeconds & $0F              '
    Seconds=(SecondsMSB*10)+SecondsLSB 'combines DECMinutes MSB and LSB
    
    MinutesMSB=BCDMinutes & $70 
    MinutesMSB=MinutesMSB>>4              
    MinutesLSB=BCDMinutes & $0F              '
    Minutes=(MinutesMSB*10)+MinutesLSB 'combines DECMinutes MSB and LSB
    
    HoursMSB=BCDHours & $70 
    HoursMSB=HoursMSB>>4  
    HoursLSB=BCDHours & $0F 
    Hours=(HoursMSB*10)+HoursLSB 'combines DECMinutes MSB and LSB
    RETURN
    
    '---------------------------------------- Get Time --------------------------
    GetTime:
    reg_adr = readsec ' Read seconds
    gosub w_in
    BCDSeconds = mem 
    reg_adr = readmin ' Read minutes
    gosub w_in
    BCDMinutes = mem
    reg_adr = readhour ' Read Hours
    gosub w_in
    BCDHours = mem
    gosub BCD_to_Decimal    'split and convert to Decimal
    Return
    '----------------------- Time Commands Subroutines --------------------------
    w_in:
    mem = reg_adr ' Set mem variable to reg_adr contents
    high DS1302_RST ' Activate the DS1302
    shiftout DS1302_DQ,DS1302_CLK,0, [mem] ' Send control byte
    shiftin DS1302_DQ,DS1302_CLK,1, [mem] ' Retrieve data in from the DS1302
    low DS1302_RST ' Deactivate DS1302
    return
    w_out:
    mem = reg_adr ' Set mem variable to reg_adr contents
    high DS1302_RST ' Activate the DS1302
    shiftout DS1302_DQ,DS1302_CLK,0, [mem] ' Send control byte
    mem = outbyte ' Set mem variable to outbyte contents
    shiftout DS1302_DQ,DS1302_CLK,0, [mem] ' Send data stored in mem variable to DS1302
    low DS1302_RST ' Deactivate DS1302
    return
    '------------sub routines------------------------
    DisplayNumber:
      IF (xx = 0) then gosub NUMBER0
      IF (xx = 1) then gosub NUMBER1
      IF (xx = 2) then gosub NUMBER2
      IF (xx = 3) then gosub NUMBER3
      IF (xx = 4) then gosub NUMBER4
      IF (xx = 5) then gosub NUMBER5
      IF (xx = 6) then gosub NUMBER6
      IF (xx = 7) then gosub NUMBER7
      IF (xx = 8) then gosub NUMBER8
      IF (xx = 9) then gosub NUMBER9
    return
    BLANK: 
       HIGH D
       LOW  C
       HIGH B
       LOW  A
    return
    NUMBER0: 
       LOW  D
       LOW  C
       LOW  B
       LOW  A
    return
    NUMBER1: 
       LOW  D
       LOW  C
       LOW  B
       HIGH A
    return
    NUMBER2: 
       LOW  D
       LOW  C
       HIGH B
       LOW  A
    return
    NUMBER3: 
       LOW  D
       LOW  C
       HIGH B
       HIGH A
    return
    NUMBER4: 
       LOW  D
       HIGH C
       LOW  B
       LOW  A
    return
    NUMBER5: 
       LOW  D
       HIGH C
       LOW  B
       HIGH A
    return
    NUMBER6: 
       LOW  D
       HIGH C
       HIGH B
       LOW  A
    return
    NUMBER7: 
       LOW  D
       HIGH C
       HIGH B
       HIGH A
    return
    NUMBER8: 
       HIGH D
       LOW  C
       LOW  B
       LOW  A
    return
    NUMBER9: 
       HIGH D
       LOW  C
       LOW  B
       HIGH A
    return
    
    END

  2. #2
    Join Date
    Mar 2011
    Location
    cape town, south africa
    Posts
    19

    Default Re: pic16F777 and ds1302 RTC

    ...several day later - problem solved! Circuit was incorrect! Power connected wrong Vcc on DS1302.

  3. #3
    Join Date
    Apr 2012
    Location
    Ptolemaida
    Posts
    50

    Default Re: pic16F777 and ds1302 RTC

    Nicely programmed my friend i have fixed a clock with DS1302 + DS18B20, displayed on 7segments. Reading the datasheet helped me a lot but you code was so nicely explained with comments etc that helped even more !! I'll share with pictures my work in a week !!!!

    Thank you again, Kostas.

Members who have read this thread : 0

You do not have permission to view the list of names.

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts