реклама на сайте
подробности

 
 
> Работа АЦП, не работает :)
L-P
сообщение Oct 30 2005, 11:42
Сообщение #1





Группа: Новичок
Сообщений: 4
Регистрация: 30-10-05
Пользователь №: 10 295



Здравствуйте. Не удается заставить работать такую программу:
(При нажатии 2-й кнопки на STK500 содержимое ADCH/L должно выводиться на диоды, с интервалом ~1cек.)
Код
.include "m8535def.inc"

.org 0
    rjmp    RESET

.org ADCCaddr
    rjmp    interrupt    

.MACRO    output
    com    @1
    out @0, @1
    com @1
.ENDMACRO

RESET:
    ldi r16,low(RAMEND)    
    out SPL,r16
    ldi r16,high(RAMEND)
    out SPH,r16

    rcall    init_ports
    rcall    init_adc
    
    sei
MAIN:    
    rjmp MAIN
    
pdelay:        

pdelay1:
    ldi r17, 100
pdelay2:
    ldi r18, 100
pdelay3:
    dec r18
    brne pdelay3
    dec r17
    brne pdelay2
    dec r19
    brne pdelay1
    ret
    
init_adc:
    push    r16
    ldi  r16, (1 << ADEN)|(1 << ADIE)|(1 << ADFR)|(1 << ADPS0)|(1 << ADPS2)
    out  ADCSRA, r16
    ldi  r16, 2
    out  ADMUX, r16
    sbi  ADCSRA, ADSC
    pop  r16
    ret
    
init_ports:
    ldi  r16, 0xFF
    out  DDRB, r16

    clr  r16
    out  DDRA, r16
    out  PORTA, r16
    ret
    
interrupt:
    in  r20, ADCL
    in  r21, ADCH
    
    output    PORTB, r20
    rcall pdelay
    output    PORTB, r21
    rcall pdelay
    ret

При запуске сначала загораются все 8 диодов, а затем через ~1 сек младшие два, которые так и застывают и при нажатии кнопок ничего не меняется.
Помогите разобраться в чем здесь проблема. Заранее спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
L-P
сообщение Nov 4 2005, 14:01
Сообщение #2





Группа: Новичок
Сообщений: 4
Регистрация: 30-10-05
Пользователь №: 10 295



Огромное спасибо за ответы, у меня закончился траффик, поэтому не смог сразу ответить.

Вот программа, слегка переделанная, но в сущности осталась как и была.
Код
.include "m8535def.inc"

.org 0
    rjmp    RESET

.org ADCCaddr
    rjmp    interrupt    

.MACRO    output
    com    @1
    out @0, @1
    com @1
.ENDMACRO

RESET:
    ldi r16,low(RAMEND)    
    out SPL,r16
    ldi r16,high(RAMEND)
    out SPH,r16

    ldi  r16, 7    ;ADC7 - вход АЦП.
    out  ADMUX, r16
;запуск преобразования в цикл. режиме, разрешение прерывания.
    ldi  r16, (1 << ADEN)|(1 << ADIE)|(1 << ADSC)|(1 << ADFR);|(1 << ADPS0)|(1 << ADPS2)
    out  ADCSRA, r16

    ldi  r16, 0xFF
    out  DDRB, r16;порт B на вывод

    clr  r16
    out  DDRA, r16
    out  PORTA, r16
    
    sei
MAIN:    
    rjmp MAIN
    
interrupt:  ;обработчик прерывания
    in  r20, ADCL
    in  r21, ADCH
    
    andi    r21, 0x03
    
    output    PORTB, r20
    rcall delay
    output    PORTB, r21
    rcall delay
    reti
    
delay:      ;подпрограмма задержки    

delay1:
    ldi r17, 100
delay2:
    ldi r18, 100
delay3:
    dec r18
    brne delay3
    dec r17
    brne delay2
    dec r19
    brne delay1
    ret

При запуске начинают мигать сначала все 8 диодов, а затем младшие два, с интервалом пару секунд. Что свидетельствует, о том, что из ADCL/ADCH извлекаются только единицы, а ведь должны быть нули, как я понимаю? Ведь на вход не поступает напряжение. Затем при нажатии на 7-ю кнопку, начинают мигать младшие три диода - т.е. в регистре ADCH - нули, а в ADCL - 0x07. Пожалуйста объясните мне почему так происходит?

Цитата
Код вполне рабочий (если ret в конце заменить на reti).
Попробовал толко что, правда не мега, а AT90S8535.
(Я тоже начинающий и играюсь сейчас с АЦП).
Мигает и правильно показывает,
(толко конечно не от нажатия кнопочки, а сам по себе, так как
кнопка в коде не упомянута).
Скорее всего проблема не в коде.
Например внешнее опорное напряжение равно нулю.
Или на измерительном входе напряжение не меняется.
Или, что нибудь напутано в фузах.

Спасибо, за внимание к моей проблеме. Проблема в том, что я слаб в
схемотехнике. Насчет опорного напряжения: наверное, оно действительно
равно нулю, потому что я никаких ИОНов не подключал. Я пробовал использовать внутр. ИОН загрузив в ADMUX 0xC7 вместо 0x07, но ничего не изменилось.

Буду признателен если объясните мне как правильно нужно измерять напряжение, - как подключить внешний ИОН (и где его брать smile.gif ) или можно обойтись внутр. ИОНом? И как правильно подавать напряжение на вход АЦП, что для этого нужно, подойдут ли для этого кнопки?

В понедельник мне нужно уже продемонстрировать работающую программу преподу. sad.gif Заранее, спасибо.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 06:23
Рейтинг@Mail.ru


Страница сгенерированна за 0.01379 секунд с 7
ELECTRONIX ©2004-2016