Jump to content
pryanic

Не получается получить данные с АЦП

Recommended Posts

Доброго времени суток. Понадобилось разобраться с АЦП.  Основной материал использовал Евстифеева (микроконтроллеры семейства мега) и учебный курс Di-Halt.

На первый раз задача простая - обработать напряжение с переменного резистора и послать по UART в терминал. С терминалом уже кое-что делал, так что тут вряд ли косяк есть.

Кратко опишу программу: каждую секунду в обработчике прерывания таймера (не совсем точно, прерывание по переполнению Т0) запускаю преобразование АЦП установкой в 1 бита ADSC. 

В обработчике прерывания АЦП читаю байт ADCH (выравнивание по левому краю ADLAR=1) и шлю по уарт. Но в терминал приходят одни FF независимо от положения движка потенциометра (подключен к PC1 средним контактом, крайними на землю и AVCC)
 

Скрытый текст

 

            .include        "m8def.inc"
            .include "macrobaselib.inc"   


            .equ     XTAL = 8000000     
            .equ     baudrate = 9600  
            .equ     bauddivider = XTAL/(16*baudrate)-1

            .def    temp    =    R16
            .def    ADCdata    =    R20

;= Start     macro.inc ========================================

;= End         macro.inc ========================================

; RAM ========================================================
        .DSEG


; FLASH ======================================================
            .cseg
            .org    0
            rjmp RESET                         ; Reset Handler
            rjmp EXT_INT0                     ; IRQ0 Handler
            rjmp EXT_INT1                     ; IRQ1 Handler
            rjmp TIM2_COMP                     ; Timer2 Compare Handler
            rjmp TIM2_OVF                     ; Timer2 Overflow Handler
            rjmp TIM1_CAPT                     ; Timer1 Capture Handler
            rjmp TIM1_COMPA                 ; Timer1 CompareA Handler
            rjmp TIM1_COMPB                 ; Timer1 CompareB Handler
            rjmp TIM1_OVF                     ; Timer1 Overflow Handler
            rjmp TIM0_OVF                     ; Timer0 Overflow Handler
            rjmp SPI_STC                     ; SPI Transfer Complete Handler
            rjmp USART_RXC                     ; USART RX Complete Handler
            rjmp USART_UDRE                 ; UDR Empty Handler
            rjmp USART_TXC                     ; USART TX Complete Handler
            rjmp A_D_C                         ; ADC Conversion Complete Handler
            rjmp EE_RDY                     ; EEPROM Ready Handler
            rjmp ANA_COMP                     ; Analog Comparator Handler
            rjmp TWSI                         ; Two-wire Serial Interface Handler
            rjmp SPM_RDY                     ; Store Program Memory Ready Handler

; Interrupts ==============================================

EXT_INT0:    nop
            reti             
EXT_INT1:    nop
            reti                 
TIM2_COMP:    nop
            reti             
TIM2_OVF:    nop
            reti             
TIM1_CAPT:    nop
            reti         
TIM1_COMPA:    nop
            reti              
TIM1_COMPB:    nop
            reti              
        
TIM0_OVF:    nop                        
            reti              
SPI_STC:    nop
            reti              
            
USART_UDRE:    nop
            reti
USART_RXC:    nop        
            reti                
USART_TXC:    nop
            reti              
                 
EE_RDY:        nop
            reti                  
ANA_COMP:    nop
            reti                  
TWSI:        nop
            reti                     
SPM_RDY:    nop
            reti  

TIM1_OVF:    PUSHF

            setb    ADCSRA,    ADSC
;            OUTI    ADCSRA,(1<<ADEN)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(0<<ADPS0)        
            POPF
            reti 
            
            
A_D_C:        PUSHF
            in        ADCdata,    ADCL
            in        ADCdata,    ADCH


uart_snt:    SBIS     UCSRA,    UDRE    
            RJMP    uart_snt     
            OUT        UDR,     ADCdata    
            POPF    
            reti      

; End Interrupts ==========================================


Reset:       STACKINIT    ; Èíèöèàëèçàöèÿ ñòåêà
            RAMFLUSH    ; Î÷èñòêà ïàìÿòè
            GPRFLUSH    ; Î÷èñòêà ÐÎÍ     


; End coreinit.inc

; Internal Hardware Init  ======================================
            outi    ddrb,    0xFF
            outi    portb,    0x00

uart_init:    LDI     R16, low(bauddivider)
            OUT     UBRRL,R16
            LDI     R16, high(bauddivider)
            OUT     UBRRH,R16

            LDI     R16,0
            OUT     UCSRA, R16

            
            LDI     R16, (1<<RXEN)|(1<<TXEN)|(0<<RXCIE)|(0<<TXCIE)|(0<<UDRIE)
            OUT     UCSRB, R16    

            ; Ôîðìàò êàäðà - 8 áèò, ïèøåì â ðåãèñòð UCSRC, çà ýòî îòâå÷àåò áèò ñåëåêòîð
            LDI     R16, (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1)
            OUT     UCSRC, R16


