la base ddu tuto pourri se faire sur des puces classic RTC DS1307 ou DS3231 tel que decrit dans le post de Jérémy.
http://www.fantaspic.fr/viewtopic.php?f=32&t=297
avec pourquoi pas étendre la réflexion sur d'autre puce avec com I2C.
A l'origine mon idée était de récupérer l'heure sur un DS1307 pour l’éclairage de mon aquarium.
Je me suis basé sur le code exemple pour faire mes premiers pas afin de tenter de comprendre comment cela fonctionne.
Je ne retrouve pas l'exemple pour le DS1307 de mikrobasic du coup on va partir sur le code exemple du PCF8583:
Code : Tout sélectionner
program RTC_Read
dim seconds, minutes, hours, _day, _month, year as byte ' Global date/time variables
' Software I2C connections
dim Soft_I2C_Scl as sbit at RC3_bit
Soft_I2C_Sda as sbit at RC4_bit
Soft_I2C_Scl_Direction as sbit at TRISC3_bit
Soft_I2C_Sda_Direction as sbit at TRISC4_bit
' End Software I2C connections
' Lcd module connections
dim LCD_RS as sbit at LATB4_bit
LCD_EN as sbit at LATB5_bit
LCD_D4 as sbit at LATB0_bit
LCD_D5 as sbit at LATB1_bit
LCD_D6 as sbit at LATB2_bit
LCD_D7 as sbit at LATB3_bit
LCD_RS_Direction as sbit at TRISB4_bit
LCD_EN_Direction as sbit at TRISB5_bit
LCD_D4_Direction as sbit at TRISB0_bit
LCD_D5_Direction as sbit at TRISB1_bit
LCD_D6_Direction as sbit at TRISB2_bit
LCD_D7_Direction as sbit at TRISB3_bit
' End Lcd module connections
'--------------------- Reads time and date information from RTC (PCF8583)
sub procedure Read_Time()
Soft_I2C_Start() ' Issue start signal
Soft_I2C_Write(0xA0) ' Address PCF8583, see PCF8583 datasheet
Soft_I2C_Write(2) ' Start from address 2
Soft_I2C_Start() ' Issue repeated start signal
Soft_I2C_Write(0xA1) ' Address PCF8583 for reading R/W=1
seconds = Soft_I2C_Read(1) ' Read seconds byte
minutes = Soft_I2C_Read(1) ' Read minutes byte
hours = Soft_I2C_Read(1) ' Read hours byte
_day = Soft_I2C_Read(1) ' Read year/day byte
_month = Soft_I2C_Read(0) ' Read weekday/month byte}
Soft_I2C_Stop() ' Issue stop signal}
end sub
'-------------------- Formats date and time
sub procedure Transform_Time()
seconds = ((seconds and 0xF0) >> 4)*10 + (seconds and 0x0F) ' Transform seconds
minutes = ((minutes and 0xF0) >> 4)*10 + (minutes and 0x0F) ' Transform months
hours = ((hours and 0xF0) >> 4)*10 + (hours and 0x0F) ' Transform hours
year = (_day and 0xC0) >> 6 ' Transform year
_day = ((_day and 0x30) >> 4)*10 + (_day and 0x0F) ' Transform day
_month = ((_month and 0x10) >> 4)*10 + (_month and 0x0F) ' Transform month
end sub
'-------------------- Output values to Lcd
sub procedure Display_Time()
Lcd_Chr(1, 6, (_day / 10) + 48) ' Print tens digit of day variable
Lcd_Chr(1, 7, (_day mod 10) + 48) ' Print oness digit of day variable
Lcd_Chr(1, 9, (_month / 10) + 48) ' Print tens digit of month variable
Lcd_Chr(1,10, (_month mod 10) + 48) ' Print oness digit of month variable
Lcd_Chr(1, 15, year + 48) ' Print year vaiable + 8 (start from year 2008)
Lcd_Chr(2, 6, (hours / 10) + 48) ' Print tens digit of hours variable
Lcd_Chr(2, 7, (hours mod 10) + 48) ' Print oness digit of hours variable
Lcd_Chr(2, 9, (minutes / 10) + 48) ' Print tens digit of minutes variable
Lcd_Chr(2,10, (minutes mod 10) + 48) ' Print oness digit of minutes variable
Lcd_Chr(2,12, (seconds / 10) + 48) ' Print tens digit of seconds variable
Lcd_Chr(2,13, (seconds mod 10) + 48) ' Print oness digit of seconds variable
end sub
'------------------ Performs project-wide init
sub procedure Init_Main()
TRISB = 0
LATB = 0xFF
TRISB = 0xFF
ANSELB = 0 ' Configure AN pins as digital I/O
ANSELC = 0
Soft_I2C_Init() ' Initialize Soft I2C communication
Lcd_Init() ' Initialize Lcd
Lcd_Cmd(_LCD_CLEAR) ' Clear Lcd display
Lcd_Cmd(_LCD_CURSOR_OFF) ' Turn cursor off
Lcd_Out(1,1,"Date:") ' Prepare and output static text on Lcd
Lcd_Chr(1,8,".")
Lcd_Chr(1,11,".")
Lcd_Chr(1,16,".")
Lcd_Out(2,1,"Time:")
Lcd_Chr(2,8,":")
Lcd_Chr(2,11,":")
Lcd_Out(1,12,"201") ' start from year 2010
end sub
'----------------- Main sub procedure
main:
Delay_ms(500)
Init_Main() ' Perform initialization
while TRUE ' Endless loop
Read_Time() ' Read time from RTC(PCF8583)
Transform_Time() ' Format date and time
Display_Time() ' Prepare and display on Lcd
wend
end. l'ensemble du code est trés simple donc autant s'interesser directement sur la fonction qui gère la com I2C
datasheet du PCF8583:
pas de surprise au debut il faut initialiser -- normal
Code : Tout sélectionner
Soft_I2C_Start() ' Issue start signal
vue que c'est du reseau bon ok il faut adrésser mais snif sur cette puce il ny a que 2 adresse de possible du coup comment on fait si on a plus de 2 puces à connecter sur le reseau?
--> Slave addresses: A1h or A3h for reading, A0h or A2h for writing (exttrait DS page 1 ) - mais quesqu'il se passe si a la place de A0 je rentre A2?
Code : Tout sélectionner
Soft_I2C_Write(0xA0) ' Address PCF8583, see PCF8583 datasheetpage 8 il y a le descriptif du registre du coup ok pour l'adresse2 de debut mais comment la puce c'est quil faut démarer à cette adresse?
Code : Tout sélectionner
Soft_I2C_Write(2) ' Start from address 2la je plante pourquoi refaire un 2nd start? quel en est l'utilité? dans la librairie il y a une fonction I2C_repeated_start le descriptif est plutot obscure et pas d'exemple est dispo est ce que c'est la meme utilité?
Code : Tout sélectionner
Soft_I2C_Start() ' Issue repeated start signalalors la je ne trouve vraiment pas d'infoo sur ce registre ormi ca:
--> Slave addresses: A1h or A3h for reading, A0h or A2h for writing (exttrait DS page 1 ) - mais quesqu'il se passe si a la place de A1 je rentre A3?
Code : Tout sélectionner
Soft_I2C_Write(0xA1) ' Address PCF8583 for reading R/W=1et la ca se complique car je ne comprend pas comment on peut dire à la puce qu'il faut quelle envoie les variables de secondes à mois, est ce que c'est parcequ'il y a le paramétre d’acquittement qui est renseigné?
Code : Tout sélectionner
seconds = Soft_I2C_Read[b](1)[/b] ' Read seconds byte
minutes = Soft_I2C_Read[b](1)[/b] ' Read minutes byte
hours = Soft_I2C_Read[b](1)[/b] ' Read hours byte
_day = Soft_I2C_Read[b](1)[/b] ' Read year/day byte
_month = Soft_I2C_Read[b](0)[/b] ' Read weekday/month byte}bon la ok pas trés difficile on comprend que ca veux dire que c'est fini :langue:
Code : Tout sélectionner
Soft_I2C_Stop() ' Issue stop signal}
end subdu coup est ce que quelqu'un pourrai démystifier tous cela? afin que les personnes qui ne maitrise pas ce protocole puisse enfin savoir pourquoi c'est comme ca et pas autrement.

