Bonjour à tous
Voilà, je suis entrain de travailler sur un projet,
Hors je dois mettre l'UART en interruption, je sais faire fonctionné l'UART dans mon programme principal mais si je veux le passer en interruption cela ne fonctionne plus!! j'ai gais pourtant une lecture de la datasheet et du cours de Bigonoff mais faut croire que j'ai loupé quelque chose d'essentielle.
Je vous explique le principe du petit programme test que j'ai mis en oeuvre.
Le principe est simple j'envoie un caractère via le bus série de mon PC (pour cela j'utilise HyperTerminal et enssuite je demande au microcontrolleur de me le renvoier pour l'affiché sur le PC
Sans utiliser les interruptions mon programme fonctionne mais sinon en interruption rien ne fonctionne j'envoie le caractère mais il ne doit pas rentrer dans la routine d'interruption. Si quelqu'un pouvais me mettre sur le chemin sa serai un aide précieuse pour moi parceque la je vous avoue que je ne voie pas pourquoi
En vous remerciant d'avance
Cordialement Paulochon
Ci-dessous le programe (je programme sous MPLAB avc le compilateur CC5X)
//Réception série d'une donnée via la Port Série du PC
#pragma chip PIC16F877 //Définie le micro
#pragma config = 0x3F3A
#include "INT16CXX.H"
#pragma origin 4 //Adresse du vecteur d'interutpion
//Routine d'interruption
interrupt uart(void)
{
int_save_registers // sauvegarde de W, STATUS (and PCLATH)
char sv_FSR = FSR; // save FSR if required
GIE=0; //désactive les interruptions
if ( RCIF == 1)
{
char data;
CREN = 1;
while ( RCIF == 0 );
data = RCREG ;
PORTB = data;
CREN = 0;
PORTC = 0x02;
TXEN = 1;
TXREG = data;
while( TRMT == 0 );
TXEN = 0;
}
FSR = sv_FSR; // restore FSR if saved
int_restore_registers // restauration W, STATUS (and PCLATH)
GIE = 1;
}
//Sous-programme
//** Initialisation de la COM
void init_com(void)
{
TXSTA = 0b00000100 ; //Mode asynchrone transfert sur 8 bit
SPBRG = 0x81; // T/R 9600 bauds/s
RCSTA = 0b10000000 ; //Reception 8 bit et Port Série autorisé
}
//Initialisation des PORTs
void init_port(void)
{
TRISB = 0b00000000; //PORTB en SORTIE
TRISC = 0b10111000; //PORTC en E/S
}
//Initialisation des PORTs
void init_interrupt(void)
{
GIE = 1; //Autorisation des interruption général
PEIE = 1; //Autorisation des interrutpion sur les périphèrique
RCIE = 1; //Autorisation de l'interruption en recpetion de L'UART
}
//Programme Principal
void main (void)
{
char data,i;
init_port();
init_com();
init_i2c();
for(;
{
}
}
-----