Untitled

 avatar
user_1610350
plain_text
a year ago
4.6 kB
1
Indexable
Never
/*-------------------------------------------------------------------------
					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;
				
				}
			}
		}
	}