; ADC Init - Èíèöèàëèçóðåì ÀÖÏ.

            OUTI    ADCSRA,(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(0<<ADPS0)
             OUTI    ADMUX,0b0110001

Timer1_1S:    clr        temp
            out        tcnt1h,    temp
            out        tcnt1l,    temp
;            ldi        temp,    0xFF
;            out        ocr1bh,    temp
;            out        ocr1bl,    temp    
            outi    tccr1b,    (1<<CS12)
            setb    TIMSK,    TOIE1
            setb    tccr1a,    com1a0
            setb    SFIOR,    PSR10

            SEI

; Main =========================================================
Main:    nop
        nop
        nop
        nop

        RJMP    Main
; End Main =====================================================


; Procedure ====================================================

; End Procedure ================================================


; EEPROM =====================================================
            .ESEG                ; Ñåãìåíò EEPROM

 

 

ADC_test.zip

Share this post


Link to post
Share on other sites

В железе собрано? У меня в Протеусе что-то меняется при вращении потенциометра:

image.png.160e930ba56d5c95b8a4598e971ca593.png

Кстати, такая запись не установит бит в ноль: (0<<TXCIE). В ноль устанавливается иначе, с использованием инверсной маски:

REG |=  (1 << BIT)			// Установка бита в 1
REG &= ~(1 << BIT)			// Установка бита в 0

 

Share this post


Link to post
Share on other sites
3 часа назад, aitras сказал:

В железе собрано? У меня в Протеусе что-то меняется при вращении потенциометра:

Да, в железе-то одни FF и идут. Причем независимо от того подключен резистор к входу АЦП или нет(

Share this post


Link to post
Share on other sites

Вебинар STM32G0 – новый лидер бюджетных 32-битных микроконтроллеров от STMicroelectronics

Компания Компэл приглашает вас 25 сентября принять участие в вебинаре, который посвящен новому семейству микроконтроллеров STM32G0. Вебинар рассчитан на технических специалистов и тех, кто хорошо знаком с семейством STM32. На вебинаре будут освоены современные методы тестирования производительности микроконтроллеров на примере самых бюджетных 32-битных семейств общего назначения STM32G0 и STM32F0 и проведено их подробное сравнение.

Подробнее

Хм, вроде бы обнаружил косяк!  В инициализации АЦП

OUTI ADMUX, 0b0110000

Не хватает еще нуля в конце. Поэтому и запись в регистр проходила некорректно. Бит ADLAR устанавливался в 1, а REFS0 так и оставался 0. Получалось что опорное напряжение должно подаваться с внешнего ИОНа. Но проверю в железе уже завтра)

Share this post


Link to post
Share on other sites
                     

Литиевые батарейки Fanso в беспроводных датчиках пожарно-охранной сигнализации

Выбор подходящего элемента питания, способного обеспечивать требуемый уровень напряжения и выдавать необходимый ток на протяжении всего периода эксплуатации беспроводной пожарно-охранной системы является одной из первостепенных задач. Наиболее подходящим для этих целей элементом являются литий-тионилхлоридные элементы питания, а одним из наиболее конкурентоспособных производителей – компания Fanso, предлагающая своим клиентам продукты как универсальные, так и разработанные специально для решения конкретных задач.

Подробнее...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • By artos5
      Приветствую всех на этом форуме!
      Есть необходимость измерять сигнал при помощи данного АЦП. С помощью этого АЦП можно измерять 4 аналоговых не дифференциальных сигнала . Схема следующая:
      Schematic_Temp_opto_sens_V2_20190817124112.pdf
      Картинками с более низким разрешением:
      библиотеку за основу взял эту:
      https://github.com/nsaspook/nidaq700/blob/master/supermoon/example/ADS1220.c
      Путем незначительного допиливания, получилась такая библиотека:
       
      Поправил только эти функции:
      void ADS1220SendByte(unsigned char Byte) { unsigned char Result = 0x01, i=0, flg=0; MOSI_LO; Delay_us(1); for(i=0;i<8;i++) { SCK_LO; //ADC_CLK=0 Delay_us(4); if (flg) MOSI_LO; Delay_us(1); SCK_HI; //ADC_CLK=1 Delay_us(1); if (Byte&Result){ MOSI_HI; flg=1; } else MOSI_LO; Delay_us(4); Result<<=1; } SCK_LO; //ADC_CLK=0 } unsigned char ADS1220ReceiveByte(void) { unsigned char Result = 0, i=0; for(i=0;i<8;i++) { Result<<=1; SCK_LO; //ADC_CLK=0 Delay_us(5); //Delay_us(5); SCK_HI; //ADC_CLK=1 Delay_us(3); if (MISO) Result++; Delay_us(2); } SCK_LO; //ADC_CLK=0 return Result; } И добавил эту функцию:
      void ADS1220Config_MUX_GAIN(uint8_t mux, uint8_t gain) { unsigned Temp; ADS1220ReadRegister(ADS1220_0_REGISTER, 0x01, &Temp); // clear prev value; Temp &= 0x0f; Temp |= gain; Temp |= mux; // write the register value containing the new value back to the ADS ADS1220WriteRegister(ADS1220_0_REGISTER, 0x01, &Temp); ADS1220ReadRegister(ADS1220_1_REGISTER, 0x01, &Temp); // clear prev DataRate code; Temp &= 0x1f; Temp |= (ADS1220_DR_600 + ADS1220_CC); // Set default start mode to 600sps and continuous conversions // write the register value containing the new value back to the ADS ADS1220WriteRegister(ADS1220_1_REGISTER, 0x01, &Temp); } ADS1220.h :
      в результате получаю такую осциллограмму :

      То есть , постоянно считывается 0.
      А вот регистры конфигурации:
      Задаю номер входа MUX и усиление :
       

       
      Читаю данные так:
      ADS1220Config_MUX_GAIN(ADS1220_MUX_0_G, ADS1220_GAIN_1); HAL_Delay(10); temp_[0] = ADS1220ReadData(); Это для 0 канала. 
      Пробовал и так:
      ADS1220SetChannel(ADS1220_MUX_0_G); ADS1220SetGain(ADS1220_GAIN_1); temp_[0] = ADS1220ReadData(); Результат аналогичный. Кто что подскажет? Может кто заметит какой косяк в коде? Уже голова дымит ..
    • By maxssau
      Продам адаптеры USB-I2S. 

       
      Возможности:
       
      стерео ввод/вывод PCM 16-32 бита, 44.1-384 кГц. Ввода DSD нет, как и драйверов для ввода DSD.
      вывод DSD в режиме DoP 64-128, в режиме Native 64-256. Native доступен в Linux без "хитрых" драйверов.
      Тактирование от платы ЦАП/АЦП, частоты 512 fs (22.5792/24.576 МГц). Теоретически возможно и 1024fs(скорости 768кГц и DSD512 Native), но это не опробовано.
      Гальваническая изоляция на Si8662/Si8640.
      Питание возможно как Self так и Bus Powered. В режиме Bus Powered необходимо самостоятельно позаботиться о мастерклоке, т.к. возможны сильные глюки при выключенном генераторе мастерклока.
       
      Тема: 
      срок изготовления 3-5 недель (сильно зависит от поставок процессоров).
      На данный момент полностью реализован интерфейс Legacy. Для отладки Native режима пока нет платы ЦАП, в процессе разработки, будет не раньше осени.
      Цена 6000 + пересылка (в среднем 250 р.).
    • By dav1977
      Кто-нибудь запускал скоростные  АЦП  AD7606(последовательного приближения)
       в последовательном режиме считывания данных ?,
      из 4 шт одна заработала, остальные на выводе последовательного вывода DOUT ничего не выдают постоянно 0.
      пробовал переключаться с внутренним опорным источником(выдает 2.49), и с внешним без разницы.
      Может у них есть какая то очередность включения?
       

    • By dommax
      Распродаю остатки радиодеталей.
      Для удобного поиска написал WEB страничку http://detali.syremo.com.ua/
      Количество может не совпадать. Пишите - отвечу. Договоримся...
      Отправляю только по Украине. Перед отправкой смогу сделать фото.
  • Сообщения

    • Предложение актуально. Цены: Минимальный заказ - 1 катушка. Цена - 950грн. Цена от 2х катушек - 900грн/катушка. Возможна отмотка от 100гр. Цена 100гр. - 130грн.
    • Всем доброго времени суток! Я новичок тут! Что можете сказать вот про такую схему, только лампы стоят 6н6п. Анодное 275, в верхних катодах 220 Ом, нижних 100 Ом. Нижние сетки 100 кОм. Сигнал сразу на сетку. Работает на наушники 250 Ом.
    • Здравствуйте уважаемые форумчане! Мне неспешно,на заказ собирают ламповый SE усилитель на прямонакальных триодах 6с4с и 6э5п(драйвер) Выходные трансформаторы мотают на заказ на хорошем железе, силовик тоже (торроидальный) вы знаете не по наслышке, что прямонакалы 6с4с "хорошо" фонят и чтобы устранить этот недостаток накал ламп советуют выпрямлять постоянкой! Но уже двое человек мне сказали что в этом случае можно "убить" звук, что якобы пропадёт динамика(детализация) и звучание будет в большей степени транзисторным! Правда ли это на самом деле?!!! 2. Если накал ламп выпрямить переменкой как тогда избавиться от фона? Прошу откликнуться знатоков, которые собирали однотактники на этих лампах(6с4с) как правильно поступить? Схему прилагаю)
    • Возможно прога не учитывает что например при 220В большинство атх бп работают в половину от макс скважности -поэтому и число витков меньше  Если сердечник немного больше,то можно взять число витков как в оригинале,40 витков на входе А вот скака витков на выходе,ещё раз подумать какой нужен запас по скважности и по снижению напряжения в сети
    • Верно.   https://vk.com/video182375012_456239021
    • Это и так два паяльника, только конструктивно объединенные в один инструмент.
    • Василичь, - то, что на верхнем фото подписано "Керамика в ОС" (не знаю, что это значит) - это высококачественная пленка от EPCOS. Тип диэлектрика не помню.
×
×
  • Create New...