Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
mega2411
0 / 0 / 0
Регистрация: 26.05.2012
Сообщений: 212
1

UART attiny2313

13.07.2019, 12:45. Просмотров 230. Ответов 8
Метки нет (Все метки)

Доброго времени суток. Подскажите пожалуйста такую вещь, организовал прием данных по UART, передаю на МК цифры от 1 до 4 , а у меня никакой реакции на действия, эксперементировал с типом данных, результат никакой. выяснил что в терминал отсылается одно число, а принимается другое. отправляю число 3, получаю 10.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#define F_CPU 8000000UL
#define USART_BAUDRATE 9600
#define UBRR_VALUE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)
#include <avr/io.h>
#include <util/atomic.h>
#include <avr/interrupt.h>
#include <util/delay.h>
 
#define PORT_B      PORTB
#define DDR_B       DDRB
#define PIN_B       PINB
#define PORT_D      PORTD
#define DDR_D       DDRD
#define PIN_D       PIND
 
volatile int hum = 0, _flag =0 ; 
float h = 0, t = 0;
unsigned char _set = '1';
 
ISR(USART0_RX_vect)
{
    _set =  UDR;
    _flag = 1;
    
}
 
void USART_Init(void) //Функция инициализации USART
{
    UBRRH = (uint8_t) (UBRR_VALUE>>8); // Set baudrate
    UBRRL = (uint8_t) UBRR_VALUE;
    UCSRB = (1<<RXEN)|(1<<TXEN)|(1 << RXCIE);
    
    /* Set frame format: 8data, 2stop bit */
    UCSRC = (1<<USBS)|(3<<UCSZ0); // Set frame format to 8 data bits, no parity, 1 stop bit
}
 
void setup()
{
    
    DDR_B &= ~((1 << BUT_PIN) | (1 << DAT_PIN));
        PORT_B |= (1 << BUT_PIN);
        DDR_D |= (1 << OUT_PIN);
        PORT_D &= ~(1 << OUT_PIN);
    USART_Init();
    sei();
    
}
 
int main(void)
{
    setup();
    while (1)
    {
        time_since = ticks();
        dht_read();
        //set();
        switch(_set)
        {
            case '1':
            flag();
            button_click();
            break;
            case '2':
            flag();
            auto_click();
            break;
            case '3':
            flag();
            button_ON();
            break;
            case '4':
            flag();
            button_OFF();
            break;
            //default: break;
        }
        }
}
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.07.2019, 12:45
Ответы с готовыми решениями:

