segoman99
Üye
- Katılım
- 11 Ağu 2021
- Mesajlar
- 5
- Puanları
- 1
- Yaş
- 44
Merhabalar. MSP430 kullanarak nem ve sıcaklık verisi ölçüyorum. Bu ölçtüğüm değerleri UART haberleşmesi kullanarak Nodemcu Wifi modülüne attım ve Nodemcu Wifi modülü kullanarak da MQTT sunucusuna attım. Ancak Nodemcu kullanarak, MQTT sunucusundan okuduğum verileri MSP430'a aktaramadım. MSP430'daki RX kesmesinin (interrupt) çalışmamasının sebebi nedir? Kesme bayrağı (interrupt flag) arada 1 oluyor yani Nodemcu'dan veri geliyor. Yardımcı olabilir misiniz? Kodum aşağıdaki gibidir.
#include <msp430.h>
int temp[50];
int diff[50];
int a=0;
unsigned int i=0;
unsigned int j=0;
unsigned char humidityHigh = 0;
unsigned char humidityLow = 0;
unsigned char temperatureHigh = 0;
unsigned char temperatureLow = 0;
unsigned char checkSum = 0;
unsigned char check = 0;
unsigned char dataOk = 0 ;
unsigned char TXCounter=0; // Giden veri sayacı
unsigned char humiTemp[2]={"xx"}; // Gönderilecek yazı
unsigned char bAlinanKarakter[1]={"x"};
void main(void)
{
WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
DCOCTL = 0;
BCSCTL1 = CALBC1_1MHZ;
DCOCTL = CALDCO_1MHZ;
P1DIR &= ~(BIT1); // P1.0 pin output
P1SEL |= (BIT1 + BIT2);//P1.1 = RXD P1.2 = TXD
P1SEL2 |= (BIT1 + BIT2);//P1.1 = RXD P1.2 = TXD
UCA0CTL1 |= UCSSEL_2; // UART Ayarları, Saat kaynağı SMCLK
UCA0BR0 = 104; // 1MHz 9600 bud ayarı
UCA0BR1 = 0; // 1MHz 9600 baud ayarı
UCA0MCTL = UCBRS0; // UART Baud hassas ayar
UCA0CTL1 &= ~UCSWRST; // USCI birimini hazırla
TA1CTL = TASSEL_2|MC_2;
TA1CCTL2 = CAP | CCIE | CCIS_0 | CM_2 | SCS ;
__delay_cycles(2000000);
P2DIR |= BIT4;
P2OUT &= ~BIT4;
__delay_cycles(20000);
P2OUT |= BIT4;
__delay_cycles(20);
P2DIR &= ~BIT4;
P2SEL |= BIT4;
_enable_interrupts();
while(1){
if (i >= 40){
for (j = 1; j <= 8; j++){
if (diff[j] >= 110)
humidityHigh |= (0x01 << (8-j));
}
for (j = 9; j <= 16; j++){
if (diff[j] >= 110)
humidityLow |= (0x01 << (16-j));
}
for (j = 17; j <= 24; j++){
if (diff[j] >= 110)
temperatureHigh |= (0x01 << (24-j));
}
for (j = 25; j <= 32; j++){
if (diff[j] >= 110)
temperatureLow |= (0x01 << (32-j));
}
for (j = 33; j <= 40; j++){
if (diff[j] >= 110)
checkSum |= (0x01 << (40-j));
}
check=humidityHigh+humidityLow+temperatureHigh+temperatureLow;
if (check == checkSum){
dataOk = 1;
humiTemp[0] =humidityHigh; // Nem değeri
humiTemp[1]= temperatureHigh; // Sıcaklık değeri
IE2 |= UCA0TXIE; // Gönderme kesmesini aç
__bis_SR_register(GIE); // interrupt aktif edildi
IE2 |= UCA0RXIE;
}
else{
dataOk = 0;
}
__delay_cycles(1000000);
WDTCTL = WDT_MRST_0_064;
}
}
}
#pragma vector = TIMER1_A1_VECTOR
__interrupt void Timer_A1(void){
temp = TA1CCR2;
i += 1;
TA1CCTL2 &= ~CCIFG ;
if (i>=2) diff[i-1]=temp[i-1]-temp[i-2];
}
#pragma vector=USCIAB0TX_VECTOR
__interrupt void USCI0TX_ISR(void)
{
while (!(IFG2&UCA0TXIFG)); // TX tamponu hazır olana kadar bekle
UCA0TXBUF = humiTemp[TXCounter]; // sıradaki karakteri gönder
__delay_cycles(2000000);
if (++TXCounter>=2){ // Tüm karakterler gitti mi?
TXCounter=0; // Gödnerme sayascını sıfırla
IE2 &= ~(UCA0TXIE); // Evet ise gönderme kesmesini kapat
}
}
#pragma vector = USCIAB0RX_VECTOR
__interrupt void USCIAB0RX_ISR(void)
{
while(!(IFG2&UCA0RXIFG));
bAlinanKarakter[0]=UCA0RXBUF; // Gelen veriyi al
IE2 &= ~(UCA0RXIE); // Evet ise alma kesmesini kapat
}