Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général en BASIC et PASCAL !

Modérateur : Gérard

La Communication I2C
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#11 Message par Jérémy » ven. 29 juil. 2016 19:14

Re, j'ai eplucher vite fait la DS, mais je suis nul la dessus !

En tout cas, tu ne devrais vraiment pas trop avoir de mal a t'en sortir . Ca m'as l'air plûtot basic !.( dehors!! )

L'adresse de ton module c'est bien 0xD0 en lecture et 0xD1 en écriture .
tu comence par lui envoyer son adresse , ensuite tu lui envoie l'adresse d'un registre , puis la valeur du registre que tu veux lui donner pour le configurer .
Il peut focntionner à 100Khz ou 400Khz au choix ( dans les config justement).

ensuite il te suffit de le lire pour avoir ces valeurs ( l'heure quoi) . Mais attention c'est du BCD , il faudra ruser pour pouvoir les interpréter !
C'est en faisant des erreurs, que l'on apprend le mieux !!!

La Communication I2C
Gérard
Avatar de l’utilisateur
Expert
Expert
Messages : 1640
Âge : 65
Enregistré en : septembre 2015
Localisation : Alsace - Haut-Rhin

#12 Message par Gérard » ven. 29 juil. 2016 22:27

J'ai une routine de conversion BCD --> binaire si tu as besoin.
Le 18/04/19 je suis devenu papy de jumeaux, le 01/09/23 une petite cousine des jumeaux est née.

La Communication I2C
cyril13110
Confirmé
Confirmé
Messages : 721
Âge : 41
Enregistré en : avril 2016
Localisation : 13

#13 Message par cyril13110 » dim. 31 juil. 2016 17:55

Salut,
Ok je pense avoir comprit ce que tu viens de decrire jeremy.
Je ferai plusieurs tests pour voir.
Ce soir je vais voir pour souder la puce. Ca devrait pouvoir le faire tres facilement, je viens de regarder sur une plaquette a pastille simple je coupe les pastilles en 2 et le tour est joué.

La Communication I2C
cyril13110
Confirmé
Confirmé
Messages : 721
Âge : 41
Enregistré en : avril 2016
Localisation : 13

#14 Message par cyril13110 » lun. 1 août 2016 23:11

bonsoir,
je reviens apres avoir fait les 1er tests de com avec la puce rtc.
voila le code que j'ai bidouillé :

Code : Tout sélectionner

program test_i2c
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

dim 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(0xD0)          '
 Address PCF8583, see PCF8583 datasheet
  Soft_I2C_Write
(0)             ' Start from address 2
  Soft_I2C_Start()              '
 Issue repeated start signal
  Soft_I2C_Write
(0xD1)          ' 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(0)      '
 Read hours byte
  Soft_I2C_Stop
()               ' Issue stop signal}
end sub

'
---------------------test WR time and date information from RTC (PCF8583)
sub procedure WR_Time()
  Soft_I2C_Start()              ' Issue start signal
  Soft_I2C_Write(0xD0)          '
 Address PCF8583, see PCF8583 datasheet
  Soft_I2C_Write
(0)             ' Start from address 2
  Soft_I2C_Write(0)     '
 Write 0 to seconds memory location
  Soft_I2C_Write
(0x12)  ' Write 0x30 to minutes memory location
  Soft_I2C_Write(0x17)  '
 Write 0x12 to hours memory location
  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
end sub

'
-------------------- Output values to Lcd
sub procedure Display_Time
()

  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()
  '
Initialisation E/S
  TRISD 
= 0x0f          ' Configure PORTC as output
  portd=0                '
 ecriture commande alim
  
  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
(2,1,"Time:")
  Lcd_Chr(2,8,":")
  Lcd_Chr(2,11,":")

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
    
    if  portD.0=1 then
         WR_Time()
    end if
    
    if  seconds>30 then
    portD.7=1
    end if
    
        if  seconds<30 then
    portD.7=0
    end if
  wend
end.


pour le moment tous fonctionne, j'ai même fait un test de mise à jour de l'heure déclenché par l'appui d'un bp...

Le code est une dérivé du code exemple pour communiquer une avec une puce RTC que j'ai pas mal trifouillé.

Je vais voir si j'ai comprit avec le capteur de température sur I2C

La Communication I2C
cyril13110
Confirmé
Confirmé
Messages : 721
Âge : 41
Enregistré en : avril 2016
Localisation : 13

#15 Message par cyril13110 » mar. 2 août 2016 08:47

alors je reviens pour décrire tous ce que j'ai fait .....

Code : Tout sélectionner

'--------------------- Reads time and date information from RTC 
sub procedure Read_Time()
  Soft_I2C_Start()              ' 
Issue start signal
  Soft_I2C_Write
(0xD0)          ' Address DS3231
  Soft_I2C_Write(0)             ' 
Start from address 0
  Soft_I2C_Start
()              ' Issue repeated start signal
  Soft_I2C_Write(0xD1)          ' 
Address  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(0)      ' Read hours byte
  Soft_I2C_Stop()               ' 
Issue stop signal}
end sub