UART на ATtiny2313
Сейчас начинаю работать с UART и RS-485. Нужно-ли как-то настраивать Выходы PD0 и PD1 (RXD и TXD...

ATtiny2313: UART + 1wire
Здравствуйте. Делаю термостат на ATtiny2313 и ds18b20. Для связи с устройством используется UART....

Attiny2313 USB-UART
ПОМОГИТЕ! Простейшее устройство, а я всё никак не разберусь. Решил собрать преобразователь...

ATtiny2313 + UART + симуляция в Proteus
Приветствую. Прошу помочь с локализацией проблемы отладки проекта. Проект такой: управление...

Переходник Usb -> Uart На AtTiny2313
Приветствую всех. Решил для своих радиолюбительских нужд собрать переходник из этой статьи. В...

8
Ethereal
7353 / 2194 / 299
Регистрация: 17.02.2013
Сообщений: 3,239
14.07.2019, 20:06 2
Цитата Сообщение от mega2411 Посмотреть сообщение
получаю 10
Получаешь байт со значением 10 или два символа '1' и '0' ?
0
tatarva87
117 / 36 / 11
Регистрация: 23.03.2018
Сообщений: 144
14.07.2019, 20:58 3
Скинь хех файл. Или сам проверь в протеусе - подключи виртуальный осциллограф и все сразу станет понятно что передается.
0
mega2411
0 / 0 / 0
Регистрация: 26.05.2012
Сообщений: 212
16.07.2019, 03:43  [ТС] 4
Цитата Сообщение от tatarva87 Посмотреть сообщение
Скинь хех файл.
ОТПРАВИЛ
0
Вложения
Тип файла: zip Debug.zip (9.6 Кб, 0 просмотров)
16.07.2019, 03:43
mega2411
0 / 0 / 0
Регистрация: 26.05.2012
Сообщений: 212
16.07.2019, 03:47  [ТС] 5
Цитата Сообщение от tatarva87 Посмотреть сообщение
Или сам проверь в протеусе - подключи виртуальный осциллограф и все сразу станет понятно что передается.
как в протеусе заставить виртуальный терминал принимать данные для передачи

Добавлено через 2 минуты
Цитата Сообщение от Ethereal Посмотреть сообщение
Получаешь байт со значением 10 или два символа '1' и '0' ?
проверил, после приема любого числа в терминале отображается 10. или конвертирую не так или же с типом данных облажался
0
mega2411
0 / 0 / 0
Регистрация: 26.05.2012
Сообщений: 212
16.07.2019, 12:26  [ТС] 6
архив проекта
0
Вложения
Тип файла: zip wet2.zip (46.4 Кб, 2 просмотров)
Ethereal
7353 / 2194 / 299
Регистрация: 17.02.2013
Сообщений: 3,239
16.07.2019, 14:23 7
Ты небось в терминале нажимаешь
3 Enter
и терминал посылает
'3' Возврат_каретки Перевод_строки
В твоей программе принимается '3' срабатывает прерывание и в нем _set = UDR; а в головной программе срабатывает switch(_set) , но после него _delay_ms(1000); а за это время будет принят еще Возврат_каретки и Перевод_строки , прерывание сработает еще два раза , еще два раза в его обработчике исполнится _set = UDR; и в переменной _set останется Перевод_строки, а он ведь и имеет код 10 (десятичное). Ты его отправляешь обратно по USART_Transmit_int(_set); и говоришь, мол ты принял 10 , хотя на самом деле ты принял '3' , а потом 13 и потом 10 .
Как вариант объяснения происходящего.
0
mega2411
0 / 0 / 0
Регистрация: 26.05.2012
Сообщений: 212
16.07.2019, 18:42  [ТС] 8
Цитата Сообщение от Ethereal Посмотреть сообщение
Как вариант объяснения происходящего.
засунул switch(_set) в обработчик прерываний, теперь получаю 13 на выходе.
как реализовать проверку полученных данных?

Добавлено через 25 минут
Цитата Сообщение от mega2411 Посмотреть сообщение
засунул switch(_set)
в протеусе получаю 13, а после заливки в чип получаю также 10
0
Ethereal
7353 / 2194 / 299
Регистрация: 17.02.2013
Сообщений: 3,239
16.07.2019, 21:10 9
Да тебе надо просто обдумать и аккуратно написать толковый алгоритм. Я же не знаю твоего конечного замысла.
Ну можешь, например обработчик прерывания сделать так :
C
1
2
3
4
5
6
7
8
9
10
ISR(USART0_RX_vect)
{
        unsigned char tmp;
        tmp = UDR;
        if (tmp >= 0x20)
        {
            _set = tmp;
            _flag = 1;
        }
}
и игнорировать в нем прием управляющих символов (их коды все ниже кода пробела = 0x20) в т.ч. возврата каретки и перевода строки.
А в функции main(void) перед switch все же надо сначала ожидать выставления флага означающего, что прием произошел, а значит переменная _set получила принятое значение и только потом ветвиться.
C
1
2
3
 while (!_flag) ;
 switch(_set)
     {
По крайней мере так оно хоть как-то будет уже работать.
0
16.07.2019, 21:10
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.07.2019, 21:10

прием байта с UART ATtiny2313
Делаю вот что: #define F_CPU 8000000UL #include &lt;avr/io.h&gt; #define baud 51 // параметр...

Attiny2313
Прочитал документацию, там 4 шим порта(вывода), но вот не понял дальше, пишут что 1 какой-то для...

Таймер на attiny2313
Приветствую всех. Как на 2313 рассчитать значение для записи в эти регистры, если я хочу получить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru