|
Связь между двумя mega48 по UART |
|
|
|
Sep 14 2012, 17:04
|
Группа: Участник
Сообщений: 10
Регистрация: 13-09-12
Пользователь №: 73 520

|
Цитата(RabidRabbit @ Sep 14 2012, 12:32)  Ага, всё, что не задано, остаётся нетронутым (0xFFFF), поэтому, если не стоит цели выжать лишние байты памяти программ из таблицы векторов прерываний, лично я заполняю неиспользованные переходы командами RETI, а можно, например, зажигать лампочку. Таймер запущен, разрешены прерывания по переполнению, разрешены прерывания - значит будет прерывание  Т.е. отсутствие команды перехода в зарезервированном месте вовсе не запрещает соответствующее прерывание. Просветили. Спасибо за ценную информацию. А ведь в даташитах об этом ни единого словечка...
|
|
|
|
|
Sep 14 2012, 17:40
|
Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Sep 15 2012, 17:01
|
Группа: Новичок
Сообщений: 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]
вывод передатчика должен быть настроен как выход
|
|
|
|
|
Sep 15 2012, 17:38
|
Гуру
     
Группа: Свой
Сообщений: 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 (что он собой представняет тоже неясно).
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|