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

 
 
> 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
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 21)
=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
Navovvol
сообщение Jan 20 2012, 11:52
Сообщение #16


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

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



Цитата(ADEPTPS @ Jan 20 2012, 08:16) *
Используется внешнее тактирование судя по фьюзам.

Моя задача вообще имеет решение?

Внешний кварц 7.3728 МГц ?
Go to the top of the page
 
+Quote Post
ADEPTPS
сообщение Jan 20 2012, 12:18
Сообщение #17


Участник
*

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



да
Go to the top of the page
 
+Quote Post
Navovvol
сообщение Jan 20 2012, 12:49
Сообщение #18


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

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



на Atmega162 вывод PD1(или PB3) соединен с пином PE0 Atmeg'и128A ?
Go to the top of the page
 
+Quote Post
ADEPTPS
сообщение Jan 22 2012, 03:05
Сообщение #19


Участник
*

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



Да, но я уже нашел другой способ получения информации.

Тема временно закрыта!
Go to the top of the page
 
+Quote Post
Aktus
сообщение May 19 2015, 16:13
Сообщение #20





Группа: Новичок
Сообщений: 3
Регистрация: 19-05-15
Пользователь №: 86 765



Всем добрый день.

Пишу вроде бы простейшую прогу для ATmega128A в Atmel Studio 6.1. Просто передаю в комп 1 байт по UART.
Сначала делаю следующим образом:

Код
#include <avr/io.h>

#define UBRR_9600 47

unsigned char s[1] = "A";

int main(void)
{
    UBRR0H = 0;
    UBRR0L = UBRR_9600;
    UCSR0B = (1<<TXEN0);
    UCSR0C = (1<<USBS0)|(1<<UCSZ00);
    
    UDR0 = s[0];
    
    while(1)
    {
    }
}

Всё нормально, но вместо символа "A" (0x41) в окне терминала (Advanced Serial Port Monitor) вижу "Б" (0xC1) sm.gif Почему-то устанавливается в 1 старший бит.

А теперь то же самое, но через прерывание:

Код
#include <avr/io.h>
#include <avr/interrupt.h>

#define UBRR_9600 47

unsigned char s[1] = "A";

int main(void)
{
    UBRR0H = 0;
    UBRR0L = UBRR_9600;
    UCSR0B = (1<<UDRIE0)|(1<< TXEN0);
    UCSR0C = (1<<USBS0)|(1<<UCSZ00);
    
    sei();
    
    while(1)
    {
    }
}

ISR(USART0_UDRE_vect)
{
    UDR0 = s[0];
}

Здесь в терминале вообще ничего не вижу, хотя, по идее, должна быть бесконечная посылка символа "A".
Ассемблерный код в обоих случаях одинаковый и, вроде бы, правильный:
Код
UDR0 = s[0];
LDS R24, 0x0100
OUT 0x0C, R24

Может кто-то сталкивался? Можете что-нибудь подсказать?

Сообщение отредактировал IgorKossak - May 19 2015, 17:13
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
RabidRabbit
сообщение May 19 2015, 18:52
Сообщение #21


Местный
***

Группа: Свой
Сообщений: 397
Регистрация: 3-12-09
Из: Россия, Москва
Пользователь №: 54 040



UCSR0C = (1<<USBS0)|(1<<UCSZ00);

Table 80. UCSZn Bits Settings
UCSZn2 UCSZn1 UCSZn0 Character Size
0 ____ 0 ____ 0 ____ 5-bit
0 ____ 0 ____ 1 ____ 6-bit


По-моему, 6 битов - Ваш случай...

А кстати, в плане занудства, для подобных вопросов существует раздел для начинающих...
Go to the top of the page
 
+Quote Post
Aktus
сообщение May 20 2015, 18:33
Сообщение #22





Группа: Новичок
Сообщений: 3
Регистрация: 19-05-15
Пользователь №: 86 765



RabidRabbit, косяк признаю. Большое спасибо. Про раздел для начинающих понял, учту.
Go to the top of the page
 
+Quote Post

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

 


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


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