AtTiny 13 и АЦП

Здесь принимаются все самые невообразимые вопросы... Главное - не стесняйтесь. Поверьте, у нас поначалу вопросы были еще глупее :)
sharmax
Открыл глаза
Сообщения: 78
Зарегистрирован: Сб янв 28, 2012 21:09:29

AtTiny 13 и АЦП

Сообщение sharmax »

Уважаемые коллеги, добрый день. Прошу прощения, возможно, вопрос и глупый, но ответа на него найти не могу нигде - если подобное и рассматривается, то только с ЖК дисплеями и в оболочках, отличных от той, с чем я учусь работать - Code Vision.
Необходимо заставить зажигаться светодиод в зависимости от положения движка потенциометра R (см. рисунок): как только напряжение на ножке 3 превысит, скажем, 2,5 В, светодиод должен зажечься, как только оно станет меньше 2,5 В - погаснуть. Насколько я понимаю, это возможно сделать, используя встроенный в МК АЦП. Но как его настроить в CodeVision?
Ну ясно, при создании проекта на вкладке "Ports" PB4 делаем входом, все остальные (в т.ч. и PB0 - выходами). А вот дальше вопросы:
1. Что мне нужно сделать на вкладке "ADC"? Единственное что можно выбрать - Auto trigger source. Никакие прерывания пока не интересуют, самое простое - напряжение выросло - диод зажегся, упало - погас.
2. При написании кода - как организовать цикл if, (if U>2.5В PB0 = 1 else PB0 = 0 - что пишется вместо U и 2,5В?)
Заранее спасибо за содержательные ответы.
Вложения
01.JPG
Схема
(26.81 КБ) 192 скачивания
metan
Вымогатель припоя
Сообщения: 593
Зарегистрирован: Ср янв 06, 2010 10:01:46

Re: AtTiny 13 и АЦП

Сообщение metan »

[uquote="sharmax",url="/forum/viewtopic.php?p=3843969#p3843969"]Единственное что можно выбрать - Auto trigger source.[/uquote]
Неправда. Там все, что нужно для начальной инициализации, есть.
adc.JPG
(33.2 КБ) 164 скачивания
И при чем тут вообще оболочка? Для выполнения задачи нужно понимать, как работает тот или иной узел контроллера, и как им управлять. Это все есть в даташите или огромном числе учебников. Там все, что вам нужно, подробнейшим образом разжевано. Чип далеко не молод :). Как вообще в инете можно не найти такой ерунды?

При написании кода нужно просто читать из регистров АЦП нужную информацию, и с чем нужно её сравнивать.

Ниже простейший пример, где настраивается АЦП.
В примере "drill.c" потенциометр управляет моторчиком путем изменения параметров ШИМа.
Спойлер

Код: Выделить всё

/*****************************************************
This program was produced by the
CodeWizardAVR V1.25.5 Professional
Automatic Program Generator
© Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : 
Version : 
Date    : 09.10.2008
Author  : Yurik                           
Company : Hardlock                        
Comments: 


Chip type           : ATtiny13
Clock frequency     : 9,600000 MHz
Memory model        : Tiny
External SRAM size  : 0
Data Stack size     : 16
*****************************************************/

#include <tiny13.h>  
unsigned int pwm;  
unsigned int c; 

#include <delay.h>

#define ADC_VREF_TYPE 0x00

// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Place your code here
if (++c > 500)
{
  c = 0;
  pwm = 110 + read_adc(2) / 7; 
  if (pwm > 255) pwm = 255;
  if (!PINB.3)
  {
    OCR0A = pwm;
  }
  else
  {
    OCR0A = 0;
  }
}  


}

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port B initialization
// Func5=In Func4=In Func3=In Func2=In Func1=In Func0=Out 
// State5=T State4=T State3=T State2=T State1=T State0=0 
PORTB=0x08;
DDRB=0x01;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 150,000 kHz
// Mode: Fast PWM top=FFh
// OC0A output: Non-Inverted PWM
// OC0B output: Disconnected
TCCR0A=0x83;
TCCR0B=0x02;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;


// External Interrupt(s) initialization
// INT0: Off
// Interrupt on any change on pins PCINT0-5: Off
GIMSK=0x00;
MCUCR=0x00;

// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x02;

// Analog Comparator initialization
// Analog Comparator: Off
ACSR=0x80;
ADCSRB=0x00;

// ADC initialization
// ADC Clock frequency: 600,000 kHz
// ADC Bandgap Voltage Reference: Off
// ADC Auto Trigger Source: None
// Digital input buffers on ADC0: On, ADC1: On, ADC2: On, ADC3: On
DIDR0&=0x03;
DIDR0|=0x00;
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x84;

// Global enable interrupts
#asm("sei")

while (1)
      {
      // Place your code here

      };
}

Аватара пользователя
АлександрЛ
Друг Кота
Сообщения: 43804
Зарегистрирован: Пн ноя 30, 2009 03:00:01
Откуда: Нерезиновая

Re: AtTiny 13 и АЦП

Сообщение АлександрЛ »

[uquote="sharmax",url="/forum/viewtopic.php?p=3843969#p3843969"]Необходимо заставить зажигаться светодиод в зависимости от положения движка потенциометра R (см. рисунок): как только напряжение на ножке 3 превысит, скажем, 2,5 В, светодиод должен зажечься, как только оно станет меньше 2,5 В - погаснуть. Насколько я понимаю, это возможно сделать, используя встроенный в МК АЦП.[/uquote]
И для такой "сложнейшей" задачи вы хотите использовать целый АЦП?
В составе данного (и не только) МК есть "On-chip Analog Comparator"- - AIN0 AIN1, выводы 5 и 6 микросхемы (DIP и SOIC), вполне пригодный для решения ВАШЕЙ задачи.. На один вход подаёте "опорное" напряжение, на второй - измеряемое..

зы.. (имхо) И компаратор работает быстрее, чем АЦП..
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: AtTiny 13 и АЦП

Сообщение pyzhman »

И будет сравнивать с Vref, а нужен заданный гистерезис и определенной напряжение.
Docendo discimus
sharmax
Открыл глаза
Сообщения: 78
Зарегистрирован: Сб янв 28, 2012 21:09:29

Re: AtTiny 13 и АЦП

Сообщение sharmax »

[uquote="metan",url="/forum/viewtopic.php?p=3844061#p3844061"][uquote="sharmax",url="/forum/viewtopic.php?p=3843969#p3843969"]
Как вообще в инете можно не найти такой ерунды?




Спойлер
[/uquote]
Если б это было так просто, я таких вопросов не задавал. Все ссылаются на даташиты. Но они все на Английском!!! Если поделитесь ссылкой на русский вариант - буду благодарен.

Добавлено after 2 minutes 16 seconds:
И для такой "сложнейшей" задачи вы хотите использовать целый АЦП?
Нет конечно. Я привел простейший пример.
Что такое компаратор, мне известно. Даже есть самоделка. Но если в аналоговом компараторе я могу выбрать ширину гистерезиса резистором (между входом и выходом), то как сделать этот гистерезис здесь, непонятно - приходится вводить задержки, что не всегда удобно.
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: AtTiny 13 и АЦП

Сообщение pyzhman »

В визарде выберите однократное преобразование, прижатый к левому краю формат (байт на выходе, а не 10 бит) и опорное напряжение питания Vcc.
В программе вызывайте adc_read() с нужным каналом. После вызова сравнивайте. 3 вольта это 255/5*3= 153, а 2,5 вольта это 255/5*2,5= 128.
Docendo discimus
metan
Вымогатель припоя
Сообщения: 593
Зарегистрирован: Ср янв 06, 2010 10:01:46

Re: AtTiny 13 и АЦП

Сообщение metan »

[uquote="sharmax",url="/forum/viewtopic.php?p=3843969#p3843969"]Если б это было так просто, я таких вопросов не задавал. Все ссылаются на даташиты. Но они все на Английском!!![/uquote]
Я еще раз спрошу, КАК это возможно? КАК?
В первой же пятерке результатов поиска по "attiny13a datasheet на русском pdf" вылезает все, что нужно.
Вот, например https://tiny13digest.ru/datasheet-attiny13-na-russkom/. Не благодарите :)
Ничего не понимаю.
Не найдет и шлюху в борделе...
sharmax
Открыл глаза
Сообщения: 78
Зарегистрирован: Сб янв 28, 2012 21:09:29

