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 : Gérard
Communication entre deux PICs en I²C
Bonjour.
J'utilise MICROCODE Studio (PicBasic)
Je débute et ne connais presque rien, je n'ai aucune formation dans le domaine.
Je m'amuse et me passionne pour les PIC.
Je voudrais faire communiquer deux (ou trois) pic 18F2520 par l'I2c (RC3/RC4) SCL SDA prévus sur le PIC.
Je veux pouvoir communiquer entre les deux pic avec une distance de 30m environ, sur un câble ordinaire.
Pour ce faire je voudrais augmenter la tension de communication à 24V et un courant d'environ 10mA afin de ne pas être trop perturbé par les éventuels parasites.
Je me pose les questions suivantes avant d'approfondir:
est-ce utopique ?
est-ce réalisable ?
L'adresse des pic se configure comment ? Simple variable ?...
si quelqu'un à du temps à perdre et connais bien le domaine, merci de me répondre.
J'utilise MICROCODE Studio (PicBasic)
Je débute et ne connais presque rien, je n'ai aucune formation dans le domaine.
Je m'amuse et me passionne pour les PIC.
Je voudrais faire communiquer deux (ou trois) pic 18F2520 par l'I2c (RC3/RC4) SCL SDA prévus sur le PIC.
Je veux pouvoir communiquer entre les deux pic avec une distance de 30m environ, sur un câble ordinaire.
Pour ce faire je voudrais augmenter la tension de communication à 24V et un courant d'environ 10mA afin de ne pas être trop perturbé par les éventuels parasites.
Je me pose les questions suivantes avant d'approfondir:
est-ce utopique ?
est-ce réalisable ?
L'adresse des pic se configure comment ? Simple variable ?...
si quelqu'un à du temps à perdre et connais bien le domaine, merci de me répondre.
Communication entre deux PICs en I²C
-
Jérémy
Administrateur du site- Messages : 2725
- Âge : 45
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Si tu débutes et que tu connais presque rien, comme tu l'as dit , cela va être compliqué..... il faut d'abord faire clignoter une led puis mettre un bouton poussoir etc ....
Sinon pour 30métres de fils tu vas avoir du mal avec l'I²C à mon avis . le RS-232 ou RS-485 me parait plus judicieux, mais attendons l'avis de personnes plus expérimentée.
Communication entre deux PICs en I²C
Bonjour,
Pour 30 m tu peux utiliser la solution sans fil avec une liaison série.
En utilisant deux modules HC12 : https://www.ebay.fr/itm/433Mhz-HC-12-SI ... SwxsRbc-uQ
Ce module est relié en TTL avec le PIC.
Exemple avec 4 PICs qui sont interrogés par un PC.
Pour 30 m tu peux utiliser la solution sans fil avec une liaison série.
En utilisant deux modules HC12 : https://www.ebay.fr/itm/433Mhz-HC-12-SI ... SwxsRbc-uQ
Ce module est relié en TTL avec le PIC.
Exemple avec 4 PICs qui sont interrogés par un PC.
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Communication entre deux PICs en I²C
- Gérard
Expert- Messages : 1648
- Âge : 65
- Enregistré en : septembre 2015
- Localisation : Alsace - Haut-Rhin
Bonjour et bienvenu Serge,
Je suis aussi de cet avis, avant de faire des choses compliquées, il faut commencer par les bases.
Je pense aussi que 30m en I2C n'est pas possible. La solution proposée par pspic me semble bien adaptée, maintenant si tu souhaites rester en filaire, une liaison en RS485 ou en boucle de courant est adaptée à ta distance.
Content de trouver quelqu'un qui fait du Basic.
Je suis aussi de cet avis, avant de faire des choses compliquées, il faut commencer par les bases.
Je pense aussi que 30m en I2C n'est pas possible. La solution proposée par pspic me semble bien adaptée, maintenant si tu souhaites rester en filaire, une liaison en RS485 ou en boucle de courant est adaptée à ta distance.
Content de trouver quelqu'un qui fait du Basic.
Communication entre deux PICs en I²C
Bonjour, et merci pour vos réponses.
EN fait, quand on ne maitrise pas complètement un domaine, je préfére dire que je n'y connais rien.
Mais je bricole un peu les PIC.
J'ai réalisé trois cartes équipées de PIC 18F2520 pour avoir un maximum de portes entrées/Sorties dans un minimum de place.
Ces trois cartes doivent communiquer entre-elles car les entrées de l'une interfèrent sur les deux autres et vice et versa.
Je veux utiliser le module MSSP du pic, et ne veux pas utiliser les fonctions Basique de MicroStudio qui paraissent plus lentes, et ne me permettent pas de maitriser au mieux ce qui se passe.
Le module EUSART ne convient pas, car ma liaison à besoin de se faire sur plus de 2 cartes.
L'i2c me parait mieux adapté.
J'ai ajouté le module PCA9600 sur le circuit afin de communiquer avec des courants plus forts (12V et 20mA)
J'arrive à émettre des signaux très propres sur un câble ordinaire de 20m (4x2,5mm²).
Mon problème ne se situe pas sur le hard que j'arrive à maitriser, mais sur les commandes de configuration des PIC.
Une led clignote par interruption(TMR0) toutes les secondes, afin de vérifier que le PIC tourne correctement, et ne reste pas planté sur une commande.
J'ai essayé de comprendre cette configue, mais manifestement, ma compréhension n'est pas bonne.
Voici ce que j'ai écris pour configurer mon PIC:
EN fait, quand on ne maitrise pas complètement un domaine, je préfére dire que je n'y connais rien.
Mais je bricole un peu les PIC.
J'ai réalisé trois cartes équipées de PIC 18F2520 pour avoir un maximum de portes entrées/Sorties dans un minimum de place.
Ces trois cartes doivent communiquer entre-elles car les entrées de l'une interfèrent sur les deux autres et vice et versa.
Je veux utiliser le module MSSP du pic, et ne veux pas utiliser les fonctions Basique de MicroStudio qui paraissent plus lentes, et ne me permettent pas de maitriser au mieux ce qui se passe.
Le module EUSART ne convient pas, car ma liaison à besoin de se faire sur plus de 2 cartes.
L'i2c me parait mieux adapté.
J'ai ajouté le module PCA9600 sur le circuit afin de communiquer avec des courants plus forts (12V et 20mA)
J'arrive à émettre des signaux très propres sur un câble ordinaire de 20m (4x2,5mm²).
Mon problème ne se situe pas sur le hard que j'arrive à maitriser, mais sur les commandes de configuration des PIC.
Une led clignote par interruption(TMR0) toutes les secondes, afin de vérifier que le PIC tourne correctement, et ne reste pas planté sur une commande.
J'ai essayé de comprendre cette configue, mais manifestement, ma compréhension n'est pas bonne.
Voici ce que j'ai écris pour configurer mon PIC:
Code : Tout sélectionner
' Module I2c
TXSTA.7 = 1 'CSRC Mode maitre avec horloge interne attribuée par BRG
TXSTA.6 = 0 'TX9 Transmission sur 8bits ou si =1 sur 9bits
TXSTA.5 = 1 'TXEN Transmission "Enable" SCREN ou CREN ignorent TXEN en mode synchro
TXSTA.4 = 1 'SYNC Transmission Synchrone'i2c ou asynchrone =0 UART ou SPI
TXSTA.3 = 0 'SENDB sans importance en mode synchrone (caractère BREAK pour l'assynchrone)
TXSTA.2 = 0 'BRGH Haute vitesse pour le Baud (400KHz au lieu de 100KHz) Incompatible sur plusieurs capteurs
TXSTA.1 = 1 'TRMT Registre de transmission vide si =0=plein
TXSTA.0 = 0 'TX9D 9ème bit de transmission peut être data ou parité ...
RCSTA.7 = 0 'SPEN 1= Sérial port Enabled (configure RX/DT et TX/CK en port série
RCSTA.6 = 0 'RX9 1= Réception sur 9 bits
RCSTA.5 = 1 'SREN Mode MAITRE Synchrone: 1= Enable réception simple (Bit effacé après réception complète)
RCSTA.4 = 0 'CREN 1=Enabled Réception continue (CREN Ignore SREN)
RCSTA.3 = 0 'ADDEN Adresse détect 9ème bit 1=Enabled interruption 0=9ème bit pour parité...
RCSTA.2 = 0 'FERR 1=Framing error (can be cleared by reading RCREG register and receiving next valid byte)
RCSTA.1 = 0 'OERR 1=Overrun error (can be cleared by clearing bit, CREN)
RCSTA.0 = 0 'RX9D 9ème bit d'adresse ou de parité à calculer par soft
'ADRESSE ' en Esclave mettre l'adresse de la carte dans SSPADD
SSPADD = $27 ' en Maitre $27=100kHz $0C=308kHz $09=400kHz @ 8 MHz 'si Maitre, ce registre contient la vitesse du réseau et si Esclave, contient l'adresse de l'esclave
SSPSTAT.7 = 1 ' SMP: Controle de la vitesse du bus: 1=vitesse standard 100 Khz 0=vitesse haute 400 Khz
SSPSTAT.6 = 0 ' CKE: SMBus Select 1=enable SMBus 0=desable SMBus
SSPSTAT.5 = 0 ' D/A: Data/Address en mode Maitre: (réservé). en esclave: 1=dernier byte reçu ou transmis est des DATA si non 0= Adresse
SSPSTAT.4 = 0 ' P: Stop bit si=1 StB à été détecté si=0 n'as pas été détecté
SSPSTAT.3 = 0 ' S: Start bit(1) si=1 StB à été détecté si=0 n'as pas été détecté
SSPSTAT.2 = 0 ' R/W: Read/Write Information bit (I2C mode only) en mode Esclave 1=Read 0=Write en mode Maitre 1= Transmission en cours 0= pas de transmission en cours
SSPSTAT.1 = 0 ' UA: Update Address bit (10-Bit Slave mode only) 1=Indique que l'utilisateur doit mettre à jour l'adresse dans le registre de SSPADD' 0=L'adresse ne doit pas être mise à jour
SSPSTAT.0 = 0 ' 0=BF: Buffer Full Status bit en mode Transmission 1= SSPBUF est plein 0=Vide'en mode Réception 1= SSPBUF est plein (sans inclure l'ACK et le StB) 0=vide
'Config I2c
SSPCON1.7 = 0 'WCOL Maitre: 1= Ecriture dans SSPBUF en transmission non valide (erreur) effacer le bit par soft
' Esclave: 1= le registre SSPBUF est écrit en transmission non finie (erreur) effacer le bit par soft
SSPCON1.6 = 0 'SSPOV Réception: 1= SSPBUF contient toujours un octet tandis qu'il en reçois un autre. (erreur) effacer le bit par soft
' Transmission: 1= Sans importance.
SSPCON1.5 = 1 'SSPEN 1= I2c Enable et configure les pins SDA et SCL
SSPCON1.4 = 0 'CKP Esclave: 1= Horloge de sortie 0= temps bas utilisé pour monter les données
' Maitre: 1= Non utilisé
SSPCON1.3 = 1 'SSPM 1111 = I2C Slave mode, 10-bit address with Start and Stop bit interrupts enabled
'1110 = I2C Slave mode, 7-bit address with Start and Stop bit interrupts enabled
SSPCON1.2 = 0 '1011 = I2C Firmware Controlled Master mode (Slave Idle)
SSPCON1.1 = 0 '1000 = I2C Master mode, clock = FOSC/(4 * (SSPADD + 1))
SSPCON1.0 = 0 '0111 = I2C Slave mode, 10-bit address
'0110 = I2C Slave mode, 7-bit address
'Bit combinations not specifically listed here are either reserved or implemented in SPI mode only.
'Gestion I2c
SSPCON2.7 = 0 'GCEN en mode Esclave seulement si =1 Enable Interruption si appel général à l'adresse(0000h) réception dans le SSPSR si=0 Desable l'appel générale
SSPCON2.6 = 0 'ACKSTAT Transmission Maitre seulement 1= pas d'acknowledge reçu de l'esclave 0= acknowledge reçu
SSPCON2.5 = 0 'ACKDT En Réception Maitre seulement 1= Pas d'acknowledge 0= acknowledge
SSPCON2.4 = 0 'ACKEN En Réception Maitre seulement 1= acknowledge sur SDA et SCL et transmission ACKDT Automatiquement (clear Hardwaire) 0= bus inocupé
SSPCON2.3 = 0 'RCEN Mode Maitre seulement 1= Enable mode réception I2c
SSPCON2.2 = 0 'PEN Mode Maitre seulement 1= Condition STOP sur SDA et SCL 0= libre (clear hardwaire)
SSPCON2.1 = 0 'RSEN Mode Maitre seulement 1= Condition Repeated START sur SDA et SCL 0= libre (clear hardwaire)
SSPCON2.0 = 0 'SEN Maitre: 1= Condition START sur SDA et SCL Esclave: 1= maintient l'horloge tant que l'esclave transmet
Modifié en dernier par Serge le mar. 18 sept. 2018 11:44, modifié 4 fois.
Communication entre deux PICs en I²C
J'ai également configuré pour la partie "Maitre":
Code : Tout sélectionner
OSCCON=%01110010 '
TRISA=%00000011
TRISB=%11111111
TRISC=%11111000 '3 et 4 en entrée c'est le MSSP qui gère
INTCON=%11110000 ' 7=Interruptions 6=Interruptions Périphériques 5=Compteur_0 4=Int_B0 3=Int_B4-7 2-1-0=Flag_Bit (Drapeaux)
INTCON2=%11100000
'''' 'INTCON3=%10001000
PIE1.7=0 'PSPIE 1=Enable Interruption Port Parallèle Lecture/Ecriture
PIE1.6=0 'ADIE 1=Enable A/D Convertisseur
PIE1.5=0 'RCIE 1=Enable EUSART Interruption Receive
PIE1.4=0 'TXIE 1=Enable EUSART Interruption Transmit
PIE1.3=1 'SSPIE 1=Enabled Interruption Port Série synchrone Maitre
PIE1.2=0 'CCP1IE 1=Enabled Interruption CCP1 Comparateur
PIE1.1=0 'TMR2IE 1=Enabled Interruption TMR2 vers PR2
PIE1.0=0 'TMR1IE 1=Enabled Interruption TMR1 Overflow
IPR1.7=0 'PSPIP Interruption Prioritaire port Parallèle
IPR1.6=0 'ADIP Interruption Prioritaire A/D Convertisseur
IPR1.5=0 'RCIP Interruption Prioritaire EUSART Réception
IPR1.4=0 'TXIP Interruption Prioritaire EUSART Transmission
IPR1.3=0 'SSPIP Interruption Prioritaire Port série Maître
IPR1.2=0 'CCP1IP Interruption Prioritaire Comparateur CCP1
IPR1.1=0 'TMR2IP Interruption Prioritaire TMR2 vers PR2 Match
IPR1.0=0 'TMR1IP Interruption Prioritaire TMR1 Overflow
'''''IPR2=%00000000
PIR1.7=0 'PSPIF 1=Flag interrupt à lecture ou écriture port Parallèle
PIR1.6=0 'ADIF 1=Flag Interrupt A/D conversion complete
PIR1.5=0 'RCIF 1=Flag EUSART Réception buffer
PIR1.4=0 'TXIF 1=Flag EUSART Transmission TXREG est Vide
PIR1.3=0 'SSPIF 1=Flag Synchrone Transmission/Réception complète (effacer par soft)
PIR1.2=0 'CCP1IF 1=Flag de capture sur TMR1 (effacer par soft) ou Comparaison effectuée avec TMR1
PIR1.1=0 'TMR2IF 1=Flag de TMR2 dans PR2 (effacer par soft)
PIR1.0=0 'TMR1IF 1=Flag du registre de TMR1 Overflow
Sort1 var PORTC.2
Sort2 var PORTC.1
Sort3 var PORTC.0
Sort4 var PORTA.6
Sort5 var PORTA.5
Sort6 var PORTA.4
Sort7 var PORTA.3
Sort8 var PORTA.2
LED var PORTA.7
SCL var PORTC.3
SDA var PORTC.4
Cli var bit
Bip var bit
On Interrupt Goto Int
Programme:
led=cli
goto Programme
I2CSTART:
SSPCON2.0 = 1 ; SEN - Start Condition Enable Bit
WHILE SSPCON2.0 = 1 : WEND ; Wait for Start to complete
sort2=1
RETURN
;-----------------------------------------------------------
I2CWR:
SSPBUF = I2CDATA ; Move data to SSPBUF
WHILE SSPSTAT.2 = 1 : WEND ; SSPSTAT = 1 Transmit in progress
sort3=1
While SSPCON2.6 = 1 : WEND ; Wait for Acknowledge from slave 1=NotAck
sort4=1
RETURN
;-----------------------------------------------------------
I2CSTOP:
SSPCON2.2 = 1 ; PEN - send stop bit
While SSPCON2.2 = 1 : Wend ; Wait for SSP to complete
sort5=1
Return
'''''''Interruptions
disable
Int:
if intcon.2=1 then 'interruption tempo TMR0
intcon.2=0
t0=t0+1
t1=t1+1
select case t0
case 1
bip=1
cli=1
case 32
bip=0
case 64
bip=1
cli=0
case 96
bip=0
case 128
t0=0
t2=t2+1
end select
endif
if PIR1.3 then 'Flag de l'I2c
sort8=1 'pour voir si l'interruption à bien eu lieu (pour développement)
PIR1.3=0
endif
if intcon.1=1 then 'interruption RB0 entrée 9
sort8=1
gosub I2CSTART
gosub I2CWR
gosub I2CSTOP
intcon.1=0 'RAZ de l'interruption B0'
endif
resume
enable
End
Modifié en dernier par Serge le mar. 18 sept. 2018 11:47, modifié 1 fois.
Communication entre deux PICs en I²C
Et voici la partie Esclave:
Code : Tout sélectionner
OSCCON=%01110010
TRISA=%00000011 '1= entrée
TRISB=%11111111 '0 = sortie
TRISC=%11111000 '
INTCON=%11110000 ' 7=Interruptions 6=Interruptions Périphériques 5=Compteur_0 4=Int_B0 3=Int_B4-7 2-1-0=Flag_Bit (Drapeaux)
INTCON2=%11000000 ' 7=PullUp du port B (Desabled=1) 6=B0_Montant 5=B1_Montant 4=B2_Montant 3=0 2=TMR0_Haute_Priorité 1=0
'INTCON3=%10001000 ' 7=Int2_Haute_Priorité 6=Int1_Haute_Priorité 5=0 4=B2_Interruption_Enabled 3=B1_Interruption_Enabled 2=0
PIE1.7=0 'PSPIE 1=Enable Interruption Port Parallèle Lecture/Ecriture
PIE1.6=0 'ADIE 1=Enable A/D Convertisseur
PIE1.5=0 'RCIE 1=Enable EUSART Interruption Receive
PIE1.4=0 'TXIE 1=Enable EUSART Interruption Transmit
PIE1.3=1 'SSPIE 1=Enabled Interruption Port Série synchrone Maitre
PIE1.2=0 'CCP1IE 1=Enabled Interruption CCP1 Comparateur
PIE1.1=0 'TMR2IE 1=Enabled Interruption TMR2 vers PR2
PIE1.0=0 'TMR1IE 1=Enabled Interruption TMR1 Overflow
'PIE2=%00000000 ' 7=Interruption Fail Oscillateur 6=Interruption Comparateur Enabled 5=0 4=Interruption Data Flash/EEprom Write Enabled
' 2=Interruption défaut tension Enabled 1=Interruption Overflow TMR3 Enabled 0=Interruption Comparateur2 CCP2 Enabled
IPR1.7=0 'PSPIP Interruption Prioritaire port Parallèle
IPR1.6=0 'ADIP Interruption Prioritaire A/D Convertisseur
IPR1.5=0 'RCIP Interruption Prioritaire EUSART Réception
IPR1.4=0 'TXIP Interruption Prioritaire EUSART Transmission
IPR1.3=0 'SSPIP Interruption Prioritaire Port série Maître
IPR1.2=0 'CCP1IP Interruption Prioritaire Comparateur CCP1
IPR1.1=0 'TMR2IP Interruption Prioritaire TMR2 vers PR2 Match
IPR1.0=0 'TMR1IP Interruption Prioritaire TMR1 Overflow
'IPR2=%00000000
PIR1.7=0 'PSPIF 1=Flag interrupt à lecture ou écriture
PIR1.6=0 'ADIF 1=Flag Interrupt A/D conversion complete
PIR1.5=0 'RCIF 1=Flag EUSART Réception buffer
PIR1.4=0 'TXIF 1=Flag EUSART Transmission TXREG est Vide
PIR1.3=0 'SSPIF 1=Flag Synchrone Transmission/Réception complète (effacer par soft)
PIR1.2=0 'CCP1IF 1=Flag de capture sur TMR1 (effacer par soft) ou Comparaison effectuée avec TMR1
PIR1.1=0 'TMR2IF 1=Flag de TMR2 dans PR2 (effacer par soft)
PIR1.0=0 'TMR1IF 1=Flag du registre de TMR1 Overflow
'PIE2=%00000000
'ADCON0 = %11000001 ' Configure+ and turn on A/D Module
ADCON1=%00001101 'bit 4 et 5 référence tension + et - et config portA 0 et 1
ADCON2=%00100100 ' bit 7à0 Justifie à gauche le résultat dans ADRH ou ADRL ensuite 8 TAD et Fosc/4 ' a confirmer selon mesures réalisées
T0CON=%11000101
' Module I2c
TXSTA.7 = 0 'CSRC 1= Mode maitre avec horloge interne attribuée par BRG 0=Esclave (adresse dans SSPADD)
TXSTA.6 = 0 'TX9 Transmission sur 8bits ou si =1 sur 9bits
TXSTA.5 = 1 'TXEN Transmission "Enable" SCREN ou CREN ignorent TXEN en mode synchro
TXSTA.4 = 1 'SYNC Transmission Synchrone'i2c ou asynchrone =0 UART ou SPI
TXSTA.3 = 0 'SENDB sans importance en mode synchrone (caractère BREAK pour l'assynchrone)
TXSTA.2 = 0 'BRGH Haute vitesse pour le Baud (400KHz au lieu de 100KHz) Incompatible sur plusieurs capteurs
TXSTA.1 = 1 'TRMT Registre de transmission vide si =0=plein
TXSTA.0 = 0 'TX9D 9ème bit de transmission peut être data ou parité ...
RCSTA.7 = 0 'SPEN 1= Sérial port Enabled (configure RX/DT et TX/CK en port série
RCSTA.6 = 0 'RX9 1= Réception sur 9 bits
RCSTA.5 = 0 'SREN Mode MAITRE Synchrone: 1= Enable réception simple (Bit effacé après réception complète)
RCSTA.4 = 0 'CREN 1=Enabled Réception continue (CREN Ignore SREN)
RCSTA.3 = 0 'ADDEN Adresse détect 9ème bit 1=Enabled interruption 0=9ème bit pour parité...
RCSTA.2 = 0 'FERR 1=Framing error (can be cleared by reading RCREG register and receiving next valid byte)
RCSTA.1 = 0 'OERR 1=Overrun error (can be cleared by clearing bit, CREN)
RCSTA.0 = 0 'RX9D 9ème bit d'adresse ou de parité à calculer par soft
'ADRESSE ' en Esclave mettre l'adresse de la carte dans SSPADD
SSPADD = 61 'en Maitre $27=100kHz $0C=308kHz $09=400kHz @ 8 MHz 'si Maitre, ce registre contient la vitesse du réseau et si Esclave, contient l'adresse de l'esclave
SSPSTAT.7 = 1 ' SMP: Controle de la vitesse du bus: 1=vitesse standard 100 Khz 0=vitesse haute 400 Khz
SSPSTAT.6 = 0 ' CKE: SMBus Select 1=enable SMBus 2=desable SMBus
SSPSTAT.5 = 0 ' D/A: Data/Address en mode Maitre (réservé) en esclave, 1=dernier byte reçu ou transmis est des DATA si non 0= Adresse
SSPSTAT.4 = 0 ' P: Stop bit si=1 StB à été détecté si=0 n'as pas été détecté
SSPSTAT.3 = 0 ' S: Start bit(1) si=1 StB à été détecté si=0 n'as pas été détecté
SSPSTAT.2 = 0 ' R/W: Read/Write Information bit (I2C mode only) en mode Esclave 1=Read 0=Write en mode Maitre 1= Transmission en cours 0= pas de transmission en cours
SSPSTAT.1 = 0 ' UA: Update Address bit (10-Bit Slave mode only) 1=Indique que l'utilisateur doit mettre à jour l'adresse dans le registre de SSPADD 0=' L'adresse ne doit pas être mise à jour
SSPSTAT.0 = 0 ' 0=BF: Buffer Full Status bit en mode Transmission 1= SSPBUF est plein 0=Vide
'en mode Réception 1= SSPBUF est plein (sans inclure l'ACK et le StB) 0=vide
SSPCON1.7 = 0 'WCOL Maitre: 1= Ecriture dans SSPBUF en transmission non valide (erreur) effacer le bit par soft
' Esclave: 1= le registre SSPBUF est écrit en transmission non finie (erreur) effacer le bit par soft
SSPCON1.6 = 0 'SSPOV Réception: 1= SSPBUF contient toujours un octet tandis qu'il en reçois un autre. (erreur) effacer le bit par soft
' Transmission: 1= Sans importance.
SSPCON1.5 = 1 'SSPEN 1= I2c Enable et configure les pins SDA et SCL
SSPCON1.4 = 0 'CKP Esclave: 1= Horloge de sortie 0= temps bas utilisé pour monter les données
' Maitre: 1= Non utilisé
SSPCON1.3 = 0 'SSPM 1111 = I2C Slave mode, 10-bit address with Start and Stop bit interrupts enabled
'1110 = I2C Slave mode, 7-bit address with Start and Stop bit interrupts enabled
SSPCON1.2 = 1 '1011 = I2C Firmware Controlled Master mode (Slave Idle)
SSPCON1.1 = 1 '1000 = I2C Master mode, clock = FOSC/(4 * (SSPADD + 1))
SSPCON1.0 = 0 '0111 = I2C Slave mode, 10-bit address
'0110 = I2C Slave mode, 7-bit address
'Bit combinations not specifically listed here are either reserved or implemented in SPI mode only.
SSPCON2.7 = 0 'GCEN en mode Esclave seulement si =1 Enable Interruption si appel général à l'adresse(0000h) réception dans le SSPSR si=0 Desable l'appel générale
SSPCON2.6 = 0 'ACKSTAT Transmission Maitre seulement 1= pas d'acknowledge reçu de l'esclave 0= acknowledge reçu
SSPCON2.5 = 0 'ACKDT En Réception Maitre seulement 1= Pas d'acknowledge 0= acknowledge
SSPCON2.4 = 0 'ACKEN En Réception Maitre seulement 1= acknowledge sur SDA et SCL et transmission ACKDT Automatiquement (clear Hardwaire) 0= bus inocupé
SSPCON2.3 = 0 'RCEN Mode Maitre seulement 1= Enable mode réception I2c
SSPCON2.2 = 0 'PEN Mode Maitre seulement 1= Condition STOP sur SDA et SCL 0= libre (clear hardwaire)
SSPCON2.1 = 0 'RSEN Mode Maitre seulement 1= Condition Repeated START sur SDA et SCL 0= libre (clear hardwaire)
SSPCON2.0 = 0 'SEN Maitre: 1= Condition START sur SDA et SCL Esclave: 1= maintient l'horloge tant que l'esclave transmet
On Interrupt Goto Int
Programme:
led=cli
return
I2CSTART:
SSPCON2.0 = 1 ; SEN - Start Condition Enable Bit
WHILE SSPCON2.0 = 1 : WEND ; Wait for Start to complete
RETURN
;-----------------------------------------------------------
I2CRD:
SSPCON2.3 = 1 ; RCEN - Enable receive mode
WHILE SSPCON2.3 = 1 : WEND ; Wait for Read to complete
I2CDATA = SSPBUF
Return
;-----------------------------------------------------------
I2CWR:
SSPBUF = I2CDATA ; Move data to SSPBUF
WHILE SSPSTAT.2 = 1 : WEND ; SSPSTAT = 1 Transmit in progress
While SSPCON2.6 = 1 : WEND ; Wait for Acknowledge from slave 1=NotAck
RETURN ; Acknowledge recieved
Return
;-----------------------------------------------------------
I2CSTOP:
SSPCON2.2 = 1 ; PEN - send stop bit
While SSPCON2.2 = 1 : Wend ; Wait for SSP to complete
Return
;-----------------------------------------------------------
I2CACK:
SSPCON2.5 = 0 ; ACKDT - Set Ack bit to Ack
SSPCON2.4 = 1 ; ACKEN - send ACKDT bit
While SSPCON2.4 = 1 : Wend ; Wait for SSP to complete
Return
disable
Int:
if intcon.2=1 then 'interruption tempo TMR0
intcon.2=0
t0=t0+1
t1=t1+1
select case t0
case 1
bip=1
cli=1
case 32
bip=0
case 64
bip=1
cli=0
case 96
bip=0
case 128
t0=0
t2=t2+1
end select
endif
if PIR1.3 then 'Flag de l'I2C
sort8=1
gosub I2CACK
PIR1.3=0
endif
resume
enable
End
Modifié en dernier par Serge le mar. 18 sept. 2018 11:54, modifié 1 fois.
Communication entre deux PICs en I²C
Communication entre deux PICs en I²C
Voici le dataSheet:
http://ww1.microchip.com/downloads/en/D ... 39631E.pdf
http://ww1.microchip.com/downloads/en/D ... 39631E.pdf
Communication entre deux PICs en I²C
-
Jérémy
Administrateur du site- Messages : 2725
- Âge : 45
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Pour ton soucis l'I²C me parait tout indiqué , mais par contre l'utilisation entre plusieurs PICS est déjà bien plus compliqué ! J'ai essayé il y a quelques temps mais j’ai laissé tombé !! J'y reviendrais un jour , mais je vais suivre ton post car cela m’intéresse .
Retourner vers « Langage BASIC & PASCAL »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 30 invités