Untitled
user_1610350
plain_text
2 years ago
4.4 kB
6
Indexable
/*------------------------------------------------------------------------- Technika Mikroprocesorowa 2 - laboratorium Lab 6 - Ćwiczenie 6: regulator zmierzchowy autor: Mariusz Sokołowski wersja: 10.10.2022r. ----------------------------------------------------------------------------*/ #include "MKL05Z4.h" #include "ADC.h" #include "DAC.h" #include "frdm_bsp.h" #include "lcd1602.h" #include <stdio.h> #include <string.h> #include <stdlib.h> #define DOT_DURATION 50 #define DASH_DURATION (150 * DOT_DURATION) #define INTER_WORD_GAP (350 * DOT_DURATION) //systick uint32_t czas=0; // Licznik czasu, zliczajacy sekundy od handlera uint8_t sekunda=0; // Licznik przerwan ( do 10) uint8_t sekunda_OK=0; float adc_volt_coeff = ((float)(((float)2.91) / 4096) ); // Współczynnik korekcji wyniku, w stosunku do napięcia referencyjnego przetwornika uint8_t wynik_ok=0; uint16_t temp; float wynik=0; int i=0; const char* morseCode[] = { ".-", //A "-...", //B "-.-.", //C "-..", //D ".", //E "..-.", //F "--.", //G "....", //H "..", //I ".---", //J "-.-", //K ".-..", //L "--", //M "-.", //N "---", //O ".--.", //P "--.-", //Q ".-.", //R "...", //S "-", //T "..-", //U "...-", //V ".--", //W "-..-", //X "-.--", //Y "--.." //Z }; char decodeMorse(const char* table) { for (int i = 0; i < 26; i++) { if (strcmp(table, morseCode[i]) == 0) { return 'A' + i; } } return ' '; } const char* light_to_Morse(int duratio) { if (duratio >= DOT_DURATION && duratio < DASH_DURATION) { return "."; } else if (duratio >= DASH_DURATION && duratio < INTER_WORD_GAP) { return "-"; } else if (duratio >= INTER_WORD_GAP) { return " "; } } void SysTick_Handler(void) // Podprogram obslugi przerwania od SysTick'a { sekunda+=1; // Licz interwaly równe 100ms if(sekunda==10) { sekunda=0; sekunda_OK=1; // Daj znac, ze minela sekunda } } void ADC0_IRQHandler() { temp = ADC0->R[0]; // Odczyt danej i skasowanie flagi COCO if(!wynik_ok) // Sprawdź, czy wynik skonsumowany przez petlę główną { wynik = temp; // Wyślij wynik do pętli głównej wynik_ok=1; } DAC_Load_Trig(temp); // Załadowanie nowej danej i wyzwolenie przetwornika C/A } int main (void) { uint8_t kal_error; char display[]={0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20}; LCD1602_Init(); // Inicjalizacja wyświetlacza LCD LCD1602_Backlight(TRUE); kal_error=ADC_Init(); // Inicjalizacja przetwornika A/C if(kal_error) { while(1); // Klaibracja się nie powiodła } DAC_Init(); // Inicjalizacja przetwornika C/A ADC0->SC1[0] = ADC_SC1_AIEN_MASK | ADC_SC1_ADCH(8); // Pierwsze wyzwolenie przetwornika ADC0 w kanale 8 i odblokowanie przerwania SysTick_Config(SystemCoreClock/10 ); uint32_t czas_trwania[20]; const char* znaki[20]; char slowo[20]; while(1) { if(sekunda_OK) { if(wynik_ok) { wynik = wynik*adc_volt_coeff; if (wynik>=1){ while(wynik>=1.5){ czas+=1; czas_trwania[i]=czas; LCD1602_SetCursor(2,0); sprintf(display,"%02d",czas); LCD1602_Print(display); LCD1602_SetCursor(2,1); sprintf(display,"%02d",czas_trwania[i]); LCD1602_Print(display); sekunda_OK=0; wynik_ok=0; } i++; } else if (wynik<1){ czas=0; } if(czas_trwania[3]!=0){ for(int i=0; i<3; i++){ znaki[i]=light_to_Morse(czas_trwania[i]); LCD1602_SetCursor(5+2*i,0); sprintf(display,"%02d",znaki[i]); LCD1602_Print(display); slowo[i]=decodeMorse(znaki); } for(int j=0; j<3; j++){ LCD1602_SetCursor(6+i,1); sprintf(display,"%c",slowo[j]); } LCD1602_Print(display); } for(int j=0; j<3; j++){ sprintf(display,"%c",slowo[j]); } LCD1602_Print(display); wynik_ok=0; } } } }
Editor is loading...