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 sur l'Assembleur !

Modérateur : mazertoc

I2C et BigOnOff
JJE
Passioné
Passioné
Messages : 399
Âge : 83
Enregistré en : novembre 2017
Localisation : Picardie

#1 Message par JJE » dim. 7 avr. 2019 18:53

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
Cordialement

JJE

C'est pas parcequ'on n'a rien à dire qu'il faut fermer sa G....e

I2C et BigOnOff
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2596
Enregistré en : juillet 2016
Localisation : Terre

#2 Message par Temps-x » dim. 7 avr. 2019 21:02

Bonsoir JJE, et tout le forum,

JJE a écrit :Source du message EEPROM 24C64


:sifflotte: C'est pas 24LC64 par hasard, si c'est bien ça, tu peux la programmer avec ton Pickit3.

24LC64.jpg


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.
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

I2C et BigOnOff
JJE
Passioné
Passioné
Messages : 399
Âge : 83
Enregistré en : novembre 2017
Localisation : Picardie

#3 Message par JJE » lun. 8 avr. 2019 11:12

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 :sifflotte:
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 :mur:
Je vais essayer de creuser ce point, j'aime bien observer le comportement que j'attends.
Pas terrible le debugger du Pickit3
Cordialement

JJE

C'est pas parcequ'on n'a rien à dire qu'il faut fermer sa G....e

I2C et BigOnOff
Claudius
Avatar de l’utilisateur
Passioné
Passioné
Messages : 260
Âge : 69
Enregistré en : septembre 2015
Localisation : ELANCOURT (78 - YVELINES)
Contact :

#4 Message par Claudius » lun. 8 avr. 2019 12:34

Bonjour JJE et à tous,
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:
ScreenClipRandomReadMode.jpg

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.

I2C et BigOnOff
JJE
Passioné
Passioné
Messages : 399
Âge : 83
Enregistré en : novembre 2017
Localisation : Picardie

#5 Message par JJE » lun. 8 avr. 2019 17:47

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. :mur: :mur: :mur:
à suivre, merci pour ton aide
Cordialement

JJE

C'est pas parcequ'on n'a rien à dire qu'il faut fermer sa G....e

I2C et BigOnOff
Claudius
Avatar de l’utilisateur
Passioné
Passioné
Messages : 260
Âge : 69
Enregistré en : septembre 2015
Localisation : ELANCOURT (78 - YVELINES)
Contact :

#6 Message par Claudius » lun. 8 avr. 2019 20:17

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) ?


ScreenClip-AT24C256.jpg
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

I2C et BigOnOff
JJE
Passioné
Passioné
Messages : 399
Âge : 83
Enregistré en : novembre 2017
Localisation : Picardie

#7 Message par JJE » mar. 9 avr. 2019 07:50

Bonjour Claudius,
:bravo:
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é :
Schéma.pdf

Deux énormités sur le même circuit à 8 pattes oops
Encore mille fois merci, je vais pouvoir avancer. Je me demande combien d'heures j'aurais passé sur ces défauts sans ton aide Merci !
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Cordialement

JJE

C'est pas parcequ'on n'a rien à dire qu'il faut fermer sa G....e

I2C et BigOnOff
Claudius
Avatar de l’utilisateur
Passioné
Passioné
Messages : 260
Âge : 69
Enregistré en : septembre 2015
Localisation : ELANCOURT (78 - YVELINES)
Contact :

#8 Message par Claudius » mar. 9 avr. 2019 09:41

Bonjour JJE et à tous,

Super et Bravo :-D

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 :geek:

Conseil: Toujours vérifier hors tension et à l’ohmmètre les connexions @ à la datasheet; évite beaucoup de surprises, notamment les courts-circuits

I2C et BigOnOff
JJE
Passioné
Passioné
Messages : 399
Âge : 83
Enregistré en : novembre 2017
Localisation : Picardie

#9 Message par JJE » mar. 9 avr. 2019 12:19

merci de ces ces conseils, je suis toujours trop pressé de voir un résultat.
Cordialement

JJE

C'est pas parcequ'on n'a rien à dire qu'il faut fermer sa G....e

I2C et BigOnOff
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2596
Enregistré en : juillet 2016
Localisation : Terre

#10 Message par Temps-x » mar. 9 avr. 2019 15:32

Bonsoir Claudius, JJE, et tout le forum,

:sifflotte: En post 7 JJE sur ton schéma tu as mis 2 plus, ça rique pas de fonctionner.

:sifflotte: 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. :wink:

==> A++
Modifié en dernier par Temps-x le mar. 9 avr. 2019 18:55, modifié 1 fois.
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:


Retourner vers « Langage ASM »

Qui est en ligne

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