// MSP430F169 // ----------------- // /|\| XIN|- 32,768kHz // | | | // Taster blau-|RST (58) XOUT|- 32,768kHz // | P1.7|LED Grün // 6 Mhz X2IN- | P1.6|Taster für Entladung wiederholen rechts // | P1.5|Taster für Start und löschen Mitte //6 MHz X2OUT- | | // | | // LED rot <-|P2.0 | // | P3.0| Ausgang für Relais Schaltausgang // UTXD0 |P3.4 P3.1|-> Daten Ausgang (29) // URXD0 |P3.5 P3.2|<- Data In (SOMI0) (30) // |P3.6 P3.3|-> Serial Clock Out (UCLK) (31) //(35) SM CE\ |P3.7 P4.0-P4.7| Daten SM karte (36)..(43) //(44) WE\ |P5.0 P2.7| CS SPI Gerät 1 Platz 1 // ALE |P5.1 P2.6| CS SPI Gerät 2 Platz 2 // CLE |P5.2 P2.4| CS SPI Gerät 3 Platz 3 // RE\ |P5.3 P2.5| frei //(48) R/B\ |P5.4 P6.7| Batterie // | P6.3| Kanal 1 Spannung aus R5 x Strom +- !,245V enladen/entladen // | P6.1| Kanal 2 Schaltspannungseingang // P6.0| Kanal 3 // P6.2| Kanal 4 // P6.4| Kanal 5 // P6.5| Kanal 6 // P6.6| Kanal 7 // P6.0....P6.6| Analogeingänge // S1b |P5.7 SM-Kartenschalter // Juni 2021 //****************************************************************************** #include #include // für Zeichen (Infotext) notwendig #include // für sprint #include void Timer_einstellen(void); void UART_einstellen(void); void werte_feld_fuellen(unsigned int temp_1); // GEKU mit Parameterübergabe versehen char i,anfangsmarke=0xAA; unsigned int temp_1,temp_1_UB,temp_1_OB; int tx_cnt // GEKU Byte Sende Zähler char txbuffer[3]; int main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer Timer_einstellen(); UART_einstellen(); P1DIR |= BIT7; //LED grün // P2DIR |= BIT0; //LED rot // MSP430F169 // ----------------- // /|\| XIN|- 32,768kHz // | | | // Taster blau-|RST (58) XOUT|- 32,768kHz // | P1.7|LED Grün // 6 Mhz X2IN- | P1.6|Taster für Entladung wiederholen rechts // | P1.5|Taster für Start und löschen Mitte //6 MHz X2OUT- | | // | | // LED rot <-|P2.0 | // | P3.0| Ausgang für Relais Schaltausgang // UTXD0 |P3.4 P3.1|-> Daten Ausgang (29) // URXD0 |P3.5 P3.2|<- Data In (SOMI0) (30) // |P3.6 P3.3|-> Serial Clock Out (UCLK) (31) //(35) SM CE\ |P3.7 P4.0-P4.7| Daten SM karte (36)..(43) //(44) WE\ |P5.0 P2.7| CS SPI Gerät 1 Platz 1 // ALE |P5.1 P2.6| CS SPI Gerät 2 Platz 2 // CLE |P5.2 P2.4| CS SPI Gerät 3 Platz 3 // RE\ |P5.3 P2.5| frei //(48) R/B\ |P5.4 P6.7| Batterie // | P6.3| Kanal 1 Spannung aus R5 x Strom +- !,245V enladen/entladen // | P6.1| Kanal 2 Schaltspannungseingang // P6.0| Kanal 3 // P6.2| Kanal 4 // P6.4| Kanal 5 // P6.5| Kanal 6 // P6.6| Kanal 7 // P6.0....P6.6| Analogeingänge // S1b |P5.7 SM-Kartenschalter // Juni 2021 //****************************************************************************** #include #include // für Zeichen (Infotext) notwendig #include // für sprint #include void Timer_einstellen(void); void UART_einstellen(void); void werte_feld_fuellen(void); void wert_senden(void); char i,anfangsmarke=0xAA; unsigned int temp_1,temp_1_UB,temp_1_OB; char txbuffer[3]; int main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer Timer_einstellen(); UART_einstellen(); P1DIR |= BIT7; //LED grün // P2DIR |= BIT0; //LED rot // wert_senden(); // GEKU //neu GKU Verarbeitun im Background tx_cnt=0; while(1) { // ... GKU hier Vorverarbeiung (z.B. Bildung von temp_1) einfügen temp_1 = 0x1667; werte_feld_fuellen(temp1); // ... GKU hier Nachverarbeitung (z.B. Auswertung Empfangspuffer) durchführen // GEKU am Ende Schleifenverzögerung einbauen z.B. 1s __delay_cycles(1000); } } void werte_feld_fuellen(unsigned int temp_1) // GEKU mit Paramterübergabe versehen { //temp_1_UB = temp_1 & 0xFF; //temp_1_OB = (temp_1 & 0xFF00)>>8; txbuffer[0] = anfangsmarke; txbuffer[1] = temp_1 & 0xFF; // unteres Byte txbuffer[2] = (temp_1 & 0xFF00)>>8; // oberes Byte } void wert_senden(void) // GEKU nur ein byte pro Interrupt versenden { if ((U0TCTL&1) && (tx_cnt<3)) // GEKU UART Senderegister frei && noch keine 3 Bytes versendet { TXBUF0=tx_buffer[tx_cnt]; tx_cnt++; } } void UART_einstellen(void) { P3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXD ME1 |= UTXE0;// + URXE0; // Enable USART0 TXD/RXD UCTL0 |= CHAR; // 8-bit character UTCTL0 |= SSEL0; // UCLK = ACLK UBR00 = 0x03; // 32k/9600 - 3.41 UBR10 = 0x00; // UMCTL0 = 0x4a; // Modulation UCTL0 &= ~SWRST; // Initialize USART state machine IE1 |= UTXIE0; // Enable USART0 RX/TX interrupt URXIE0 + } void Timer_einstellen(void) { unsigned int Zeit; unsigned int ZeitOB=0x1A,ZeitUB = 0xFF; TACTL = TASSEL0 + TACLR;// +ID_1; // TASSEL0 = Takteingang für ACLK(32,7kHz), TACLR--löscht Timer Vorteiler = 2 TACTL |= MC0; // Timer zählt bis CCRO TACCTL0 = CCIE; // Interruptfreigabe Zeit =(ZeitOB << 8)|ZeitUB; // Zusammensetzen OB und UB TACCR0 =Zeit; // Taktzeit: 0,5s 16383 0x3FFF; 1s 0x7FFF = 32767 // Zeitfaktor=2; // bei SD-Karte eingetragen, abhängig vom Vorteiler +ID_1 --> Vorteiler durch 2--> Zeitfaktor=2; _EINT(); // allg. Interrupt-Freigabe } // Timer A0 interrupt service routine #pragma vector=TIMERA0_VECTOR __interrupt void Timer_A (void) { P1OUT ^= BIT7; //LED grün temp_1 = 0x1667; // Messwert 1 Beisoiel werte_feld_fuellen(); wert_senden(); } // UART0 TX ISR #pragma vector=UART0TX_VECTOR __interrupt void usart1_tx (void) { } for(;;); } void werte_feld_fuellen(void) { //temp_1_UB = temp_1 & 0xFF; //temp_1_OB = (temp_1 & 0xFF00)>>8; txbuffer[0] = anfangsmarke; txbuffer[1] = temp_1 & 0xFF; // unteres Byte txbuffer[2] = (temp_1 & 0xFF00)>>8; // oberes Byte } void wert_senden(void) // GEKU Byte für Byte versenden { if ((U0TCTL&1) && (tx_cnt<3)) // GEKU Byte senden wenn Sendepuffer im UART leer und die versendete Anzahl an Bytes kleine als 3 ist { TXBUF0=tx_buffer[tx_cnt]; tx_cnt++; } } void UART_einstellen(void) { P3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXD ME1 |= UTXE0;// + URXE0; // Enable USART0 TXD/RXD UCTL0 |= CHAR; // 8-bit character UTCTL0 |= SSEL0; // UCLK = ACLK UBR00 = 0x03; // 32k/9600 - 3.41 UBR10 = 0x00; // UMCTL0 = 0x4a; // Modulation UCTL0 &= ~SWRST; // Initialize USART state machine IE1 |= UTXIE0; // Enable USART0 RX interrupt URXIE0 + } void Timer_einstellen(void) { unsigned int Zeit; unsigned int ZeitOB=0x1A,ZeitUB = 0xFF; TACTL = TASSEL0 + TACLR;// +ID_1; // TASSEL0 = Takteingang für ACLK(32,7kHz), TACLR--löscht Timer Vorteiler = 2 TACTL |= MC0; // Timer zählt bis CCRO TACCTL0 = CCIE; // Interruptfreigabe Zeit =(ZeitOB << 8)|ZeitUB; // Zusammensetzen OB und UB TACCR0 =Zeit; // Taktzeit: 0,5s 16383 0x3FFF; 1s 0x7FFF = 32767 // Zeitfaktor=2; // bei SD-Karte eingetragen, abhängig vom Vorteiler +ID_1 --> Vorteiler durch 2--> Zeitfaktor=2; _EINT(); // allg. Interrupt-Freigabe } // Timer A0 interrupt service routine #pragma vector=TIMERA0_VECTOR __interrupt void Timer_A (void) { P1OUT ^= BIT7; //LED grün //temp_1 = 0x1667; // Messwert 1 Beisoiel GEKU in den Background verschoben //werte_feld_fuellen(); GEKU in den Background verschoben wert_senden(); // GEKU mit jedem Timerinterrupt eine Byte versenden // ... GKU andere Aktivitäten zur Timerzeit durchführen } // UART0 TX ISR GEKU wird nicht benötigt, da TX Interrupt dauerhaft gesperrt //#pragma vector=UART0TX_VECTOR //__interrupt void usart1_tx (void) //{ //}