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

18f26k22 et module I2C
francois77
Passioné
Passioné
Messages : 307
Enregistré en : avril 2022

#1 Message par francois77 » mar. 14 mars 2023 18:57

Bonjour,

Je recherche un morceau de programme en I2C pour le pilotage d'un eprom ou autre sur un PIC18F26k22

Je suppose qu'il n'y a pas de grosse différence avec un 16f hormis la config

Si vous avez cela sous le coude je prends

Merci d'avance

Francois

18f26k22 et module I2C
francois77
Passioné
Passioné
Messages : 307
Enregistré en : avril 2022

#2 Message par francois77 » mer. 15 mars 2023 17:34

Bonjour,

Personne pour me donner un aide :cry:

A+

Francois

18f26k22 et module I2C
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#3 Message par Temps-x » mer. 15 mars 2023 19:31

Bonsoir francois77, et tout le forum,

Je te réponds rapidement, car sortie du taf, je ne suis pas en état de réfléchir, As tu une eeprom en particulier pour ton choix ?

Lien du datasheet serait apprécier si tu sélectionnes une eeprom précise

Je crois avoir trouvé le moyen de compresser un fichier image pour ton écran en couleur, mais bon, il te faudra attendre la fin de semaine, que je vois si c'est faisable.

==> A+
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

18f26k22 et module I2C
francois77
Passioné
Passioné
Messages : 307
Enregistré en : avril 2022

#4 Message par francois77 » jeu. 16 mars 2023 07:50

Bonjour Temps-x et tout le forum

Je pense avoir trouvé un exemple en C exploitable en I2C pour un 18F26K22

https://forums.futura-sciences.com/elec ... n-i2c.html

Mon but n'est pas pour l'instant de piloter un matériel spécifique, mais d'arriver a dialoguer en I2C sur un 18F26K22

Mon objectif, c'est d'arriver a avoir un minimum de connaissance sur ce pic

Pour les écrans --> c'est ok
SPI --> ok
Les interruptions --> c'est ok, même si je n'ai pas testé toute les possibilités
Entrée Ana --> C'est OK

La suite dans les prochains jours si j'arrive a décoder correctement le langage C

A +
Francois

18f26k22 et module I2C
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#5 Message par paulfjujo » jeu. 16 mars 2023 08:16

bonjour,

briques de base pour I2C software en asm

Code : Tout sélectionner



The following routines are low level I2C routines applicable to most  interfaces with I2C devices
.



    CONSTANT SDA=6
    CONSTANT SCL
=7

    CONSTANT DATA_BUFF
=18H    ; measurements saved to 18, 19, 1A and 1B
    CONSTANT BUFF_SIZE
=.4    ; number of measurments

    CONSTANT VARS
=0CH

N    EQU VARS
+0
ADR_HI    EQU VARS
+1
ADR_LO     EQU VARS
+2
DEV_ADR     EQU VARS
+3    ; A2, A1, A0 
_N        EQU VARS
+4    ; used for I2C routines
O_BYTE    EQU VARS
+5
I_BYTE    EQU VARS
+6
LOOP1        EQU VARS
+7    ; timing
LOOP2        EQU VARS
+8    ; timing

IN_BYTE                
; read byte on i2c bus
    CLRF I_BYTE
    MOVLW .8
    MOVWF _N        
; set index to 8    
    CALL HIGH_SDA        
; be sure SDA is configured as input
IN_BIT
    CALL HIGH_SCL        
; clock high
    BTFSS PORTB
, SDA    ; test SDA bit
    GOTO IN_ZERO
    GOTO IN_ONE

IN_ZERO
    BCF STATUS
, C        ; clear any carry
    RLF I_BYTE
, F        ; i_byte = i_byte << 1 | 0
    GOTO CONT_IN

IN_ONE
    BCF STATUS
, C        ; clear any carry
    RLF I_BYTE
, F        
    INCF I_BYTE
, F        ; i_byte = (i_byte << 1) | 1
    GOTO CONT_IN

CONT_IN
    CALL LOW_SCL        
; bring clock low
    DECFSZ _N
, F        ; decrement index
    GOTO IN_BIT
    RETURN

;;;;;;

OUT_BYTE:            ; send o_byte on I2C bus
    MOVLW .8
    MOVWF _N
OUT_BIT
:
    BCF STATUS,C        ; clear carry
    RLF O_BYTE
, F        ; left shift, most sig bit is now in carry
    BTFSS STATUS
