Например TDA7294

Форум РадиоКот :: Просмотр темы - ATxmega128A1: Имеет ли право на жизнь прог-ма
Форум РадиоКот
https://radiokot.ru/forum/

ATxmega128A1: Имеет ли право на жизнь прог-ма
https://radiokot.ru/forum/viewtopic.php?f=20&t=48500
Страница 1 из 1

Автор:  kitovnik [ Пт май 20, 2011 13:20:13 ]
Заголовок сообщения:  ATxmega128A1: Имеет ли право на жизнь прог-ма

Здравствуйте, уважаемые пользователи форума!

Имеется (в теории): ATxmega128A1, датчик давления в выходом на 0-5В, драйвер RS-232 (ADM202), Zigbee (AT86RF230).
Задача: Соединить это всё. Напряжение с датчика давления подаётся на АЦП в МК, с МК раздаётся на RS-232 и Zigbee.
Zigbee через SPI. RS-232 через USART и работает для прошивки МК.

Перелопатил мануалы. Вот что получилось.

.include "m128def.inc"
.org $0000
rjmp INIT ;Переход на секцию инициализации
.org $000E
rjmp ADC_Complete ;Прерывание от АЦП
.org $0030

;==================
;Обработчик прерывания:
ADC_Complete:
in r17,ADCH
reti

;==================

;Одна большая инициализация
INIT:
;Инициализация стека:
ldi r16,low(RAMEND)
out SPL,r16
ldi r16,high(RAMEND)
out SPH,r16


;Инициализация АЦП:
ldi r16,0x00
out admux,r16
ldi r16,0b10111110
out ADCSRA,r16


;Инициализация SPI как MASTER
SPI_MasterInit:
; Установка MOSI и SCK на вывод, все остальные на ввод
ldi r17,(1<<DDC5)|(1<<DDC7)
out DDRC,r17
; Разрешение SPI в режиме мастера, установка скорости связи fck/16
ldi r17,(1<<SPE)|(1<<MSTR)|(1<<SPR0)
out SPCR,r17
ret

;параметры скорости записаны в r16, r17

ldi r16, low(0x33)
ldi r17, high(0x33)


USART_Init:
; Установка скорости связи
out UBRRH, r17
out UBRRL, r16
; Разрешение работы приемника и передатчика
ldi r16, (1<<RXEN)|(1<<TXEN)
out UCSRB,r16
; Установка формата посылки: 8 бит данных, 2стоп-бита
ldi r16, (1<<USBS)|(3<<UCSZ0)
out UCSRC,r16
ret



proga:

USART_Transmit:
; Ожидание освобождения буфера передатчика
sbis UCSRA,UDRE
rjmp USART_Transmit
; Помещение данных (r17) в буфер, отправка данных
out UDR,r17
ret



USART_Receive:
; Ожидание окончания приема данных
sbis UCSRA, RXC
rjmp USART_Receive
; Загрузка принятых данных из буфера
in r16, UDR
ret



SPI_MasterTransmit:
; Запуск передачи данных (r16)
out SPDR,r17
Wait_Transmit:
; Ожидание завершения передачи данных
sbis SPSR,SPIF
rjmp Wait_Transmit
ret


rjmp proga


Будет ли правильно работать?

Заранее благодарю.

Автор:  Engineer_Keen [ Пт май 20, 2011 14:15:21 ]
Заголовок сообщения:  Re: ATxmega128A1: Имеет ли право на жизнь прог-ма

Не будет, без некоторых переделок.
1) Inc-файл от меги128, у вас Xmega, это совершенно разные контроллеры (честно говоря даже не знаю где взять инк от ИКС-меги)
2) По всему коду куча не нужных ret. Ret ставится в конце подпрограммы, а у вас они и в инициализации и в главном цикле. Впечатление, что куски надергали из разных примеров то ли невнимательно, то ли без понимания. Либо уберите, либо оформляйте эти блоки отдельными процедурами и вызывайте из основной программы через Rcall.
3) Прерывания (АЦП) не разрешены (нет SEI в инициализации).
4) В SPI точно не нужна линия CS? (посмотрел ДШ на RF230 - нужна, там называется SEL)
5) Исходя из логики программы (при условии, если бы она работала), получается что МК
- постоянно передает последнее значение АЦП в UART и SPI (USART_Transmit, SPI_MasterTransmit). Зачем постоянно передавать? АЦП сработало - передаем, потом ждем.
- постоянно принимает данные из UART и ничего с ними не делает(USART_Receive). Зачем? Если для будущих целей управления, то сделать по прерыванию.
6) Скорее всего ZigBee еще надо инициализировать какими-то настройками, ДШ влом подробно читать...

Главное решить с первым вопросом. В случае, если у вас все-таки просто MEGA, нужно просто обработать код напильником (кстати оформляйте вложением, раз он такой длинный). А если XMEGA, то не знаю, сам только описание мельком читал, но там и таблица прерываний другая и регистры по-другому называются.

Автор:  kitovnik [ Пн май 23, 2011 11:23:15 ]
Заголовок сообщения:  Re: ATxmega128A1: Имеет ли право на жизнь прог-ма

Ошибки усвоил. Только вот по поводу 5ого пункта есть вопросы: "АЦП сработало - передаем, потом ждем." и "Если для будущих целей управления, то сделать по прерыванию." как это организовать? моих знаний пока на это не хватает. Вчера поставил новую AVR Studio 5, там есть для Хмега inc-файл. Вся прога вообще никак не будет работать плоть до инициализации стека...буду искать другой попроще МК...

Автор:  Engineer_Keen [ Пн май 23, 2011 13:16:57 ]
Заголовок сообщения:  Re: ATxmega128A1: Имеет ли право на жизнь прог-ма

Мысль про МК попроще правильная, Xmega великовата для такой задачки.
Что касается 5-го пункта, там все просто. У вас уже имеется прерывание АЦП, вот в нем можно и сразу передавать полученное значение через UART и SPI. А если нужно управлять работой контроллера, то нужно написать обработчик прерывания по приходу байта по UART и блок анализа этого байта (или строки). Тогда основной цикл будет состоять из одной строчки.
Код:
proga: RJMP proga

Еще лучше будет, если использовать отдельный регистр с флагами, чтобы в самом обработчике не делать ничего громоздкого, только подготовительные операции и установка флага. Например:
Код:
ADC_Complete:
in r17,ADCH ;сохранить значение АЦП
SBR Flags,0x01 ;установить флаг готовности данных к передаче
reti
...
...
...
proga:
SBRC Flags,0 ;проверить флаг готовности к передаче
RJMP proga ;переход на начало, если флаг не установлен
RCALL USART_Transmit ;передать по UART
RCALL SPI_MasterTransmit ;и по SPI
CBR Flags,0x01 ;сбросить флаг

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/