Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
26.06.2009, 15:42
|
|
Прописка
Регистрация: 25.03.2009
Сообщений: 137
Сказал спасибо: 22
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Помогите разобраться с АЦП (встроенный atmega169)
Вот ниже код программы,ошибка возникает при обращении к ADMUX:
out ADMUX,r16
и точно такая же здесь:
out ADCSRA,r16
в файле m169def.inc,написано,что эти регистры расширенные порты ввода-вывода и не могут использоваться с IN/OUT инструкциями.
; Definitions marked "MEMORY MAPPED"are extended I/O ports
; and cannot be used with IN/OUT instructions
Как мне записать константу в порт ADCSRA,чтобы запустить АЦП?
.include "m169def.inc"
;Кварц 32kHz
;ATMEGA169
jmp RESET ; Reset Handler
reti ; IRQ0 Handler
reti ; PCINT0 Handler
reti ; PCINT0 Handler
reti ; Timer2 Compare Handler
reti ; Timer2 Overflow Handler
reti ; Timer1 Capture Handler
reti ; Timer1 CompareA Handler
reti ; Timer1 CompareB Handler
reti ; Timer1 Overflow Handler
reti ; Timer0 Compare Handler
reti ; Timer0 Overflow Handler
reti ; SPI Transfer Complete Handler
reti ; USART RX Complete Handler
reti ; USART,UDR Empty Handler
reti ; USART TX Complete Handler
reti ; USI Start Condition Handler
reti ; USI Overflow Handler
reti ; Analog Comparator Handler
jmp ADC_COMP; ADC Conversion Complete Handler
reti ; EEPROM Ready Handler
reti ; SPM Ready Handler
reti ; LCD Start of Frame Handler
;
RESET:
ldi r16, high(RAMEND); Main program start
out SPH,r16
ldi r16, low(RAMEND)
out SPL,r16
ldi r16,0b01100001 ;канал PF0
out ADMUX,r16
ldi r16,(1‹‹ADEN)|(1‹‹ADSC)|(1‹‹ADPS0)
out ADCSRA,r16 ;Запускаю единичное преобразование
sei
loop:jmp loop ;жду прерывания от АЦП
ADC_COMP:
in r17,ADCH ;Считываю результат в переменную,
ldi r16,(1‹‹ADEN)|(1‹‹ADSC)|(1‹‹ADPS0)
out ADCSRA,r16 ;запускаем очередное преобразование
reti
|
|
|
|
27.06.2009, 13:43
|
|
Прописка
Регистрация: 24.09.2008
Сообщений: 116
Сказал спасибо: 0
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
1. Для обращения к "расширенной области I/O" нужно пользовать инструкции lds/sts(или ld/ldd/st/std через индексные регистры X, Y, Z) вместо in/out, т.к. это адресное поле SRAM.
2. Повнимательнее посмотрите на флаги, у Вас не установлен флаг разрешения прерывания ADCSRA.ADIE, и прерывание ADC "игнорируется".
3. Чтение результата измерение у Вас осуществляется из "старшего" байта - это не верно! Нужно читать младший, а затем старший.
P.S. Ознакомтесь подробние с описанием обращения к регистрам.
__________________
Если мы вам не подходим, вы нам вовсе не нужны!
Услышал и забыл, увидел и запомнил, сделал и понял!
Нейрон - штука тонкая!
Чудес на свете не бывает!
|
|
|
|
27.06.2009, 16:35
|
|
Прописка
Регистрация: 25.03.2009
Сообщений: 137
Сказал спасибо: 22
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
да,спасибо,точно,команды заменил,обращение стало происходить...
Но АЦП все равно ничего не преобразует или преобразует,но я не могу понять как...
Флаг от компаратора установил(ADIE)
решил поместить в обработчик прерывания от АЦП
такие инструкции чтобы увидеть результат преобразования
Обработчик прерыв. от АЦП:
ADC_COMP:
lds r17,ADCH;ADLAR установлен,можно читать ADCH
out PortB,r17 ;Что я не правильно сделал,почему PORTB пуст?
ldi r16,0b01100001
sts ADMUX,r16
ldi r16,0b11001001
sts ADCSRA,r16
reti
Подскажите пожалуйста,как добиться того,чтобы результат преобразования после каждого преобразования оставался в r17?Может использовать
сохранение результата в стэк внутри обработчика?
ADC_COMP:
...
push r17
..
reti
где то в главной части программы:
pop r17?
.include "m169def.inc"
;Кварц 32kHz
;ATMEGA169
таблица векторов
;
RESET:
ldi r16, high(RAMEND); Main program start
out SPH,r16
ldi r16, low(RAMEND)
out SPL,r16
ldi r16,$ff
out DDRB,r16
ldi r16,$ff
out PortB,r16
ldi r16,0b01100001;ADLAR установлен,можно читать ADCH
sts ADMUX,r16
ldi r16,0b11001001
sts ADCSRA,r16
sei
loop:jmp loop
ADC_COMP:
lds r17,ADCH
out PortB,r17 ;в PortB ничего нет
ldi r16,0b01100001
sts ADMUX,r16
ldi r16,0b11001001
sts ADCSRA,r16
reti
|
|
|
|
27.06.2009, 20:27
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,559
Сказал спасибо: 76
Сказали Спасибо 326 раз(а) в 230 сообщении(ях)
|
Советую писать на Си - это гораздо продуктивней.
Вот про АЦП в AVR задача-упражнение с краткой теорией
http://avr123.nm.ru/z11.htm
__________________
Обучалка AVR PIC ARM начинающим программирование курс самоучитель шаг за шагом с нуля, CVAVR, PROTEUS, MPLAB, WinAVR, IAR, KEIL электроника - http://proavr.narod.ru
|
|
|
|
28.06.2009, 12:55
|
|
Прописка
Регистрация: 24.09.2008
Сообщений: 116
Сказал спасибо: 0
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
У Вас есть "противоречия" в коде!
На мой взгляд, для примера, можно использовать след. код:
Код:
|
.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
; Vref=VCC, Left, ADC0
ldi r16, (0‹‹REFS1)|(1‹‹REFS0)|(1‹‹ADLAR)|(0‹‹MUX4)|(0‹‹MUX3)|(0‹‹MUX2)|(0‹‹MUX1)|(0‹‹MUX0)
sts ADMUX, r16
; Enab ADC, Manual, Int Enab, F/2
ldi r16, (1‹‹ADEN)|(0‹‹ADATE)|(1‹‹ADIE)|(0‹‹ADPS2)|(0‹‹ADPS1)|(1‹‹ADPS0)
sts ADCSRA, r16
ser r16
out DDRB, r16
lds r16, ADCSRA
sbr r16, (1‹‹ADSC)
sts ADCSRA, r16
sei
;-----------
_MAIN:
rjmp _MAIN
;-----------
_ADC_COMPL:
lds r17, ADCL
lds r17, ADCH
out PORTB, r17
lds r16, ADCSRA
sbr r16, (1‹‹ADSC)
sts ADCSRA, r16
reti |
P.S.
Цитата:
|
Советую писать на Си - это гораздо продуктивней
|
Весьма спорный вопрос!!! Сравните размер конечного HEX-са это примера и такого-же написаного на Си!!!
__________________
Если мы вам не подходим, вы нам вовсе не нужны!
Услышал и забыл, увидел и запомнил, сделал и понял!
Нейрон - штука тонкая!
Чудес на свете не бывает!
|
|
|
|
01.07.2009, 10:54
|
|
Частый гость
Регистрация: 15.01.2008
Сообщений: 16
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Берите AlgorithmBuilder и пишите на нем! Гораздо продуктивнее ассемблера и даже Си, т.к. все метки переходов видны как на ладони. Пробовал все - AlgorithmBuilder заметно удобнее.
|
|
|
|
01.07.2009, 11:00
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,559
Сказал спасибо: 76
Сказали Спасибо 326 раз(а) в 230 сообщении(ях)
|
Только не Algorithm Builder.
__________________
Обучалка AVR PIC ARM начинающим программирование курс самоучитель шаг за шагом с нуля, CVAVR, PROTEUS, MPLAB, WinAVR, IAR, KEIL электроника - http://proavr.narod.ru
|
|
|
|
01.07.2009, 19:28
|
|
Прописка
Регистрация: 25.03.2009
Сообщений: 137
Сказал спасибо: 22
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Спасибо,большое за советы...Но мне больше нравится asm,я считаю что главное преимущество асма - то что ты РЕАЛЬНО понимаешь что происходит с железкой...
|
|
|
|
02.07.2009, 09:05
|
|
Частый гость
Регистрация: 15.01.2008
Сообщений: 16
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Сообщение от Archer07
|
Спасибо,большое за советы...Но мне больше нравится asm,я считаю что главное преимущество асма - то что ты РЕАЛЬНО понимаешь что происходит с железкой...
|
Придерживаюсь того же мнения. Причем в Билдере ничто не мешает продолжать писать на уровне ассемблера. Главное что все метки переходов видны сразу же и не паришься при отладке. А вообще каждый пишет на чем хочет, главное чтобы результат бесглючный был...
|
|
|
|
02.07.2009, 09:18
|
|
Частый гость
Регистрация: 15.01.2008
Сообщений: 16
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Сообщение от Archer07
|
да,спасибо,точно,команды заменил,обращение стало происходить...
Но АЦП все равно ничего не преобразует или преобразует,но я не могу понять как...
Флаг от компаратора установил(ADIE)
решил поместить в обработчик прерывания от АЦП
такие инструкции чтобы увидеть результат преобразования
Обработчик прерыв. от АЦП:
ADC_COMP:
lds r17,ADCH;ADLAR установлен,можно читать ADCH
out PortB,r17 ;Что я не правильно сделал,почему PORTB пуст?
ldi r16,0b01100001
sts ADMUX,r16
ldi r16,0b11001001
sts ADCSRA,r16
reti
Подскажите пожалуйста,как добиться того,чтобы результат преобразования после каждого преобразования оставался в r17?Может использовать
сохранение результата в стэк внутри обработчика?
ADC_COMP:
...
push r17
..
reti
где то в главной части программы:
pop r17?
.include "m169def.inc"
;Кварц 32kHz
;ATMEGA169
таблица векторов
;
RESET:
ldi r16, high(RAMEND); Main program start
out SPH,r16
ldi r16, low(RAMEND)
out SPL,r16
ldi r16,$ff
out DDRB,r16
ldi r16,$ff
out PortB,r16
ldi r16,0b01100001;ADLAR установлен,можно читать ADCH
sts ADMUX,r16
ldi r16,0b11001001
sts ADCSRA,r16
sei
loop:jmp loop
ADC_COMP:
lds r17,ADCH
out PortB,r17 ;в PortB ничего нет
ldi r16,0b01100001
sts ADMUX,r16
ldi r16,0b11001001
sts ADCSRA,r16
reti
|
А линия порта, по которой идет преобразование установлена в 0 (cbi PORTA.0)? Т.е. снять подтяжку порта, иначе будете считывать макс. значение АЦП. И вообще 32кГц маловато, могут идти мелкие ошибки АЦП:
By default, the successive approximation circuitry requires an input clock frequency
between 50 kHz and 200 kHz to get maximum resolution. If a lower resolution than
10 bits is needed, the input clock frequency to the ADC can be higher than 200 kHz to
get a higher sample rate.
The ADC module contains a prescaler, which generates an acceptable ADC clock frequency
from any CPU frequency above 100 kHz. The prescaling is set by the ADPS bits
in ADCSRA. The prescaler starts counting from the moment the ADC is switched on by
setting the ADEN bit in ADCSRA. The prescaler keeps running for as long as the ADEN
bit is set, and is continuously reset when ADEN is low.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 12:24.
|
|