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 : Jérémy
Test mini OLED SSD1306 20x10mm 128x32 18F27K42
Test mini OLED SSD1306 20x10mm 128x32 18F27K42
Test mini OLED SSD1306 20x10mm 128x32 18F27K42
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
Hello,
Bonsoir,
Toujours du fil à retordre avec le 18F27K42 en I2C1 Hardware , mais SANS la lib MikroC !
(bien que ça marche nickel avec ! .. mais pas l'OLED !,
ce qui explique mon entêtement à ne pas utiliser la lib MikroC ..
au 1er passage d'init SQW output, j'obtiens bien toute la trame I2C OK
device adresse +RW=0, 0x0E, 0x40
mais au 2 em passage
je n'ai qu'une trame , qui parait correcte .. mais trop courte ??
Device Adresse+RW=0, Ox0E ..mais pas la valeursuivante 0x40!
WHY ?
le tout etant dans le main programme, il n'y a normalement pas de phenomene lié à la réentrance..
trame correcte
Bonsoir,
Toujours du fil à retordre avec le 18F27K42 en I2C1 Hardware , mais SANS la lib MikroC !
(bien que ça marche nickel avec ! .. mais pas l'OLED !,
ce qui explique mon entêtement à ne pas utiliser la lib MikroC ..
Code : Tout sélectionner
CPrint(" Active sortie SQW=1Hz: \r\n");
tmp[0]=0x0E; tmp[1]=0x40; // set SQW output Start oscillateur
p1=&tmp[0];
SQA=1;
I2C1ADB1 = DS3231_ADDR; // Load address 0xD0 with write = 0
I2C1TXB = *(p1++); // Load beginning slave register address to write
I2C1CNT = 2; // Load with size of array to write PLUS 1 for reg
I2C1CON0_S = 1; // Set Start to get things going
while(I2C1CNT) // While count is true
{ SQA=1;
while(!I2C1STAT1_TXBE); // Wait until buffer is empty before loading
I2C1TXB = *(p1++);
SQA=0; // Load next byte to transmit, hardware decrements count
}
SQA=1;
while (I2C1PIR_PCIF==0) { }; // PCIF is set after the STOP
I2C1PIR_PCIF = 0; // Clear Stop condition IF
I2C1PIR_SCIF = 0; // Clear Start condition IF
I2C1STAT1_CLRBF = 1;
SQA=0;
CPrint(" vu OK avec SQA , 0x0E et 0x40 \r\n");
CPrint(" #2 Active sortie SQW=1Hz: \r\n");
Wait_TimeOut_Only(100,0);
tmp[0]=0x0E; tmp[1]=0x40; // set SQW output Start oscillateur
p1=&tmp[0];
SQA = 1 ;
I2C1PIR_PCIF = 0; // clear STOP bit flag
I2C1ADB1 = DS3231_ADDR; // Load address with write = 0
I2C1TXB = *(p1++); // Load beginning slave register address to write
I2C1CNT = 2; // Load with size of array to write PLUS 1 for reg
I2C1CON0_S = 1;
while(I2C1CNT>0) // While count is true
{
while(!I2C1STAT1_TXBE); // Wait until buffer is empty before loading
I2C1TXB = *(p1++);
}
while (I2C1PIR_PCIF==0) { }; // PCIF is set after the STOP
I2C1PIR_PCIF = 0; // Clear Stop condition IF
I2C1PIR_SCIF = 0; // Clear Start condition IF
I2C1STAT1_CLRBF = 1;
SQA=0;
CPrint(" vu BAD avec SQA , seulement 0x0E !manque 0x40 \r\n");
Wait_TimeOut_Only(30,0); // delay de 30x100mS 0=delay only 1=delay ou Keyboard touch
au 1er passage d'init SQW output, j'obtiens bien toute la trame I2C OK
device adresse +RW=0, 0x0E, 0x40
mais au 2 em passage
je n'ai qu'une trame , qui parait correcte .. mais trop courte ??
Device Adresse+RW=0, Ox0E ..mais pas la valeursuivante 0x40!
WHY ?
le tout etant dans le main programme, il n'y a normalement pas de phenomene lié à la réentrance..
trame correcte
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Test mini OLED SSD1306 20x10mm 128x32 18F27K42
Test mini OLED SSD1306 20x10mm 128x32 18F27K42
Bonsoir,
Dans la première trame I2C, tu envoies 2 ou 3 octets data ?
La trame correcte fait 3 octets data sur l'image, car il n'y a pas de stop !
J'avais pas fait de while (I2C1CNT), je sais pas si c'est bon ou pas, j'ai utilisé une autre variable, décrémentée dans la boucle.
Tu remplis I2C1TXB ensuite tu fais I2C1CNT = 2, peut être que cela donne 1+2 data au lieu de 2 data.
Le { } peut remplacer le ; après le while, donc { }; c'est redondant.
Teste d'abord avec ça, à envoyer plusieurs fois -> adresse + 0x0E + 0x40 :
dans mes tests je faisais plutôt
Dans la première trame I2C, tu envoies 2 ou 3 octets data ?
La trame correcte fait 3 octets data sur l'image, car il n'y a pas de stop !
J'avais pas fait de while (I2C1CNT), je sais pas si c'est bon ou pas, j'ai utilisé une autre variable, décrémentée dans la boucle.
Tu remplis I2C1TXB ensuite tu fais I2C1CNT = 2, peut être que cela donne 1+2 data au lieu de 2 data.
Le { } peut remplacer le ; après le while, donc { }; c'est redondant.
Teste d'abord avec ça, à envoyer plusieurs fois -> adresse + 0x0E + 0x40 :
Code : Tout sélectionner
I2C1ADB1 = DS3231_ADDR; // Load address 0xD0 with write = 0
I2C1CNT = 2; // Load with size of array to write PLUS 1 for reg
I2C1TXB = *(p1++); // Load beginning slave register address to write
I2C1PIR_PCIF = 0; // Clear Stop condition IF
I2C1CON0_S = 1; // Set Start to get things going
while (!I2C1STAT1_TXBE) ; // Wait until buffer is empty before loading
I2C1TXB = *(p1++);
while (!I2C1PIR_PCIF) ; // PCIF is set after the STOP
dans mes tests je faisais plutôt
Code : Tout sélectionner
while (!I2C1STAT0bits.BFRE) ; // attente bus libre
I2C1ADB1 = DS3231_ADDR; // Load address 0xD0 with write = 0
I2C1CNT = 2; // Load with size of array to write PLUS 1 for reg
I2C1TXB = *(p1++); // Load beginning slave register address to write
I2C1CON0_S = 1; // Set Start to get things going
while (!I2C1STAT1_TXBE) ; // Wait until buffer is empty before loading
I2C1TXB = *(p1++);
Test mini OLED SSD1306 20x10mm 128x32 18F27K42
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
satinas a écrit :Dans la première trame I2C, tu envoies 2 ou 3 octets data ?
j'envoie l'adresse device (0x68+bitR/W + 2 bytes de datas : 0x0E et 0x40)
satinas a écrit :La trame correcte fait 3 octets data sur l'image, car il n'y a pas de stop !
Si , le stop est bien présent en fin de trame ( lettre P)
si j'en crois la figure 33-19 I2C Master 7bits adress transmission + 2 data (pdf joint)
on voit que ICxCNT=02 pour l'adresse
I2CxCNT =1 pour data#1
I2CxCNT 0 pour data#2
I2CxCNT est deja à zero pendant l'envoi de data #2 !
et se termine par un stop.
Vraiment étrange comportement :
Seul le 1 er envoi est OK
le 2em envoi l'adresse device + data 0xAA qui correspond à l'indice 2 de ma table ?? avec un NACK
tmp[0]=0x0E; tmp[1]=0x40;tmp[2]=0xAA;tmp[3]=0x55;
comment est-ce possible ? puisque j'initialise le pointeur p1 sur le debut de ma table
et pour le 3em envoi, j'ai adresse device + data 0x40 ???? avec NACK
Là c'est trop fort !
AUCUNE MAITRISE de l'envoi ..
figure 33-19 I2C Matser datasheet DS400019 PIC18F..serie 42
Il y a cette notion de MSB of I2C1TXB 4 bits de poids fort D7,D6,D5,D4) de data #1 , le transfert LSB data#1 se ferait avec TBE=0 ?
avec software writes I2CxTXB au front montant de TXBE
et l'ecriture de MSB ( errare ?? ce devrait etre LSB) au front descendant de TXBE
et le second byte data #2 serait au 2e front montant de TXBE ?
Pourquoi parler de MSB sur un Byte ? ( un quartet ?)
d'autan que cette notion de MSB n'apparait plus pour le 2em data , pas de transition de TXBE apres bit D4
avec ce datagram on ne sait pas trop, qui fait quoi ? le hard ou le soft ( le programme qu'on ecrit !)
une errata de datasheet ?
dois je abandonner pour n'utiliser que MPLABX ?
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Test mini OLED SSD1306 20x10mm 128x32 18F27K42
J'ai pas compris pour le MSB et le LSB, où tu lis ça ?
Ah oui, il dit juste qu'on met en premier sur SDA, le bit de poids fort de I2C1TXB (MSB) . Logique, l'i2c transmet MSB first, comme le SPI et pas comme l'uart.
Tu t'obstines, pourquoi ne pas essayer ce que je t'ai demandé de tester, sans la boucle. Il n' y a que 2 octets à envoyer.
En envoyant en permanence la trame, tu peux voir à l'oscillo analogique ce que cela donne, si une trame est plus courte tu le verras.
PS Au cas où tu l 'aurais pas remarqué, j'essaye de te ramener à mon code qui a marché du premier coup sur l'Oled
Ah oui, il dit juste qu'on met en premier sur SDA, le bit de poids fort de I2C1TXB (MSB) . Logique, l'i2c transmet MSB first, comme le SPI et pas comme l'uart.
Tu t'obstines, pourquoi ne pas essayer ce que je t'ai demandé de tester, sans la boucle. Il n' y a que 2 octets à envoyer.
En envoyant en permanence la trame, tu peux voir à l'oscillo analogique ce que cela donne, si une trame est plus courte tu le verras.
PS Au cas où tu l 'aurais pas remarqué, j'essaye de te ramener à mon code qui a marché du premier coup sur l'Oled
Test mini OLED SSD1306 20x10mm 128x32 18F27K42
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
satinas a écrit :J'ai pas compris pour le MSB et le LSB, où tu lis ça ?
en fait , c'est plutot le fait que TXBE occupe une largeur de 4 bits (D7..D4) qui me laissait à penser cette notion de
MSB et LSB , alors que MSB est ecrit MSb .. le petit 'b' fait toute la difference.
J'ai testé le programme#2 , envoi de 2 bytes .. ne marche pas,
j'avais testé aussi le 2em , en sauvant mon source sous un autre nom (lié à la date !)
mais MikroC a tendance à toujours le sauver dans son propre directory , au lieu de mon directory Projet..
bien qu'ayant defini les "paths" via Edit search path !!
je recompilais donc l'ancienne version ...au lieu du source definit dans le projet en cours .. que de temps perdu!
Dans ce cas, je referme le projet et MikroC et le relance pour etre sûr ..
Re_testé à l'instant :
OK pour le 1er programme.. testé sur 3 envois consécutifs OK
sans utiliser de boucle ..
par contre , je pense qu'il faudrait utiliser I2C1CNT pour l'envoi d'un bloc de datas ?
exemple : pour l'envoi des 7 bytes d'init de la RTC SS,MN,HH,JS,JJ,MM,AA
ou bloc /page eeprom I2C ..
Test mini OLED SSD1306 20x10mm 128x32 18F27K42
Le module i2c1 utilise I2C1CNT pour sa propre cuisine interne, et surtout pour envoyer le Stop lorsque i2C1CNT arrive à 0.
Il faut bien sûr le renseigner au départ, c'est obligatoire.
Après pour la boucle qui remplit le registre I2C1TXB, autant créer sa propre variable, on sait combien d'octets on veut envoyer.
On doit aussi pouvoir boucler en utilisant I2C1CNT, mais il faut y aller petit à petit, en partant d'un truc qui marche.
La fonction OledData envoie déjà un buffer, pas de problème.
Dans le code C du 18F47Q10, il y a 2 fonctions, une qui écrit un buffer dans l'eeprom, avec lancement auto du cycle d'écriture à chaque franchissement de page, et la seconde qui attend que le cycle d'écriture soit terminé en interrogeant en permanence l'adresse i2c de l'eeprom jusqu'à réception d'un acknoledge.
Il faut bien sûr le renseigner au départ, c'est obligatoire.
Après pour la boucle qui remplit le registre I2C1TXB, autant créer sa propre variable, on sait combien d'octets on veut envoyer.
On doit aussi pouvoir boucler en utilisant I2C1CNT, mais il faut y aller petit à petit, en partant d'un truc qui marche.
La fonction OledData envoie déjà un buffer, pas de problème.
Dans le code C du 18F47Q10, il y a 2 fonctions, une qui écrit un buffer dans l'eeprom, avec lancement auto du cycle d'écriture à chaque franchissement de page, et la seconde qui attend que le cycle d'écriture soit terminé en interrogeant en permanence l'adresse i2c de l'eeprom jusqu'à réception d'un acknoledge.
Test mini OLED SSD1306 20x10mm 128x32 18F27K42
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 61 invités