Страница 1 из 2

AtTiny 13 и АЦП

Добавлено: Ср май 20, 2020 16:54:08
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В?)
Заранее спасибо за содержательные ответы.

Re: AtTiny 13 и АЦП

Добавлено: Ср май 20, 2020 20:26:19
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

      };
}


Re: AtTiny 13 и АЦП

Добавлено: Ср май 20, 2020 20:46:08
АлександрЛ
[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), вполне пригодный для решения ВАШЕЙ задачи.. На один вход подаёте "опорное" напряжение, на второй - измеряемое..

зы.. (имхо) И компаратор работает быстрее, чем АЦП..

Re: AtTiny 13 и АЦП

Добавлено: Чт май 21, 2020 07:35:52
pyzhman
И будет сравнивать с Vref, а нужен заданный гистерезис и определенной напряжение.

Re: AtTiny 13 и АЦП

Добавлено: Чт май 21, 2020 07:49:10
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:
И для такой "сложнейшей" задачи вы хотите использовать целый АЦП?
Нет конечно. Я привел простейший пример.
Что такое компаратор, мне известно. Даже есть самоделка. Но если в аналоговом компараторе я могу выбрать ширину гистерезиса резистором (между входом и выходом), то как сделать этот гистерезис здесь, непонятно - приходится вводить задержки, что не всегда удобно.

Re: AtTiny 13 и АЦП

Добавлено: Чт май 21, 2020 08:14:17
pyzhman
В визарде выберите однократное преобразование, прижатый к левому краю формат (байт на выходе, а не 10 бит) и опорное напряжение питания Vcc.
В программе вызывайте adc_read() с нужным каналом. После вызова сравнивайте. 3 вольта это 255/5*3= 153, а 2,5 вольта это 255/5*2,5= 128.

Re: AtTiny 13 и АЦП

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

Re: AtTiny 13 и АЦП

Добавлено: Ср сен 23, 2020 12:11:53
sharmax
pyzhman писал(а):Вот, например https://tiny13digest.ru/datasheet-attiny13-na-russkom/. Не благодарите
Вы извините, там переведено только первые 2-3 темы. Что касается АЦП - "здесь ничего нет"

Re: AtTiny 13 и АЦП

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

Re: AtTiny 13 и АЦП

Добавлено: Ср сен 23, 2020 13:26:31
pyzhman
[uquote="sharmax",url="/forum/viewtopic.php?p=3896469#p3896469"]
pyzhman писал(а):.. Не благодарите
Вы извините...[/uquote]
Я такого не писал. См. выше. Извинения приняты.

Re: AtTiny 13 и АЦП

Добавлено: Ср сен 23, 2020 13:51:11
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-ричной системе) - светодиод включить, иначе - выключить.
Компилирую, программирую, устанавливаю на макетную плату. И тишина... Как ни крути движок - светодиод не зажигается.
В чем моя ошибка?

Re: AtTiny 13 и АЦП

Добавлено: Ср сен 23, 2020 14:08:01
akl
Ваш рисунок показывает, что выбрана самая неудачная лапа для подключения сигнала. Попробуйте вместо RESET/PB5 какую либо другую.

Re: AtTiny 13 и АЦП

Добавлено: Ср сен 23, 2020 14:11:40
sharmax
Хорошо, вечером. Но рассуждения мои верные?

Re: AtTiny 13 и АЦП

Добавлено: Ср сен 23, 2020 17:32:39
Самсусамыч
Тестовая прошивка для проверки работы АЦП, МК тини13. Тактируется на заводской установке (1,2 МГц) – Фьюзы прошивать не нужно. На входе РВ4 больше 2,5 В – светик горит, меньше 2,5 В – погашен.
ADC_test.hex
1.png
В железе не проверял. :)

Re: AtTiny 13 и АЦП

Добавлено: Ср сен 23, 2020 21:04:25
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 и АЦП

Добавлено: Ср сен 23, 2020 22:14:19
Самсусамыч
Вам мой код ничего не расскажет… :) я пишу на неизвестном Вам языке… :write:
Вот скрин кода в исходнике…
2.png
Если хотите, то могу простыми словами рассказать про свой алгоритм. А Вы уже на своём программном языке попробуете это реализовать. :))

Re: AtTiny 13 и АЦП

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

Re: AtTiny 13 и АЦП

Добавлено: Ср сен 23, 2020 22:28:46
Самсусамыч
[uquote="sharmax",url="/forum/viewtopic.php?p=3896778#p3896778"]и не adcw вовсе нужно читать?[/uquote]
Не знаю, что у Вас там называется, :dont_know: но значение АЦП находится в двухбайтном регистре (ADCL; ADCH), при чём значение считается прочитанным когда читается значение из старшего регистра (ADCH). То есть если вначале прочитать старший регистр, то младший может быть потерян… :cry:

Re: AtTiny 13 и АЦП

Добавлено: Чт сен 24, 2020 06:42:25
Ivanoff-iv
да, в кодевижен есть регистр ADCW (16 бит целиком) и ADCH ADCL (2 его части по 8 бит по отдельности) если нужны все 10бит - проще работать с ADCW, если достаточно точности 8 бит - можно включить выравнивание влево и брать данные только из ADCH.
П.С. смотрю давно маешься :( вечером постараюсь помочь.

Re: AtTiny 13 и АЦП

Добавлено: Чт сен 24, 2020 08:31:45
sharmax
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3896850#p3896850"]вечером постараюсь помочь.[/uquote]
Спасибо. Я очень буду ждать...