Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 05.11.2009, 15:42  
Archer07
Прописка
 
Регистрация: 25.03.2009
Сообщений: 137
Сказал спасибо: 22
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
Archer07 на пути к лучшему
По умолчанию Странность с 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.

Мне кажется данная проблема как то связана с согласованием частот передатчика и приемника... Как именно хотел спросить...
Миниатюры:
Нажмите на изображение для увеличения
Название: 01.JPG
Просмотров: 80
Размер:	103.5 Кб
ID:	1786  
Реклама:

Последний раз редактировалось Archer07; 05.11.2009 в 17:38.
Archer07 вне форума  
Непрочитано 05.11.2009, 17:24  
niXto
Почётный гражданин KAZUS.RU
 
Аватар для niXto
 
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
niXto на пути к лучшему
По умолчанию Re: Странность с USART в ATMega16

12 - это в десятичном виде, в чип надо писать 0х0С

и отключите фуз CKDIV8
niXto вне форума  
Непрочитано 05.11.2009, 17:33  
Archer07
Прописка
 
Регистрация: 25.03.2009
Сообщений: 137
Сказал спасибо: 22
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
Archer07 на пути к лучшему
По умолчанию Re: Странность с USART в ATMega16

Устройство работает от кварца 2 MHz извините, не написал сразу...
а на счет:
Цитата:
12 - это в десятичном виде, в чип надо писать 0х0С
и так и так пробовал...Ему видимо все равно.
Archer07 вне форума  
Непрочитано 05.11.2009, 18:33  
kison
Почётный гражданин KAZUS.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: Странность с USART в ATMega16

Попробуйте локализовать проблему.
Выведите не данные с АЦП, а что нибудь типа ""ABCD"
А вообще по симптомам похоже что контроллер работает не от 2-х мегагерцового кварца, а от внутреннего генератора на 1МГц
Можете попробовать UBRR = 6;
И
Код:
  ;Устанавливаем преобразование по прерыванию от Timer0
      outi   SFIOR,0x80;0b10000000
лишнее - Вы в прерывании все равно АЦП руками запускаете.
kison вне форума  
Непрочитано 05.11.2009, 19:59  
Archer07
Прописка
 
Регистрация: 25.03.2009
Сообщений: 137
Сказал спасибо: 22
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
Archer07 на пути к лучшему
По умолчанию Re: Странность с USART в ATMega16

ДА!Вы абсолютно правы, почему сам не догадался не понимаю...Мало опыта...
Все фузы на кварц перешил, все заработало.
Спасибо Вам огромное
Archer07 вне форума  
Непрочитано 05.11.2009, 20:27  
baiderin
Почётный гражданин KAZUS.RU
 
Аватар для baiderin
 
Регистрация: 10.12.2007
Адрес: Екатеринбург
Сообщений: 2,727
Сказал спасибо: 2,428
Сказали Спасибо 893 раз(а) в 580 сообщении(ях)
baiderin на пути к лучшему
По умолчанию Re: Странность с USART в ATMega16

Вчера полдня убил на эти-же грабли,хотя наделал уже не один десяток проектов на всевозможных процессорах.
Так что не удивляйтесь.
baiderin вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
прерывания usart в avr studio 4.13 zubr_ Микроконтроллеры, АЦП, память и т.д 6 14.10.2009 18:33
Проблема при запуске Atmega16 zamsv Микроконтроллеры, АЦП, память и т.д 5 02.10.2009 12:52


Часовой пояс GMT +4, время: 20:12.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot