// Lecture du capteur TC77 par UART-SPI avec interruptions // ****************************************************************************** #include "msp430xG46x.h" #include "intrinsics.h" // fonctions intrinsèques #include "LCD.h" // déclaration des fonctions LCD #include "capteurTemp.h" #include // déclaration de la fonction "sprintf" int mode = 0; signed short data; // Programme principal void main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; // initialisation de P1.0 (bouton pression SW1) P1DIR &= ~(BIT0); // configuration de P1.0 en entrée P1IE |= 0x01; // enable interrupt P1.0 P1IFG = 0; P2DIR = 0xC3; P2OUT = 0xB1; LCD_init(); // initialisation de l'affichage LCD // initialisation de l'interface avec le capteur de température (Ports P3,P4) spi1_init(); // Définition d'un timer_A avec fréquence = 1 Hz CCR0 = 32768/1 - 1; TACTL = TASSEL_1 + MC_1; // ACLK, upmode CCTL0 = CCIE; // CCR0 interrupt enabled __enable_interrupt(); // Boucle infinie while(1); } //routine d'interruption qui survient lorsque P1.0 a un flanc #pragma vector=PORT1_VECTOR __interrupt void Port1_ISR (void) { if (P1IFG == 0x01) mode ^= 1; P1IFG = 0; } #pragma vector=USART1RX_VECTOR __interrupt void USART1RX_ISR (void) { if (IFG2 & UTXIFG1) // USART1 TX buffer ready? { IE2 = 0; P2OUT ^= 0x03; data = U1RXBUF << 8; // lecture des MSBs U1TXBUF = 0x00; // Chargement du buffer de transmission U1TXBUF while (!(U1TCTL & 0x01)); // Attente de la reception du 2ème octet // TXEPT=1 indique que le buffer de transmission est vide data = data | U1RXBUF; // lecture des LSBs P3OUT |= BIT0; // relève enable: désactivation du CS P3OUT &= ~BIT0; // Activation du CS U1TXBUF = 0; // Chargement du buffer de transmission U1TXBUF IE2 = URXIE1; } } #pragma vector= TIMERA0_VECTOR // Timer_A TACCR0 interrupt vector handler __interrupt void int_timerA(void) { unsigned int n; char str[9]; // Tableau de 9 caractères (8 bits) P2OUT ^= 0xC0; // Toggle P2.6-7 // Supression des 3 bits de poids faibles du mots de 16 bits issu du capteur n = data >> 3; // Création d'une chaîne de caractère ASCII à afficher if(mode==0) sprintf(str, "T= %3.1fC",n*0.0625); else sprintf(str, "T=%4.1fK", n*0.0625 + 273.2); LCD_print(str); // Affichage de la chaîne de caractères }