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
[RESOLU] UART Write Text erreur !
Bonjour a tous,
toujours dans ma quête de faire fonctionné un écran lcd en i2c voir topic ici . paulfjujo m'a gentiment donner un code qui permet de scaner les appareils i2c connecter sur mon 16f887.
J'ai donc décidé par propreté de créer un nouveau projet qui aura pour but unique de scanner les adresses i2c sur le pic 16f887.
Le problème, c'est que je n'arrive même pas a affiché un simple hello word en UART. J'ai utilisé le code donner dans l'aide de mikroc mais rien.
J'ai donc comme beaucoup m’ont déjà démontrer sur ce forum. mis une led qui clignote en fin de code, histoire de faire entre guillemet un debug.
Voici le souci que je rencontre. Si je comment la phrase 11 du code, qui correspond a : UART1_Write_Text("Hello word"); la led clignote bien. Mais des que je la "décommante", la led ne fonctionne plus. Ou ai-je fait l'erreur ?
Problème résolu le 07/03/2018. ça venait du microcontrôleur.
Voici mon code final fonctionnel:
D'avance merci.
@++
toujours dans ma quête de faire fonctionné un écran lcd en i2c voir topic ici . paulfjujo m'a gentiment donner un code qui permet de scaner les appareils i2c connecter sur mon 16f887.
J'ai donc décidé par propreté de créer un nouveau projet qui aura pour but unique de scanner les adresses i2c sur le pic 16f887.
Le problème, c'est que je n'arrive même pas a affiché un simple hello word en UART. J'ai utilisé le code donner dans l'aide de mikroc mais rien.
J'ai donc comme beaucoup m’ont déjà démontrer sur ce forum. mis une led qui clignote en fin de code, histoire de faire entre guillemet un debug.
Voici le souci que je rencontre. Si je comment la phrase 11 du code, qui correspond a : UART1_Write_Text("Hello word"); la led clignote bien. Mais des que je la "décommante", la led ne fonctionne plus. Ou ai-je fait l'erreur ?
Problème résolu le 07/03/2018. ça venait du microcontrôleur.
Voici mon code final fonctionnel:
Code : Tout sélectionner
sbit led at RA4_bit; // donne un nom a la patte RA4 du microcontorleur "led"
// procedure de paulfjujo pour les pic 16F
void UART1_Write_CText(const char *txt)
{
while (*txt)
{
UART1_Write(*txt++);
// Delay_us(500);
}
}
void main() {
OSCCON = 0b01110001; // oscilateur 8Mhz
while(OSCCON.HTS==0); // boucle en attendant de voir le flag à 1
C1ON_bit = 0; // Disable comparators
C2ON_bit = 0;
ANSEL = 0; // Configure AN pins as digital
ANSELH = 0;
TRISA = 0x00; // tout les port A en sortie. Entrée = 1, sortie = 0
TRISC=0b10111111; // RC7 en entree RC6 en Sortie
//////////////////////////////////////////////////////////////////////////////
//clignotement de la led en debut de code/////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
led = 1; // allume la led
delay_ms(2000);
led = 0; // eteint la led
delay_ms(2000);
led = 1; // allume la led
delay_ms(2000);
led = 0; // eteint la led
delay_ms(2000);
UART1_Init(9600); // Initialize UART module at 9600 bps
Delay_ms(100); // Wait for UART module to stabilize
while (1) { // Boucle infini
UART1_Write_CText("Hello World \r\n"); // on appel la procedure plus haut
led = 1; // allume la led
delay_ms(1000);
led = 0; // eteint la led
delay_ms(1000);
}
}
D'avance merci.
@++
Modifié en dernier par venom le mer. 7 mars 2018 13:27, modifié 1 fois.
UART Write Text erreur !
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
bonjour Venom et à tous,
Attention avec les 16F , meme si le resultat de compilation est OK avec 0 erreurs
As tu un message warning IRP bit ? ( fenetre Messages)
pour ecrire un message en dur , dans le code , ,il vaut mieux utiliser
ou
rajoute aussi
Attention avec les 16F , meme si le resultat de compilation est OK avec 0 erreurs
As tu un message warning IRP bit ? ( fenetre Messages)
pour ecrire un message en dur , dans le code , ,il vaut mieux utiliser
Code : Tout sélectionner
void UART1_Write_CText(const char *txt)
{
while (*txt)
{
UART1_Write(*txt++);
// Delay_us(500);
}
}
....
UART1_Write_CText("Hello World \r\n");
...
ou
Code : Tout sélectionner
char TEXTE[]= "Hello World";
....
UART1_Write_Text(TEXTE);
rajoute aussi
Code : Tout sélectionner
C1ON_bit = 0; // Disable comparators
C2ON_bit = 0;
UART Write Text erreur !
Ah d'accord. J'avais bien croisé ta procédure UART1_Write_CText car nous avions déjà eu affaire a l'UART sur mon projet de thermomètre.
Mais je me suis dit que pour un "simple message" le pointeur était inutile. Puis je suis rester buté sur l'exemple dans l'aide mikroc, qu i est beaucoup plus basic. Et qui utilise un 16F d’où mon erreur
Autre question en rapport a ta réponse, pourquoi les ++ a cette ligne UART1_Write(*txt++); ?
Encore merci de ton aide.
@++
Mais je me suis dit que pour un "simple message" le pointeur était inutile. Puis je suis rester buté sur l'exemple dans l'aide mikroc, qu i est beaucoup plus basic. Et qui utilise un 16F d’où mon erreur
Autre question en rapport a ta réponse, pourquoi les ++ a cette ligne UART1_Write(*txt++); ?
Encore merci de ton aide.
@++
Modifié en dernier par venom le sam. 3 mars 2018 10:46, modifié 2 fois.
UART Write Text erreur !
-
Jérémy
Administrateur du site- Messages : 2725
- Âge : 45
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Bonjour ,
Il sert à incrementer le pointeur "txt". Autrement dis tu passes au caractére suivant !
venom a écrit :Source du message Autre question en rapport a ta réponse, pourquoi les ++ a cette ligne UART1_Write(*txt++); ?
Il sert à incrementer le pointeur "txt". Autrement dis tu passes au caractére suivant !
UART Write Text erreur !
Ah très bien je vois ce que tu veut dire. Merci Jérémy
@++
@++
UART Write Text erreur !
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
venom a écrit :....l'exemple dans l'aide mikroc, qu i est beaucoup plus basic. Et qui utilise un 16F d’où mon erreur
Ce n'est pas vraiment une erreur , puisque cela "tombe en marche" ((c)Daudet78) dans les courts exemples de mikroC..
ce qui n'est plus le cas , des qu'on s'approche des limites de RAM du MCU considéré !
Le compilo ne sachant plus gerer tout seul les franchissement de Bank ..
voir avec mot clé "IRP bit" sur le forum MikroC ..
d'ou l'usage de pointeur "constant" pour mettre le texte en flash ROM, Là ou il y a plus de place dispo,
plutot que en RAM ( espace Rikiki).
C'est pourquoi MikroC préconise l'usage du 18F plutot que les 16F ( anciens)
UART Write Text erreur !
Merci pour ces explications. Donc on utilise la rom plutôt que la RAM pour les 16f.
Je mettrai un résolu après test
@++
Je mettrai un résolu après test
@++
UART Write Text erreur !
Pour résumé ça donne ceci ;
C'est bien ça ?
@++
Code : Tout sélectionner
sbit led at RA4_bit; // donne un nom a la patte RA4 du microcontorleur "led"
// procedure de paulfjujo pour les pic 16F
void UART1_Write_CText(const char *txt)
{
while (*txt)
{
UART1_Write(*txt++);
// Delay_us(500);
}
}
void main() {
C1ON_bit = 0; // Disable comparators
C2ON_bit = 0;
ANSEL = 0; // Configure AN pins as digital
ANSELH = 0;
TRISA = 0x00; // tout les port A en sortie. Entrée = 1, sortie = 0
UART1_Init(9600); // Initialize UART module at 9600 bps
Delay_ms(100); // Wait for UART module to stabilize
while (1) { // Endless loop
UART1_Write_CText("Hello World \r\n"); // on appel la procedure plus haut
led = 1; // allume la led
delay_ms(500);
led = 0; // eteint la led
delay_ms(500);
}
}
C'est bien ça ?
@++
UART Write Text erreur !
Arf... ça ne veut pas, ça ne veut pas Pourquoi avec moi un simple code deviens si compliqué... (manque de connaissance sans doute)
@++
@++
UART Write Text erreur !
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
Est-tu sur de ton terminal ?
pas de croisement TX,RX ?
As-tu verifier que le programme tourne avec led clignotante en debut de programme ...
Essai aussi un simple envoi de 1 caractere à la fois
montre le contenu de la fenetre "Messages" (resultat de compuilation
sinon, exemple ci dessous , dûment testé OK , avec en sus , la reception
pas de croisement TX,RX ?
As-tu verifier que le programme tourne avec led clignotante en debut de programme ...
Essai aussi un simple envoi de 1 caractere à la fois
Code : Tout sélectionner
UART1_Write('A'); Delay_ms(100);
UART1_Write('B');Delay_ms(100);
UART1_Write('C');Delay_ms(100);
montre le contenu de la fenetre "Messages" (resultat de compuilation
sinon, exemple ci dessous , dûment testé OK , avec en sus , la reception
Code : Tout sélectionner
#define Version "12-06-2016"
// activation TMRO IT
//C:\_MikroC\_MesProjets_MikroC\_16F887_Demo_Board\16F887_UART_IT_Test_1606.c
//#define Version "23-07-2015"
// C:\_MikroC\_MesProjets_MikroC\_16F887_Demo_Board\16F887_UART_IT_Test_150723.c
// C:\_MikroC\_MesProjets_MikroC\16F887_Uart_Test.mcppi
// 04-04-2015
//Hardware :
// carte Microchip PICkit2 44 pin demo board
//ac:board_schem
// PIC16F887
// FOSC interne 8MHz
// 8 leds sur PORTD
// switch INT0 sur RB0
// RA0 analog input POTAR RP1
// module bluetooth (à 9600 bauds
// RC6 -->--RXD HC06 ou fil blanc PROLIX PL2303
// RC7 --<--TXD HC06 ou fil vert PROLIX PL2303
// ou
// test avec cordon USB-RS232 DB9 TREND TUS9 + interface 2tr RS232 - TTL sur RC6 et RC7
// Vbray terminal 19200 bds sur COM12
//
//16F887_FOSC_Interne_8MHz.cfgsch
// CONFIG1 : $2007 : 0x2CF4
// CONFIG2 : $2008 : 0x0700
#define POWER_SUPPLY_5V
#define FOSC 8 // MHz
#define BAUD 9600 // UART1 vers module BT HC06
//#define With_IT_RB0
#define Wit_TMR0
//-- commandes terminal VT220
#define CLS 12 // effacement de page sur Terminal VBRAY
#define CR 13
#define VT 10
#define LF 10
#define TAB 9
#define Bell 7
#define Byte unsigned char
// pinout settings
sbit LD7 at RD7_bit;
sbit LD6 at RD6_bit;
sbit LD5 at RD5_bit;
sbit LD4 at RD4_bit;
sbit LD3 at RD3_bit;
sbit LD2 at RD2_bit;
sbit LD1 at RD1_bit;
sbit LD0 at RD0_bit;
sbit SW1 at RB0_bit ;
// 12345678901234567890
const char chaine0[]="16F877 Card 44 pin: Test IT UART & Timer0 \r\n ";
const char chaine1[]="FOSC interne 8MHZ Port COM 19200 \r\n";
const char chaine2[]="C:\_MikroC\_MesProjets_MikroC\16F887_Uart_Test.mcppi\r\n";
const char *RS_Str[]={chaine0,chaine1,chaine2};
char Texte[48];
char CRam1[20];
char *txt;
char c1;
int i,j,k;
unsigned int cpt0;
unsigned int Max_Timer0=40;
unsigned int Flag_Timer0=0;
#define MAXLEN 40
unsigned char buffer[MAXLEN];
unsigned int Index1,i1;
unsigned int UART1_DataReady;
unsigned char cpt1, cpt2 ,cpt3 ;
unsigned long T1;
unsigned int M0;
void Interrupt() iv 0x0004 ics ICS_AUTO
{
//UART1
if((RCIF_bit) && (RCIE_bit))
{
if(OERR_bit)
{
CREN_bit = 0;
CREN_bit = 1;
OERR_bit = 0;
}
if(FERR_bit) c1 = RCREG;
c1 = RCREG;
if ((c1==CR)|| (i1>=MAXLEN))
{
UART1_DataReady=1;
if (i1 >=MAXLEN) UART1_DataReady=2;
PIE1.RCIE=0 ; //interdit IT Reception UART
buffer[i1]=0;
Index1=i1;
i1=0;
c1=0;
}
else
{
buffer[i1]=c1;
Index1=i1;
i1++;
}
}
#ifdef With_IT_RB0
// ===== Interrupt RB0 ===========
if ((INTCON.INTE)&& (INTCON.INTF))
{
LD3=1;
LD4=0;
LD7=1;
// reinit timer0 , pour eteindre led apres tempo 2sec
cpt1=62; // 2sec
TMR0=0;
INTCON.T0IF=0; // Raz Flag
if ((cpt2 & 0x02)==2)
{
LD3=0; // RAZ led3 every 2 IT
LD4=1;
}
cpt2++ ;
INTCON.INTF=0; // raz flag
}
#endif
// rb0
#ifdef Wit_TMR0
// ==== IT Timer0 =============
if((INTCON.TMR0IE) && (INTCON.T0IF))
{
cpt0++;
if(cpt0>Max_Timer0)
{
LD7=!LD7;
Flag_Timer0=1;
cpt0=0;
TMR0IE_bit=0;
}
TMR0=60; // 25 ms at 8MHz 10mS at 20Mhz
INTCON.T0IF=0; // Raz Flag
}
#endif
}
// --- Copie le texte depuis FLASH ROM vers RAM
void strConstRamCpy(unsigned char *dest, const code char *source)
{
while (*source)*dest++ = *source++ ;
*dest = 0 ; // terminateur
}
void CRLF()
{
UART1_Write(CR);
UART1_Write(LF);
}
void UART1_Write_CText(const char *txt)
{
while (*txt)
UART1_Write(*txt++);
}
#ifdef Wit_TMR0
void Init_Timer0()
{
OPTION_REG=0;
T0CS_bit=0;
PSA_bit=0; // use 8 bits prescaler
T0IF_bit=0;
PS2_bit=1;
PS1_bit=1;
PS0_bit=1; // 1:256
// Q=20Mhz (255-60)*256*0.2 =10035 µS ~ 10 mS
// Q=8Mhz (255-60)*256*0.5 µS =25 088 µS ~ 25 mS
TMR0= 60;
TMR0IF_bit=0;
Flag_Timer0=0;
TMR0IE_bit=1;
}
#endif
void main()
{
OSCCON=0;
OSCCON.IRCF2=1;
OSCCON.IRCF1=1;
OSCCON.IRCF0=1;
OSCCON.SCS=1;
//OSCCON=0b01110001 ; // 8MHz (111) & SCS=1 (sinon 4 MHz par defaut)
TRISB=0xFF;
TRISC=0xFF;
TRISA=0xFF;
TRISA=0xFF;
TRISD=0;
PORTD=0;
ANSEL = 0; // Configure AN pins as digital I/O
ANSEL=0x01; // RA0 = Analog input
ANSELH = 0;
C1ON_bit = 0; // Disable comparators
C2ON_bit = 0;
// 1er test hardware sur les 8 leds PORT D
i=0;
while(i<10)
{
PORTD = 0;
Delay_ms(500);
PORTD = 255;
Delay_ms(500);
i++;
}
PORTD = 0;
Max_Timer0=40; // 25ms x 40 => 1sec
txt=&Texte[0]; // init pointeur
UART1_Init(19200); // Initialize UART module at 9600 bps
Delay_ms(100); // Wait for UART module to stabilize
/* init interrupt RB0 & timer0
// 0x81 OPTION_REG RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0
OPTION_REG= 0b00000111;
OPTION_REG.T0CS=0; // internal Fosc/4
OPTION_REG.INTEDG=0; // IT on falling edge
OPTION_REG.PSA=0; // prescaler on Timer0
OPTION_REG.PS2=1; // divi by 128
OPTION_REG.PS1=1; // timer0 IT every 32mS
OPTION_REG.PS0=1;
INTCON.T0IF=0;
*/
UART1_Write('A');
UART1_Write('B');
UART1_Write('C');
CRLF();
Delay_ms(1000);
UART1_DataReady=0;
UART1_Write_CText("Version :"Version"\r\n");
UART1_Write(10);
UART1_Write(13);
UART1_Write_CText(chaine0);
UART1_Write_CText(chaine1);
UART1_Write_CText(chaine2);
UART1_Write_CText("Start\r\n");
UART1_Write_CText("Init ADC chanel RA0 \r\n");
ADC_Init();
// INTCON.INTE=1; // enable RB0 IT interrupt
INTCON.TMR0IE=0; // disable timer0 It
RCIE_bit=1;
INTCON.PEIE=1;
INTCON.GIE=1;
#ifdef With_TMR0
Max_Timer0=40;
Init_Timer0();
#endif
cpt1=0;
LD0=1;
LD1=0;
while(1)
{
#ifdef With_TMR0
Max_Timer0=40;
Init_Timer0();
#endif
LD0=!LD0;
LD1=!LD1;
WordToStr(cpt1,txt);
UART1_Write_Text(txt);
cpt1++;
UART1_Write_CText("\tEA0= ");
M0=ADC_Read(0);
WordToStr(M0,CRam1);
UART1_Write_Text(CRam1);
CRLF();
#ifdef With_TMR0
while( Flag_Timer0==0);
#else
Delay_ms(500);
#endif
if(UART1_DataReady>0)
{
if(UART1_DataReady==1)
UART1_Write_CText("Recu : \r\n");
else
UART1_Write_CText("Attention buffer Full!, reçu :\r\n ");
UART1_Write_Text(buffer);
CRLF();
UART1_DataReady=0;
i1=0;
buffer[0]=0;
RCIE_bit=1;
}
}
}
/*
Terminal log file
Date: 22/07/2015 - 17:56:03
-----------------------------------------------
17:56:10.387, 16F877 Card 44 pin: Test IT UART & Timer0
17:56:10.492, FOSC interne 8MHZ Port COM 96000
17:56:10.492, PROJET C:_MikroC_MesProjets_MikroCF887_Uart_Test.mcppi
17:56:10.492, Start
17:56:10.492, 0
17:56:11.043, 1
17:56:11.477, 2
17:56:12.025, 3
17:56:12.466, 4
17:56:13.007, 5
17:56:13.559, 6
17:56:13.996, Recu :
17:56:13.996, U;05;07;21;02;17:45#
17:56:13.996, 7
17:56:14.542, 8
17:56:14.977, 9
17:56:15.525, 10
17:56:16.073, 11
17:56:16.515, 12
17:56:17.058, 13
17:56:17.495, Recu :
17:56:17.495, AOK
17:56:17.495, 14
17:56:18.044, 15
17:56:18.586, 16
17:56:19.029, 17
17:56:19.572, 18
17:56:20.009, 19
17:56:20.560, 20
17:56:20.995, 21
17:56:21.542, 22
17:56:22.088, 23
17:56:22.526, Recu :
17:56:22.526, hello
17:56:22.526, 24
17:56:23.073, 25
17:56:23.507, 26
17:56:24.059, 27
17:56:24.605, 28
17:56:25.044, 29
17:56:25.586, Recu :
17:56:25.586, hello
17:56:25.586, 30
17:56:26.024, 31
17:56:26.572, 32
*/
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 50 invités