|
USART & Atmega128A |
|
|
|
Jan 19 2012, 08:02
|
Участник

Группа: Участник
Сообщений: 41
Регистрация: 5-05-09
Пользователь №: 48 683

|
Постановка задачи: Есть Atmega162, которая непрерывно посылками светит по USART. Нужно выцепить определенный байт из посылки. Задача 1: Просто что-нибудь поймать по USART CODE #include <avr/io.h> #include <avr/delay.h> #include "lcd.h" #include <stdio.h> #include "stdafx.h"
typedef unsigned char byte; typedef unsigned short word; typedef unsigned long dword; void uart0_init(void) // инициализация uart { DDRE = (DDRE | 2) & ~1; // выводы порта - PE0 in, PE1 out UCSR0B = 0x00; // временно запретить uart UCSR0A = 0x00; UCSR0C = 0x06; UBRR0L = 0x17; // скорость 19200 UBRR0H = 0x00; UCSR0B = 0x18; // запуск }
void uartsend(byte c) // посылка байта { while(!(UCSR0A & (1<<UDRE0))); UDR0 = c; }
byte uartrecv() // прием байта { while(!(UCSR0A & (1<<RXC0))); return UDR0; }
void main(void) { UCHAR i; DDRE = 0x00; char text[6]; unsigned int n=0; double ut = 0; CLI(); lcd_init(); lcd_write("Autorising..."); seconds(1); lcd_init(); lcd_write("Autorising..."); seconds(1); uart0_init(); DDRD = (1 << 4); SEI(); while (1) { ut = uartrecv(); dtostrf(ut,6,0,text); lcd_send(COMMAND, LCD_CLEAR); DDRD = (1 << 4); lcd_write(text); DDRD = 0x00; seconds(1); }
}
Что здесь не так?
|
|
|
|
|
Jan 19 2012, 08:51
|
Участник

Группа: Участник
Сообщений: 41
Регистрация: 5-05-09
Пользователь №: 48 683

|
Цитата(Палыч @ Jan 19 2012, 12:21)  1. В этом МК регистры UBRR0H и UCSR0C имеют один адрес и различаются битом URSEL Что мне с этим делать? Отладчик показывает, что программа стопорится на: byte uartrecv() // прием байта { while(!(UCSR0A & (1<<RXC0))); <<<<<<<<<<<<<<<<<<<<ЗДЕСЬ return UDR0; }
|
|
|
|
|
Jan 19 2012, 09:04
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(ADEPTPS @ Jan 19 2012, 12:51)  Что мне с этим делать? Например, что-то такое: Код UCSR0C = 0x06 | (1 << URSEL); Цитата(ADEPTPS @ Jan 19 2012, 12:51)  Отладчик показывает ... Убедится (осциллографом, например), что сигнал доходит до МК.
|
|
|
|
|
Jan 19 2012, 09:35
|
Участник

Группа: Участник
Сообщений: 41
Регистрация: 5-05-09
Пользователь №: 48 683

|
Цитата(Палыч @ Jan 19 2012, 13:04)  Код UCSR0C = 0x06 | (1 << URSEL); URSEL???? у меня Atmega128!!! у нее URSEL по крайней мере по даташиту отсутствует Цитата Убедится (осциллографом, например), что сигнал доходит до МК. Это я проверил первым делом!
Сообщение отредактировал ADEPTPS - Jan 19 2012, 09:36
|
|
|
|
|
Jan 19 2012, 10:05
|
Участник

Группа: Участник
Сообщений: 41
Регистрация: 5-05-09
Пользователь №: 48 683

|
Цитата(Палыч @ Jan 19 2012, 13:54)  Снять фуз M103C ! Снят! Цитата UCSR0C = 0x06; UBRR0L = 0x17; // скорость 19200 UBRR0H = 0x00; Оставить как было?
Сообщение отредактировал ADEPTPS - Jan 19 2012, 10:07
|
|
|
|
|
Jan 19 2012, 10:47
|
Участник

Группа: Участник
Сообщений: 41
Регистрация: 5-05-09
Пользователь №: 48 683

|
Цитата(Палыч @ Jan 19 2012, 14:27)  Осталось убедиться, что МК "заведён" от кварца, а не от внутреннего генератора. Как это сделать нормально?
|
|
|
|
|
Jan 20 2012, 05:16
|
Участник

Группа: Участник
Сообщений: 41
Регистрация: 5-05-09
Пользователь №: 48 683

|
Используется внешнее тактирование судя по фьюзам.
Моя задача вообще имеет решение?
|
|
|
|
|
Jan 20 2012, 08:14
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(Navovvol @ Jan 20 2012, 10:58)  Да тактирование тут ни причем, мусор бы все равно приходил. Как я понял программа стопориться в цикле ожидания байта. Если тактовая частота МК в разы меньше, чем штатная, то мусор, как раз бы, и не приходил, а МК "повис" бы на ожидании прихода байта. Цитата(Navovvol @ Jan 20 2012, 10:58)  Значит надо поменять местам Rx Tx. Предлагаете применять "метод тыка"?  ТС убедился, что сигнал доходит до МК (см.пост №6)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|