#include //Senden von Adresse 00 um die sicher die Temperaturdaten auslesen zu können void fSende00() { U0CTL |= MST; // Master mode I2CTCTL |= I2CSTT+I2CSTP+I2CTRX; // Initiate transfer while ((I2CIFG & TXRDYIFG) == 0); // Wait for transmitter to be ready I2CDRB = 0x00; while ((I2CIFG & TXRDYIFG) == 0); // Wait for transmitter to be ready I2CDRB = 0x00; // Load MSByte // while ((I2CIFG & TXRDYIFG) == 0); // Wait for transmitter to be ready // I2CDRB = 0x00; // Load LSByte while ((I2CTCTL & I2CSTP) == 0x02); // To prevent Arbitration Lost } int fAuslesen() { int Mitteltemp = 0; int Zahlx = 0; int highbyte = 0; int g = 0; while (g < 32) //Mittelwert von 32 Messwerten ermitteln { U0CTL |= MST; // Master I2CTCTL |= I2CSTT+I2CSTP; // Initiate transfer while ((I2CIFG & RXRDYIFG) == 0); // Wait for Receiver to be ready highbyte = I2CDRB; // Receive MSByte from DAC while ((I2CTCTL & I2CSTP) == 0x02); // Wait for Stop Condition if (highbyte < 150) //Messwerte über 150 rausfiltern { Mitteltemp = Mitteltemp + highbyte; g++; } } Zahlx = Mitteltemp >> 5; //addierte Werte durch 32 teilen return Zahlx; } void fSenden(int Sendezahl) //Ziffer wird über UART an Computer gesendet { while (!(IFG2 & UTXIFG1)); //so lange warte bis Sendevorgang abgeschlossen TXBUF1 = Sendezahl; //Zahl in Sendepuffer schreiben } void fneueZeile(void) //Courser soll auf dem Computer and den Anfang einer neuen Zeile Springen { fSenden(10); // Asci: 10 = Courser in nächste Zeile fSenden(13); // Asci: 13 = Courser zum Zeilenanfang } void TempSenden(int Temperatur) //Zahl wird in einzelene Ziffern aufgeteilt und an { //PC gesendet char sendString2[9]= " Grad C"; //Sendestring festlegen int k = 0; //Zählvariablen festlegen int Temp=Temperatur; if (Temperatur & 0x80)//wenn die Zahl negtive ist { fSenden(45); //Minuszeichen Senden Temp = ~Temperatur & 0x00FFUL; //Zahlenwert negieren Temp++; // um 1 erhöhen } int ZifferTem[5]; //Array um die Zahl in Ziffern aufteilen zu können //Temperatur wird in einzelne Ziffern aufgeteilt ZifferTem[0]=Temp%10; Temp=Temp/10; ZifferTem[1]=Temp%10; Temp=Temp/10; ZifferTem[2]=Temp%10; Temp=Temp/10; ZifferTem[4]=Temp/10; ZifferTem[3]=Temp%10; int xzehntausenderzahl=ZifferTem[4]+0x30; //Ziffer + Hex 30 ergibt den Asci Code der Ziffer int Tausenderzahl=ZifferTem[3]+0x30; //Ziffer + Hex 30 ergibt den Asci Code der Ziffer int Hunderterzahl=ZifferTem[2]+0x30; //Ziffer + Hex 30 ergibt den Asci Code der Ziffer int Zehnerzahl=ZifferTem[1]+0x30; //Ziffer + Hex 30 ergibt den Asci Code der Ziffer int Einerzahl=ZifferTem[0]+0x30; //Ziffer + Hex 30 ergibt den Asci Code der Ziffer fSenden(xzehntausenderzahl); //Ziffer an Sendefunktion übergeben fSenden(Tausenderzahl); //Ziffer an Sendefunktion übergeben fSenden(Hunderterzahl); //Ziffer an Sendefunktion übergeben fSenden(Zehnerzahl); //Ziffer an Sendefunktion übergeben fSenden(Einerzahl); //Ziffer an Sendefunktion übergeben while (sendString2[k] != 0) //zweiter String (Grad C) wird gesendet { while (!(IFG2 & UTXIFG1)); { TXBUF1 = sendString2[k]; k++; } } fneueZeile(); //Courser springt in Sendedaten zun nächsten Zeilenanfang } void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop watchdog P3SEL |= 0xC0; // P3.6,7 = USART1 TXD/RXD UCTL1 |= SWRST; ME2 |= UTXE1 + URXE1; // Enable USART1 TXD/RXD UCTL1 |= CHAR; // 8-bit character UTCTL1 |= SSEL0; // UCLK = ACLK UBR01 = 0x03; // 32k/9600 - 3.41 UBR11 = 0x00; // UMCTL1 = 0x4A; // Modulation UCTL1 &= ~SWRST; // Initialize USART state machine P2SEL|=0x00; // Port2 als input output benutzten P1DIR|=0xFF; // Port1 sind die 8 LEDs P2DIR|=0xFF; //Port2 sind die Latschsignale für 7-Segment decoder P3SEL |= 0x0a; // Assign I2C pins to module P3OUT |= 0x05; //am Port3 Pin 1+3 auf High setzen (Latch Pins) P1OUT = 0x00; U0CTL |= I2C + SYNC; // Switch USART0 to I2C mode U0CTL &= ~I2CEN; // Recommended I2C init procedure I2CTCTL = I2CSSEL_2; // SMCLK I2CPSC = 0x06; // Vorteiler I2CSCLH = 0x03; // High period of SCL I2CSCLL = 0x03; // Low period of SCL I2CNDAT = 0x01; // Transmit two byte U0CTL |= I2CEN; // Enable I2C, 7 bit addr, P1OUT=0x00; for (;;) { I2CSA = 0x49; // Slave address 1001001 (erster Fühler) //fSende00(); int Zahl = fAuslesen(); //Zahl *=143; //Faktor 1,43 um den ausgelesnen Messwert zu korrigieren //Zahl /=100; for(int p=0;p<500;p++); int Zehner = Zahl/10; //Temperaturwert in Zehner und einer Ziffern int Einer = Zahl%10; //aufsplitten und an 7-segment decoder übergeben P2OUT = Zehner; P3OUT ^= 0x04; //Pin 1 am Port 3 wird zurückgesetzt P3OUT ^= 0x04; //Pin 1 am Port 3 wird gesetzt P2OUT = Einer; P3OUT ^= 0x01; //Pin 3 am Port 3 wird zurückgesetzt P3OUT ^= 0x01; //Pin 3 am Port 3 wird gesetzt TempSenden(Zahl); for(unsigned int j=0;j<4000;j++) //Wartezeit um zum Testen { for(int g=0; g<2; g++); } I2CSA = 0x4B; // Slave address 1001011 (zweiter Fühler) int Zahlzwei = fAuslesen(); TempSenden(Zahlzwei); fneueZeile(); P1OUT ^=0x02; // Blinkende LED benutze ich um zusehen ob das Programm durchläuft for(unsigned int j=0;j<4000;j++) //Wartezeit um zum Testen { for(int g=0; g<2; g++); } } }