реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> USART & Atmega128A
ADEPTPS
сообщение Jan 19 2012, 08:02
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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);
}

}


Что здесь не так?
Go to the top of the page
 
+Quote Post
=GM=
сообщение Jan 19 2012, 08:17
Сообщение #2


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



seconds(1); убрать


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jan 19 2012, 08:21
Сообщение #3


Гуру
******

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



Цитата(ADEPTPS @ Jan 19 2012, 12:02) *
Что здесь не так?

1. В этом МК регистры UBRR0H и UCSR0C имеют один адрес и различаются битом URSEL
2. При задании скорости нужно задавать вначале UBRR0H, а затем UBRR0L
3. Если поток, действительно, непрерывный, то можно "не попасть" на начало очередного байта при включении "подслушки".
Go to the top of the page
 
+Quote Post
ADEPTPS
сообщение Jan 19 2012, 08:51
Сообщение #4


Участник
*

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



Цитата(Палыч @ Jan 19 2012, 12:21) *
1. В этом МК регистры UBRR0H и UCSR0C имеют один адрес и различаются битом URSEL

Что мне с этим делать?

Отладчик показывает, что программа стопорится на:
byte uartrecv() // прием байта
{
while(!(UCSR0A & (1<<RXC0))); <<<<<<<<<<<<<<<<<<<<ЗДЕСЬ
return UDR0;
}
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jan 19 2012, 09:04
Сообщение #5


Гуру
******

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



Цитата(ADEPTPS @ Jan 19 2012, 12:51) *
Что мне с этим делать?


Например, что-то такое:
Код
UCSR0C = 0x06 | (1 << URSEL);


Цитата(ADEPTPS @ Jan 19 2012, 12:51) *
Отладчик показывает ...

Убедится (осциллографом, например), что сигнал доходит до МК.
Go to the top of the page
 
+Quote Post
ADEPTPS
сообщение Jan 19 2012, 09:35
Сообщение #6


Участник
*

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



Цитата(Палыч @ Jan 19 2012, 13:04) *
Код
UCSR0C = 0x06 | (1 << URSEL);

URSEL???? у меня Atmega128!!! у нее URSEL по крайней мере по даташиту отсутствует

Цитата
Убедится (осциллографом, например), что сигнал доходит до МК.

Это я проверил первым делом!

Сообщение отредактировал ADEPTPS - Jan 19 2012, 09:36
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jan 19 2012, 09:54
Сообщение #7


Гуру
******

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



Цитата(ADEPTPS @ Jan 19 2012, 13:35) *
у меня Atmega128!!!

Так бы сразу и говорили... А то, в первом посте речь про m162 была, запутало всё...

Снять фуз M103C !
Go to the top of the page
 
+Quote Post
ADEPTPS
сообщение Jan 19 2012, 10:05
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jan 19 2012, 10:27
Сообщение #9


Гуру
******

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



Цитата(ADEPTPS @ Jan 19 2012, 14:05) *
Оставить как было?

Правильнее: строки с UBRR0L и UBRR0H поменять местами, но в данном случае это ничему не помешает (и не поможет).

Осталось убедиться, что МК "заведён" от кварца, а не от внутреннего генератора.
Go to the top of the page
 
+Quote Post
ADEPTPS
сообщение Jan 19 2012, 10:47
Сообщение #10


Участник
*

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



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

Как это сделать нормально?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jan 19 2012, 12:22
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(ADEPTPS @ Jan 19 2012, 12:47) *
Как это сделать нормально?

Подключить программатор.
Прочитать fuse (источник тактирования у m128 задаётся фузами и не может менятся на лету).
Go to the top of the page
 
+Quote Post
smalcom
сообщение Jan 19 2012, 13:05
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



я думаю для задач обмена данными по UART нужно как минимум включать UART.
Go to the top of the page
 
+Quote Post
ADEPTPS
сообщение Jan 20 2012, 05:16
Сообщение #13


Участник
*

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



Используется внешнее тактирование судя по фьюзам.

Моя задача вообще имеет решение?
Go to the top of the page
 
+Quote Post
Navovvol
сообщение Jan 20 2012, 06:58
Сообщение #14


Частый гость
**

Группа: Участник
Сообщений: 105
Регистрация: 9-09-11
Пользователь №: 67 080



Да тактирование тут ни причем, мусор бы все равно приходил. Как я понял программа стопориться в цикле ожидания байта. Значит надо поменять местам Rx Tx. И вообще для наглядности лучше через прерывание по завершению приема байта сделать.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jan 20 2012, 08:14
Сообщение #15


Гуру
******

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



Цитата(Navovvol @ Jan 20 2012, 10:58) *
Да тактирование тут ни причем, мусор бы все равно приходил. Как я понял программа стопориться в цикле ожидания байта.
Если тактовая частота МК в разы меньше, чем штатная, то мусор, как раз бы, и не приходил, а МК "повис" бы на ожидании прихода байта.
Цитата(Navovvol @ Jan 20 2012, 10:58) *
Значит надо поменять местам Rx Tx.
Предлагаете применять "метод тыка"? biggrin.gif ТС убедился, что сигнал доходит до МК (см.пост №6)
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 11:51
Рейтинг@Mail.ru


Страница сгенерированна за 0.01536 секунд с 7
ELECTRONIX ©2004-2016