en gros j'ai testé de récupérer 1 variable (que la seconde), après 2 variable, puis 3, puis 4, ect......
et en faite la ou ca merdé que je ne comprenais pas c'est le bit acquittement

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]0[/b])      ' Read hours byte


j'ai testé ces lignes la, gros carnage:

Code : Tout sélectionner

  seconds Soft_I2C_Read([b]0[/b])    ' Read seconds byte
  minutes = Soft_I2C_Read([b]1[/b])    ' 
Read minutes byte
  hours 
Soft_I2C_Read([b]0[/b])      ' Read hours byte


puis ca, carnage aussi

Code : Tout sélectionner

  seconds Soft_I2C_Read([b]1[/b])    ' Read seconds byte
  minutes = Soft_I2C_Read([b]0[/b])    ' 
Read minutes byte
  hours 
Soft_I2C_Read([b]0[/b])      ' Read hours byte


ca ca fonctionne bien, avec les autres ligne en commentaire:

Code : Tout sélectionner

  seconds Soft_I2C_Read([b]0[/b])    ' Read seconds byte


en gros il faut mettre le paramètre d’acquittement à 1 sur toutes les lignes de lectures sauf la dernière, pourquoi très bonne question, mais si c'est pas comme ca l'µC récupère n'importe quoi.

La Communication I2C
Gérard
Avatar de l’utilisateur
Expert
Expert
Messages : 1640
Âge : 65
Enregistré en : septembre 2015
Localisation : Alsace - Haut-Rhin

#16 Message par Gérard » mar. 2 août 2016 11:06

Je ne comprends pas cette ligne : seconds = Soft_I2C_Read(0) ' Read seconds byte
Tu veux faire quoi exactement?
As-tu regardé le post #2? J'ai mis un exemple qui fonctionne.

Edit : la ligne dont je parle est la dernière que tu as posté, j'ai copié/collé, et ce n'est pas la même chose.
Le 18/04/19 je suis devenu papy de jumeaux, le 01/09/23 une petite cousine des jumeaux est née.

La Communication I2C
cyril13110
Confirmé
Confirmé
Messages : 721
Âge : 41
Enregistré en : avril 2016
Localisation : 13

#17 Message par cyril13110 » mar. 2 août 2016 11:26

j'ai testé ton code et sans fonctionne sans problème.

ce que j'ai voulus faire c’était de trifouiller le réseau pour voir pour ne récupérer qu'une variable, ici la seconde en cours.


Code : Tout sélectionner

'--------------------- Reads time and date information from RTC 
sub procedure Read_Time()
  Soft_I2C_Start()              '
 Issue start signal
  Soft_I2C_Write
(0xD0)          ' Address DS3231
  Soft_I2C_Write(0)             '
 Start from address 0
  Soft_I2C_Start
