Изменил(а) на 'UART/main.c'

This commit is contained in:
Никита Солодянкин 2023-06-16 22:19:56 +00:00
parent f83f5bfa9f
commit cb281d378e

View File

@ -1,156 +1,119 @@
#include <avr/io.h> #include <avr/io.h>
#include <avr/interrupt.h> #include <avr/interrupt.h>
#include <stdint.h> #include <stdint.h>
#include <string.h> #include <string.h>
#include "timer.h" #include "timer.h"
#include "circular_buf.h" #include "circular_buf.h"
#define F_CPU 16000000 #define F_CPU 16000000
#define SIZE_BUF 16 #define SIZE_BUF 16
CircularBuffer usartTxBuffer;
CircularBuffer usartRxBuffer;
volatile unsigned char usartTxBuf[SIZE_BUF];
volatile unsigned char txBufTail = 0; void UARTInit(void) {
volatile unsigned char txBufHead = 0; UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0) | (1 << UDRIE0); // &#1074;&#1082;&#1083;&#1102;&#1095;&#1072;&#1077;&#1084; &#1087;&#1088;&#1077;&#1088;&#1099;&#1074;&#1072;&#1085;&#1080;&#1077; &#1087;&#1086; &#1087;&#1088;&#1080;&#1077;&#1084;&#1091; &#1080; &#1086;&#1087;&#1091;&#1089;&#1090;&#1086;&#1096;&#1077;&#1085;&#1080;&#1102; &#1073;&#1091;&#1092;&#1077;&#1088;&#1072; &#1087;&#1077;&#1088;&#1077;&#1076;&#1072;&#1095;&#1080;
volatile unsigned char txCount = 0; UCSR0C = (1 << UCSZ01) | (1 << UCSZ00);
UBRR0H = 0;
volatile unsigned char usartRxBuf[SIZE_BUF]; UBRR0L = 103;
volatile unsigned char rxBufTail = 0; }
volatile unsigned char rxBufHead = 0;
volatile unsigned char rxCount = 0; void UARTSend(uint8_t* data, size_t length) {
for (size_t i = 0; i < length; i++) {
if (!BufferFull(&usartTxBuffer)) {
writeBuffer(&usartTxBuffer, data[i]);
void UARTInit(void) { } else {
UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0) | (1 << TXCIE0); break; // &#1073;&#1091;&#1092;&#1077;&#1088; &#1087;&#1077;&#1088;&#1077;&#1076;&#1072;&#1095;&#1080; &#1079;&#1072;&#1087;&#1086;&#1083;&#1085;&#1077;&#1085;, &#1087;&#1088;&#1077;&#1088;&#1099;&#1074;&#1072;&#1077;&#1084; &#1086;&#1090;&#1087;&#1088;&#1072;&#1074;&#1082;&#1091;
UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); }
UBRR0H = 0; }
UBRR0L = 103; UCSR0B |= (1 << UDRIE0); // &#1042;&#1082;&#1083;&#1102;&#1095;&#1072;&#1077;&#1084; &#1087;&#1088;&#1077;&#1088;&#1099;&#1074;&#1072;&#1085;&#1080;&#1077; &#1087;&#1086; &#1086;&#1087;&#1091;&#1089;&#1090;&#1086;&#1096;&#1077;&#1085;&#1080;&#1102; &#1073;&#1091;&#1092;&#1077;&#1088;&#1072; &#1087;&#1077;&#1088;&#1077;&#1076;&#1072;&#1095;&#1080;
} }
//&#1087;&#1086;&#1083;&#1086;&#1078;&#1080;&#1090;&#1100; &#1089;&#1080;&#1084;&#1074;&#1086;&#1083; &#1074; &#1073;&#1091;&#1092;&#1077;&#1088;
void UARTSend(uint8_t* data, size_t length) { void USART_PutChar(unsigned char sym) {
for (size_t i = 0; i < length; i++) { // Æä¸ì îïóñòîøåíèÿ áóôåðà ïåðåäà÷è (÷èòàåì ôëàã). if (((UCSR0A & (1 << UDRE0)) != 0) && BufferEmpty(&usartTxBuffer)) {
while (!(UCSR0A & (1 << UDRE0))); UDR0 = sym;
UDR0 = data[i];// Çàïèñûâàåì â ðåãèñòð çíà÷åíèå ïåðåìåííîé "data" äëÿ ïåðåäà÷è. } else {
} if (!BufferFull(&usartTxBuffer)) {
} writeBuffer(&usartTxBuffer, sym);
//ïîëîæèòü ñèìâîë â áóôåð } else {
void USART_PutChar(unsigned char sym) { // &#1041;&#1091;&#1092;&#1077;&#1088; &#1087;&#1077;&#1088;&#1077;&#1076;&#1072;&#1095;&#1080; &#1087;&#1086;&#1083;&#1086;&#1085;, &#1086;&#1073;&#1088;&#1072;&#1073;&#1086;&#1090;&#1082;&#1072; &#1086;&#1096;&#1080;&#1073;&#1082;&#1080; &#1080;&#1083;&#1080; &#1076;&#1088;&#1091;&#1075;&#1072;&#1103; &#1083;&#1086;&#1075;&#1080;&#1082;&#1072;
if (((UCSR0A & (1 << UDRE0)) != 0) && (txCount == 0)) { }
UDR0 = sym; }
} else { }
if (txCount < SIZE_BUF) { //&#1074;&#1079;&#1103;&#1090;&#1100; &#1089;&#1080;&#1084;&#1074;&#1086;&#1083; &#1080;&#1079; &#1073;&#1091;&#1092;&#1077;&#1088;&#1072;
usartTxBuf[txBufTail] = sym; int GetChar(unsigned char* sym) {
txCount++; if (!BufferEmpty(&usartTxBuffer)) {
txBufTail++; *sym = readBuffer(&usartTxBuffer);
if (txBufTail == SIZE_BUF) { return 1; // &#1059;&#1089;&#1087;&#1077;&#1096;&#1085;&#1086; &#1087;&#1088;&#1086;&#1095;&#1080;&#1090;&#1072;&#1085; &#1089;&#1080;&#1084;&#1074;&#1086;&#1083; &#1080;&#1079; &#1073;&#1091;&#1092;&#1077;&#1088;&#1072; &#1087;&#1077;&#1088;&#1077;&#1076;&#1072;&#1095;&#1080;
txBufTail = 0; } else {
} return 0; // &#1041;&#1091;&#1092;&#1077;&#1088; &#1087;&#1077;&#1088;&#1077;&#1076;&#1072;&#1095;&#1080; &#1087;&#1091;&#1089;&#1090;, &#1074;&#1086;&#1079;&#1085;&#1080;&#1082;&#1083;&#1072; &#1086;&#1096;&#1080;&#1073;&#1082;&#1072; &#1095;&#1090;&#1077;&#1085;&#1080;&#1103;
} }
} }
} //&#1092;&#1091;&#1085;&#1082;&#1094;&#1080;&#1103; &#1079;&#1072;&#1075;&#1088;&#1091;&#1079;&#1082;&#1080; &#1089;&#1090;&#1088;&#1086;&#1082;
//âçÿòü ñèìâîë èç áóôåðà void USART_SendStr(const unsigned char* data) {
unsigned char GetChar(void) { while (*data) {
unsigned char sym = 0; USART_PutChar(*data++);
if (txCount > 0) { }
sym = usartTxBuf[txBufHead]; }
txCount--; //&#1087;&#1086;&#1083;&#1091;&#1095;&#1072;&#1077;&#1084; &#1076;&#1072;&#1085;&#1085;&#1099;&#1077; &#1080;&#1079; &#1073;&#1091;&#1092;&#1077;&#1088;&#1072;
txBufHead++; void UARTReceive(uint8_t* data) {
if (txBufHead == SIZE_BUF) { uint32_t timeout_ms_mb = 100;
txBufHead = 0; uint32_t timeout_ms = 4;
} uint32_t start_time = millis();
} while (BufferEmpty(&usartRxBuffer)) {
return sym; if ((millis() - start_time) > timeout_ms_mb) {
} // &#1054;&#1073;&#1088;&#1072;&#1073;&#1086;&#1090;&#1082;&#1072; &#1086;&#1096;&#1080;&#1073;&#1082;&#1080; &#1080;&#1083;&#1080; &#1090;&#1072;&#1081;&#1084;&#1072;&#1091;&#1090;&#1072; &#1087;&#1088;&#1080;&#1077;&#1084;&#1072;
//ôóíêöèÿ çàãðóçêè ñòðîê return 0;
void USART_SendStr(const unsigned char* data) { }
while (*data) { }
USART_PutChar(*data++); data[0] = readBuffer(&usartRxBuffer);
} start_time = millis();
} while (!BufferEmpty(&usartRxBuffer)) {
//ïîëó÷àåì äàííûå èç áóôåðà if ((millis() - start_time) > timeout_ms) {
void UARTReceive(uint8_t* data) { break;
uint32_t timeout_ms_mb = 100;//timeout 100ms, â íàøåì ñëó÷àå, èíîãäà ïî 1 ñåê, è äàæå ïî 4-5 ñ, åñëè áàéò ïîâðåäèëñÿ è èäåò îêîëî 1-2ñåêóíä, òî øòîðà ìîæåò ñëîìàòüñÿ }
uint32_t timeout_ms = 4; }
uint32_t start_time = millis();//çàïîìèíàåì âðåìÿ íà÷àëà îæèäàíèÿ }
while (rxCount == 0) { //îæèäàíèå íàëè÷èÿ äàííûõ â áóôåðå ïðè¸ìà
if ((millis() - start_time) > timeout_ms_mb) { //åñëè âðåìÿ îæèäàíèÿ èñòåêëî int main(void) {
return 0; //âûõîäèì èç öèêëà sei();
} UARTInit();
} timerInit();
data[0] = usartRxBuf[rxBufHead];//ñ÷èòûâàíèå áàéòà èç áóôåðà DDRD = 0xFF;
rxCount--; uint8_t buff[] = {0x48, 0x45, 0x4C, 0x4C, 0x4F, 0x21, 0x09};
rxBufHead++; UARTSend(buff, sizeof(buff));
if (rxBufHead == SIZE_BUF) {
rxBufHead = 0; uint8_t receivedData[SIZE_BUF];
} UARTReceive(receivedData);
start_time = millis();//îáíóëÿåì òàéìàóò, òàê êàê äàííûå íà÷àëè ïðèõîäèòü UARTSend(receivedData, sizeof(receivedData));
while (rxCount > 0) { //îæèäàíèå îêîí÷àíèÿ ïðè¸ìà äàííûõ
if ((millis() - start_time) > timeout_ms) { //åñëè âðåìÿ îæèäàíèÿ èñòåêëî while (1) {
break; //âûõîäèì èç öèêëà îæèäàíèÿ //unsigned long currentTime = millis();
}
} }
} return 0;
}
int main(void) { ISR(USART_RX_vect) {
sei(); if (!BufferFull(&usartRxBuffer)) {
UARTInit(); writeBuffer(&usartRxBuffer, UDR0);// &#1047;&#1072;&#1087;&#1080;&#1089;&#1099;&#1074;&#1072;&#1077;&#1084; &#1087;&#1088;&#1080;&#1085;&#1103;&#1090;&#1099;&#1081; &#1089;&#1080;&#1084;&#1074;&#1086;&#1083; &#1074; &#1073;&#1091;&#1092;&#1077;&#1088; &#1087;&#1088;&#1080;&#1077;&#1084;&#1072;
timerInit(); }
DDRD = 0xFF;
uint8_t buff[] = {0x48, 0x45, 0x4C, 0x4C, 0x4F, 0x21, 0x09}; if (!BufferEmpty(&usartTxBuffer)) {
UARTSend(buff, sizeof(buff)); UDR0 = readBuffer(&usartTxBuffer);// &#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1084; &#1089;&#1080;&#1084;&#1074;&#1086;&#1083; &#1080;&#1079; &#1073;&#1091;&#1092;&#1077;&#1088;&#1072; &#1087;&#1077;&#1088;&#1077;&#1076;&#1072;&#1095;&#1080;
//for (int i = 0; i < 7; i++) { } else {
//UARTSend(buff, sizeof(buff)); UCSR0B &= ~(1 << UDRIE0); // &#1054;&#1090;&#1082;&#1083;&#1102;&#1095;&#1072;&#1077;&#1084; &#1087;&#1088;&#1077;&#1088;&#1099;&#1074;&#1072;&#1085;&#1080;&#1077; &#1087;&#1086; &#1086;&#1087;&#1091;&#1089;&#1090;&#1086;&#1096;&#1077;&#1085;&#1080;&#1102; &#1073;&#1091;&#1092;&#1077;&#1088;&#1072; &#1087;&#1077;&#1088;&#1077;&#1076;&#1072;&#1095;&#1080;
//} }
}
uint8_t receivedData[SIZE_BUF];
UARTReceive(receivedData);
//
//// rx_data = UDR0; //Â íåì äàííûå èç ïðèåìíîãî áóôåðà UDR ïåðåíîñÿòñÿ â ãëîáàëüíóþ ïåðåìåííóþ rx_data
UARTSend(receivedData, sizeof(receivedData)); //// rx_flag = 1; //âûñòàâëÿåòñÿ ôëàã rx_flag, ãîâîðÿùèé î òîì, ÷òî ïðèåì çàâåðøåí
//}
while (1) {
//unsigned long currentTime = millis();
// Äåëàéòå ÷òî-òî ñ òåêóùèì âðåìåíåì...
}
return 0;
}
ISR(USART_RX_vect) {
if (rxCount < SIZE_BUF) {
usartRxBuf[rxBufTail] = UDR0;
rxBufTail++;
if (rxBufTail == SIZE_BUF) {
rxBufTail = 0;
}
rxCount++;
}
}
////îáðàáîò÷èê ïðåðûâàíèÿ ïî çàâåðøåíèþ ïåðåäà÷è
//ISR(USART_TXC_vect) {
//if (txCount > 0){ //åñëè áóôåð íå ïóñòîé
//UDR0 = usartTxBuf[txBufHead]; //çàïèñûâàåì â UDR ñèìâîë èç áóôåðà
//txCount--; //óìåíüøàåì ñ÷åò÷èê ñèìâîëîâ
//txBufHead++; //èíêðåìåíòèðóåì èíäåêñ ãîëîâû áóôåðà
//if (txBufHead == SIZE_BUF)
//txBufHead = 0;
//}
//else {
//UCSR0B &= ~(0<<TXCIE0);
//}
//
//// rx_data = UDR0; //Â íåì äàííûå èç ïðèåìíîãî áóôåðà UDR ïåðåíîñÿòñÿ â ãëîáàëüíóþ ïåðåìåííóþ rx_data
//// rx_flag = 1; //âûñòàâëÿåòñÿ ôëàã rx_flag, ãîâîðÿùèé î òîì, ÷òî ïðèåì çàâåðøåí
//}