Jump to content
Sign in to follow this  
rmatveev

Attiny26: Уже Который День Бьюсь С Ацп - Нет Данных

Recommended Posts

Пардон, разобрался!

Видимо, надо было считывать сначала ADCL, затем ADCH (причем именно в такой последовательности).

Вот код (извиняюсь, что там много "лишнего", просто мало ли что на что косвенно или прямо влияет):

#include <tiny26.h>
#include <delay.h>

#define setb_EORLOCK {PORTA.1=0;DDRA.1=1;}
#define clrb_EORLOCK {DDRA.1=0;PORTA.1=1;}
#define setb_START {PORTA.2=1;}
#define clrb_START {PORTA.2=0;}
#define setb_STOP {PORTA.3=0;DDRA.3=1;}
#define clrb_STOP {DDRA.3=0;PORTA.3=1;}
#define EOF ( (PINA&1<<3))
#define setb_VP_NORMA {PORTA.4=0;DDRA.4=1;}
#define clrb_VP_NORMA {DDRA.4=0;PORTA.4=0;}
#define BUT1 (!(PINA&1<<4))
#define setb_SAVE {PORTA.5=0;DDRA.5=1;}
#define clrb_SAVE {DDRA.5=0;PORTA.5=0;}
#define BUT2 (!(PINA&1<<5))
#define BUT3 (!(PINA&1<<6))
#define VPIN_pin PINA.7
#define BUT4 (!(PINA&1<<7))

#define DAC_DIN PORTB.0
#define clrb_LED5 {PORTB.1=1;DDRB.1=1;}
#define setb_LED5 {PORTB.1=0;DDRB.1=1;}
#define DAC_SCLK PORTB.2
#define DAC_SYNC PORTB.3
#define setb_LED3 {PORTB.4=0;DDRB.4=1;}
#define clrb_LED3 {PORTB.4=1;DDRB.4=1;}
#define setb_LED2 {PORTB.5=0;DDRB.5=1;}
#define clrb_LED2 {PORTB.5=1;DDRB.5=1;}
#define BUTR (!(PINB&1<<6))
#define BUTL (!(PINB&1<<7))
#define setb_LED1 {PORTB.7=0;DDRB.7=1;}
#define clrb_LED1 {PORTB.7=1;DDRB.7=1;}

#define _RESET #asm("cli");while(1){}
#define _LOCK #asm("cli");while(1){#asm("wdr")}

#define setb_ADSC ADCSR|=(1<<6)

volatile unsigned int vp = 0;
volatile unsigned int msec = 0;
volatile unsigned char led_inp_mode = 0;
volatile unsigned char led_inp = 0;


void main( void )
{
unsigned long int i;
int led=0;
int led2=0;
// Declare your local variables here

DDRA = 0b00000100;
PORTA = 0b00000100;
DDRB = 0b00111101;
PORTB = 0b00000000;

TCCR0 = 0b00000000;
TCNT0 = 0;

PLLCSR = 0b00000000;

TCCR1A = 0b00000000;
TCCR1B = 0b00000110;
TCNT1 = 0;
OCR1A = 0;
OCR1B = 0;
OCR1C = 0;

GIMSK = 0b00000000;
TIMSK = 0b00000100;
MCUCR = 0b00000000;

WDTCR=0b00001010;

USICR = 0b00000000;

ACSR = 0b10000000;

ADMUX = 0b10000110;
ADCSR = 0b11100111;



#asm("sei");
while( msec<20 )
if( !EOF ) msec = 0;

#asm("cli");
setb_STOP;
setb_EORLOCK;
delay_us( 10 );
clrb_STOP;
for( i=0; i<8; i++ )
{
delay_us( 330 );
setb_START;
delay_us( 1 );
clrb_START;
}
clrb_EORLOCK;

while (1)
{
#asm("wdr");
delay_us( 1000 );

msec++;
if( msec >= ADCL ) {led = 1-led; msec = 0;}
if( led ) setb_SAVE else clrb_SAVE;

}
}

Никак не добьюсь зависимости частоты мигания от напряжения на ножке 11 (PORTA.7). При этом АЦП, вроде запускается и ADSC сбрасывается как пологается...

100 раз уже перепроверил мультиплексор, режим работы и пр. Попробовал и фри-ран и однократный режим. Все одно: частота не меняется. И похоже из ADCL считывается всегда 0.

Может я что-то пропустил?

Edited by rmatveev

Share this post


Link to post
Share on other sites

А кто мешает так читать: i=ADCW;

Проверено на Mega16/32.

PS. В доке его нету, но в .h файлах есть.

Share this post


Link to post
Share on other sites

А кто мешает так читать: i=ADCW;

