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

|
Здравствуйте, уважаемые разработчики. Подскажите, пожалуйста новичку.
Разрабатываю устройство на основе двух МК (meg48 и mega48P). Один изх них (mega48P) использую для обработки кнопок, и управления. Другой (mega48) - торлько для индикации (7-сегментный СИД-дисплей). Связь между ними осуществляю по UART. Индикационный контроллер (mega48) нработает в режиме SLAVE и только слушает UART. Контроллер управления (mega48P) работает в режиме MASTER и только передаёт сообщения SLAVE . Приём сообщений SLAVE осуществляет по прерыванию RX_Complete.
В SLAVE объявляю прерывание по приёму .equ URXCaddr 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) ; только приёмник 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: sbis UCSR0A, RXC0 ; Wait for data to be received rjmp USART_Receive in temp, UDR0; Get and return received data from buffer 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
Кварцевый резонатро не использую Фьюзы в обоих МК не программировал, поэтому источник тактирования обоих контроллеров - внутренний, установленный по умолчанию (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. Си владею плохо - буду очень благодарен за примеры на асме
|
|
|
|
|
 |
Ответов
|
Sep 14 2012, 09:21
|
Группа: Участник
Сообщений: 10
Регистрация: 13-09-12
Пользователь №: 73 520

|
Цитата(zombi @ Sep 14 2012, 09:45)  Зачем вообще использовать уарт??? чем SPI не устраивает? проводов столькоже и калибровать ничего не надо. Работа на будущее - в этом проекте достаточно одностороннего обмена, но уже через несколько недель может понадобиться полнодуплексный обмен. А отладочная плата и черновой вариант программы - вот они, уже есть. Цитата(RabidRabbit @ Sep 14 2012, 09:27)  ldi temp,$4 sts tccr1b,temp ldi temp,$1 sts timsk1,temp В "слэйве" не мешает каждые 16 секунд попадание на 0xFFFF в незаполненной таблице векторов прерываний?  Не должно бы - адрес обработки прерывания по переполнению счётчика ведь не задан: .org 0 rjmp reset .org URXCaddr rjmp USART_Receive Описаны только адреса обработчика ресета и прерывания по приёму данных. Или я не прав? Внесите, пожалуйста, ясность. Но в любом случае это кусок кода - мусор оставшийся от предыдущей версии программы и его, естественно, буду вычищать.
|
|
|
|
|
Sep 14 2012, 09:32
|

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

|
Цитата(D_K_ @ Sep 14 2012, 13:21)  Описаны только адреса обработчика ресета и прерывания по приёму данных. Или я не прав? Внесите, пожалуйста, ясность. Но в любом случае это кусок кода - мусор оставшийся от предыдущей версии программы и его, естественно, буду вычищать. Ага, всё, что не задано, остаётся нетронутым (0xFFFF), поэтому, если не стоит цели выжать лишние байты памяти программ из таблицы векторов прерываний, лично я заполняю неиспользованные переходы командами RETI, а можно, например, зажигать лампочку. Таймер запущен, разрешены прерывания по переполнению, разрешены прерывания - значит будет прерывание  Т.е. отсутствие команды перехода в зарезервированном месте вовсе не запрещает соответствующее прерывание.
|
|
|
|
|
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
|
|
|
|
Сообщений в этой теме
D_K_ Связь между двумя mega48 по UART Sep 13 2012, 06:52 mempfis_ КодКварцевый резонатро не использую Фьюзы в обоих ... Sep 13 2012, 07:23 D_K_ Цитата(mempfis_ @ Sep 13 2012, 10:23) Код... Sep 13 2012, 08:13  mempfis_ Цитата(D_K_ @ Sep 13 2012, 11:13) Есть ка... Sep 13 2012, 08:41   D_K_ ЦитатаP.S. Ещё пару вопросов - Вы настроили стек? ... Sep 13 2012, 11:07 kovigor Цитата(D_K_ @ Sep 13 2012, 09:52) Кварцев... Sep 13 2012, 12:37 D_K_ Цитата(kovigor @ Sep 13 2012, 15:37) UART... Sep 13 2012, 13:22  kovigor Цитата(D_K_ @ Sep 13 2012, 16:22) Спасибо... Sep 13 2012, 14:46 ILYAUL Что-то я так и не увидел , где это SLAVE разрешили... Sep 13 2012, 13:56 D_K_ Цитата(ILYAUL @ Sep 13 2012, 16:56) Что-т... Sep 13 2012, 20:40 D_K_ Каюсь....Грешен... Выше прокричал на весь мир о то... Sep 14 2012, 06:10 RabidRabbit ldi temp,$4
sts tccr1b,temp
ldi temp,$1
... Sep 14 2012, 06:27 kostyaims В SLAVE объявляю прерывание по приёму
.equ URXCad... Sep 15 2012, 17:01 _Артём_ Цитата(kostyaims @ Sep 15 2012, 20:01) Вс... Sep 15 2012, 17:38 ILYAUL КодUSART_Receive:
если работаете по прерыванию... Sep 15 2012, 17:02 ILYAUL В том-то и дело , что kostyaims переписал пост1. ... Sep 15 2012, 17:49 _Артём_ Цитата(ILYAUL @ Sep 15 2012, 20:49) Кстат... Sep 15 2012, 19:02
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0
|
|
|