Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.98/42: Рейтинг темы: голосов - 42, средняя оценка - 4.98
Oyr_Homstir
0 / 0 / 0
Регистрация: 16.04.2014
Сообщений: 20
1

Проблема с UART (ATmega88)

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

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

.def   temp3   =r28
.def   Data   =r29

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

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
Ответы с готовыми решениями:

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

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

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

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

Странная проблема uart
mega8515, от внутреннего генератора 1MHz, .include &quot;m8515def.yms&quot; ;...

26
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
Добрый день! Сейчас занимаюсь разработкой одного устройства (контроллер...

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

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


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

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

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