Re: AtTiny 13 и АЦП

Сообщение sharmax »

pyzhman писал(а):Вот, например https://tiny13digest.ru/datasheet-attiny13-na-russkom/. Не благодарите
Вы извините, там переведено только первые 2-3 темы. Что касается АЦП - "здесь ничего нет"
Аватара пользователя
mickbell
Друг Кота
Сообщения: 16377
Зарегистрирован: Пт мар 30, 2012 05:17:29
Откуда: Екатеринбург

Re: AtTiny 13 и АЦП

Сообщение mickbell »

[uquote="sharmax",url="/forum/viewtopic.php?p=3896469#p3896469"]Вы извините, там переведено только первые 2-3 темы. Что касается АЦП - "здесь ничего нет"[/uquote]Открою маленький секрет. The language of datasheets is not English. Даташиты пишутся на упрощённом международном языке, который всяк поймёт, ибо там нет ничего страшного, кроме латиницы. Мало того, всегда лучше читать даташиты именно в оригинале. Когда только появился в СССР "аналог" микропроцессора i8080, появилась и литература по нему. Переведённая. Зачем-то вместе с терминами и аббревиатурами. Вот где пришлось мозги заправлять, запоминая два варианта и соответствие между ними. Ладно хоть мнемоники команд догадались оставить оригинальные. :)))
И хрюкотали зелюки,
Как мюмзики в мове.

На каждый РКН
Найдётся VPN.
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: AtTiny 13 и АЦП

Сообщение pyzhman »

[uquote="sharmax",url="/forum/viewtopic.php?p=3896469#p3896469"]
pyzhman писал(а):.. Не благодарите
Вы извините...[/uquote]
Я такого не писал. См. выше. Извинения приняты.
Docendo discimus
sharmax
Открыл глаза
Сообщения: 78
Зарегистрирован: Сб янв 28, 2012 21:09:29

Re: AtTiny 13 и АЦП

Сообщение sharmax »

Итак, господа, продолжим.
Собрал схему - см. рис. 1.
Когда напряжение на 1 ножке МК превысит определенное значение, светодиод должен зажечься.
Code Vision конфигурируем так:
- вкладка Ports: Bit 2 - выход с нулевым начальным состоянием, все остальные биты - входы с подтяжкой, но бит 5 - без нее.
- вкладка ADC: включить АЦП; частота преобразования: 150 кГц (тактовая частота МК - 1,2МГц); источник автоматического инициализирования - Free running (свободный запуск). Галочки "Use 8 bits, Interrupt и Bandgap reference" оставляем пустыми. Это означает (поправьте, если не так): АЦП использует 10 бит, не формирует прерываний и в качестве опорного источника использует внешний источник питания 5В.
Галочки "Disable digital input buffers" (отключить цифровые входы?) включаем 1, 2 и 3, а нулевую - не ставим, поскольку 1 вывод МК есть канал ADC0.

Генерируем код...
#include <tiny13a.h>

#include <delay.h>

#define ADC_VREF_TYPE 0x00

// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port B initialization
// Func5=In Func4=In Func3=In Func2=Out Func1=In Func0=In
// State5=T State4=P State3=P State2=0 State1=P State0=P
PORTB=0x1B;
DDRB=0x04;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// External Interrupt(s) initialization
// INT0: Off
// Interrupt on any change on pins PCINT0-5: Off
GIMSK=0x00;
MCUCR=0x00;

// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
ACSR=0x80;
ADCSRB=0x00;
DIDR0=0x00;

// ADC initialization
// ADC Clock frequency: 150,000 kHz
// ADC Bandgap Voltage Reference: Off
// ADC Auto Trigger Source: Free Running
// Digital input buffers on ADC0: On, ADC1: Off, ADC2: Off, ADC3: Off
DIDR0&=0x03;
DIDR0|=0x1C;
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0xA3;
ADCSRB&=0xF8;

while (1)
{
// Place your code here

}
}

