Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
01.07.2009, 20:24
|
#1
|
Прописка
Регистрация: 25.03.2009
Сообщений: 137
Сказал спасибо: 22
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Проблема с USART AVR mega169
Подскажите пожалуйста,можно ли мне в обработчике прерывания от АЦП поместить следующий код:
USART_Transmit:
; sbis UCSRA,UDRE,заменил эту команду на комбинацию двух нижних,не нашел команду для работы с регистрами из SRAM.
lds r16,UCSRA
sbrs r16,UDRE
rjmp USART_Transmit
;Все нормально?тогда складываем r17 в UDR,они улетают в порт.
sts UDR,r17
ret
Возможно ли подобное изощрение?мне и самому ясно,что я потеряю в этом случае большую часть прерываний.
И еще вопрос.Я работаю на mega169,в даташите есть таблицы частот для делителя USART,минимальная частота кварца 1MHz,а у меня 32kHz,что мне ложить в регистры UBRRH,UBRRL чтобы получить скорость 9600бод,какая формула для вычисления,подскажите если не затруднит..
;кварц 32kHz
.include "m169def.inc"
;-----------
.cseg
.org 0
rjmp _RESET
.org ADCCaddr
rjmp _ADC_COMPL
;---------------------
.org INT_VECTORS_SIZE
_RESET:
ldi r16,High(RAMEND)
out SPH,r16
ldi r16,Low(RAMEND)
out SPL,r16
;-----------Uart unit
; Set baud rate
ldi r16,1
ldi r17,0
sts UBRRH, r17
sts UBRRL, r16
; разрешаем прием-передачу.
ldi r16, (1‹‹RXEN)|(1‹‹TXEN)
sts UCSRB,r16
ldi r16,(1‹‹U2X)
sts UCSRA,r16
ldi r16, (1‹‹USBS)|(3‹‹UCSZ0)
sts UCSRC,r16
;-----------
........тут настраиваются каналы АЦП
........И запускается первое преобразование(спасибо человеку с форума,которые нашел ошибку у меня,эта редакция кода его)
sei
;-----------
_MAIN:
rjmp _MAIN
;-----------
_ADC_COMPL:;Обработчик АЦП преобразование завершено
lds r17,ADCL
lds r17,ADCH
;-----------Send on PC(USART)
USART_Transmit:
; sbis UCSRA,UDRE,заменил эту команду на комбинацию двух нижних
lds r16,UCSRA
sbrs r16,UDRE
rjmp USART_Transmit
; Put data (r16) into buffer, sends the data
sts UDR,r17
ret
;-----------Completed
lds r16,ADCSRA;Запускаем очередное преобразование
sbr r16,(1‹‹ADSC)
sts ADCSRA,r16
reti
|
|
|
|
02.07.2009, 08:42
|
#2
|
Прописка
Регистрация: 24.09.2008
Сообщений: 116
Сказал спасибо: 0
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
И так, продолжение...
Цитата:
|
И еще вопрос.Я работаю на mega169,в даташите есть таблицы частот для делителя USART,минимальная частота кварца 1MHz,а у меня 32kHz,что мне ложить в регистры UBRRH,UBRRL чтобы получить скорость 9600бод,какая формула для вычисления,подскажите если не затруднит.
|
Скорость UART (условно BPS), UBRR и тактовая частота МК (условно Fmcu) относятся к друг другу след. образом:
Код:
|
для стандартной скорости - UCSR0A.U2X0=0
; BPS = Fmcu/(16*(UBRR+1))
; UBRR = Fmcu/(16*BPS)-1
; Fmcu = BPS*16*(UBRR+1)
для двойной скорости - UCSR0A.U2X0=1
; BPS = Fmcu/(8*(UBRR+1))
; UBRR = Fmcu/(8*BPS)-1
; Fmcu = BPS*8*(UBRR+1) |
Из формул видно, что для получения скорости BPS=9600 при UBRR=0 даже на удвоеной скорости, тактовая частота должна буть минимум Fmcu=9600*8=76800.
В Вашем случае на 32кГц (предпологаю 3276 максимальная скорость BPS=32768/8=4096, что ниже требуемой в 2 с лишнем раза!
В этом случае есть несколько выходов: снизить скорость UARTа до ближайщей меньшей стандартной скорости, или увеличить тактовую частоту с применением другого кварца или другой тактовой частоты внутренего RC или внешнего генератора. Во втором случае обратить внимание на тактирование ADC и пересчитать делитель (ADCSRA.ADPSx)...
Цитата:
|
USART_Transmit:
lds r16,UCSR0A
sbrs r16,UDRE0
rjmp USART_Transmit
sts UDR0,r17
ret
|
Нормальный код, но вы его используете несколько некоректно, а проще сказать не правильно!
В обработчике ADC вы должны делать либо вызов этой процедуры командой rcall, или используя этот код не использовать возврат ret.
P.S. To be continued...
__________________
Если мы вам не подходим, вы нам вовсе не нужны!
Услышал и забыл, увидел и запомнил, сделал и понял!
Нейрон - штука тонкая!
Чудес на свете не бывает!
|
|
|
|
02.07.2009, 08:53
|
#3
|
Вид на жительство
Регистрация: 26.07.2007
Сообщений: 483
Сказал спасибо: 18
Сказали Спасибо 107 раз(а) в 68 сообщении(ях)
|
Насчет 32к как я понял это 32768? У Атмелов есть асинхронный режим работы. Сам контроллер тактируете частотой от внутреннего RC либо от внешнего кристалла, если такое позволяет корпус - более оного кристалла. Настраиваете соответствующий таймер для работы в асинхронном режиме с тактированием от 32768 герц и получаете асинхронное прерывание. Для работы с USART будет лучьше если вы воспользуетесь флагами и будете решать задачу в основном потоке (главная функция) либо настроив USART в асинхронном режиме и передавать данные по прерыванию UDR ( если память не изменяет).
Также следует заметить в веду архитектуры ATMega находясь в прерывании вы не можите обработать другое прерывание пока не выйдете из текущего...
|
|
|
|
02.07.2009, 09:28
|
#4
|
Гражданин KAZUS.RU
Регистрация: 08.07.2006
Сообщений: 886
Сказал спасибо: 119
Сказали Спасибо 1,110 раз(а) в 177 сообщении(ях)
|
Цитата:
|
Также следует заметить в веду архитектуры ATMega находясь в прерывании вы не можите обработать другое прерывание пока не выйдете из текущего...
|
Да с чего вы взяли, запросто. Просто если разрешить прерывания в самом начале обработчика прерываний, то обработаете другие с успехом.
|
|
|
|
02.07.2009, 09:53
|
#5
|
Вид на жительство
Регистрация: 26.07.2007
Сообщений: 483
Сказал спасибо: 18
Сказали Спасибо 107 раз(а) в 68 сообщении(ях)
|
Сообщение от alexgap
|
Да с чего вы взяли, запросто. Просто если разрешить прерывания в самом начале обработчика прерываний, то обработаете другие с успехом.
|
Хм, во всяком случае так говорилось в каком-то документе. Надо будет попробовать, хотя трудно сказать насколько это применимо, это может привезти к появлению кучи проблем, хотя - "не знаю - не пробовал"
|
|
|
|
02.07.2009, 11:59
|
#6
|
Почётный гражданин KAZUS.RU
Регистрация: 08.10.2007
Сообщений: 2,760
Сказал спасибо: 1,105
Сказали Спасибо 1,037 раз(а) в 569 сообщении(ях)
|
Сообщение от nerozero
|
Сообщение от alexgap
|
Да с чего вы взяли, запросто. Просто если разрешить прерывания в самом начале обработчика прерываний, то обработаете другие с успехом.
|
Хм, во всяком случае так говорилось в каком-то документе. Надо будет попробовать, хотя трудно сказать насколько это применимо, это может привезти к появлению кучи проблем, хотя - "не знаю - не пробовал"
|
Чего там пробовать, на ассемблере можно всё. При входе в прерывание да, остальные запрещаются. Но можно их разрешить, имея в перспективе геморрой с ret/reti. Или не разрешать, а опрашивать флаг другого прерывания, обработать его и сбросить.
А вообще-то в прерывании нужно установить флаг и быстренько выйти. Потом на тот флаг смотреть в основном цикле. Больно и страшно бывает видеть delay_ms(100) внутри прерывания!
|
|
|
|
02.07.2009, 12:25
|
#7
|
Вид на жительство
Регистрация: 26.07.2007
Сообщений: 483
Сказал спасибо: 18
Сказали Спасибо 107 раз(а) в 68 сообщении(ях)
|
Сообщение от makakus
|
Больно и страшно бывает видеть delay_ms(100) внутри прерывания!
|
Не пугайте так
|
|
|
|
02.07.2009, 13:22
|
#8
|
Прописка
Регистрация: 25.03.2009
Сообщений: 137
Сказал спасибо: 22
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
У меня AVR BUTTERFLY(mega169) демонстрационная отладочная плата,там кварц,LCD,Джойстик,все встроенное.И нет никакой внешней задающие RC-цепи.Кроме кварца нет ничего!Но я точно знаю,что связь организовать на 9600 бодах возможно.
Оригинальная прошивка на нее имеет возможность измерять температуру,проигрывать мелодии,...и отправлять данные в com-порт.
Подскажите пожалуйста способ организовать связь.
|
|
|
|
02.07.2009, 13:51
|
#9
|
Прописка
Регистрация: 24.09.2008
Сообщений: 116
Сказал спасибо: 0
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Такой девайс что-ли?
-- Прилагается рисунок: --
__________________
Если мы вам не подходим, вы нам вовсе не нужны!
Услышал и забыл, увидел и запомнил, сделал и понял!
Нейрон - штука тонкая!
Чудес на свете не бывает!
|
|
|
|
02.07.2009, 14:07
|
#10
|
Прописка
Регистрация: 25.03.2009
Сообщений: 137
Сказал спасибо: 22
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
На плате установлен кварц вот этот медленный на 32kHz
и еще есть встроенный,на 1MHz.Я еще раз все перечитаю и попробую тогда разобраться..Внешний подключен к XTAL1 и XTAL2.Больше ничего не знаю.Буду читать.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
USART AVR MODBUS
|
ua_gruzin |
Микроконтроллеры, АЦП, память и т.д |
9 |
22.04.2012 00:00 |
Настройка USART AVR на DMX512
|
anton_avr |
Микроконтроллеры, АЦП, память и т.д |
1 |
16.07.2009 13:13 |
Проблема с USART в Atmega8
|
tvilsa |
Микроконтроллеры, АЦП, память и т.д |
21 |
14.01.2009 16:27 |
Регистры r0-r15 у mega169
|
myxan |
Микроконтроллеры, АЦП, память и т.д |
17 |
17.12.2008 13:30 |
Проблема с USART в ATTiny2313
|
Фокс |
Микроконтроллеры, АЦП, память и т.д |
4 |
09.04.2005 20:02 |
Часовой пояс GMT +4, время: 16:24.
|
|