Цитата: Shaman от 14 Июль, 2022, 14:38This bit is set when an ADC conversion completes and the Data Registers are updated. The ADC Conversion Complete Interrupt is executed if the ADIE bit and the I-bit in SREG are set.
ADIF is cleared by hardware when executing the corresponding interrupt Handling Vector. Alter-natively, ADIF is cleared by writing a logical one to the flag. Beware that if doing a Read-Modify-Write on ADCSRA, a pending interrupt can be disabled. This also applies if the SBI and CBI
instructions are used.
Этот бит устанавливается, когда преобразование АЦП завершается и регистры данных обновляются. Прерывание завершения преобразования АЦП выполняется, если установлены бит ADIE и бит I в SREG. ADIF сбрасывается аппаратно при выполнении соответствующего вектора обработки прерывания. В качестве альтернативы ADIF очищается путем записи логической единицы во флаг. Имейте в виду, что при выполнении чтения-модификации-записи на ADCSRA ожидающее прерывание может быть отключено. Это также применяется, если SBI и CBI используются инструкции.
Цитата: Shaman от 15 Июль, 2022, 17:27выдержки из мануала. Я пока не нашел.Как это не нашёл, если мне же эту фразу и цитировал?
Цитата: Shaman от 15 Июль, 2022, 17:27А сигнал RD/WR чисто хардверный или может управляться тем кто пишет программу?Это сигнал арбитража шины, и он хардверный (и не единственный). Но косвенно программист на него влияет, например, когда пишет ReadPort или ReadRAM (команды чисто условные). Формируется же непосредственно шинным контроллером, который у ATmega спрятан где-то внутри, как и сама шина. Вообще, хорошо бы поизучать построение вычислительных систем, начиная с i8080 или с той же Моторолы (правда, у нас она мало распространена, зато i8080 как грязи), там шинный контроллер - устройство частично внешнее (частично всё-таки в чипе CPU, который и задаёт правила его работы), но зато сама шина полностью открыта для фантазий конструктора. Другое дело, что по скорости та же Mega кроет его как... но это другой вопрос.
Цитата: Slabovik от 14 Июль, 2022, 18:21В даташите чётко написано, что сброшенное состояние "0", но для получения "0" при чтении записать надо "1".
Цитата: Slabovik от 14 Июль, 2022, 18:21Вот это: if (ADCSRA & (1<<4))
Цитата: Slabovik от 14 Июль, 2022, 18:21ADTS не вижу, где задан...Пример писался для Атмеги8, в ней нет регистра ADCSRB а соответственно и бита ADTS. А также 5 бит в регистре ADCSRА называется ADFR вместо ADATE и просто включает режим FreeRunning. Комментарий остался от кода для 328-й, забыл исправить
Цитата: Slabovik от 14 Июль, 2022, 18:21И всегда (подчеркну: ВСЕГДА) это разные наборы.Ок, очень ценная информация. А сигнал RD/WR чисто хардверный или может управляться тем кто пишет программу? Если нет, то тогда интересно зачем сделана такая реализация?
Цитата: Slabovik от 14 Июль, 2022, 18:21PortB используется для контрольки?В основной программе для отладки, потом удалю, а в примере из видео для вывода индикации.
Цитата: Slabovik от 14 Июль, 2022, 18:21Для некоторого ускорения работы программы,Да, благодарю, я потом так и делаю просто в СИ я новичок и так мне проще запустить незнакомый код и отследить где он не работает и уж потом упрощать.
ЦитатаЕсли написано что для сброса состояния нужно записать 1 значит в регистре это бит выставится в 1. А значит сброшенное состояние 1не является верным. В даташите чётко написано, что сброшенное состояние "0", но для получения "0" при чтении записать надо "1". Это не только у Mega такой прикол, это и у Tiny аналогично, и на форумах тоже часть народ недопонимает это место. Но ещё раз скажу: лучше проверить, поскольку у меня, не часто практикующего последнее время, в голове набор приёмов для кучки разных процессоров и ядер, поэтому где-то могу и ошибиться. Но документация - наше всё, я её и толкую. Ладно, поехали дальше.
Цитата: Slabovik от 14 Июль, 2022, 15:13зы: подозреваю, что есть некоторое заблуждение относительно того, что в реальности из регистра вовсе не обязано читаться то, что туда было записано. Ибо регистр записи и регистр чтения - это разные устройства.
#define F_CPU 1000000UL
#include <avr/io.h>
int main(void)
{
DDRB |= (1<<2) | (1<<1) | (1<<0);
PORTB &= ~((1<<2) | (1<<1) | (1<<0));
DDRC &= ~(1<<1);
//Настраиваем АЦП
ADCSRA |= (1<<ADEN); //разрешаем работу АЦП,
ADCSRA |= (1<<ADFR); //разрешаем работу АЦП с тригера
ADCSRA &= ~(1<<ADPS2);
ADCSRA |= (1<<ADPS1) | (1<<ADPS0); //частота дискретизации 125 кГц
ADMUX |= (1<<REFS1) | (1<<REFS0); //используем внутреннее опорное напряжение
ADMUX |= (1<<ADLAR); //правостороннее выравнивание
ADMUX &= ~((1<<MUX3) | (1<<MUX2) | (1<<MUX1)); //выставляем в качестве входа АЦП порт PC0
ADMUX |= (1<<MUX0);
ADCSRA |= (1<<ADSC); //запускаем АЦП
while (1)
{
if (ADCSRA & (1<<4))
{
if (ADC >= 600) //в место 600 нужно подставить необходимое заначение для опорного напряжения 1,1 V
{
PORTB |= (1<<0);
PORTB &= ~(1<<1);
PORTB &= ~(1<<2);
}
if (ADC >= 560 && ADC < 600) //в место 600 нужно подставить необходимое заначение для опорного напряжения 1,1 V
{
PORTB &= ~(1<<0);
PORTB |= (1<<1);
PORTB &= ~(1<<2);
}
if (ADC < 560) //в место 600 нужно подставить необходимое заначение для опорного напряжения 1,1 V
{
PORTB &= ~(1<<0);
PORTB &= ~(1<<1);
PORTB |= (1<<2);
}
ADCSRA |= (1<<4);
}
}
}
Цитата: Slabovik от 14 Июль, 2022, 10:03сброшенное состояние ADIF это 1а из даташита цитируешь, что "для сброса ADIF запишите в него "1". Разве это одно и то же? Это совершенно разные вещи. Первое - это состояние. Второе - действие для изменения состояния.