Bonjour,
Depuis 2 jours j'essaye de faire en sorte que mon pic18f45k22 reçoive des données envoyées depuis l'ordinateur par connexion série.
J'arrive a envoyer du pic vers le PC sans soucis, mais l'inverse est impossible.
Je pense avoir mal configurer les interruptions car en mettant une sonde sur le port RX1 du pic je reçois bien les données, je n'arrive simplement pas à les traiter dans le code ...
Ce que j'utilise :
- PIC16F45K22 (datasheet)
- Compilateur C18 (avec bibliothèque uart.h)
- MPLAB ICD 3
- Convertisseur Serie-USB (pour connecter a mon PC) USB-COM485-PLUS1
- Horloge interne (tant pis pour la précision pour l'instant)
Maintenant voici mon code :
Voilà, dites moi si vous voyez une erreur monumentale ...Code:#include <p18cxxx.h> #include <string.h> #include <usart.h> #include <delays.h> void SYS_InterruptHigh (void); void SYS_InterruptLow (void); /*----------------------------------------------------------- * * Vecteurs d'Interruptions * -----------------------------------------------------------*/ #pragma code HIGH_INTERRUPT_VECTOR = 0x1008 void High_ISR(void) { _asm goto SYS_InterruptHigh _endasm } #pragma code LOW_INTERRUPT_VECTOR = 0x1018 void Low_ISR(void) { _asm goto SYS_InterruptLow _endasm } #pragma code #pragma interrupt SYS_InterruptHigh void SYS_InterruptHigh() { if(PIR1bits.RC1IF) { // Je veut simplement allumer une LED pour le moment :) LATDbits.LATD2 = 1; // Allume LED } if(RCSTAbits.OERR) { RCSTAbits.OERR = 0; } if(RCSTAbits.FERR) { RCSTAbits.FERR = 0; } } #pragma interruptlow SYS_InterruptLow void SYS_InterruptLow() { } /*----------------------------------------------------------- * * Initialisation * -----------------------------------------------------------*/ void init(void) { // *** CONFIG I/O *** TRISDbits.RD2 = 0; // LED (une led de test) LATDbits.LATD2 = 0; // LED OFF TRISCbits.RC6 = 0; // TX1 TRISCbits.RC7 = 1; // RX1 // *** CONFIG OSCILLATOR (4Mhz) *** OSCCONbits.IRCF0 = 1; OSCCONbits.IRCF1 = 0; OSCCONbits.IRCF2 = 1; // *** INTERRUPTS CONFIG *** RCONbits.IPEN = 1; //En priority INTCONbits.GIE = 1; //autorisation IT INTCONbits.GIEL = 1; INTCONbits.PEIE = 1; //autorisation IT peripheriques PIE1bits.RC1IE = 1; // autorisation des flags des IT Tx IPR1bits.RC1IP = 1; // High Priority // *** CONFIG USART *** baud1USART(BAUD_8_BIT_RATE & BAUD_AUTO_OFF & BAUD_WAKEUP_OFF); // Open the USART configured as // 4MHz, 9600 baud Open1USART ( USART_TX_INT_OFF & USART_RX_INT_ON & USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_CONT_RX & USART_BRGH_HIGH, 25); BAUDCON1bits.CKTXP = 0; // Tx not inverted } void main (void) { init(); while(1) { } }
-----