Уважаемые коллеги, добрый день. Прошу прощения, возможно, вопрос и глупый, но ответа на него найти не могу нигде - если подобное и рассматривается, то только с ЖК дисплеями и в оболочках, отличных от той, с чем я учусь работать - 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В?)
Заранее спасибо за содержательные ответы.
[uquote="sharmax",url="/forum/viewtopic.php?p=3843969#p3843969"]Единственное что можно выбрать - Auto trigger source.[/uquote]
Неправда. Там все, что нужно для начальной инициализации, есть.
И при чем тут вообще оболочка? Для выполнения задачи нужно понимать, как работает тот или иной узел контроллера, и как им управлять. Это все есть в даташите или огромном числе учебников. Там все, что вам нужно, подробнейшим образом разжевано. Чип далеко не молод . Как вообще в инете можно не найти такой ерунды?
При написании кода нужно просто читать из регистров АЦП нужную информацию, и с чем нужно её сравнивать.
Ниже простейший пример, где настраивается АЦП.
В примере "drill.c" потенциометр управляет моторчиком путем изменения параметров ШИМа. Спойлер
[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), вполне пригодный для решения ВАШЕЙ задачи.. На один вход подаёте "опорное" напряжение, на второй - измеряемое..
зы.. (имхо) И компаратор работает быстрее, чем АЦП..
[uquote="metan",url="/forum/viewtopic.php?p=3844061#p3844061"][uquote="sharmax",url="/forum/viewtopic.php?p=3843969#p3843969"]
Как вообще в инете можно не найти такой ерунды?
[/uquote]
Если б это было так просто, я таких вопросов не задавал. Все ссылаются на даташиты. Но они все на Английском!!! Если поделитесь ссылкой на русский вариант - буду благодарен.
Добавлено after 2 minutes 16 seconds:
И для такой "сложнейшей" задачи вы хотите использовать целый АЦП?
Нет конечно. Я привел простейший пример.
Что такое компаратор, мне известно. Даже есть самоделка. Но если в аналоговом компараторе я могу выбрать ширину гистерезиса резистором (между входом и выходом), то как сделать этот гистерезис здесь, непонятно - приходится вводить задержки, что не всегда удобно.
В визарде выберите однократное преобразование, прижатый к левому краю формат (байт на выходе, а не 10 бит) и опорное напряжение питания Vcc.
В программе вызывайте adc_read() с нужным каналом. После вызова сравнивайте. 3 вольта это 255/5*3= 153, а 2,5 вольта это 255/5*2,5= 128.
[uquote="sharmax",url="/forum/viewtopic.php?p=3843969#p3843969"]Если б это было так просто, я таких вопросов не задавал. Все ссылаются на даташиты. Но они все на Английском!!![/uquote]
Я еще раз спрошу, КАК это возможно? КАК?
В первой же пятерке результатов поиска по "attiny13a datasheet на русском pdf" вылезает все, что нужно.
Вот, например https://tiny13digest.ru/datasheet-attiny13-na-russkom/. Не благодарите
Ничего не понимаю.
Не найдет и шлюху в борделе...
[uquote="sharmax",url="/forum/viewtopic.php?p=3896469#p3896469"]Вы извините, там переведено только первые 2-3 темы. Что касается АЦП - "здесь ничего нет"[/uquote]Открою маленький секрет. The language of datasheets is not English. Даташиты пишутся на упрощённом международном языке, который всяк поймёт, ибо там нет ничего страшного, кроме латиницы. Мало того, всегда лучше читать даташиты именно в оригинале. Когда только появился в СССР "аналог" микропроцессора i8080, появилась и литература по нему. Переведённая. Зачем-то вместе с терминами и аббревиатурами. Вот где пришлось мозги заправлять, запоминая два варианта и соответствие между ними. Ладно хоть мнемоники команд догадались оставить оригинальные.
Итак, господа, продолжим.
Собрал схему - см. рис. 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
// 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-ричной системе) - светодиод включить, иначе - выключить.
Компилирую, программирую, устанавливаю на макетную плату. И тишина... Как ни крути движок - светодиод не зажигается.
В чем моя ошибка?
Тестовая прошивка для проверки работы АЦП, МК тини13. Тактируется на заводской установке (1,2 МГц) – Фьюзы прошивать не нужно. На входе РВ4 больше 2,5 В – светик горит, меньше 2,5 В – погашен.
[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]
Проверил. Работает!
Интересно было бы посмотреть код.
Выходит, что то я делаю не так. Но вот что???
Господа, просьба активнее оказывать помощь!
[uquote="sharmax",url="/forum/viewtopic.php?p=3896778#p3896778"]и не adcw вовсе нужно читать?[/uquote]
Не знаю, что у Вас там называется, но значение АЦП находится в двухбайтном регистре (ADCL; ADCH), при чём значение считается прочитанным когда читается значение из старшего регистра (ADCH). То есть если вначале прочитать старший регистр, то младший может быть потерян…
да, в кодевижен есть регистр ADCW (16 бит целиком) и ADCH ADCL (2 его части по 8 бит по отдельности) если нужны все 10бит - проще работать с ADCW, если достаточно точности 8 бит - можно включить выравнивание влево и брать данные только из ADCH.
П.С. смотрю давно маешься вечером постараюсь помочь.
Для тех, кто не учил магию мир полон физики
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...