- 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 ---
Modérateur : Gérard
-
Jérémy
Administrateur du site- Messages : 2727
- Âge : 45
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
En tout cas, tu ne devrais vraiment pas trop avoir de mal a t'en sortir . Ca m'as l'air plûtot basic !.( )
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 !
-
cyril13110
Confirmé- Messages : 742
- Âge : 41
- Enregistré en : avril 2016
- Localisation : 13
-
cyril13110
Confirmé- Messages : 742
- Âge : 41
- Enregistré en : avril 2016
- Localisation : 13
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
-
cyril13110
Confirmé- Messages : 742
- Âge : 41
- Enregistré en : avril 2016
- Localisation : 13
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.
- Gérard
Expert- Messages : 1661
- Âge : 65
- Enregistré en : septembre 2015
- Localisation : Alsace - Haut-Rhin
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.
-
cyril13110
Confirmé- Messages : 742
- Âge : 41
- Enregistré en : avril 2016
- Localisation : 13
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.
-
Jérémy
Administrateur du site- Messages : 2727
- Âge : 45
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
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.
-
cyril13110
Confirmé- Messages : 742
- Âge : 41
- Enregistré en : avril 2016
- Localisation : 13
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 108 invités