Собрал простейшую схему на 2ух ATmega48 один передает, другой принимает днные по UART. Алгоритм принимающей микросхемы построен по принципу: принял данные установил на выходе 1,пауза в 1мкс, сбросил на выходе. Частота передаваемых данных по UART 20мс. НО! Микросхеммы - приемник работает не правильно: приняла данные, установила бит на выходе,пауза,сбросила бит,установила бит,пауза,сбросила бит.
Листинг прерывания принятого по UART:
UART_RXC:
sts RamTemp1,rTemp1
in rSreg,SREG
cbr rSTATUS,1<<IndEnd
lds rTemp1,UCSR0A
cbr rTemp1,1<<RXC0
sts UCSR0A,rTemp1
lds rTemp1,RamTemp1
out SREG,rSreg
reti
Кусок программы по обработе данных:
;инициализация и настройка
Programma:
sbrc rSTATUS,IndEnd
rjmp Programma
sbi PORTD,7
nop
nop
nop
nop
nop
nop
nop
nop
cbi PORTD,7
sbr rSTATUS,1<<IndEnd
rjmp Programma
В чем загвоздка подскажите.
Данные по UART приходят 1 раз в 20мс -я проверял по осцилографу.
Проблемма с работой USART у ATMEGA48
Re: Проблемма с работой USART у ATMEGA48
jtlex писал(а):Собрал простейшую схему на 2ух ATmega48 один передает, ......
НО! Микросхеммы - приемник работает не правильно: приняла данные, установила бит на выходе,пауза,сбросила бит,установила бит,пауза,сбросила бит.
Листинг прерывания принятого по UART:
UART_RXC:
sts RamTemp1,rTemp1
in rSreg,SREG
cbr rSTATUS,1<<IndEnd
lds rTemp1,UCSR0A
cbr rTemp1,1<<RXC0
sts UCSR0A,rTemp1
lds rTemp1,RamTemp1
out SREG,rSreg
reti
Кусок программы по обработе данных:
;инициализация и настройка
.......
В чем загвоздка подскажите.
Данные по UART приходят 1 раз в 20мс -я проверял по осцилографу.
загвоздка скорее всего в том, что в прерывании по приему байта у вас не сбрасывается флаг RXC0 - посмотрите даташит, для того чтобы этот флаг сбросился необходимо прочитать регистр UDR0. иначе никак.
из-за того, что у вас не сбрасывается этот флаг прерывание вызывается повторно соответственно остальные проблемы по той-же причине
З. Ы. Поправлю ответ как скачается даташит на МЕГУ48, пока под рукой нет.
Боюсь показаться занудой, но желатьно использовать теги code для оформления фрагментов кода
Добавлено позже
Собственно вот отрывок из ДШ про прием байта
19.7.3 Receive Compete Flag and Interrupt
The Receive Complete (RXCn) Flag indicates if there are unread data present in the receive buffer. This flag is one when unread data exist in the receive buffer, and zero when the receive buffer is empty (i.e., does not contain any unread data). If the Receiver is disabled (RXENn = 0), the receive buffer will be flushed and consequently the RXCn bit will become zero.
When the Receive Complete Interrupt Enable (RXCIEn) in UCSRnB is set, the USART Receive Complete interrupt will be executed as long as the RXCn Flag is set (provided that global interrupts are enabled). When interrupt-driven data reception is used, the receive complete routine must read the received data from UDRn in order to clear the RXCn Flag, otherwise a new interrupt will occur once the interrupt routine terminates.