Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
Photofenix
62 / 62 / 39
Регистрация: 18.11.2016
Сообщений: 554
Завершенные тесты: 1
1

Прием и передача данных через UART интерфейс. Atmega32A

05.06.2018, 21:45. Просмотров 1319. Ответов 6
Метки нет (Все метки)

Итак, написал очень простой код для МК мега32.
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
#define F_CPU 12000000UL
#define BAUDRATE 9600
 
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/delay.h>
#include "libs/LCD.h"
 
void UART_init (){
    UBRRL = (F_CPU/BAUDRATE/16-1);
    UBRRH = (F_CPU/BAUDRATE/16-1) >> 8;
    UCSRB |= (1 << RXCIE); // Interrupt enable.
    UCSRB |= (1 << RXEN); // Recieve byte enable.
    UCSRB |= (1 << TXEN); // Transmit enable.
    
    UCSRC |= (1 << URSEL); // Switch to register UCSEL
    UCSRC |= (1 << UCSZ1) | (1 << UCSZ0); // The frame is 8 bits.
}
 
void UART_send_byte (uint8_t byte){
    while (!(UCSRA & (1 << UDRE)));
    UDR = byte;
}
 
uint8_t UART_recieve_byte (){
    while (!(UCSRA & (1 << RXC)));
    return UDR;
}
 
ISR (USORT_RXC_vect){
    uint8_t temp = UDR;
    if (temp == 0x31){
        PORTB = 0x00;
        UART_send_byte(' ');
        UART_send_byte('O');
        UART_send_byte('K');
        UART_send_byte(' ');
    } else{
        PORTB = 0xFF;
        UART_send_byte(' ');
        UART_send_byte('O');
        UART_send_byte('K');
        UART_send_byte(' ');
    }
}
 
int main(void)
{
    DDRB = 0xFF;
    PORTB = 0xFF;
    
    LCD_initial();
    UART_init();
    
    
    LCD_send_string("Hello this world");
    
    //sei();
    
    while (1) {
        UART_send_byte(0x31);
        _delay_ms(1000);
    }
}
Использую USB - TTL переходник CP2102.
Прерывание не работает, отправляет обратно какую то дичь. Не могу найти проблему.

Добавлено через 1 минуту
Хочу добавить, что в протеусе работает великолепно.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.06.2018, 21:45
Ответы с готовыми решениями:

ATS90S8535. Считывание, суммирование и передача данных через UART
ATS90S8535 написать программу которая каждую секунду по прерыванию таймер счётчика 2 считывает два...

Прием данных с UART
Вопрос скорее архитектурного плана. МК принимает по UART пакеты данных. Протокол бинарный. Формат...

Прием данных на пк с UART, ATMEGA16
Здравствуйте, не работает прием данных на пк, они не выводятся в TEXTBOX. Отправка с самого МК...

Прием данных по UART в 8052
Не могу разобраться с приемом по uart скорость 9600 на 11.0592МГц. 8ми битная посылка. Передача...

Прием данных по UART (Raspberry Pi)
День добрый. Я пишу программу под Raspberry на C++. Мне необходимо принимать данные по UART...

6
ValeryS
Модератор
7528 / 5703 / 738
Регистрация: 14.02.2011
Сообщений: 19,524
Завершенные тесты: 1
05.06.2018, 22:07 2
Лучший ответ Сообщение было отмечено Photofenix как решение

Решение

Цитата Сообщение от Photofenix Посмотреть сообщение
Цитата Сообщение от Photofenix Посмотреть сообщение
(F_CPU/BAUDRATE/16-1);
формулу то правильно написал?
обычно пишут
(F_CPU/(BAUDRATE*16)-1);
да и записывается по моему сначала старший бит а потом младший

Добавлено через 1 минуту
Цитата Сообщение от Photofenix Посмотреть сообщение
Прерывание не работает,
Цитата Сообщение от Photofenix Посмотреть сообщение
//sei();
зачем закомментировал? кто прерывания то включать будет
1
Photofenix
62 / 62 / 39
Регистрация: 18.11.2016
Сообщений: 554
Завершенные тесты: 1
06.06.2018, 08:31  [ТС] 3
Sei закоментировал, потому что это один фиг, прерывание на прием байта не работал вообще.
Да и хотелось посмотреть, как читает и пишет МК. Спасибо, глянул даташит.
0
sharpey
365 / 155 / 37
Регистрация: 21.09.2008
Сообщений: 518
17.07.2018, 12:27 4
Мне очень нравится Youtube-канал Электротехника и электроника для программистов, нахожу там много для себя интересного и актуального.
0
sharpey
365 / 155 / 37
Регистрация: 21.09.2008
Сообщений: 518
23.07.2018, 13:27 5
Возможно, новичкам будет полезна статья AVR: обмен данными по uart c использованием прерываний и fifo.
0
Photofenix
62 / 62 / 39
Регистрация: 18.11.2016
Сообщений: 554
Завершенные тесты: 1
27.07.2018, 16:56  [ТС] 6
Господа программисты, купил другой TTL - USB адптер FT232RL.
Данные так же определяются не корректно. В чем может быть причина?
0
sharpey
365 / 155 / 37
Регистрация: 21.09.2008
Сообщений: 518
30.07.2018, 19:57 7
Здесь были? "Криминала" в инициализации USART не видно, но Ваш код инициализации я бы переписал так:
C
1
2
3
4
5
6
void UART_init(){
    UBRRL = (F_CPU/BAUDRATE/16-1);
    UBRRH = (F_CPU/BAUDRATE/16-1) >> 8;
    UCSRB = (1 << RXCIE) | (1 << RXEN) | (1 << TXEN); 
    UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0);
}
Вторая статья на том же сайте весьма интересная (с исходниками).

Добавлено через 23 минуты
Ещё одна очень полезная статья.
0
30.07.2018, 19:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2018, 19:57

Корректный прием данных из UART на Delphi
Здравствуйте, с контроллера (ATmega16) через USB-UART в порт посылаю числа (1, 2, 3...), с помощью...

Прием 8 бит данных UART-ом 8051
Здравствуйте. Нужно написать программу для приема 8 бит данных на последовательный порт(режим uart...

LaunchPad: прием данных с UART в MSP430
Здравствуйте! Учусь программировать msp430. Использую launchPad. Никак не могу разобраться как в...


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

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

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