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 le langage C !

Modérateur : Jérémy

[RESOLU] UART Write Text erreur !
venom
Avatar de l’utilisateur
Passioné
Passioné
Messages : 372
Âge : 32
Enregistré en : avril 2016
Localisation : . <------ ici
Contact :

#1 Message par venom » ven. 2 mars 2018 21:56 lien vers la Data-Sheet : Cliquez ici

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:

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.
En fait tout est une question de BIT ? :-D

UART Write Text erreur !
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1029
Âge : 67
Enregistré en : juillet 2015
Localisation : 01120
Contact :

#2 Message par paulfjujo » sam. 3 mars 2018 09:23 lien vers la Data-Sheet : Cliquez ici

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

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 !
venom
Avatar de l’utilisateur
Passioné
Passioné
Messages : 372
Âge : 32
Enregistré en : avril 2016
Localisation : . <------ ici
Contact :

#3 Message par venom » sam. 3 mars 2018 10:19 lien vers la Data-Sheet : Cliquez ici

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

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.
En fait tout est une question de BIT ? :-D

UART Write Text erreur !
Jérémy
Administrateur du site
Administrateur du site
Messages : 2112
Âge : 39
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#4 Message par Jérémy » sam. 3 mars 2018 10:40 lien vers la Data-Sheet : Cliquez ici

Bonjour ,

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 !
C'est en faisant des erreurs, que l'on apprend le mieux !!!

UART Write Text erreur !
venom
Avatar de l’utilisateur
Passioné
Passioné
Messages : 372
Âge : 32
Enregistré en : avril 2016
Localisation : . <------ ici
Contact :

#5 Message par venom » sam. 3 mars 2018 10:42 lien vers la Data-Sheet : Cliquez ici

Ah très bien je vois ce que tu veut dire. Merci Jérémy :wink:






@++
En fait tout est une question de BIT ? :-D

UART Write Text erreur !
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1029
Âge : 67
Enregistré en : juillet 2015
Localisation : 01120
Contact :

#6 Message par paulfjujo » sam. 3 mars 2018 11:47 lien vers la Data-Sheet : Cliquez ici

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 ( :arrow: espace Rikiki).

C'est pourquoi MikroC préconise l'usage du 18F plutot que les 16F ( anciens)

UART Write Text erreur !
venom
Avatar de l’utilisateur
Passioné
Passioné
Messages : 372
Âge : 32
Enregistré en : avril 2016
Localisation : . <------ ici
Contact :

#7 Message par venom » sam. 3 mars 2018 12:03 lien vers la Data-Sheet : Cliquez ici

Merci pour ces explications. Donc on utilise la rom plutôt que la RAM pour les 16f. :-D

Je mettrai un résolu après test :wink:





@++
En fait tout est une question de BIT ? :-D

UART Write Text erreur !
venom
Avatar de l’utilisateur
Passioné
Passioné
Messages : 372
Âge : 32
Enregistré en : avril 2016
Localisation : . <------ ici
Contact :

#8 Message par venom » sam. 3 mars 2018 15:34 lien vers la Data-Sheet : Cliquez ici

Pour résumé ça donne ceci ;

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 ?






@++
En fait tout est une question de BIT ? :-D

UART Write Text erreur !
venom
Avatar de l’utilisateur
Passioné
Passioné
Messages : 372
Âge : 32
Enregistré en : avril 2016
Localisation : . <------ ici
Contact :

#9 Message par venom » dim. 4 mars 2018 09:27 lien vers la Data-Sheet : Cliquez ici

Arf... ça ne veut pas, ça ne veut pas :mur: Pourquoi avec moi un simple code deviens si compliqué... (manque de connaissance sans doute)







@++
En fait tout est une question de BIT ? :-D

UART Write Text erreur !
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1029
Âge : 67
Enregistré en : juillet 2015
Localisation : 01120
Contact :

#10 Message par paulfjujo » dim. 4 mars 2018 09:37 lien vers la Data-Sheet : Cliquez ici

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

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 cpt1cpt2 ,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=//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 ;    // 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
*/
 


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 7 invités