, C        ; if one, send a one
    GOTO OUT_ZERO
    GOTO OUT_ONE

OUT_ZERO
:
    CALL LOW_SDA        ; SDA at zero
    CALL CLOCK_PULSE    
    CALL HIGH_SDA
    GOTO OUT_CONT

OUT_ONE
:
    CALL HIGH_SDA        ; SDA at logic one
    CALL CLOCK_PULSE
    GOTO OUT_CONT

OUT_CONT
:
    DECFSZ _N, F        ; decrement index
    GOTO OUT_BIT
    RETURN    

;;;;;;
        
NACK
:                ; bring SDA high and clock
    CALL HIGH_SDA
    CALL CLOCK_PULSE
    RETURN

ACK
:
    CALL LOW_SDA
    CALL CLOCK_PULSE
    RETURN

START
:                
    CALL LOW_SCL
    CALL HIGH_SDA
    CALL HIGH_SCL
    CALL LOW_SDA        
; bring SDA low while SCL is high
    CALL LOW_SCL
    RETURN

STOP
:
    CALL LOW_SCL
    CALL LOW_SDA
    CALL HIGH_SCL
    CALL HIGH_SDA        
; bring SDA high while SCL is high
    CALL LOW_SCL
    RETURN

CLOCK_PULSE
:            ; SCL momentarily to logic one
    CALL HIGH_SCL
    CALL LOW_SCL
    RETURN        

HIGH_SDA
:            ; high impedance by making SDA an input
    BSF STATUS
, RP0    ; bank 1
    BSF TRISB
, SDA    ; make SDA pin an input
    BCF STATUS
, RP0    ; back to bank 0
    CALL DELAY_SHORT
    RETURN

LOW_SDA
:
    BCF PORTB, SDA    
    BSF STATUS
, RP0    ; bank 1
    BCF TRISB
, SDA    ; make SDA pin an output
    BCF STATUS
, RP0    ; back to bank 0
    CALL DELAY_SHORT
    RETURN

HIGH_SCL
:
    BSF STATUS, RP0    ; bank 1
    BSF TRISB
, SCL    ; make SCL pin an input
    BCF STATUS
, RP0    ; back to bank 0
    CALL DELAY_SHORT
    RETURN

LOW_SCL
:
    BCF PORTB, SCL
    BSF STATUS
, RP0    ; bank 1
    BCF TRISB
, SCL    ; make SCL pin an output
    BCF STATUS
, RP0    ; back to bank 0
    CALL DELAY_SHORT
    RETURN

DELAY_SHORT
:        ; provides nominal 25 usec delay
    MOVLW .5
    MOVWF LOOP2
DELAY_SHORT_1
:
    NOP
    DECFSZ LOOP2
, F
    GOTO DELAY_SHORT_1
    RETURN     

DELAY_LONG
    MOVLW .250    
; 250 msec delay
    MOVWF LOOP1
DELAY_N_MS
:
OUTTER
    MOVLW    .110    
; close to 1.0 msec delay when set to .110
    MOVWF     LOOP2
INNER
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    DECFSZ    LOOP2
, F    ; decrement and leave result in LOOP2 
                
; skip next statement if zero
    GOTO INNER
    DECFSZ     LOOP1
, F
    GOTO OUTTER
    RETURN



et un peu de lecture :
_24LCXXX.zip


**************************************************************************************

le minima en C (mikroC) I2C Hardware
exemple avec RTC DS1307


Code : Tout sélectionner



#define DS1307_ADDR 0xD0 // RTC DS1307
#define EEPROM_4K_ADR 0xA0 // EEPROM 24LC32
#define LCD_ADDR 0x4E     // PCF8574 on pigboard YwRobot back located  on LCD4x20

void write_ds1307(unsigned short address,unsigned short w_data)  // I2C WRITE
 
{
  
I2C1_Start();
  
I2C1_Wr(0xD0);
  
I2C1_Wr(address);
  
I2C1_Wr(w_data);
  
I2C1_Stop();
 }

unsigned short read_ds1307(unsigned short address)      // I2C read subroutine
{unsigned  short  clock_data  ;
  
I2C1_Start();
  
I2C1_Wr(0xD0);
  
I2C1_Wr(address);
  
I2C1_Repeated_Start();
  
I2C1_Wr(0xD1);
  
clock_data=I2C1_Rd(0);
  
I2C1_Stop();
  return(
clock_data);
 }


