Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
05.11.2009, 15:42
|
|
Прописка
Регистрация: 25.03.2009
Сообщений: 137
Сказал спасибо: 22
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Странность с USART в ATMega16
Привет всем!
Столкнулся с такой странностью в работе UART'а AVR'кого. Хотя скорее всего это я чего то неправильно делаю.
Программа работает не так, как надо.
Код программы написал ниже. Коротко опишу основную идею. Через определенный интервал времени происходит переполнение Timer0-счетчика, соответственно происходит прерывание, в обработчике этого прерывания запускаем АЦП в режиме одиночного преобразования, считываем только 8 старших бит результата из регистра ADCH, а дальше отправляем считанный байт в PORTC и в регистр UDR и он вроде должен попасть в комп без изменений!
Никаких управлений потоком нет..кадр 8бит, нет четности, 2 стоповых.
Устройство работает от кварца 2 MHz.
Код:
|
.include "m16def.inc"
.MACRO outi
LDI R16,@1
OUT @0,R16
.ENDM
.cseg
.org 0
rjmp _RESET
.org OVF0addr
rjmp _TOV0
.org INT_VECTORS_SIZE
_RESET:
ldi r16,High(RAMEND)
out SPH,r16
ldi r16,Low(RAMEND)
out SPL,r16
;ИНИЦИАЛИЗАЦИЯ USART
; Set baud rate
ldi r17,0
ldi r16,12 ;При частоте кварца 2MHz baudrate=9600
out UBRRH,r17
out UBRRL,r16
; Enable receiver and transmitter
ldi r16,(1‹‹RXEN)|(1‹‹TXEN)
out UCSRB,r16
; Set frame format: 8data, 2stop bit
ldi r16,(1‹‹URSEL)|(1‹‹USBS)|(3‹‹UCSZ0)
out UCSRC,r16
;Настраиваем Timer0
ldi r16,(1‹‹CS02)|(1‹‹CS00)
out TCCR0,r16 ; Timer clock = system clock / 1024
ldi r16,1‹‹TOV0
out TIFR,r16 ; Clear TOV0/ clear pending interrupts
ldi r16,1‹‹TOIE0
out TIMSK,r16 ; Enable Timer/Counter0 Overflow Interrupt
ser r16
out DDRB,r16 ; Set Port B as output
out DDRC,r16 ; Set Port B as output
;ИНИЦИАЛИЗАЦИЯ АЦП
;Vref=VCC, Left, ADC0
outi ADMUX,(0‹‹REFS1)|(1‹‹REFS0)|(1‹‹ADLAR)|(0‹‹MUX4)|(0‹‹MUX3)|(0‹‹MUX2)|(0‹‹MUX1)|(1‹‹MUX0)
;Устанавливаем преобразование по прерыванию от Timer0
outi SFIOR,0x80;0b10000000
;Enab ADC, Manual, Int Enab, F/16
outi ADCSRA,(1‹‹ADEN)|(1‹‹ADATE)|(0‹‹ADIE)|(1‹‹ADPS2)|(1‹‹ADPS1)|(1‹‹ADPS0)
in r16,ADCSRA
sbr r16,(1‹‹ADSC)
out ADCSRA,r16
sei
loop: jmp loop
_TOV0:
push r16
in r16,SREG
push r16
in r16,PORTB ; Read Port B
com r16 ; Invert bits of r16 register
out PORTB,r16 ; Write Port B
in r17,ADCL
in r17,ADCH
out PORTC,r17
USART_Transmit:
sbis UCSRA,UDRE
rjmp USART_Transmit
out UDR,r17
in r18,ADCSRA
sbr r18,(1‹‹ADSC)
out ADCSRA,r18
pop r16
out SREG,r16
pop r16
reti |
Но без изменений не получается. На рисунке ниже Вы можете видеть терминальную программу, которой я пользуюсь. Она принимает данные с устройства. Специально выводил вход АЦП в режим насыщения (левая горизонтальная линия) и наоборот садил землю (правая горизонтальная линия)
Я получаю байт, а 5 старших битов 1, только 3 изменяются...Причем эти 3 являются старшими для считанного байта, потому как малые изменения напряжения не изменяют их, а существенное изменение напряжения влияет на них. То есть фактически какое бы не было напряжение на входе АЦП, то результатом будет число не меньшее 248.
Мне кажется данная проблема как то связана с согласованием частот передатчика и приемника... Как именно хотел спросить...
Последний раз редактировалось Archer07; 05.11.2009 в 17:38.
|
|
|
|
05.11.2009, 17:24
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: Странность с USART в ATMega16
12 - это в десятичном виде, в чип надо писать 0х0С
и отключите фуз CKDIV8
|
|
|
|
05.11.2009, 17:33
|
|
Прописка
Регистрация: 25.03.2009
Сообщений: 137
Сказал спасибо: 22
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Re: Странность с USART в ATMega16
Устройство работает от кварца 2 MHz извините, не написал сразу...
а на счет:
Цитата:
|
12 - это в десятичном виде, в чип надо писать 0х0С
|
и так и так пробовал...Ему видимо все равно.
|
|
|
|
05.11.2009, 18:33
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: Странность с USART в ATMega16
Попробуйте локализовать проблему.
Выведите не данные с АЦП, а что нибудь типа ""ABCD"
А вообще по симптомам похоже что контроллер работает не от 2-х мегагерцового кварца, а от внутреннего генератора на 1МГц ![Улыбка](images/smilies/icon_smile.gif)
Можете попробовать UBRR = 6; ![Улыбка](images/smilies/icon_smile.gif)
И
Код:
|
;Устанавливаем преобразование по прерыванию от Timer0
outi SFIOR,0x80;0b10000000 |
лишнее - Вы в прерывании все равно АЦП руками запускаете.
|
|
|
|
05.11.2009, 19:59
|
|
Прописка
Регистрация: 25.03.2009
Сообщений: 137
Сказал спасибо: 22
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Re: Странность с USART в ATMega16
ДА!Вы абсолютно правы, почему сам не догадался не понимаю...Мало опыта...
Все фузы на кварц перешил, все заработало.
Спасибо Вам огромное
|
|
|
|
05.11.2009, 20:27
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.12.2007
Адрес: Екатеринбург
Сообщений: 2,727
Сказал спасибо: 2,428
Сказали Спасибо 893 раз(а) в 580 сообщении(ях)
|
Re: Странность с USART в ATMega16
Вчера полдня убил на эти-же грабли,хотя наделал уже не один десяток проектов на всевозможных процессорах.
Так что не удивляйтесь.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 20:12.
|
|