#include "msp430xG46x.h" #include "intrinsics.h" // fonctions intrinsèques #include "LCD.h" // déclaration des fonctions LCD #include // déclaration de la fonction "sprintf" int mode = 0; signed short data; void SPI_1_init(void) { ME2 |= USPIE1; // Enable USART1 SPI mode U1CTL = CHAR + SYNC + MM; U1TCTL= SSEL0 + STC; // ACLK, 3-pin mode U1BR0 = 0x00; U1BR1 = 0x02; // UCLK/512 = 64 Hz baudrate = ~3 Hz sampling U1MCTL = 0x00; // no modulation IE2 = URXIE1; // Configuration de la ligne Chip Select (P3.0) P3OUT |= 0x01; P3SEL = 0x00; P3DIR |= 0x01; // Configuration du port P4 pour le périphérique USART1 en mode SPI P4DIR &= ~BIT4; // SOMI1 P4SEL |= BIT4; P4DIR |= BIT5; // UCLK1 P4SEL |= BIT5; } // 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) SPI_1_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 __low_power_mode_3(); // 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=%4.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 }