/*---------------------------------------------------------------------------------------------------------------------------------------- Mikroelektronika - laboratorium Lab 5 - Ćwiczenie 3: miernik temperatury autor: Mariusz Sokołowski wersja: 10.09.2025r. ------------------------------------------------------------------------------------------------------------------------------------------*/ #include "MKL05Z4.h" #include "PIT.h" #include "ADC.h" #include "uart0.h" #include "tsi.h" #include "frdm_bsp.h" #include "lcd1602.h" #include #include #include #include #include volatile float volt_coeff = 2910.0/4096.0; volatile float aver=0; volatile float wynik, temp; volatile uint32_t aver_count=0; volatile uint32_t counter=0; volatile uint8_t wynik_ok=0; void PIT_IRQHandler() // Przerwanie co 100ms (5 okresów sieci) { if(!wynik_ok) { wynik_ok=1; wynik = aver/aver_count; // Uśrednianie wyniku za 100ms counter=aver_count; } aver=0; aver_count=0; PIT->CHANNEL[0].TFLG = PIT_TFLG_TIF_MASK; NVIC_ClearPendingIRQ(PIT_IRQn); } void ADC0_IRQHandler() // Zbieranie próbek z prędkością N kilopróbek na sekundę { aver = aver + ADC0->R[0]; aver_count +=1; NVIC_ClearPendingIRQ(ADC0_IRQn); } int main (void) { volatile uint32_t baud_rate, i=0; volatile uint8_t w=0; uint8_t kal_error=0; char display[]={0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20}; LCD1602_Init(); LCD1602_Backlight(TRUE); UART0_Init(); TSI_Init(); while(w==0) w=TSI_ReadSlider(); // Ustaw BR dla UART0, dotykaąc pole: 0<1/3 - 9600, 1/3<2/3 - 28800,2/3< - 230400 UART0->C2 &= ~(UART0_C2_TE_MASK | UART0_C2_RE_MASK ); //Blokada nadajnika i o dbiornika /*if(w<33) { UART0->BDH = 1; //Dla CLOCK_SETUP=0 BR=9600 UART0->BDL =1; //Dla CLOCK_SETUP=0 BR=9600 UART0->C4 = UART0_C4_OSR(16); baud_rate=9600; } if((w>33)&&(w<66)) {*/ UART0->BDH = 0; //Dla CLOCK_SETUP=0 BR=28800 UART0->BDL =91; //Dla CLOCK_SETUP=0 BR=28800 UART0->C4 = UART0_C4_OSR(15); baud_rate=28800; /*} if(w>66) { UART0->BDH = 0; //Dla CLOCK_SETUP=0 BR=230400 UART0->BDL =13; //Dla CLOCK_SETUP=0 BR=230400 UART0->C4 = UART0_C4_OSR(13); baud_rate=230400; }*/ sprintf(display,"BR=%d b/s",baud_rate); // Wyświetlenie aktualnej wartości BR LCD1602_SetCursor(0,0); LCD1602_Print(display); LCD1602_SetCursor(0,1); LCD1602_Print("Ustaw BR w PC..."); DELAY(5000) w=0; while(w==0) w=TSI_ReadSlider(); LCD1602_SetCursor(0,1); LCD1602_Print("Transmisja... "); UART0->C2 |= UART0_C2_TE_MASK; //Włącz nadajnik kal_error=ADC_Init(); if(kal_error) { while(1); } ADC0->SC1[0] = ADC_SC1_AIEN_MASK | ADC_SC1_ADCH(26); // Wyzwolenie przetwornika ADC0 w kanale 26 i włączenie przerwań od ADC0 - czujnik temperatury PIT_Init(); while(1) { if(wynik_ok) // Wyświetl temperaturę, jeśli wynik pomiaru gotowy { temp = wynik*volt_coeff; temp = 25.0-((temp-716.0))/1.62; sprintf(display,"T=%5.1f%cC%c",temp,0xF8,0xd); for(i=0;display[i]!=0;i++) { while(!(UART0->S1 & UART0_S1_TDRE_MASK)); // Czy nadajnik jest pusty? UART0->D = display[i]; // Wyślij aktualną wartość licznika display[i] = ' '; } DELAY(5000) wynik_ok=0; } } }