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 ---
- 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 : mazertoc
I2C et BigOnOff
Bonjour à tous,
Quelqu'un a-t-il eu la curiosité de tester le programme de BigOnOff Part2Rev 24 Ch.23.13 ? (mise en oeuvre d'une mémoire EEPROM 24C64)
Je n'arrive pas à le faire fonctionner sur un 16F884, il est vrai, mais il s'assemble sans modification.
l'EEPROM utilisée est neuve.
Devant les difficultés rencontrées, pas de plantage mais les affichages étaient incohérents, j'ai essayé de faire afficher le contenu des 40 octets exploités de l'EEPROM avant d'y écrire
Je tombe, très rapidement sur SSPCON, WCOL =1 (Write Collision Detct bit) dès la lecture du deuxième octet mais je doute de l'exactitude de la première.
Merci de vos infos éventuelles, au moins d'avoir lu ce post
Quelqu'un a-t-il eu la curiosité de tester le programme de BigOnOff Part2Rev 24 Ch.23.13 ? (mise en oeuvre d'une mémoire EEPROM 24C64)
Je n'arrive pas à le faire fonctionner sur un 16F884, il est vrai, mais il s'assemble sans modification.
l'EEPROM utilisée est neuve.
Devant les difficultés rencontrées, pas de plantage mais les affichages étaient incohérents, j'ai essayé de faire afficher le contenu des 40 octets exploités de l'EEPROM avant d'y écrire
Je tombe, très rapidement sur SSPCON, WCOL =1 (Write Collision Detct bit) dès la lecture du deuxième octet mais je doute de l'exactitude de la première.
Merci de vos infos éventuelles, au moins d'avoir lu ce post
I2C et BigOnOff
Bonsoir JJE, et tout le forum,
C'est pas 24LC64 par hasard, si c'est bien ça, tu peux la programmer avec ton Pickit3.
Datasheet : 24LC24
Ouais, j'ai déjà testé il y a longtemps de ça, et ça fonction bien, mais il te faut une bonne organisation au niveau programmation.
Je suppose que tu le sais, mais ton EEPROM 24LC64 doit être défini par une adresse.
Elle peut être fixée par les pattes A0, A1, A2 qui représentent les bits de poids faibles de l'adresse.
Un bout de code pour un Pic16F883 pour un LCD2119 I2C, oscillateur réglé sur 4 Mhz
C'est la même configuration pour un Pic16F884, il ont les même bank, c'est le nombre de patte qui les différencient.
Un Analyseur de Logique te serait bien utile, surtout pour le prix qu'ils sont vendues :
Avec les Pic18xxxx le protocole est déjà présent, donc, beaucoup de chose en moins à écrire.
A++
JJE a écrit :Source du message EEPROM 24C64
C'est pas 24LC64 par hasard, si c'est bien ça, tu peux la programmer avec ton Pickit3.
Datasheet : 24LC24
JJE a écrit :Source du message Quelqu'un a-t-il eu la curiosité de tester le programme de BigOnOff
Ouais, j'ai déjà testé il y a longtemps de ça, et ça fonction bien, mais il te faut une bonne organisation au niveau programmation.
Je suppose que tu le sais, mais ton EEPROM 24LC64 doit être défini par une adresse.
Elle peut être fixée par les pattes A0, A1, A2 qui représentent les bits de poids faibles de l'adresse.
Un bout de code pour un Pic16F883 pour un LCD2119 I2C, oscillateur réglé sur 4 Mhz
C'est la même configuration pour un Pic16F884, il ont les même bank, c'est le nombre de patte qui les différencient.
Code : Tout sélectionner
;**********************************************************************************************
BANKSEL SSPSTAT ; passer banque 1
clrf SSPSTAT
clrf SSPCON2
bsf SSPSTAT,SMP ; 1 = actie le filtre si la fréquence et comptise entre 100 KHz ou de 1 MHz
bcf SSPSTAT,CKE ; 0 = compatible du protocole I²C
movlw B'00001001' ; (SSPADD) = ((4 000 000 / (4*100 000)) - 1) = 9 = B'00001001'
movwf SSPADD ;
BANKSEL SSPCON ; passer en banque 0
movlw B'00101000' ; module MSSP en service en mode I²C master
movwf SSPCON
call I2c_start ; envoyer start-condition
movlw B'01001110' ; adresse imposé + adresse choisi + R_W = 0x27
call I2c_write ; écrire adresse PCF8574T
BANKSEL SSPCON2 ; passer en banque1
btfsc SSPCON2,ACKSTAT ; tester si ACK reception reçu
goto $-1 ; non alors en remonte d'une ligne
BANKSEL SSPCON ; passer en banque 0
goto LCD_ini
call I2c_stop
boucle
goto boucle
;*****************************************************************************
; initialisation du mode 4 bits pour LCD 1602
;*****************************************************************************
LCD_ini
call pause_15000µs
; Function Set
movlw B'00100000' ; mode 4 bits
movwf tmps
call I2c_write
call E1_E0
;----------------------------------------------------------------------------
movlw B'00100000' ; mode 4 bits
movwf tmps
call I2c_write
call E1_E0
;----------------------------------------------------------------------------
movlw B'10000000' ; ; mode 4 bits
movwf tmps
call I2c_write
call E1_E0
call pause_40µs
;----------------------------------------------------------------------------
; 2 lignes
movlw B'00100000' ; utilisation de 2 ligne du LCD
movwf tmps
call I2c_write
call E1_E0
movlw B'11000000'
movwf tmps
call I2c_write
call E1_E0
call pause_40µs
;----------------------------------------------------------------------------
; Display On/Off Control
movlw B'00000000' ; autorise l'affichage, et cache le curseur
movwf tmps
call I2c_write
call E1_E0
movlw B'11000000'
movwf tmps
call I2c_write
call E1_E0
call pause_40µs
;----------------------------------------------------------------------------
; Display Clear
movlw B'00000000' ; efface l'écran, et raméne le curseur
movwf tmps
call I2c_write ; au début
call E1_E0
movlw b'00010000'
movwf tmps
call I2c_write
call E1_E0
call pause_1640µs
;----------------------------------------------------------------------------
;Entry Mode Set
movlw B'00000000' ; déplacement du curseur après l'apparition
movwf tmps
call I2c_write ; d'un caractère de gauche à droite
call E1_E0
movlw b'01100000'
movwf tmps
call I2c_write
call E1_E0
call pause_40µs
;----------------------------------------------------------------------------
clrf lettre
movlw D'2' ; page 2, tableaux de 256 octets.
movwf PCLATH ; 4 tableaux de 256 octets disponibles.
movfw lettre
call message
movwf tmps
movwf temps
xorlw D'126'
btfsc STATUS,Z ; si Z = 0 résultal égal, ligne 1
goto allume_led
call ecrit_1
incf lettre,1
goto $-9
;----------------------------------------------------------------------------
movlw B'01000000' ; colonne des chiffres de la table de car.
movwf tmps
call I2c_write
call RS_1 ; rs = 1 pour une donnée
call E1_E0
movlw B'01000000'
movwf tmps
call I2c_write
call RS_1
call E1_E0
call pause_40µs
;----------------------------------------------------------------------------
allume_led
bsf PORTC,0
retour
goto retour
;*****************************************************************************
ecrit_1
clrf loop3
ecrit_2
bcf tmps,0
bcf tmps,1
bcf tmps,2
bcf tmps,3
movf tmps,W
call I2c_write
call RS_1 ; rs = 1 pour une donnée
call E1_E0
swapf temps,1
movf temps,W
movwf tmps
incf loop3,F
movfw loop3
xorlw D'2'
btfsc STATUS,Z ; si Z = 0 résultal égal, ligne 1
return
call pause_40µs
goto ecrit_2
;*****************************************************************************
E1_E0
bsf tmps,2 ; E sur I2C à 1 B'XXXXX1XX'
movf tmps,W
call I2c_write
bcf tmps,2 ; E sur I2C à 1 B'XXXXX0XX'
movf tmps,W
call I2c_write
return
;*****************************************************************************
RS_1
bsf tmps,0 ; RS sur I2C à 1 B'XXXXXXX1'
movf tmps,W
call I2c_write
return
;*****************************************************************************
RS_0
bcf tmps,0 ; RS sur I2C à 1 B'XXXXXXX0'
movf tmps,W
call I2c_write
return
;*****************************************************************************
; ENVOYER LE START-CONDITION *
;*****************************************************************************
I2c_start
BANKSEL SSPCON2 ; passer en banque 1
bsf SSPCON2,SEN
IWAIT SSPCON2,SEN ; attendre fin start-condition
return
;*****************************************************************************
; ENVOYER LE REPEATED START-CONDITION *
;*****************************************************************************
I2c_rstart
BANKSEL SSPCON2 ; passer en banque 1
bsf SSPCON2,RSEN ; lancer le repeated start-condition
IWAIT SSPCON2,RSEN ; attendre fin repeated start-condition
return ; et retour
;*****************************************************************************
; ENVOYER LE STOP-CONDITION *
;*****************************************************************************
I2c_stop
BANKSEL SSPCON2 ; passer en banque 1
bsf SSPCON2,PEN ; lancer le stop-condition
IWAIT SSPCON2,PEN ; attendre fin stop-condition
return ; et retour
;*****************************************************************************
; ENVOYER LE ACK *
;*****************************************************************************
I2c_ack
BANKSEL SSPCON2 ; passer en banque 1
bcf SSPCON2,ACKDT ; le bit qui sera envoyé vaudra " 0 "
bsf SSPCON2,ACKEN ; lancer l'acknowledge (= ACKDT = 0 = ACK)
IWAIT SSPCON2,ACKEN ; attendre fin ACK
return ; et retour
;*****************************************************************************
; ENVOYER LE NOACK *
;*****************************************************************************
I2c_noack
BANKSEL SSPCON2 ; passer en banque 1
bsf SSPCON2,ACKDT ; le bit qui sera envoyé vaudra " 1 "
bsf SSPCON2,ACKEN ; lancer l'acknowledge (= ACKDT = 1 = NOACK)
IWAIT SSPCON2,ACKEN ; attendre fin NOACK
return ; et retour
;*****************************************************************************
; ENVOYER UN OCTET QU'ON PLACE DANS W *
;*****************************************************************************
I2c_write
BANKSEL SSPBUF ; passer en banque 0
movwf SSPBUF ; lancer l'émission de l'adresse en mode écriture
BANKSEL SSPSTAT ; passer en banque 1
IWAIT SSPSTAT,R_W ; attendre émission terminée
return
;*****************************************************************************
; LIRE UN OCTET QUI EST DANS W *
;*****************************************************************************
I2c_read
BANKSEL SSPCON2 ; passer en banque 1
bsf SSPCON2,RCEN ; lancer la lecture
IWAIT SSPCON2,RCEN ; attendre réception terminée
movf SSPBUF,W ; charger octet reçu
return ; et retour
Un Analyseur de Logique te serait bien utile, surtout pour le prix qu'ils sont vendues :
Avec les Pic18xxxx le protocole est déjà présent, donc, beaucoup de chose en moins à écrire.
A++
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
I2C et BigOnOff
réponse partielle à Temps-x
sur la facture (Conrad), il est écrit 24C64/P et sur l'objet, gravé 24C65/P, j'ai fait confiance à la facture
Ok pour l'@ du circuit, c'est un classique de l'I2C. Je suis quand même très surpris que le programme ait le même comportement si je mets l'@ 0 (b'000') ou l'@ 4 (b'100') qui est l'@ câblée
Je vais essayer de creuser ce point, j'aime bien observer le comportement que j'attends.
Pas terrible le debugger du Pickit3
sur la facture (Conrad), il est écrit 24C64/P et sur l'objet, gravé 24C65/P, j'ai fait confiance à la facture
Ok pour l'@ du circuit, c'est un classique de l'I2C. Je suis quand même très surpris que le programme ait le même comportement si je mets l'@ 0 (b'000') ou l'@ 4 (b'100') qui est l'@ câblée
Je vais essayer de creuser ce point, j'aime bien observer le comportement que j'attends.
Pas terrible le debugger du Pickit3
I2C et BigOnOff
- Claudius
Passioné- Messages : 260
- Âge : 69
- Enregistré en : septembre 2015
- Localisation : ELANCOURT (78 - YVELINES)
- Contact :
Bonjour JJE et à tous,
Partons de cette erreur "Write Collision Detect bit" qui signifie que "l'écriture dans le registre SSPBUF a été tentée alors que les conditions I2C n'étaient pas valides pour qu'une transmission puisse commencer" ... quelques pistes:
1 - Plusieurs périphériques répondent sur la ligne SDA
=> Ne garder q'un seul et unique périphérique I2C (la 24C64 en l’occurrence ;-) et vérifier son adresse câblée @ à sa datasheet comme parfaitement identifié par Temps-x
2 - Les lignes SCL et SDA (vues du µC-maître) ne sont pas à l'état haut avant l'écriture et donc vérifier impérativement l'état de ces lignes avec un analyseur, un oscilloscope ou à défaut un voltmètre comme encore proposé par Temps-x
3 - Les 2 résistances de pullup sur SDA et SCL d'au moins 1 KΩ reliées au +5V sont mal ou pas connectées ... (facile à vérifier)
NB: Dans le projet : Utilisation du coprocesseur flottant Micromega uM-FPU (post #22), j'utilise une AT24C256 sans problème dans tous ses modes (Current Address Write, Byte Write, Page Write, Current Address Read, Random Read et Sequential Read); eeprom de plus grande capacité qui se pilote comme une AT24C64 notamment dans celui "Ramdom Read" indiqué pas BigOnOff; à savoir:
A noter que le SR (Start Repeat) du chronogramme ci-dessus peut être remplacé sans problème par un Stop (P) suivi d'un Start (S) ;-)
JJE a écrit:
Je tombe, très rapidement sur SSPCON, WCOL =1 (Write Collision Detct bit) dès la lecture du deuxième octet mais je doute de l'exactitude de la première.
Partons de cette erreur "Write Collision Detect bit" qui signifie que "l'écriture dans le registre SSPBUF a été tentée alors que les conditions I2C n'étaient pas valides pour qu'une transmission puisse commencer" ... quelques pistes:
1 - Plusieurs périphériques répondent sur la ligne SDA
=> Ne garder q'un seul et unique périphérique I2C (la 24C64 en l’occurrence ;-) et vérifier son adresse câblée @ à sa datasheet comme parfaitement identifié par Temps-x
2 - Les lignes SCL et SDA (vues du µC-maître) ne sont pas à l'état haut avant l'écriture et donc vérifier impérativement l'état de ces lignes avec un analyseur, un oscilloscope ou à défaut un voltmètre comme encore proposé par Temps-x
3 - Les 2 résistances de pullup sur SDA et SCL d'au moins 1 KΩ reliées au +5V sont mal ou pas connectées ... (facile à vérifier)
NB: Dans le projet : Utilisation du coprocesseur flottant Micromega uM-FPU (post #22), j'utilise une AT24C256 sans problème dans tous ses modes (Current Address Write, Byte Write, Page Write, Current Address Read, Random Read et Sequential Read); eeprom de plus grande capacité qui se pilote comme une AT24C64 notamment dans celui "Ramdom Read" indiqué pas BigOnOff; à savoir:
A noter que le SR (Start Repeat) du chronogramme ci-dessus peut être remplacé sans problème par un Stop (P) suivi d'un Start (S) ;-)
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Enregistreur de traces GPS & Boussole GPS parlante (PIC & Arduino)
I2C et BigOnOff
Merci Claudius, je croyais bien que tu avais soulevé le lièvre avec ton point 3. Le circuit que j'utilisais avant sans succès, raison pour laquelle je m'étais rabattu sur cette EEPROM, intégrait les résistances de pull-up, donc, je les avais oubliées. Mais ça n'a pas suffit, je ne reçois pas l'acquittement après l'envoi de l'adresse, qu'elle soit bonne ou mauvaise.
Je n'ai que ce périph. sur le bus I2C
Les deux broches du pic SDA et SCL sont bien au +5V.
à suivre, merci pour ton aide
Je n'ai que ce périph. sur le bus I2C
Les deux broches du pic SDA et SCL sont bien au +5V.
à suivre, merci pour ton aide
I2C et BigOnOff
- Claudius
Passioné- Messages : 260
- Âge : 69
- Enregistré en : septembre 2015
- Localisation : ELANCOURT (78 - YVELINES)
- Contact :
Bonsoir JJE,
@ je ne reçois pas l'acquittement après l'envoi de l'adresse, qu'elle soit bonne ou mauvaise
En I2C, on reçoit toujours un ACK ou un NACK après une opération d'écriture, notamment de l'adresse du périphérique désiré
Faut lever le doute entre le hard et le soft; ton schéma ressemble t'il à cela (plus général que celui de Temps-x) ?
@ je ne reçois pas l'acquittement après l'envoi de l'adresse, qu'elle soit bonne ou mauvaise
En I2C, on reçoit toujours un ACK ou un NACK après une opération d'écriture, notamment de l'adresse du périphérique désiré
Faut lever le doute entre le hard et le soft; ton schéma ressemble t'il à cela (plus général que celui de Temps-x) ?
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Enregistreur de traces GPS & Boussole GPS parlante (PIC & Arduino)
I2C et BigOnOff
Bonjour Claudius,
J'ai fais le schéma, à partir de l'existant, pour pouvoir répondre à ta demande et là, horreur, je m’aperçois que les broches SDA et SCL sont inversées. Je suis vraiment trop étourdi pour me lancer dans de telles aventures, mais peut-être contribuent-elles à maintenir mes quelques derniers neurones en forme.
le voici corrigé :
Deux énormités sur le même circuit à 8 pattes
Encore mille fois merci, je vais pouvoir avancer. Je me demande combien d'heures j'aurais passé sur ces défauts sans ton aide
J'ai fais le schéma, à partir de l'existant, pour pouvoir répondre à ta demande et là, horreur, je m’aperçois que les broches SDA et SCL sont inversées. Je suis vraiment trop étourdi pour me lancer dans de telles aventures, mais peut-être contribuent-elles à maintenir mes quelques derniers neurones en forme.
le voici corrigé :
Deux énormités sur le même circuit à 8 pattes
Encore mille fois merci, je vais pouvoir avancer. Je me demande combien d'heures j'aurais passé sur ces défauts sans ton aide
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
I2C et BigOnOff
- Claudius
Passioné- Messages : 260
- Âge : 69
- Enregistré en : septembre 2015
- Localisation : ELANCOURT (78 - YVELINES)
- Contact :
Bonjour JJE et à tous,
Super et Bravo
Une petite remarque sans conséquence sur ton schéma @ l'entrée WP (Write Protect):
- Si reliée au +5V => Inhibition des écritures
- Si reliée au GND => Autorisation des écritures
- Si non connectée => Autorisation des écritures car cette entrée est tirée en interne au GND (If left unconnected, WP is internally pulled down to GND - cf. AT24C32/64 - Page 3/19)
=> Maintenant, il est toujours plus prudent d'imposer un état car sinon, source de pièges avec d'autres eeprom qui n'auraient pas cette caractéristique. De plus, c'est plus clair pour les lecteurs
=> A moins qui tu aies lu et relu la datasheet et donc ... je n'ai rien dit
Conseil: Toujours vérifier hors tension et à l’ohmmètre les connexions @ à la datasheet; évite beaucoup de surprises, notamment les courts-circuits
Super et Bravo
Une petite remarque sans conséquence sur ton schéma @ l'entrée WP (Write Protect):
- Si reliée au +5V => Inhibition des écritures
- Si reliée au GND => Autorisation des écritures
- Si non connectée => Autorisation des écritures car cette entrée est tirée en interne au GND (If left unconnected, WP is internally pulled down to GND - cf. AT24C32/64 - Page 3/19)
=> Maintenant, il est toujours plus prudent d'imposer un état car sinon, source de pièges avec d'autres eeprom qui n'auraient pas cette caractéristique. De plus, c'est plus clair pour les lecteurs
=> A moins qui tu aies lu et relu la datasheet et donc ... je n'ai rien dit
Conseil: Toujours vérifier hors tension et à l’ohmmètre les connexions @ à la datasheet; évite beaucoup de surprises, notamment les courts-circuits
Enregistreur de traces GPS & Boussole GPS parlante (PIC & Arduino)
I2C et BigOnOff
I2C et BigOnOff
Bonsoir Claudius, JJE, et tout le forum,
En post 7 JJE sur ton schéma tu as mis 2 plus, ça rique pas de fonctionner.
Bon j'ai rien à dire, car tu m'a corrigé sur ma Multiplication 16 bits sur 16 bits, avec résultat sur 32 bits, ou j'avais moi aussi fait une étourderie.
Le principal c'est que tu puisses avancer dans ton projet.
A++
En post 7 JJE sur ton schéma tu as mis 2 plus, ça rique pas de fonctionner.
Bon j'ai rien à dire, car tu m'a corrigé sur ma Multiplication 16 bits sur 16 bits, avec résultat sur 32 bits, ou j'avais moi aussi fait une étourderie.
Le principal c'est que tu puisses avancer dans ton projet.
A++
Modifié en dernier par Temps-x le mar. 9 avr. 2019 18:55, modifié 1 fois.
Retourner vers « Langage ASM »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 52 invités