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
Envoyer plusieurs octets avec SPI sur PIC16F
-
Superphénix
Débutant- Messages : 54
- Enregistré en : mars 2020
Bonjour
C'est la première fois que je tente de programmer une liaison SPI.
Le maître est un PIC16F1779 et les esclaves 3 CIs dont un BU97550KV avec lequel je suis en train de faire des tests.
J'ai écris un premier programme que je n'ai pas encore testé et qui envoie 1 octet :
Ma question est, comment faire pour envoyer plusieurs octets de sorte à ce que le BU97550KV les reçois dans le bon ordre ?
Suffit t'il de faire :
Et comment le BU97550KV sait quel octet reçu correspond à quoi ?
Autre question: Y a t'il des avantages de choisir un mode d'horloge plutôt qu'un autre avec SMP, CKE, CKP ? Là j'en ai choisis un qui me semblait le plus normale sans savoir si c'est mieux ou pas.
Merci
C'est la première fois que je tente de programmer une liaison SPI.
Le maître est un PIC16F1779 et les esclaves 3 CIs dont un BU97550KV avec lequel je suis en train de faire des tests.
J'ai écris un premier programme que je n'ai pas encore testé et qui envoie 1 octet :
Code : Tout sélectionner
SSPDATPPS = 0b00001001 ; // RB1
SSPCLKPPS = 0b00011010 ; // RD2
SSPSSPPS = 0b00011111 ; // RD7 (LCD)
SSP1STATbits.SMP = 0 ;
SSP1STATbits.CKE = 1 ;
SSP1CON1bits.CKP = 0 ;
SSP1CON1bits.SSPM = 0b0010 ; // 62500Hz // 0010 = SPI Master mode, clock = FOSC/64 ; 0001 = SPI Master mode, clock = FOSC/16
SSP1CON1bits.SSPEN = 1 ; // SPI ON
SSPBUF = data ; // data=char
while(!SSP1STATbits.BF) ; // Wait for Data Transmit/Receipt complete
SSP1CON1bits.SSPEN = 0 ; // SPI OFF
Ma question est, comment faire pour envoyer plusieurs octets de sorte à ce que le BU97550KV les reçois dans le bon ordre ?
Suffit t'il de faire :
Code : Tout sélectionner
SSPBUF = data1 ;
while(!SSP1STATbits.BF) ;
SSPBUF = data2 ;
while(!SSP1STATbits.BF) ;
SSPBUF = data3 ;
while(!SSP1STATbits.BF) ;
… ??
Et comment le BU97550KV sait quel octet reçu correspond à quoi ?
Autre question: Y a t'il des avantages de choisir un mode d'horloge plutôt qu'un autre avec SMP, CKE, CKP ? Là j'en ai choisis un qui me semblait le plus normale sans savoir si c'est mieux ou pas.
Merci
Envoyer plusieurs octets avec SPI sur PIC16F
Bonsoir,
Je suis pas dans ma section, car je pratique l'assembleur (ASM), mais pour la configuration voici ce qui faut faire pour ton PIC16F1779 en version ASM
Quand tu vas maitriser le protocole SPI, il faudra envoyer les séquences spécifique pour ton écran.
Je crois que tu veux aller trop vite, il y a du boulot crois moi, mais bon tu es au bon endroit, c'est quand même mieux que Futura ou tu
as pas eu grande réponse.
Note : J'ai pas vérifier le brochage des sorties SPI sur ton Pic, ici c'est un exemple
Exemple en ASM
A+
Je suis pas dans ma section, car je pratique l'assembleur (ASM), mais pour la configuration voici ce qui faut faire pour ton PIC16F1779 en version ASM
Quand tu vas maitriser le protocole SPI, il faudra envoyer les séquences spécifique pour ton écran.
Je crois que tu veux aller trop vite, il y a du boulot crois moi, mais bon tu es au bon endroit, c'est quand même mieux que Futura ou tu
as pas eu grande réponse.
Note : J'ai pas vérifier le brochage des sorties SPI sur ton Pic, ici c'est un exemple
Exemple en ASM
Code : Tout sélectionner
;*************************************** assignations *****************************************
#DEFINE dc LATA,2 ; RA2 ==> sélection du mode : commande = 0 , donnée = 1
#DEFINE cs LATA,1 ; RA1 ==> activer ou désactiver la transmission
#DEFINE rst LATA,0 ; RA0 ==> reset de l'écran
;************************** configuration des registres pour mode SPI **************************
movlw B'01000000' ; B7 = 0 : lecture des données au milieu
movwf SSP1STAT ;
movlw B'00100001' ; B0 ...B3 = spi en mode Maître, B5 = polarité négative
movwf SSP1CON1 ; horloge = FOSC/16 application 64 /16 = 4Mbps
;************************ configuration du registre TRISC pour mode SPI ************************
movlw B'01010000' ;
movwf TRISC ;
;*************************** " exemple pour utilisation du mode SPI" ***************************
movlw 0x10
rcall command ; pour commande de ton LCD
movf datas,W
rcall donner ; pour donner de ton LCD
boucle
nop
bra boucle
;***********************************************************************************************
command
bcf dc ; DC = 0 en mode commande
bra spi
;***********************************************************************************************
donner
bsf dc ; DC = 1 en mode donnée
bra spi ;
;***********************************************************************************************
spi
bcf cs ; mise en fonction du mode SPI
; charger les données dans W
movwf SSP1BUF ; puis les transmettres dans le registre pour l'envoi
attends
btfss SSP1STAT,BF ; attendre
bra attends ; boucler jusqu'a finition d'envoie des données
bsf cs ; mise hors fonction du mode SPI
movf SSP1BUF,W ; précaution de lecture pour vider registre
return
A+
Envoyer plusieurs octets avec SPI sur PIC16F
-
Superphénix
Débutant- Messages : 54
- Enregistré en : mars 2020
Envoyer plusieurs octets avec SPI sur PIC16F
-
Superphénix
Débutant- Messages : 54
- Enregistré en : mars 2020
J'ai avancé mon programme comme je le pensais et évidement après test ça ne fait rien.
Je ne sais pas s'il s'agit d'un problème de bits de configuration du BU ou de la manière dont j'ai fait le programme en C qui ne marche pas, mais l’afficheur n'affiche rien.
Je poste le code complet :
J'ai fait aussi ce jolie tableau qui contient les octets des trames à envoyer au BU :
Je ne sais pas s'il s'agit d'un problème de bits de configuration du BU ou de la manière dont j'ai fait le programme en C qui ne marche pas, mais l’afficheur n'affiche rien.
Je poste le code complet :
Code : Tout sélectionner
#define _XTAL_FREQ 4000000
#include <XC.h>
#include <stdio.h>
#include <stdlib.h>
#pragma config FOSC = XT
#pragma config FCMEN = OFF
#pragma config IESO = OFF
#pragma config CLKOUTEN = OFF
#pragma config BOREN = OFF
#pragma config CP = OFF //Protection mémoire?
#pragma config MCLRE = OFF // PIN RESET
#pragma config PWRTE = OFF
#pragma config WDTE = OFF
#pragma config LVP = OFF
#pragma config LPBOR = OFF
#pragma config STVREN = OFF
#pragma config PLLEN = OFF
#pragma config ZCD = OFF
#pragma config PPS1WAY = OFF
#pragma config WRT = OFF
#define SEL_RTC PORTDbits.RD5
#define SEL_GPS PORTDbits.RD6
#define SEL_LCD PORTDbits.RD7
int main(int argc, char** argv)
{
unsigned int i=0, j=0 ;
unsigned char AFF1[3][19], AFF2[3][19] ; // Contiens les 6 trames à envoyer au BU. Je décompose en 2 pour éviter des problèmes de mémoire.
TRISB = 0b00001101 ;
TRISD = 0b00000001 ;
ANSELB = 0b00000000 ;
ANSELD = 0b00000001 ;
PORTB = 0b00010000 ;
PORTD = 0b11100000 ;
OSCCON = 0b00111000 ;
// PPS :
SSPDATPPS = 0b00001001 ; // RB1
SSPCLKPPS = 0b00011010 ; // RD2
SSPSSPPS = 0b00011111 ; // RD7
for(i=0 ; i<3 ; i++) for(j=0 ; j<19 ; j++) {AFF1[i][j]=0 ; AFF2[i][j]=0 ;} // Tout est à 0 sauf les octets qui suivent.
AFF1[0][15]=0b00000001 ; AFF1[0][16]=0b01011111 ; AFF1[0][17]=0b11100111 ;
AFF1[1][16]=0b00011111 ; AFF1[1][17]=0b11110111 ; AFF1[1][18]=0b10000001 ;
AFF1[2][18]=0b00000010 ;
AFF2[0][18]=0b00000011 ;
AFF2[1][18]=0b00000100 ;
AFF2[2][18]=0b00000101 ;
AFF2[0][3]=0b00010000 ; AFF1[0][5]=0b10010001 ; AFF2[1][9]=0b10010001 ; AFF2[2][10]=0b10010001 ; // N'importe quoi pour tester
SSP1STATbits.SMP = 0 ;
SSP1STATbits.CKE = 1 ;
SSP1CON1bits.CKP = 0 ;
SSP1CON1bits.SSPM = 0b0010 ; // 0010 = SPI Master mode, clock = FOSC/64=62500Hz ;
SSP1CON1bits.SSPEN = 1 ; // SPI ON
for(i=0 ; i<3 ; i++)
{
SSPBUF = 0b10010010 ; // Adresse 49h
while(!SSP1STATbits.BF) ;
SEL_LCD = 0 ;
for(j=0 ; j<19 ; j++)
{
SSPBUF = AFF1[i][j] ;
while(!SSP1STATbits.BF) ;
}
SEL_LCD = 1 ;
__delay_us(100) ;
}
for(i=0 ; i<3 ; i++)
{
SSPBUF = 0b10010010 ; // Adresse 49h
while(!SSP1STATbits.BF) ;
SEL_LCD = 0 ;
for(j=0 ; j<19 ; j++)
{
SSPBUF = AFF2[i][j] ;
while(!SSP1STATbits.BF) ;
}
SEL_LCD = 1 ;
__delay_us(100) ;
}
while(1){}
SSP1CON1bits.SSPEN = 0 ; // SPI OFF
return (EXIT_SUCCESS);
}
J'ai fait aussi ce jolie tableau qui contient les octets des trames à envoyer au BU :
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Envoyer plusieurs octets avec SPI sur PIC16F
Bonsoir,
Je vais te poser la question inverse, parce que là.... tu nous demande de lire la datasheet à ta place, et de le comprendre
Peux tu nous dire.... sur quelle page de la datasheet de l'écran as tu vue ça pour le mode SPI... BU97550KV
il y a une base de donnée ou sont stockés les adresses, dans les adresses il y a des informations, faut pas chercher plus loin, car tu es pas constructeur.
On te donne la datasheet ou théoriquement tout est inscrit pour faire fonctionner ton écran.
Là tu confonds tous,
SMP :1 = Données d'entrée échantillonnées à la fin du temps de sortie des données
0 = Données d'entrée échantillonnées au milieu du temps de sortie des données
Généralement on choisi le milieu, mais tout dépend de ton écran
CKE :1 = la transmission se produit lors du passage de l'état d'horloge actif à l'état inactif
0 = la transmission se produit lors du passage de l'état inactif à l'état d'horloge actif
CKP :1 = l'état inactif de l'horloge est un niveau élevé
0 = l'état inactif de l'horloge est un niveau bas
Pour ton écran... il y a surement un reset a faire, avant de lui envoyer les commandes, de plus je te conseille d'acheter un analyseur logique
ceux à 10 euros suffit voici un lien
Moi j'en suis jamais sorti, et j'ai maintenant mes bibliothèque que je peux modifier à tout moment.
A+
Superphénix a écrit :Source du message Ma question est, comment faire pour envoyer plusieurs octets de sorte à ce que le BU97550KV les reçois dans le bon ordre ?
Je vais te poser la question inverse, parce que là.... tu nous demande de lire la datasheet à ta place, et de le comprendre
Peux tu nous dire.... sur quelle page de la datasheet de l'écran as tu vue ça pour le mode SPI... BU97550KV
Et comment le BU97550KV sait quel octet reçu correspond à quoi ?
il y a une base de donnée ou sont stockés les adresses, dans les adresses il y a des informations, faut pas chercher plus loin, car tu es pas constructeur.
On te donne la datasheet ou théoriquement tout est inscrit pour faire fonctionner ton écran.
Superphénix a écrit :Source du message Autre question: Y a t'il des avantages de choisir un mode d'horloge plutôt qu'un autre avec SMP, CKE, CKP ? Là j'en ai choisis un qui me semblait le plus normale sans savoir si c'est mieux ou pas.
Là tu confonds tous,
SMP :1 = Données d'entrée échantillonnées à la fin du temps de sortie des données
0 = Données d'entrée échantillonnées au milieu du temps de sortie des données
Généralement on choisi le milieu, mais tout dépend de ton écran
CKE :1 = la transmission se produit lors du passage de l'état d'horloge actif à l'état inactif
0 = la transmission se produit lors du passage de l'état inactif à l'état d'horloge actif
CKP :1 = l'état inactif de l'horloge est un niveau élevé
0 = l'état inactif de l'horloge est un niveau bas
Pour ton écran... il y a surement un reset a faire, avant de lui envoyer les commandes, de plus je te conseille d'acheter un analyseur logique
ceux à 10 euros suffit voici un lien
Superphénix a écrit :Source du message La dernière fois que j'ai fait de l'assembleur c'était en cours à l'IUT en 2011
Moi j'en suis jamais sorti, et j'ai maintenant mes bibliothèque que je peux modifier à tout moment.
A+
Envoyer plusieurs octets avec SPI sur PIC16F
-
Superphénix
Débutant- Messages : 54
- Enregistré en : mars 2020
Je ne l'ai pas vu, c'est pour ça que je demande.
Par contre je crois que j'ai oublié d'expliquer quelque chose. Le PIC est connecté au BU et les sorties du BU sont connectés à l'écran. L'écran affiche des segments et icones. Il a 80PIN, c'est un 1/8duty, 1/4bias. µC+BU+Écran sont sur la même carte, que j'ai conçu.
Pour les données je m'oriente par rapport aux trames à la page 8.
C'est bon pour cette question. J'ai trouvé les adresses, qui font tout simplement partie de ce qui est envoyé dans les trames de la page 8. (le DD à la fin de chaque trame)
Ok pour SMP, CKE, CKP.
Il le fait automatiquement au démarrage (page66). J'ai ajouté le condensateur de 100nF comme ils le demandent à une autre page, pour que ça puisse fonctionner.
Merci pour le lien, ça m'intéresse parce que j'en ai pas.
Par contre je crois que j'ai oublié d'expliquer quelque chose. Le PIC est connecté au BU et les sorties du BU sont connectés à l'écran. L'écran affiche des segments et icones. Il a 80PIN, c'est un 1/8duty, 1/4bias. µC+BU+Écran sont sur la même carte, que j'ai conçu.
Pour les données je m'oriente par rapport aux trames à la page 8.
il y a une base de donnée ou sont stockés les adresses, dans les adresses il y a des informations, faut pas chercher plus loin, car tu es pas constructeur.
C'est bon pour cette question. J'ai trouvé les adresses, qui font tout simplement partie de ce qui est envoyé dans les trames de la page 8. (le DD à la fin de chaque trame)
Ok pour SMP, CKE, CKP.
Pour ton écran... il y a surement un reset a faire
Il le fait automatiquement au démarrage (page66). J'ai ajouté le condensateur de 100nF comme ils le demandent à une autre page, pour que ça puisse fonctionner.
Merci pour le lien, ça m'intéresse parce que j'en ai pas.
Envoyer plusieurs octets avec SPI sur PIC16F
Re
A lire entièrement, voici une explication pour mettre en fonction l'analyseur logique ICI j'ai le même et j'en suis content.
Je vais regarder la datasheet de ton écran sans rien te promette, car l'anglais je connais pas du tout, je le devine c'est tout.
A+
Superphénix a écrit :Source du message Merci pour le lien, ça m'intéresse parce que j'en ai pas.
A lire entièrement, voici une explication pour mettre en fonction l'analyseur logique ICI j'ai le même et j'en suis content.
Je vais regarder la datasheet de ton écran sans rien te promette, car l'anglais je connais pas du tout, je le devine c'est tout.
A+
Envoyer plusieurs octets avec SPI sur PIC16F
Bonjour,
après le while(!SSP1STATbits.BF) ;
il faut lire SSPBUF, ce qui remet à zéro le bit BF.
Si le bif BF reste à 1, les while suivants ne seront pas bon.
Il se peut que l'écriture de SSPBUF le remette aussi à zéro, il faudrait regarder.
Je n'ai pas la réponse car je lis toujours SSPBUF, le spi c'est un échange d'octet, et c'est un même registre qui fait tout le boulot.
après le while(!SSP1STATbits.BF) ;
il faut lire SSPBUF, ce qui remet à zéro le bit BF.
Si le bif BF reste à 1, les while suivants ne seront pas bon.
Il se peut que l'écriture de SSPBUF le remette aussi à zéro, il faudrait regarder.
Je n'ai pas la réponse car je lis toujours SSPBUF, le spi c'est un échange d'octet, et c'est un même registre qui fait tout le boulot.
Envoyer plusieurs octets avec SPI sur PIC16F
-
Superphénix
Débutant- Messages : 54
- Enregistré en : mars 2020
Envoyer plusieurs octets avec SPI sur PIC16F
-
Superphénix
Débutant- Messages : 54
- Enregistré en : mars 2020
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 46 invités