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

 
 
> Снова АЦП
ILYAUL
сообщение Sep 21 2009, 17:53
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



ATmega164P. Отладчик AVRdragon и Studio Проблема в следующем ,при прогоне программы с подключённым макетом АЦП ведёт себя как ему и положено , но стоит запрограмировать микросхему и запустить в автономке АЦП просыпается только по прерыванию от таймера , в моем случае через секунду. FUSES выставлены - проблем я с ними не вижу. Ниже привожу код , может всё таки что-то упустил. Конечно многое отсёк оставив только относящееся к АЦП. HELP laughing.gif



Код
            ***********************
;           *                                     *
;           *                                     *
;           *     ATMega 164P             *
;           *                                     *
;           ***********************




.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m164pdef.inc"

.DEVICE ATmega164P

.org    ADCCaddr
    jmp ADC3  ; ADC Conversion Complete

        

; *****************************
; *                                               *
; *       Initialization АЦП          *
; *                                               *
; *                                               *
; *****************************


        ldi        temp,(1<<REFS0)|(1<<ADLAR)
        sts        ADMUX,temp     ; Внешнее напряжение AVcc, выравнивание влево
        ldi        temp,(1<<ADC0D)    ; Отключение цифрового контакта от
        sts        DIDR0,temp    ; PORTA pin0
        clr        temp
        sts        ADCSRB,temp
        ldi        temp,(1<<ADEN)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(0<<ADPS0)
        sts        ADCSRA,temp        ; |(0<<ADSC) Преобразование отключено
    ; АЦП вкл. Прерывание разрешено . Делитель на 64 = 187,5 Кгц частота
    ; преобразования



; *****************************
; *                                               *
; *  Подпрограмма обнаружения     *
; *                                               *
; *                                               *
; *****************************



TIM2COMPB:
        
        cli
        push        temp
        push        count
        in          temp,SREG
        push        temp
        ldi        Cnt0,Low(255); Инициализация счётчика преобразований        
        clr        rab    ; Очиска рабочих регистров
        clr        mean0
        clr        mean1
        clr         ZH                         
            clr         ZL
        cbi        PORTB,0
            
ADC1:
                                            

        ldi        temp,(1<<SE)|(1<<SM0)     ; Настройка режима "сна"
        out        SMCR,temp    ; Запись SMCR
        sei        
        sleep                                   ; Преобразование
        dec        Cnt0                ;
        brne        ADC1                ; Если не равно 255 - преобразование
        ldi        count,$08            ; Начинаем процедуру вычисления среднего
ADC5:        lsr        mean1                ; 255=2 в степени 8
        ror        mean0                ; сдвигаем регистры в право 8 раз
        dec        count
        brne        ADC5                ; Конец процедуры вычисления среднего
        
        
        ldi        temp,(0<<SE)|(1<<SM0); Выход из режима "сна"
        out        SMCR,temp    
        pop        temp
        out        SREG,temp                                            
        pop        count
        pop        temp
        sbi        PORTB,0
        sei
        rjmp    CHECK


; *****************************
; *                                               *
; *       Вычисление среднего          
; *                                               *
; *****************************


ADC3:    
        cli
        ldi        temp,(0<<SE)|(1<<SM0)    ; Выход из режима "сна"
        out        SMCR,temp            ; Запись SMCR
        lds        rab,ADCH            ; Считывание только старшего регистра
        clr         temp
        add        mean0,rab            ; Вычисление среднего
        adc        mean1,temp            ; Вычисление среднего
        ret

                
; *****************************
; *                                               *
; *      Таблица значений для ADC    
                                               *
; *****************************

tabADC:            .db        $00,$01,$4A,$4B,$4C,$95,$96,$97
            .db        $B4,$B5,$B6,$7E,$7F,$80,$FE,$FF




Пояснения
TIM2COMPB: это прерывание от таймера по которому и запускается АЦП- убрано за ненадобностью


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Александр Куличо...
сообщение Oct 14 2009, 15:03
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 256
Регистрация: 6-03-06
Из: Украина, г. Винница
Пользователь №: 15 017



Исправлюсь по поводу своего высказывания:
Цитата
Так, стоп. Вы меня уже совсем запутали. Где Вы нашли в таймере2 вход внешнего тактирования? Или Вы подаете их на ножку TOSC1?? Если так, то этого делать нельзя.

Использовать таймер 2 в асинхронном режиме для счета секундных импульсов если и правильно, то уж точно не целесообразно. Вообще он предназначался для работы от кварца или от внешего генератора частотой 32768. Работа этого таймера в асинхронном режиме требует от программиста мер по синхронизации асинхронной логики таймера2 с ядром контроллера, особенно перед входом в спящий режим. А на это нужно не менее 2х тактов таймера 2 (в Вашем случае - 2 сек). Подробнее - в даташите в разделе 17.9 Asynchronous Operation of the Timer/Counter2, стр.128.