Насколько я понимаю, результат АЦП заносится в регистр ADCW, это в зависимости от положения движка потенциометра, какое-то число от 1 до 1023 (или это не так??)
В главном теле программы (Place your code here) пишу вот это:
if (ADCW<0xC8) {PORT B.2=1;} else {PORTB.2=0;}
то есть, если число в регистре ADCW меньше 200 (С8 в 16-ричной системе) - светодиод включить, иначе - выключить.
Компилирую, программирую, устанавливаю на макетную плату. И тишина... Как ни крути движок - светодиод не зажигается.
В чем моя ошибка?
Вложения
1.JPG
рис. 1
(21.53 КБ) 146 скачиваний
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: AtTiny 13 и АЦП

Сообщение akl »

Ваш рисунок показывает, что выбрана самая неудачная лапа для подключения сигнала. Попробуйте вместо RESET/PB5 какую либо другую.
sharmax
Открыл глаза
Сообщения: 78
Зарегистрирован: Сб янв 28, 2012 21:09:29

Re: AtTiny 13 и АЦП

Сообщение sharmax »

Хорошо, вечером. Но рассуждения мои верные?
Самсусамыч

Re: AtTiny 13 и АЦП

Сообщение Самсусамыч »

Тестовая прошивка для проверки работы АЦП, МК тини13. Тактируется на заводской установке (1,2 МГц) – Фьюзы прошивать не нужно. На входе РВ4 больше 2,5 В – светик горит, меньше 2,5 В – погашен.
ADC_test.hex
1.png
В железе не проверял. :)
sharmax
Открыл глаза
Сообщения: 78
Зарегистрирован: Сб янв 28, 2012 21:09:29

Re: AtTiny 13 и АЦП

Сообщение sharmax »

[uquote="akl",url="/forum/viewtopic.php?p=3896518#p3896518"]Попробуйте вместо RESET/PB5 какую либо другую.[/uquote]
Попробовал (2 ножка, порт 3). Не работает все - равно.

Добавлено after 1 minute 14 seconds:
[uquote="Самсусамыч",url="/forum/viewtopic.php?p=3896609#p3896609"]В железе не проверял. :)[/uquote]
Проверил. Работает!
Интересно было бы посмотреть код.
Выходит, что то я делаю не так. Но вот что???
Господа, просьба активнее оказывать помощь!
Самсусамыч

Re: AtTiny 13 и АЦП

Сообщение Самсусамыч »

Вам мой код ничего не расскажет… :) я пишу на неизвестном Вам языке… :write:
Вот скрин кода в исходнике…
2.png
Если хотите, то могу простыми словами рассказать про свой алгоритм. А Вы уже на своём программном языке попробуете это реализовать. :))
Последний раз редактировалось Самсусамыч Ср сен 23, 2020 22:21:27, всего редактировалось 1 раз.
sharmax
Открыл глаза
Сообщения: 78
Зарегистрирован: Сб янв 28, 2012 21:09:29

Re: AtTiny 13 и АЦП

Сообщение sharmax »

Алгоритм известен: считать содержимое регистра adcw и сравнить его с константой. А поди ж ты, не работает.
А может, и не adcw вовсе нужно читать?
Самсусамыч

Re: AtTiny 13 и АЦП

Сообщение Самсусамыч »

[uquote="sharmax",url="/forum/viewtopic.php?p=3896778#p3896778"]и не adcw вовсе нужно читать?[/uquote]
Не знаю, что у Вас там называется, :dont_know: но значение АЦП находится в двухбайтном регистре (ADCL; ADCH), при чём значение считается прочитанным когда читается значение из старшего регистра (ADCH). То есть если вначале прочитать старший регистр, то младший может быть потерян… :cry:
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Re: AtTiny 13 и АЦП

Сообщение Ivanoff-iv »

да, в кодевижен есть регистр ADCW (16 бит целиком) и ADCH ADCL (2 его части по 8 бит по отдельности) если нужны все 10бит - проще работать с ADCW, если достаточно точности 8 бит - можно включить выравнивание влево и брать данные только из ADCH.
П.С. смотрю давно маешься :( вечером постараюсь помочь.
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
sharmax
Открыл глаза
Сообщения: 78
Зарегистрирован: Сб янв 28, 2012 21:09:29

Re: AtTiny 13 и АЦП

Сообщение sharmax »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3896850#p3896850"]вечером постараюсь помочь.[/uquote]
Спасибо. Я очень буду ждать...
Ответить

Вернуться в «Теория»