Проверено на Mega16/32.

PS. В доке его нету, но в .h файлах есть.

Буду знать, спасибо!

Share this post


Link to post
Share on other sites

Высококачественные конденсаторы Panasonic для надежности вашей электроники!

Электролитические алюминиевые конденсаторы Panasonic отличаются повышенной надежностью, длительным сроком службы, низким импедансом и выдерживают большой ток пульсаций, в то время как семейства полимерных конденсаторов Panasonic SP-CAP, POSCAP, OS-CON и HYBRID характеризуют сверхнизкий ESR и увеличенная емкость, работа при высоких напряжениях и в расширенном температурном диапазоне. Приобретая продукцию Panasonic, вы гарантированно получаете самое передовое решение для ваших задач. Для облегчения вашего выбора, мы подготовили подборку полезных материалов.

Читать статьи

Но Вы всё-таки проверьте заранее, мож это у них из разряда "недокументированных возможностей"...

Вот сейчас ещё раз поиском по ДШ на Mega32A прошёлся - нет у него такого регистра :crazy: . Глубоко не вчитывался, может просто некий "алиас" на пару ADCH/ADCL.

Edited by hd44780

Share this post


Link to post
Share on other sites

Регистр ADCW - это виртуальный регистр компилятора CodeVisionAVR. В нем хранится 16-битный результат АЦП преобразования (т.е. ADCH+ADCL).

Share this post


Link to post
Share on other sites
                     

Вебинар "Как создать BLE-устройство на базе новейшего беспроводного микроконтроллера STM32WB55"

27 ноября 2019 года компания КОМПЭЛ приглашает разработчиков, технических руководителей и энтузиастов беспроводной связи на вебинар, посвященный новинке 2019 года – мультипротокольному беспроводному микроконтроллеру STM32WB55, который позволяет создавать устройства на базе стандартов BLE 5.0; BLE Mesh; 802.15.4/ZigBee и Thread. На вебинаре мы покажем, как с помощью привычных инструментов STM32Cube и STM32CubeMX можно создать свое первое, надежно работающее BLE-приложение.

Зарегистрироваться на вебинар

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...
Sign in to follow this  

  • 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 pryanic
      Доброго времени суток. Понадобилось разобраться с АЦП.  Основной материал использовал Евстифеева (микроконтроллеры семейства мега) и учебный курс Di-Halt.
      На первый раз задача простая - обработать напряжение с переменного резистора и послать по UART в терминал. С терминалом уже кое-что делал, так что тут вряд ли косяк есть.
      Кратко опишу программу: каждую секунду в обработчике прерывания таймера (не совсем точно, прерывание по переполнению Т0) запускаю преобразование АЦП установкой в 1 бита ADSC. 
      В обработчике прерывания АЦП читаю байт ADCH (выравнивание по левому краю ADLAR=1) и шлю по уарт. Но в терминал приходят одни FF независимо от положения движка потенциометра (подключен к PC1 средним контактом, крайними на землю и AVCC)
       
       
      ADC_test.zip
  • Сообщения

    • @kotenok А ты его попробуй применить :).
    • Подтвердите документально?
    • В таких системах используется такое свойство как гистезис, то есть после того как аккумулятор заряжен до определенного напряжения, зарядка останавливается пока напряжение не снизится до определенного уровня.  В вашей задаче ключевые факторы это режим работы, время заряда – время разряда, и запас ёмкости. Из этого рассчитывается ток заряда и напряжения состояний. Необходимость постоянного присутствия балансира и разновидность, тоже определяется этими факторами.  Также для данной химии аккумулятора нужен постоянный мониторинг температуры, как при заряде, так и под нагрузкой и определение полностью разряженного аккумулятора.  На самом деле всё проще, чем пугают философскими фразачками. Добавлю, что балансиры, производителями рассматриваются как отдельные компоненты. В балансирах тоже есть пороговые значения, балансировка идет не постоянно, а при необходимости, но сама логика, хоть и мало, но всё же  потребляет энергию. Можно ограничить, чтоб балансировка происходила только при зарядке.   Всё в одном, и под различные, индивидуальные запросы  делают на программируемых мк.  Чем определяется выбор данной химии аккумулятора ?  
    • Видео не о чём. Если нет реакции на кнопки - не доходит сигнал до МК: не пропай, брак. Балаболит - могут быть помехи от ШИМа дисплея. У меня тоже без оформления в корпус - молчала М2. Как "прижал" всё по месту - дисплей дал о себе знать.  Другой вопрос, не реагирует на увеличение СЕНСа - косяк во входных цепях, брак МК.  Так что, сначала, ищм непропаи и сверяйся номиналом деталей со схемой.
×
×
  • Create New...