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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Связь между двумя mega48 по UART
D_K_
сообщение Sep 14 2012, 17:04
Сообщение #16





Группа: Участник
Сообщений: 10
Регистрация: 13-09-12
Пользователь №: 73 520



Цитата(RabidRabbit @ Sep 14 2012, 12:32) *
Ага, всё, что не задано, остаётся нетронутым (0xFFFF), поэтому, если не стоит цели выжать лишние байты памяти программ из таблицы векторов прерываний, лично я заполняю неиспользованные переходы командами RETI, а можно, например, зажигать лампочку. Таймер запущен, разрешены прерывания по переполнению, разрешены прерывания - значит будет прерывание sm.gif Т.е. отсутствие команды перехода в зарезервированном месте вовсе не запрещает соответствующее прерывание.



Просветили. Спасибо за ценную информацию. А ведь в даташитах об этом ни единого словечка...
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Sep 14 2012, 17:40
Сообщение #17


Гуру
******

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



Цитата(D_K_ @ Sep 14 2012, 20:04) *
Просветили. Спасибо за ценную информацию. А ведь в даташитах об этом ни единого словечка...

Что в даташите об этом должно быть написано?

Есть ещё вариант: неиспользуемые прерывания заполнять не RETI, a чем-то вроде такого

Код
    jmp UndefinedInterrupt
    jmp UndefinedInterrupt
    jmp UndefinedInterrupt


UndefinedInterrupt:
// здесь сделать сброс процессора через WDT или jmp 0x0000
Go to the top of the page
 
+Quote Post
kostyaims
сообщение Sep 15 2012, 17:01
Сообщение #18





Группа: Новичок
Сообщений: 1
Регистрация: 27-05-12
Пользователь №: 72 035



В SLAVE объявляю прерывание по приёму
.equ URXCaddr
rjmp USART_Receive

.org URXCaddr;URXCaddr в соответствии с файпом def
rjmp USART_Receive


Инициализация UARTа в SLAVE :

USART_Init:
clr temp
out UBRR0H, temp
ldi temp, $C ;частота тактирования 1МГц, содержимое UBRR0H=0, UBRR0L=12 => скорость передачи данных 4800bps
out UBRR0L, temp

ldi temp, (1<<RXEN0) | (1<<RXCIE); только приёмник + ПРЕРЫВАНИЕ
out UCSR0B,temp
ldi temp, (1<<USBS0)|(3<<UCSZ00); формат передачи: 8data, 2stop bit
out UCSR0C,temp

Инициализация UARTа MASTER :

USART_Init:
clr temp
out UBRR0H, temp
ldi temp, $C ;частота тактирования 1МГц, содержимое UBRR0H=0, UBRR0L=12 => скорость передачи данных 4800bps
out UBRR0L, temp

ldi temp, (1<<TXEN0) ; только передатчик А ПРЕРЫВАНИЕ?(если надо для передатчика)
out UCSR0B,temp
ldi temp, (1<<USBS0)|(3<<UCSZ00); формат передачи: 8data, 2stop bit
out UCSR0C,temp

Приём данных SLAVEом :

USART_Receive:
если работаете по прерыванию - зачем бит состояния анализировать! вы сюда попадете когда все свершилось
а вто вначале надо
push r16
in r16,sreg
push r16

; sbis UCSR0A, RXC0 ; Wait for data to be received
; rjmp USART_Receive
in temp, UDR0; Get and return received data from buffer

pop r16
out sreg,r16
pop r16
reti

Передача данных MASTERом :

USART_Transmit:
; sbis UCSR0A,UDRE0 ; Wait for empty transmit buffer
; rjmp USART_Transmit
;разрешите после передачи первого байта прерывания по пустому буферу или по концу передачи и
;попадете автоматом
ldi temp, 5
out UDR0,temp ; sends the data
ret

ну и конечно RETI в конце прерываний и не забыть sei в начале
если передается массив данных (два и более байт) - введите адрес поля и указатель (счетчик байт)
пересмотрите ВНИМАТЕЛЬНО документацию, usart раздел register description

Кварцевый резонатро не использую Фьюзы в обоих МК не программировал, поэтому источник тактирования обоих контроллеров - внутренний, установленный по умолчанию (The device is shipped with internal RC oscillator at 8.0MHz and with the fuse CKDIV8 programmedб resulting in 1.0MHz system clock.).

Ноги RxD и TxD обоих МК перекрестил - RxD MASTERа скоммутировал с TxD SLAVE, ТxD MASTERа скоммутировал с RxD SLAVE. Целостность линий RxD MASTERа -> TxD SLAVE и ТxD MASTERа -> RxD SLAVE тестировал мультиметром непосредственно на лапах контроллеров.

Всё компилируется, но не работает, сволочь. В чём может быть причина?

Заранее спасибо за помощь

P.S. Си владею плохо - буду очень благодарен за примеры на асме
[/quote]


вывод передатчика должен быть настроен как выход
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Sep 15 2012, 17:02
Сообщение #19


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

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Код
USART_Receive:
если работаете по прерыванию - зачем бит состояния анализировать! вы сюда попадете когда все свершилось
а вто вначале надо
push r16
in r16,sreg
push r16

; sbis UCSR0A, RXC0; Wait for data to be received
; rjmp USART_Receive
in temp, UDR0; Get and return received data from buffer

pop r16
out sreg,r16
pop r16
reti

Вот это понравилось. Главное , что будет получено на выходе что угодно , только не то что передали


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Sep 15 2012, 17:38
Сообщение #20


Гуру
******

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



Цитата(kostyaims @ Sep 15 2012, 20:01) *
Всё компилируется, но не работает, сволочь. В чём может быть причина?

Посмотрите осцилографом (если он есть), что на выходах TX. Данные идут?

Цитата(kostyaims @ Sep 15 2012, 20:01) *
вывод передатчика должен быть настроен как выход

Совершенно не должен, альтернативная функция в данном случае переопределяет основную (у MegaAVR).

Цитата(ILYAUL @ Sep 15 2012, 20:02) *
Вот это понравилось. Главное , что будет получено на выходе что угодно , только не то что передали

А что не так?
push-pop лишний, конечно. Данные читаются из UDR0 в какой-то temp (что он собой представняет тоже неясно).

Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Sep 15 2012, 17:49
Сообщение #21


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

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



В том-то и дело , что kostyaims переписал пост1. И видимо не смотрел последующие. Кстати в одном из них temp = R16


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Sep 15 2012, 19:02
Сообщение #22


Гуру
******

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



Цитата(ILYAUL @ Sep 15 2012, 20:49) *
Кстати в одном из них temp = R16

Теперь понятно, если так то, код действительно странный.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 22:12
Рейтинг@Mail.ru


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