Передача строки по UART
Re: Передача строки по UART
Уважаемые коты, не оставьте пожалуйста без ответа вопрос парой постов выше. Спасибо.
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Передача строки по UART
maxitch писал(а):вопрос парой постов выше
немножко теории у ЛИ почитать можно, одна из копипаст:
http://cxem.net/mc/mc3.php
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Передача строки по UART
Какой вопрос тут безответный?maxitch писал(а):не оставьте пожалуйста без ответа вопрос парой постов выше.
Re: Передача строки по UART
oleg110592 писал(а):maxitch писал(а):вопрос парой постов выше
немножко теории у ЛИ почитать можно, одна из копипаст:
http://cxem.net/mc/mc3.php
Спасибо. По ссылке как раз полезность увеличения частоты подаётся как аксиома. Это зависит от типа нагрузки? Инерционность моего бытового конвектора такова, что для достижения результата (поддержание заданной температуры с гистерезисом 1гр. С. и точностью 0,5 гр. С.) это излишне.
Вопрос мой был конкретно про бытовые обогреватели. Что лучше или правильнее: обрезать каждый полупериод на четверть, пропуск 1 полупериода из 3 или пропуск 100 полупериодов из 300?
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Передача строки по UART
кушать мёд.maxitch писал(а): Что лучше или правильнее
как вы не поймете, что "лучше или правильнее" в каждом случае разные?!
вам, по-моему, уже было сказано, что регулирование пропусками полупериодов/периодов при мощной нагрузке даст вам заметные глазом колебания яркости ламп накаливания, но отсутствие помех радиоприемникам СВ/ДВ диапазона, в то время как регулирование "обрезкой" полуволны напряжения (фазовое регулирование) избавит вас от мерцания ламп, по даст кучу помех в радиоприемниках и древних телевизорах?
чем ВЫ готовы пожертвовать - тот вариант и будет лучше. а если вы спрашиваете именно моего мнения, то см. выше - плюньте на всё и ешьте мёд - по столовой ложке натощак (если желудок здоровый) - это будет в мульён раз лучше любого способа регулирования нагрузки.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Передача строки по UART
maxitch писал(а):oleg110592 писал(а):Вопрос мой был конкретно про бытовые обогреватели. Что лучше или правильнее
вроде для бытовых всегда было достаточно двухпозиционного регулирования (включено, выключено). Если инерция большая - имхо можно сообразить простенький ПИД, симистор просто включать/выключать.
Re: Передача строки по UART
Из вышесказанного можно сделать вывод, что выключить нагрузку в виде нагревателя на 1 секунду ничем не хуже, чем на 1 полупериод? И включить на 3 секунды ничем не хуже, чем на 3 полупериода?
Колебания яркости освещения в квартире не замечено. У соседей не проверял
За советы в области диетологии отдельное персональное спасибо
Колебания яркости освещения в квартире не замечено. У соседей не проверял
За советы в области диетологии отдельное персональное спасибо
- Starichok51
- Модератор
- Сообщения: 19044
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: Передача строки по UART
не нужен там никакой ПИД или ПИ. инерция настолько большая, что при двухпозиционном регулировании счет пойдет на десятки секунд, а может, на минуты.oleg110592 писал(а):вроде для бытовых всегда было достаточно двухпозиционного регулирования (включено, выключено). Если инерция большая - имхо можно сообразить простенький ПИД
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Re: Передача строки по UART
Уважаемые кото-форумчане! У меня тот-же вопрос что на первой странице в первом посту, только я новичёк пишу в codevision и досконально понять код среды Atmel Studio для меня проблема. Облизал все шесть страниц, хоть ломайте мне все когти и вырывайте усы- не могу понять и всё..
ПОЖАЛУЙСТА, просто приведите пример рабочего кусочка кода в мою программу (Завести массив и переменную и т.д)
Задача проста: в протеусе, в терминале, единицей зажигаю светодиод а потушить хочу в терминале (например) введя три символа off
код рабочей программы:
#include <tiny2313.h>
#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
// USART Receiver buffer
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];
#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif
bit rx_buffer_overflow;
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if(data==1+(0x30))PORTB.0=1; //зажигаю
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index]=data;
if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
};
};
}
#ifndef _DEBUG_TERMINAL_IO_
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif
#include <stdio.h>
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=0xFF;
UCSRB=0x90;
UCSRC=0x06;
UBRRL=0x33;
ACSR=0x80;
#asm("sei")
while (1)
{
};
}
СПА-СИ-БО!
Задача проста: в протеусе, в терминале, единицей зажигаю светодиод а потушить хочу в терминале (например) введя три символа off
код рабочей программы:
#include <tiny2313.h>
#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
// USART Receiver buffer
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];
#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif
bit rx_buffer_overflow;
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if(data==1+(0x30))PORTB.0=1; //зажигаю
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index]=data;
if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
};
};
}
#ifndef _DEBUG_TERMINAL_IO_
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif
#include <stdio.h>
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=0xFF;
UCSRB=0x90;
UCSRC=0x06;
UBRRL=0x33;
ACSR=0x80;
#asm("sei")
while (1)
{
};
}
СПА-СИ-БО!
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Передача строки по UART
romozan писал(а):ПОЖАЛУЙСТА, просто приведите пример рабочего кусочка кода в мою программу
ленивее и прощее тутошную покурочить получилось (кодевижн2 портабле, в протеусе работает, 8МГц):
Спойлер
Код: Выделить всё
#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;
}
}
Re: Передача строки по UART
Всё работает, oleg110592-гу кото-человеческое СПАСИБО!
