Untitled
user_1610350
plain_text
3 years ago
4.6 kB
5
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;
char message[256] = "";
//int time[3];
//char kod[3];
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 duration=0;
int i=0;
volatile int temp2=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 time;
uint32_t czas_trwania[20];
const char* znaki[20];
char slowo[20];
const char* znakii[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...