4 réponses
somehow
Messages postés
84
Date d'inscription
mercredi 19 janvier 2011
Statut
Membre
Dernière intervention
2 mars 2011
11
24 févr. 2011 à 10:48
24 févr. 2011 à 10:48
Je ne suis absolument pas sûr (vu que je n'ai jamais touché à Mikroc), mais pour moi
while(1)
{
uart1_init(9600);
uart1_write_text('A');
lcd_out(1,3,RFID);
}
C'est une boucle infinie... Et ça, c'est jamais bon.
while(1)
{
uart1_init(9600);
uart1_write_text('A');
lcd_out(1,3,RFID);
}
C'est une boucle infinie... Et ça, c'est jamais bon.
loupius
Messages postés
697
Date d'inscription
dimanche 1 novembre 2009
Statut
Membre
Dernière intervention
31 décembre 2017
148
25 févr. 2011 à 00:58
25 févr. 2011 à 00:58
Il faut savoir que 'microC' est un compilateur C dédié aux microcontroleurs; il existe donc certaines spécificités.
* Par exemple la fonction 'interrupt' (avec 2 'r' !!!) sera automatiquement appellée lors d'une interruption déclenchée par un signal arrivant sur le microcontrôleur (à condition que cette interruption ait bien sûr été préalablement autorisée). Toutes les interruptions appellent la même fonction -> il faudra donc éventuellement faire un tri à l'entrée de la fonction.
* Il est normal de trouver une boucle infinie dans le 'main'. En effet, dans un microcontrôleur, le programme sert en même temps d'OS; c'est donc au 'main' d'assurer longue vie au programme 'sinon le programme s'arrête avant que l'on ait vu quoique ce soit !
Par contre ce qui est beaucoup moins normal, c'est d'y trouver l'initialisation d'un port série à chaque tour de boucle.
* Les fonctions de la librairie LCD commence par 'Lcd' (1ère lettre en majuscule). D'autre part, on doit monter l'afficheur d'une certaine manière et le déclarer à la fonction 'Lcd_Init' (voir la doc).Un exemple y est donné:
Bonne continuation.
* Par exemple la fonction 'interrupt' (avec 2 'r' !!!) sera automatiquement appellée lors d'une interruption déclenchée par un signal arrivant sur le microcontrôleur (à condition que cette interruption ait bien sûr été préalablement autorisée). Toutes les interruptions appellent la même fonction -> il faudra donc éventuellement faire un tri à l'entrée de la fonction.
* Il est normal de trouver une boucle infinie dans le 'main'. En effet, dans un microcontrôleur, le programme sert en même temps d'OS; c'est donc au 'main' d'assurer longue vie au programme 'sinon le programme s'arrête avant que l'on ait vu quoique ce soit !
Par contre ce qui est beaucoup moins normal, c'est d'y trouver l'initialisation d'un port série à chaque tour de boucle.
* Les fonctions de la librairie LCD commence par 'Lcd' (1ère lettre en majuscule). D'autre part, on doit monter l'afficheur d'une certaine manière et le déclarer à la fonction 'Lcd_Init' (voir la doc).Un exemple y est donné:
void main() { TRISB = 0; // PORTB is output Lcd_Init(&PORTB); // Initialize LCD connected to PORTB Lcd_Cmd(Lcd_CLEAR); // Clear display Lcd_Cmd(Lcd_CURSOR_OFF); // Turn cursor off Lcd_Out(1, 1, text); // Print text to LCD, 2nd row, 1st column }Il est toujours possible d'utiliser une connexion particulière en faisant appel aux fonctions 'Lcd_Custom_...'.
Bonne continuation.
merci de me répondre (^_^),je corrige mon programme de cette façon mais maintenant pour afficher une chaîne de caractère sur LCD:
sbit LCD_RS at RC4_bit;
sbit LCD_EN at RC5_bit;
sbit LCD_D7 at RC3_bit;
sbit LCD_D6 at RC2_bit;
sbit LCD_D5 at RC1_bit;
sbit LCD_D4 at RC0_bit;
// Pin direction
sbit LCD_RS_Direction at TRISC4_bit;
sbit LCD_EN_Direction at TRISC5_bit;
sbit LCD_D7_Direction at TRISC3_bit;
sbit LCD_D6_Direction at TRISC2_bit;
sbit LCD_D5_Direction at TRISC1_bit;
sbit LCD_D4_Direction at TRISC0_bit;
void interrupt();
char RFID[5];
int cmp=0;
int i=0;
void main ()
{
INTCON = 0xC0;
TXSTA|=0x2E;
RCSTA|=0x90;
TRISC=0x00;
PORTC=0x00;
Lcd_Init();
lcd_cmd(_lcd_clear);
lcd_Cmd(_LCD_CURSOR_OFF);
while(1)
{
uart1_init(9600);
Delay_ms(100);
uart1_write_text("hello");
for(i=0;i<5;i++)
{
lcd_chr(1,i+1,RFID[cmp-1]);
}
}
}
void interrupt()
{
if (PIR1.RCIF==1)
{
RFID[cmp]=RCREG;
cmp++;
PIR1.RCIF=0;
}
}
il est compiler mais la simulation sur l'isis ne fonctionne jamais malgré le schéma correcte
sbit LCD_RS at RC4_bit;
sbit LCD_EN at RC5_bit;
sbit LCD_D7 at RC3_bit;
sbit LCD_D6 at RC2_bit;
sbit LCD_D5 at RC1_bit;
sbit LCD_D4 at RC0_bit;
// Pin direction
sbit LCD_RS_Direction at TRISC4_bit;
sbit LCD_EN_Direction at TRISC5_bit;
sbit LCD_D7_Direction at TRISC3_bit;
sbit LCD_D6_Direction at TRISC2_bit;
sbit LCD_D5_Direction at TRISC1_bit;
sbit LCD_D4_Direction at TRISC0_bit;
void interrupt();
char RFID[5];
int cmp=0;
int i=0;
void main ()
{
INTCON = 0xC0;
TXSTA|=0x2E;
RCSTA|=0x90;
TRISC=0x00;
PORTC=0x00;
Lcd_Init();
lcd_cmd(_lcd_clear);
lcd_Cmd(_LCD_CURSOR_OFF);
while(1)
{
uart1_init(9600);
Delay_ms(100);
uart1_write_text("hello");
for(i=0;i<5;i++)
{
lcd_chr(1,i+1,RFID[cmp-1]);
}
}
}
void interrupt()
{
if (PIR1.RCIF==1)
{
RFID[cmp]=RCREG;
cmp++;
PIR1.RCIF=0;
}
}
il est compiler mais la simulation sur l'isis ne fonctionne jamais malgré le schéma correcte
je ne vois pas pourquoi vous rendez les choses difficile alors que c'est simple
voila comment
//commentaire : a chaque fois que tu utilise un afficheur tu doit faire la declaration suivante ;pour le branchement du lcd//
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
//commentair: fin de la declaration//
void main() {
lcd_init();
lcd_out(1,1,"votre texte ici");
}
voila comment
//commentaire : a chaque fois que tu utilise un afficheur tu doit faire la declaration suivante ;pour le branchement du lcd//
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
//commentair: fin de la declaration//
void main() {
lcd_init();
lcd_out(1,1,"votre texte ici");
}
24 févr. 2011 à 15:45
24 févr. 2011 à 16:03
Ta fonction interrupt, tu ne l'utilises jamais. C'est peut être aussi pour ça que ça bug ?
void interupt()
{
if (PIR1.RCIF==1)
{
RFID=RCREG;
PIR1.RCIF=0;
}
}
Tu dois avoir un cours qui t'explique en détail, non ?
3 mars 2011 à 14:39