У Вас убран вектор прерываний по Int1, но сами прерывания вы не запретили. Поэтому возможны ложные вызовы следующего после Int1 вектора прерывания - TIM2COMPA
При вычислении среднего Вы используете 255 отсчетов, а сумму делите на 256
В прерывании TIM2COMPA у Вас будет переполнение стека при ошибках передачи по TWI
Вы не дожидаетесь завершения формирования условия СТОП на шине TWI перед стартом

ДЛя чего у Вас используется АЦП? На него подвешаны кнопки? Если да, зачем использовать ADC noise canceler ? При 8 кнопках "расстояние" между ними составляет в идеальном случае 32 LSB при 8-битном преобразовании. Этого более чем достаточно и без режима уменьшения шума. В крайнем случае, с шумом справится и внешний конденсатор. Покажите схему, по которой у Вас подключены кнопки. С указанием номиналов компонентов.
Как часто вы опрашиваете кнопки? судя по программе, 1 раз в минуту. Это так и задумывалось или я чего-то пропустил в коде? Таймер2 у Вас считает внешние импульсы от DS1337 с интервалом 1 секунда. Период переполнения таймера2 - 60 секунд.(OCR2A). На каждой 2-й секунде у вас запускается опрос кнопок (OCR2A = 1).

P.S.
Подход, который Вы избрали для написания программы, в корне неверный. Может в Вашем конкретном случае он приемлимый, но лучше сразу писать правильно.
Прерывания обычно используются для того, чтобы по-быстрому отвлечься от текущей задачи, быстренько сделать самое необходимое (принять и буферизировать данные, выстивить флаги, подсчитать имульсы и т.п)и выйти. А обработку данных,которая требует значительно времени, уже делать в основном цикле. Извините, может я и слишком резко выразился, но я бы нокогда не делал прием/передачу данных по медленному интерфесу I2C в прерывании. То же касется и 256 преобразований АЦП.

Если есть желание зделать устройство работоспособным, стучитесь в личку. Или лучше на аську - 275-707-581. Только при обращении укажите, что Вы с этого форума, а то забаню smile.gif. Помогу, чем смогу. Но для этого нужно сначала сформулировать задачу, которая стоит перед микроконтроллером в целом.
Go to the top of the page
 
+Quote Post
defunct
сообщение Oct 14 2009, 22:49
Сообщение #3


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Александр Куличок @ Oct 14 2009, 18:03) *
Подход, который Вы избрали для написания программы, в корне неверный. Может в Вашем конкретном случае он приемлимый, но лучше сразу писать правильно.

Зато стиль хороший. Написано качественно, хорошо структурировано, аккуратно, читаемо и понимаемо.
Уверен с таким стилем автору не составит труда самому изменить пару строк чтобы получить верный подход,
а пока можно порассуждать почему же не всегда сбрасывается ADIF.


Цитата
то флажок ADIF сбрасывается через раз, почему не понимаю. Даже и не знаю как объяснить,аппаратно , он обязан сброситься, но не сбрасывается.

А в железе как? тоже не сбрасывается?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- ILYAUL   Снова АЦП   Sep 21 2009, 17:53
- - domowoj   Почему в ADC3 в конце стоит ret ??? И зачем вот э...   Sep 21 2009, 22:16
|- - ILYAUL   Цитата(domowoj @ Sep 22 2009, 02:16) Поче...   Sep 22 2009, 05:17
|- - 777777   Цитата(ILYAUL @ Sep 22 2009, 09:17) Стави...   Sep 23 2009, 04:57
|- - domowoj   Цитата(777777 @ Sep 23 2009, 11:57) Я худ...   Sep 23 2009, 08:35
- - Александр Куличок   ЦитатаADC5: lsr mean1 ...   Sep 22 2009, 00:15
- - domowoj   У Евстифеева написано, что АЦП запускается по ком...   Sep 22 2009, 15:58
- - Rst7   ЦитатаКоней попредержи на поворотах, англоязычный ...   Sep 23 2009, 08:43
|- - ILYAUL   Цитата(Rst7 @ Sep 23 2009, 12:43) Нормаль...   Sep 23 2009, 18:39
- - Александр Куличок   ЦитатаПояснения TIM2COMPB: это прерывание от тайме...   Sep 24 2009, 18:26
|- - ILYAUL   Александр Огромное спаибо эа развёрнутый ответ. ...   Sep 24 2009, 21:49
- - Александр Куличок   ЦитатаТаймер2 считает внешние 1Гц импульсы от DS13...   Sep 25 2009, 17:40
- - ILYAUL   Извините , что долго не отвечал. Выкладываю полный...   Oct 12 2009, 09:08


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

 


RSS Текстовая версия Сейчас: 24th August 2025 - 03:48
Рейтинг@Mail.ru


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