//****************************************************************************** #include #include "TS_LC7981.h" #include // für Zeichen (Infotext) notwendig #include // für sprint #include unsigned int t,k; void programmversion(void); void UART1_einstellen(void); void E32_konfiguration_festlegen(void); void E32_konfigurieren(void); void pause400(void); void pause40000(void); void daten_tx_festlegen(void); void daten_senden(void); void datenrx1_ausgeben(void); void datenrx2_ausgeben(void); void D1_ausgeben(void); void D2_ausgeben(void); void D3_ausgeben(void); void D4_ausgeben(void); void temp27_ausgeben_ausgeben(void); void antwort_empfangen(void); char i,D1,D2,D3,D4,D5; unsigned char txbuffer[6],txbuffer_daten[5],daten1,daten2; int main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer P2IE |= 0x03; // an P2.0, P2.1 Interruptfreigabe P2IES |= 0x03; // auf H/L Flanke an P2.0, P2.1 P5DIR |= BIT6+ BIT7; // für LED P5.6 + P5.7 P5OUT |= BIT6; // LED grün AUS P5OUT |= BIT7; // LED rot AUS P4DIR |= BIT0 + BIT1; // M0; M1 P4OUT |= BIT0 + BIT1; // M0 und M1 auf 1 --> E32 konfigurieren P1DIR =0xFF; // FKA text_init(); // in FKA TS_7981.h programmversion(); daten_tx_festlegen(); // zu sendende Daten festlegen UART1_einstellen(); E32_konfiguration_festlegen(); E32_konfigurieren(); P4OUT &= ~BIT0; // M0 und M1 auf 0 --> E32 senden/empfangen P4OUT &= ~BIT1; // M0 und M1 auf 0 --> E32 senden/empfangen pause40000(); _EINT(); for(;;); } void antwort_empfangen(void) { while(1) { D1 = RXBUF1; while (!(IFG2 & URXIFG1)); D2 = RXBUF1; while (!(IFG2 & URXIFG1)); D3 = RXBUF1; while (!(IFG2 & URXIFG1)); D4 = RXBUF1; P5OUT &= ~BIT7; //LED rot EIN daten1 = (D2<<8) | D3; daten2 = (D4<<8) | D5; D1_ausgeben(); D2_ausgeben(); D3_ausgeben(); D4_ausgeben(); datenrx1_ausgeben(); datenrx2_ausgeben(); temp27_ausgeben_ausgeben(); P5OUT |= BIT7; //LED rot AUS } } void E32_konfiguration_festlegen(void) //E32_868T { txbuffer[0] = 0xC0; // sichert die Parameter nach Stromausfall txbuffer[1] = 0x03; // Adresse oberes Byte txbuffer[2] = 0x03; // Adresse unteres Byte txbuffer[3] = 0x1A; // 8N1, UART baut rate:9600 (bps), Übertragungsrate:2,4k (bps) txbuffer[4] = 0x09; // Kanal 09 gesendet von von Gerät 3 txbuffer[5] = 0xC7; // "fixed" Übetragungsmodus; TXD und AUX als Ausgang RXD als Eingang; } void E32_konfigurieren(void) { i=0; while (i<6) { TXBUF1 = txbuffer[i]; while (!(IFG2 & UTXIFG1)); // USART1 TX buffer ready? pause400(); i++; } } void UART1_einstellen(void) { P3SEL |= 0xC0; // P3.6 = USART1 TXD ; P3.7 = RXD1 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 IE2 |= UTXIE1+ URXIE1; // Enable USART1 RX interrupt // _BIS_SR(LPM3_bits + GIE); // Enter LPM3 w/ interrupt } void daten_tx_festlegen(void) { txbuffer_daten[0] = 0x02; // Adresse txbuffer_daten[1] = 0x02; // Adresse txbuffer_daten[2] = 0x09; // kanal txbuffer_daten[3] = 0x56; // 0x56 löst in LP161 antwort aus txbuffer_daten[4] = 0x56; } void daten_senden(void) { char i; i=0; while (i<5) { P5OUT &= ~BIT7; //LED rot EIN TXBUF1 = txbuffer_daten[i]; while (!(IFG2 & UTXIFG1)); // USART0 TX buffer ready? pause400(); P5OUT |= BIT7; //LED rot AUS i++; } } void programmversion(void) { char vers[26],z,c; lcd_write_command(LCD_CMD_CURSOR_LA,26); //26 Zeilenanfang 2.Zeile --> 26 Zeichen pro Zeile lcd_write_command(LCD_CMD_CURSOR_HA,0); sprintf(vers,"%s","0198b se an 0202 G1+empf"); for (z=0; z<25;z++) { c=vers[z]; lcd_write_command(LCD_CMD_WRITE_DATA, c); } lcd_write_command(LCD_CMD_CURSOR_LA,52); //26 Zeilenanfang 2.Zeile --> 26 Zeichen pro Zeile lcd_write_command(LCD_CMD_CURSOR_HA,0); sprintf(vers,"%s","antwort von LP161 G1 "); for (z=0; z<25;z++) { c=vers[z]; lcd_write_command(LCD_CMD_WRITE_DATA, c); } } // UART1RX ISR #pragma vector=UART1RX_VECTOR // UART0RX_VECTOR __interrupt void usart1_rx (void) { } // UART1TX ISR #pragma vector=UART1TX_VECTOR // UART0TX_VECTOR __interrupt void usart1_tx (void) { } #pragma vector=PORT2_VECTOR // nicht vergessen: #include __interrupt void taste_und_einschubkontrolle (void) { if ((P2IFG&BIT0) == BIT0) //Taster 2.0 { P5OUT &=~BIT6; // LED grün EIN als Kontrolle daten_senden(); P5OUT |=BIT6; // LED grün AUS als Kontrolle P2IFG &=~BIT0; antwort_empfangen(); evtl ist hier die kritische Stelle !!!!! } if ((P2IFG&BIT1) == BIT1) //Taster 2.1 { P5OUT ^= BIT6; // schaltet LED grün, P2IFG&=~BIT1; } } void pause400(void) { unsigned int i; for (i=400;i>0;i--); // warten ca.360ms } void pause40000(void) { unsigned int i; for (i=40000;i>0;i--); // warten ca.360ms } void D1_ausgeben(void) { char vers[5],z,c; lcd_write_command(LCD_CMD_CURSOR_LA,106); //26 Zeilenanfang 2.Zeile --> 26 Zeichen pro Zeile lcd_write_command(LCD_CMD_CURSOR_HA,0); sprintf(vers,"%02X",D1); for (z=0; z<2;z++) { c=vers[z]; lcd_write_command(LCD_CMD_WRITE_DATA, c); } } void D2_ausgeben(void) { char vers[5],z,c; lcd_write_command(LCD_CMD_CURSOR_LA,109); //26 Zeilenanfang 2.Zeile --> 26 Zeichen pro Zeile lcd_write_command(LCD_CMD_CURSOR_HA,0); sprintf(vers,"%02X",D2); for (z=0; z<2;z++) { c=vers[z]; lcd_write_command(LCD_CMD_WRITE_DATA, c); } } void D3_ausgeben(void) { char vers[5],z,c; lcd_write_command(LCD_CMD_CURSOR_LA,112); //26 Zeilenanfang 2.Zeile --> 26 Zeichen pro Zeile lcd_write_command(LCD_CMD_CURSOR_HA,0); sprintf(vers,"%02X",D3); for (z=0; z<2;z++) { c=vers[z]; lcd_write_command(LCD_CMD_WRITE_DATA, c); } } void D4_ausgeben(void) { char vers[5],z,c; lcd_write_command(LCD_CMD_CURSOR_LA,115); //26 Zeilenanfang 2.Zeile --> 26 Zeichen pro Zeile lcd_write_command(LCD_CMD_CURSOR_HA,0); sprintf(vers,"%02X",D4); for (z=0; z<2;z++) { c=vers[z]; lcd_write_command(LCD_CMD_WRITE_DATA, c); } } void datenrx1_ausgeben(void) { char vers[7],z,c; lcd_write_command(LCD_CMD_CURSOR_LA,157); //26 Zeilenanfang 2.Zeile --> 26 Zeichen pro Zeile lcd_write_command(LCD_CMD_CURSOR_HA,0); sprintf(vers,"%05u",daten1); for (z=0; z<5;z++) { c=vers[z]; lcd_write_command(LCD_CMD_WRITE_DATA, c); } } void datenrx2_ausgeben(void) { char vers[7],z,c; lcd_write_command(LCD_CMD_CURSOR_LA,167); //26 Zeilenanfang 2.Zeile --> 26 Zeichen pro Zeile lcd_write_command(LCD_CMD_CURSOR_HA,0); sprintf(vers,"%05u",daten2); for (z=0; z<5;z++) { c=vers[z]; lcd_write_command(LCD_CMD_WRITE_DATA, c); } } void temp27_ausgeben_ausgeben(void) { char vers[6],z,c; float mw27; mw27=daten1/16.0; // .0 muss angehängt werden, damit Nachkommazahlen erzeugt werden lcd_write_command(LCD_CMD_CURSOR_LA,183); //26 Zeilenanfang 2.Zeile --> 26 Zeichen pro Zeile lcd_write_command(LCD_CMD_CURSOR_HA,0); sprintf(vers,"%05.2f",mw27); for (z=0; z<5;z++) { c=vers[z]; lcd_write_command(LCD_CMD_WRITE_DATA, c); } }