Передача строки по UART

Обсуждаем контроллеры компании Atmel.
maxitch
Открыл глаза
Сообщения: 47
Зарегистрирован: Пн авг 10, 2015 12:53:00

Re: Передача строки по UART

Сообщение maxitch »

Уважаемые коты, не оставьте пожалуйста без ответа вопрос парой постов выше. Спасибо.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Передача строки по UART

Сообщение oleg110592 »

maxitch писал(а):вопрос парой постов выше

немножко теории у ЛИ почитать можно, одна из копипаст:
http://cxem.net/mc/mc3.php
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: Передача строки по UART

Сообщение Z_h_e »

maxitch писал(а):не оставьте пожалуйста без ответа вопрос парой постов выше.
Какой вопрос тут безответный?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
maxitch
Открыл глаза
Сообщения: 47
Зарегистрирован: Пн авг 10, 2015 12:53:00

Re: Передача строки по UART

Сообщение maxitch »

oleg110592 писал(а):
maxitch писал(а):вопрос парой постов выше

немножко теории у ЛИ почитать можно, одна из копипаст:
http://cxem.net/mc/mc3.php

Спасибо. По ссылке как раз полезность увеличения частоты подаётся как аксиома. Это зависит от типа нагрузки? Инерционность моего бытового конвектора такова, что для достижения результата (поддержание заданной температуры с гистерезисом 1гр. С. и точностью 0,5 гр. С.) это излишне.

Вопрос мой был конкретно про бытовые обогреватели. Что лучше или правильнее: обрезать каждый полупериод на четверть, пропуск 1 полупериода из 3 или пропуск 100 полупериодов из 300?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Передача строки по UART

Сообщение ARV »

maxitch писал(а): Что лучше или правильнее
кушать мёд.

как вы не поймете, что "лучше или правильнее" в каждом случае разные?!

вам, по-моему, уже было сказано, что регулирование пропусками полупериодов/периодов при мощной нагрузке даст вам заметные глазом колебания яркости ламп накаливания, но отсутствие помех радиоприемникам СВ/ДВ диапазона, в то время как регулирование "обрезкой" полуволны напряжения (фазовое регулирование) избавит вас от мерцания ламп, по даст кучу помех в радиоприемниках и древних телевизорах?

чем ВЫ готовы пожертвовать - тот вариант и будет лучше. а если вы спрашиваете именно моего мнения, то см. выше - плюньте на всё и ешьте мёд - по столовой ложке натощак (если желудок здоровый) - это будет в мульён раз лучше любого способа регулирования нагрузки.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Передача строки по UART

Сообщение oleg110592 »

maxitch писал(а):
oleg110592 писал(а):Вопрос мой был конкретно про бытовые обогреватели. Что лучше или правильнее

вроде для бытовых всегда было достаточно двухпозиционного регулирования (включено, выключено). Если инерция большая - имхо можно сообразить простенький ПИД, симистор просто включать/выключать.
maxitch
Открыл глаза
Сообщения: 47
Зарегистрирован: Пн авг 10, 2015 12:53:00

Re: Передача строки по UART

Сообщение maxitch »

Из вышесказанного можно сделать вывод, что выключить нагрузку в виде нагревателя на 1 секунду ничем не хуже, чем на 1 полупериод? И включить на 3 секунды ничем не хуже, чем на 3 полупериода?
Колебания яркости освещения в квартире не замечено. У соседей не проверял :)

За советы в области диетологии отдельное персональное спасибо
Аватара пользователя
Starichok51
Модератор
Сообщения: 19044
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: Передача строки по UART

Сообщение Starichok51 »

oleg110592 писал(а):вроде для бытовых всегда было достаточно двухпозиционного регулирования (включено, выключено). Если инерция большая - имхо можно сообразить простенький ПИД
не нужен там никакой ПИД или ПИ. инерция настолько большая, что при двухпозиционном регулировании счет пойдет на десятки секунд, а может, на минуты.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
romozan
Родился
Сообщения: 2
Зарегистрирован: Сб сен 14, 2013 13:25:31

Re: Передача строки по UART

Сообщение romozan »

Уважаемые кото-форумчане! У меня тот-же вопрос что на первой странице в первом посту, только я новичёк пишу в codevision и досконально понять код среды Atmel Studio для меня проблема. Облизал все шесть страниц, хоть ломайте мне все когти и вырывайте усы- не могу понять и всё.. :cry: ПОЖАЛУЙСТА, просто приведите пример рабочего кусочка кода в мою программу (Завести массив и переменную и т.д)
Задача проста: в протеусе, в терминале, единицей зажигаю светодиод а потушить хочу в терминале (например) введя три символа 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

Сообщение oleg110592 »

romozan писал(а): :cry: ПОЖАЛУЙСТА, просто приведите пример рабочего кусочка кода в мою программу

ленивее и прощее тутошную покурочить получилось (кодевижн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;
    }
}
romozan
Родился
Сообщения: 2
Зарегистрирован: Сб сен 14, 2013 13:25:31

Re: Передача строки по UART

Сообщение romozan »

Всё работает, oleg110592-гу кото-человеческое СПАСИБО!
Ответить

Вернуться в «AVR»