()              ' Issue repeated start signal
  Soft_I2C_Write(0xD1)          '
 Address  for reading R/W=1
  seconds 
= Soft_I2C_Read(0)    ' Read seconds byte
  Soft_I2C_Stop()               '
 Issue stop signal}
end sub


si je rentre cette ligne le pic ne récupère n'importe quoi.

Code : Tout sélectionner

'--------------------- Reads time and date information from RTC 
 ----
  seconds = Soft_I2C_Read([b]1[/b])    '
 Read seconds byte
  
----
end sub


j'ai voulu partir sur un code minimaliste pour voir comment ca aller réagir afin de comprendre comment le mécanisme de la communication fonctionne à 100%.
Hier le test a été fait avec cette puce la, et des que je peux je me récupère une autre puce I2C afin de continuer à tester l'I2C.
Mais pour le moment je ne vois pas l'influence de ce paramètre d’acquittement qui passe en paramètre du "soft_I2C_read()"

chose que je n'avais pas fait gaff, je suis en "soft_I2C", ce soir si je peux je regarde pour utiliser l'I2C physique afin de pouvoir voir comment ca fonctionne.

La Communication I2C
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#18 Message par Jérémy » mar. 2 août 2016 11:54

Hello cyril13110,

Je vois que tu avance bien .

Bon je ne connais pas Mikrobasic, mais ca doit fort ressemble MikroC. Voila ce que je peux te dire en regardant mon tuto tu trouveras pas mal d'infos (DS1307)

Quand tu lis dans le registre de ton module tu lui demande ou non un accusé de réception . c'est le fameux 0 ou 1 que tu mets ici : Soft_I2C_Read(0).

Perso je te conseille de ne pas le mettre .

Tu devrais essayer avec

Code : Tout sélectionner

'--------------------- Reads time and date information from RTC 
sub procedure Read_Time()
  Soft_I2C_Start()              '
 Issue start signal
  Soft_I2C_Write
(0xD0)          ' Address DS3231
  Soft_I2C_Write(0)             '
 Start from address 0
  Soft_I2C_Start
()              ' Issue repeated start signal
  Soft_I2C_Write(0xD1)          '
 Address  for reading R/W=1
  seconds 
= Soft_I2C_Read(0)    ' Read seconds byte
  minutes = Soft_I2C_Read(0)    '
 Read minutes byte
  hours 
= Soft_I2C_Read(0)      ' Read hours byte
  Soft_I2C_Stop()               '
 Issue stop signal}
end sub


J'ai un doute que l'adresse du registre soit incrémenter à chaque lecture, a vérifier sur la DS . Sinon il faut changer l'adresse de lecture avant chaque lecture sinon tu lis toujours la même chose. dans mon tuto l'adresse de lecture est rentré en paramètre d’entrée de la fonction.
C'est en faisant des erreurs, que l'on apprend le mieux !!!

La Communication I2C
Gérard
Avatar de l’utilisateur
Expert
Expert
Messages : 1640
Âge : 65
Enregistré en : septembre 2015
Localisation : Alsace - Haut-Rhin

#19 Message par Gérard » mar. 2 août 2016 12:17

L'adresse est incrémentée tant que tu lis des registres. Il suffit de donner l'adresse du 1er et de lire.
Le 18/04/19 je suis devenu papy de jumeaux, le 01/09/23 une petite cousine des jumeaux est née.

La Communication I2C
cyril13110
Confirmé
Confirmé
Messages : 721
Âge : 41
Enregistré en : avril 2016
Localisation : 13

#20 Message par cyril13110 » mar. 2 août 2016 12:19

Salut jeremy,
Jai testé avec le paramètre a 0 pour chaque lecture. Resultat le pic affiche n'importe quoi sur le lcd.
Quand je passe ce paramètre a 1 les valeurs sont correcte.
Par contre apres avoir jouer un moment avec ce paramètre il faut que ce pametre soit a 0 pour la derniere ligne si non carnage......


Retourner vers « Langage BASIC & PASCAL »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 3 invités