Re: Передача строки по UART
Добавлено: Сб янв 28, 2017 15:54:20
Уважаемые коты, не оставьте пожалуйста без ответа вопрос парой постов выше. Спасибо.
немножко теории у ЛИ почитать можно, одна из копипаст:maxitch писал(а):вопрос парой постов выше
Какой вопрос тут безответный?maxitch писал(а):не оставьте пожалуйста без ответа вопрос парой постов выше.
Спасибо. По ссылке как раз полезность увеличения частоты подаётся как аксиома. Это зависит от типа нагрузки? Инерционность моего бытового конвектора такова, что для достижения результата (поддержание заданной температуры с гистерезисом 1гр. С. и точностью 0,5 гр. С.) это излишне.oleg110592 писал(а):немножко теории у ЛИ почитать можно, одна из копипаст:maxitch писал(а):вопрос парой постов выше
http://cxem.net/mc/mc3.php
кушать мёд.maxitch писал(а): Что лучше или правильнее
вроде для бытовых всегда было достаточно двухпозиционного регулирования (включено, выключено). Если инерция большая - имхо можно сообразить простенький ПИД, симистор просто включать/выключать.maxitch писал(а):oleg110592 писал(а):Вопрос мой был конкретно про бытовые обогреватели. Что лучше или правильнее
не нужен там никакой ПИД или ПИ. инерция настолько большая, что при двухпозиционном регулировании счет пойдет на десятки секунд, а может, на минуты.oleg110592 писал(а):вроде для бытовых всегда было достаточно двухпозиционного регулирования (включено, выключено). Если инерция большая - имхо можно сообразить простенький ПИД
ленивее и прощее тутошную покурочить получилось (кодевижн2 портабле, в протеусе работает, 8МГц):romozan писал(а):ПОЖАЛУЙСТА, просто приведите пример рабочего кусочка кода в мою программу
Код: Выделить всё
#include <tiny2313.h>
#include <string.h>
#define RX_BUFFER_SIZE 4
unsigned char received;
char rx_data [4];
volatile unsigned char rx_flag = 0;
volatile unsigned char indexchar = 0;
char buffer[] = "OFF";
void UARTInit(void) {
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x98;
UCSRC=0x06;
UBRRH=0x00;
UBRRL=0x33;
}
unsigned char UARTGet() {
while(!rx_flag);
rx_flag = 0;
indexchar = 0;
rx_data[3] = '\0';
return 1;
}
void main(void)
{
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
DDRB.0=1;
ACSR=0x80;
UARTInit();
// Global enable interrupts
#asm("sei")
while(1)
{
received = UARTGet();
if (strcmp(buffer, rx_data) == 0)
{
PORTB.0 = 0;
}
if (rx_data[0]=='1')
{
PORTB.0 = 1;
}
rx_data[0]='-';
rx_data[1]='-';
rx_data[2]='-';
}
}
interrupt [USART_RXC] void usart_rx_isr(void)
{
rx_data[indexchar] = UDR;
if ((rx_data[0] !='1')&&(rx_data[0] !='O'))
{
indexchar = 0;
return;
}
if ((rx_data[0]=='O') && (rx_data[2]=='F'))
{
rx_flag = 1;
return;
}
if (rx_data[0]=='1')
{
rx_flag = 1;
return;
}
if(++indexchar >= RX_BUFFER_SIZE)
{
indexchar = 0;
}
}