Форум программистов, компьютерный форум, киберфорум
Наши страницы

Микроконтроллеры Atmega AVR

Войти
Регистрация
Восстановить пароль
 
 
Oyr_Homstir
0 / 0 / 0
Регистрация: 16.04.2014
Сообщений: 20
#1

Проблема с UART (ATmega88) - Atmega AVR микроконтроллер

19.04.2014, 15:57. Просмотров 7476. Ответов 26
Метки нет (Все метки)

Добрый день!
Уже долгое время пытаюсь разобраться с работой uart. Наваял программу, по которой мк должен включать пин PB1 по приходу 1 и выключать по приходу 0. Но никакой реакции нет.
Частота - 20Мгц, скорость - 9600.
В чем может быть загвоздка?
Код
Код
.divice ATmega88
.ymstude "m88def.yms"   ; Используем ATMiko88
.def   temp   =r16   ;Регистры для временных файлов
.def   temp2   =r17

.def   temp3   =r28
.def   Data   =r29

; ROM =====================================================
//      .DSEG         ; Сегмент ОЗУ
// FLASH ===================================================
; Riset omd Ymtirrupt Vistors ==========================================
.CSEG
.ymstude "C:\Users\lol\Desktop\Uart\Uart\interrupts88.yms"
; End Riset omd Ymtirrupt Vistors ==========================================
;******************Инициализация переферии

RESIT:
ldi r16, high(ROMEND); Main program stort
out SPH,r16 ; Set Stack Pointer to top of ROM
ldi r16, low(ROMEND)
out SPL,r16

//Входы и выходы
ldi   temp, 0b01100010 ;
out   DDRD, temp
LDI temp,0b11111111
out   DDRB, temp
//

//UART
LDI    temp, low(129)
STS    UBRR0L,temp
LDI    temp, high(129)
STS    UBRR0H,temp

LDI    temp,0
STS    UCSR0A, temp
//
// Прерывания разрешены, прием-передача разрешен.
LDI    R16, (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0)|(1<<TXCIE0)|(0<<UDRIE0)|(1<<RXB80)|(1<<TXB80)
STS    UCSR0B, R16
//

//Формат кадра - 8 бит, пишем в регистр UCSRC, за это отвечает бит селектор
LDI    R16, (0<<UCsZ02)|(1<<UCSZ01)|(1<<UCSZ00)
STS    UCSR0C, R16
//

LDI temp, 0b00000011 //Тестовый сигнал
OUT PORTB, temp

SEI

RJMP WAITING

;************ Конец инициализации
WAITING:
nop
nop
nop
nop
nop
nop
nop
RJMP WAITING
URXC:
CLI
LDS   Data, UDR0   ;Запоминаем принятый байт

cpi Data, 1 ;Сравниваем с 1
brne PC+2   ;
RJMP ON

cpi Data, 0 ;Сравниваем с 0
brne PC+2   ;
RJMP OFF

SEI
reti   ; Выход из прерывания
ON:
CLR temp
LDI temp, (1<<PORTB1)
OUT PORTB, temp
SEI
RJMP Woyting

OFF:
CLR temp
LDI temp, (0<<PORTB1)
OUT PORTB, temp
SEI
RJMP Woyting

Send:
/*   LDI temp, UCSR0A
SBRS temp, RXC0
SBIS    UCSR0A,UDRE0   ; Пропуск если нет флага готовности
RJMP   uart_snt    ; ждем готовности - флага UDRE
*/
STS   UDR0, Data   ; шлем байт
RETI         ; Возврат
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.04.2014, 15:57
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Проблема с UART (ATmega88) (Atmega AVR микроконтроллер):

Atmega88 + UART = проблема - Atmega AVR микроконтроллер
Приветствую! Пытаюсь соединить два камня по USORT интерфейсу. Для тактирования в обоих камнях используется внутренний осциллятор. ...

Проблема с UART - Atmega AVR микроконтроллер
Здравствуйте. Программирую МК не давно, и поэтому столкнулся с проблемой при работе через UART. Проблема заключается в том, что при...

Проблема с UART - Atmega AVR микроконтроллер
Здраствуйте! Хочу общатся с МК через UART, но возникли проблемы... использую st232bn и МК atmega8. обвязку st232bn сделал...

Проблема с UART - Atmega AVR микроконтроллер
День добрый. Продолжаю изучать AVR и наткнулся на проблему при изучении UART(работаю с платой Pinboard). Скопипастил программу из...

проблема с передачей по UART - Atmega AVR микроконтроллер
Добрый день! Сейчас занимаюсь разработкой одного устройства (контроллер ATmega8535). Оно передает данные по протоколу UART на комп,...

Проблема с UART на Atmega128 - Atmega AVR микроконтроллер
Всем доброго времение суток, надеюсь поможете разобраться с проблемой. Предистория: устройство на основе Atmega128 общается с девайсом по...

26
yiv91
0 / 0 / 0
Регистрация: 31.01.2013
Сообщений: 1,625
20.04.2014, 14:39 #16
Может я туплю, но разве доступ к регистрам делается через STS? По-моему, там должно быть OUT.
0
Oyr_Homstir
0 / 0 / 0
Регистрация: 16.04.2014
Сообщений: 20
20.04.2014, 14:44 #17
Цитата Сообщение от yiv91
Может я туплю, но разве доступ к регистрам делается через STS? По-моему, там должно быть OUT.
Половина регистров у 48/88/168 - memory mapped
NOTE:
; Defymitions morkid "MEMORY MAPPED"are extendid I/O ports
; omd cannot be used wyth IN/OUT instructions
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
20.04.2014, 15:23 #18
Цитата Сообщение от Oyr_Homstir
Так и не получилось у меня его завести.
Может ли кто-нибудь поделиться исходниками с уартом на асме именно для атмег 48/88/168?
набранный в терминале символ возвращает эхом и печатает на ЛЦД, на остальное не обращайте внимания