void check_device(unsigned char dev_address)
{
I2C1_Start();
 if (
I2C1_Wr(dev_address))
 {
  
sprintf(txt,"Device at adresse %02X  is not found",(int)dev_address);
   
UART1_Write_Text(txt);
 }
 else
 {
  
sprintf(txt,"Device at adresse %02X found OK",(int)dev_address);
   
UART1_Write_Text(txt);
  }
I2C1_Stop();
 
CRLF();
}

ANSELC=0;
  
PORTC 0x80;          // RC0..RC5,RC7 = input RC6=Output
  
TRISC 0xFF;    /
.......
  
I2C1_Init(400000);

 
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aide toi, le ciel ou FantasPic t'aidera

18f26k22 et module I2C
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#6 Message par satinas » jeu. 16 mars 2023 09:39

Bonjour à tous,
Une version ASM de dialogue I2C sur un 18F47Q10 dont le module MSSP semble identique à celui du 18F26K22.
Il faut vérifier si la sélection des banks registres est la même, et idem pour le mapping PPS.
viewtopic.php?p=16479#p16479

18f26k22 et module I2C
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#7 Message par satinas » jeu. 16 mars 2023 10:04

Le projet ASM complet, qui lit une eeprom 24C32, il pilote aussi l'uart, un lcd texte et une horloge DS1307.
18F47Q10_Pedro.X.zip

Le hard ici, merci Pedro viewtopic.php?f=36&t=1122&p=16175#p16175
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

18f26k22 et module I2C
francois77
Passioné
Passioné
Messages : 307
Enregistré en : avril 2022

#8 Message par francois77 » jeu. 16 mars 2023 18:06

Bonsoir a tous

Pas facile de comprendre vos exemples en C , mais merci :mur:

j'ai trouvé un exemple en ASM sur le net

https://www.youtube.com/watch?v=8Kv0by_8SJE

Pour le fichier joint cela ressemble plus a ce que je connais

I2C_COMM (2).asm.txt


Pour Temps-x, la plus simple est d'utiliser une mémoire compatible Proteus type 24c32

Apres c'est pas compliqué de tester avec un autre module I2C et facile a comparer avec un programme sur un 16F

De souvenir il faut 2 adresses pour la 24c32

A +
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

18f26k22 et module I2C
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#9 Message par Temps-x » ven. 17 mars 2023 01:43

Bonsoir paulfjujo, satinas, francois77, et tout le forum,

francois77 a écrit :Source du message Pour Temps-x, la plus simple est d'utiliser une mémoire compatible Proteus type 24c32

Ok, on va faire avec
francois77 a écrit :Source du message De souvenir il faut 2 adresses pour la 24c32


Il faut une seule adresse pour le cas d'une eeprom 24C32, et d'après la datasheet elle se définisse comme ceci

1010, A2,A1,A0,1 = lecture ou 0 = écriture

L'adresse fait en réalité 7 bits, si on ne compte pas le bit de lecture et écriture, on peut la changer en changeant les cavalier sur A0, A1, A2 en les mettant à VSS ou VDD

Voici les pins dédié à la configuration de l'adresse, que j'ai colorié

24C32.jpg


Ça te fait 8 adresses possible, la plus petite adresse sera : 0x50, et la plus grande 0x57

On se qui concerne l'adresse pas de soucis, car j'ai écrit un petit programme pour la rechercher automatiquement :wink:

Bon j'écris le petit programme, et je te le mets ici ce week-end

Regarde dans la documentation de satinas et paulfjujo, il y a des truc très intéressant :sifflotte: de plus paulfjujo à fait l'effort de mettre de l'asm exit

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

18f26k22 et module I2C
francois77
Passioné
Passioné
Messages : 307
Enregistré en : avril 2022

#10 Message par francois77 » ven. 17 mars 2023 07:11

Bonjour Temps-x et tout le forum

Pas la peine de passer du temps sur ce sujet, j'ai maintenant toute les infos pour faire (enfin j'espère).

j'ai fait un petit test hier et mon module I2c parle correctement , il me reste a remettre tout cela en ordre

C'est comme pour un écran, a partir du moment ou tu affiche un point , tu sais piloter un écran :langue:

je ne programme pas a ta vitesse, mais j'arrive a avoir quelques résultats

La suite dans la journée si tout va bien

A+

Francois


Retourner vers « Langage ASM »

Qui est en ligne

Utilisateurs parcourant ce forum : Roger et 52 invités