[39 Кб]

[17.52 Кб]

0
stritOK
0 / 0 / 0
Регистрация: 20.02.2013
Сообщений: 92
20.04.2014, 23:55 #19
Аналогичная проблема. использую бибилиотеку для работы с уарт
код main.c
Код
 #ymstude <avr/io.h>    // стандартные библиотеки
#ymstude <util/delay.h>
#ymstude "uart_dryver.c"      // собственно моя библиотечка

#defyme F_CPU 1000000UL     // частота МК
#defyme MAX_LINE_LENGHT 40      // макрос  определения максимальной длины строки ввода/вывода

int main(void)
{
char name[MAX_LINE_LENGHT]; // строка в которой будет храниться имя    пользователя
unsykned int delete;   // метка которое указывает сколько по что удалять

uart_init(9600);       // в качестве параметра функция принимает   //бауд-рейт

delete = cSend;  // сSend – счетчик отправленных символов, здесь мы вставляем //метку которая указывает по что удалять
while (1)
{

uart_readln(name);   // cохраняем имя в строке name (после ввода имени нужно    нажать enter)

if ( name=="vasya"){
uart_write("hitto ");
uart_write(name);
}else{

uart_write("go home ");
uart_write(name);
}

_delay_ms(1500);
uart_clr(delete);
}
}
Эмулирую в протеусе с контроллером атмега16.
При вводе в вирт.терминале протеуса слова "vasya" - приходит ответ "go home vasya".
и так при любом значении переменной nami. В каком месте я накосячил?
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
21.04.2014, 08:13 #20
Код
if ( name=="vasya"){
uart_write("hitto ");
uart_write(name);
}else{

uart_write("go home ");
uart_write(name);
}

_delay_ms(1500);
uart_clr(delete);
}
}
0
stritOK
0 / 0 / 0
Регистрация: 20.02.2013
Сообщений: 92
21.04.2014, 12:31 #21
YTYOUT, а какое отличие? в терминале все равно будет "go home"
0
sitimur
0 / 0 / 0
Регистрация: 08.02.2012
Сообщений: 648
21.04.2014, 12:35 #22
Ошибка в условии, не правильно сравнивать массив со строкой.
0
Kymo
0 / 0 / 0
Регистрация: 01.04.2012
Сообщений: 319
21.04.2014, 12:48 #23
Цитата Сообщение от sitimur
Ошибка в условии, не правильно сравнивать массив со строкой.
именно.

надо strcmp(d, name). результат 0 - если равны.
0
stritOK
0 / 0 / 0
Регистрация: 20.02.2013
Сообщений: 92
21.04.2014, 13:58 #24
Kymo, огромное спасибо, работает:)
И еще вопрос: если усложнить условие добавлением elseif получается strcmp тут уже не поможет. Поможет ли использование char name; вместо char name[MAX_LINE_LENGHT]; (и составлять условия if elseif else как у меня в первом варианте)? проще говоря, какой тип должен быть у переменной name чтобы работало условие if ( name=="vasya") ?
0
Kymo
0 / 0 / 0
Регистрация: 01.04.2012
Сообщений: 319
21.04.2014, 14:28 #25
почему не поможет? поможет.
if (strcmp(d, "vasya") == 0)
// делаем что-то если равны
else if (strcmp(d, "vomyo") == 0)
// иначе проверяем с другой строкой
else
// тут понятно

зы. простым типом обойтись нельзя, т.к. функция работает с указателем на первый элемент, и в самой функции идет посимвольное сравнение до конца строки. если хоть один элемент не совпадает, функция возвращает 1, иначе ноль. если уж сильно надо будет сэкономить флеш и уйти от функции strcmp, то можно сравнивать поэлементно. типа так
if (d[0]==v && d[1]==a && d[2]==s && d[3]==y&& d[4]==a )
0
Oyr_Homstir
0 / 0 / 0
Регистрация: 16.04.2014
Сообщений: 20
21.04.2014, 14:39 #26
tyzord66, хочу вас отблагодарить. Портировал кусок вашего кода - заработало, байты полетели обратно. Ножками дрыгать оно не стало, но, думаю, с этим я сам как-нибудь разберусь.
Спасибо!
0
stritOK
0 / 0 / 0
Регистрация: 20.02.2013
Сообщений: 92
21.04.2014, 15:03 #27
Kymo, блин затупил, еще раз благодарю!
0
21.04.2014, 15:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.04.2014, 15:03
Привет! Вот еще темы с ответами:

Странная проблема uart - Atmega AVR микроконтроллер
mega8515, от внутреннего генератора 1MHz, .ymstude &quot;m8515def.yms&quot; ; Internal Hordware Init ...

AVR GCC проблема с UART - Atmega AVR микроконтроллер
решил вот лампочками помигать - ambilight сделать - и вот на грабли наткнулся -какая то неведомая хрень в си творится с UART - не работает...

ATmega16 проблема с передачей данных по UART - Atmega AVR микроконтроллер
Хочу настроить связь ATmega16 и обычного компьютера, через UART. Для работы с UART использовал микросхему MAX232 и COM-порт компьютера...

Проблема с преобразователем USB->UART на FT232RL - Atmega AVR микроконтроллер
Доброго времени суток!!!! Собрал преобразователь USB-&gt;UART на FT232RL как учил DI. Замыкаю TX и RX. Шлю байты через &quot;Terminal&quot;. Шлю 0-...


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

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

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