Что то я запутался в старых граблях... Нужно включить АЦП, подождать завершения преобразования, получить 8-битный результат и сравнить его с заданным.
Если результат выше заданного - задать переменной power_limit значение "1", которое не должно изменяться на протяжении работы всей программы.
Сброс переменной power_limit в "0" должно происходить после отключения питания микроконтролера.
Но этого не происходит! В симуляторе естественно все работает. В живую - нет.
Ждал ADIF =0 в цикле, так же ждал ADSC=0 в цикле и не фига...
Курил SREG, но видимо мало...
Короче уже 3 часа ипусь...
Освежите плиз заскорузглою мою память)) Спс!
Тестовый код:
Код: Выделить всё
volatile unsigned int adc_val;
int power_limit=0;
int main(void){
DDRB=1<<DDB3|0<<DDB2|1<<DDB0;
PORTB=0<<PB3|1<<PB2|0<<PB0;
ADMUX=0<<REFS0|1<<ADLAR|1<<MUX0;
ADCSRA=1<<ADEN|1<<ADATE|1<<ADSC|1<<ADPS1|1<<ADPS2;
while(1){
ADCSRA|=1<<ADSC;
while ((ADCSRA & (1 << ADIF)) == 0) {
adc_val = ADCH;}
if(adc_val >150) { PORTB |=(1<<PB3); power_limit=1;} else {PORTB&=~(1<<PB3);power_limit=0;}
if (power_limit>=1) {PORTB|=1<<PB0; power_limit=0;}
}
}Если работать в 10-битном режиме (то бишь ADLAR=0 и читать изначально ADCL), - все то же самое.
Если подождать 30 мил. сек. , а затем принимать результат преобразования - то все работает.
Но это как то не есть правильно на мой взгляд.
Вопрос: Почему переменная АЦП, до начала преобразования, равна максимуму (то есть if ADC = 150 при запуске программы истинно, хотя физически это не так).
Точнее работает так: вкл. питания--запуск АЦП--получение результата--сравнение (adc_val >150)--если да-вкл светодиод. При первом запуске это работает. После наступления истинности (adc_val >150) и последующем выкл\вкл питания МК истинность (adc_val >150) остается (30 микросекунд) истинной, хотя в реальность adc_val<50 например...
Где то я проеб момент в Datashet аля SREG например, но потратив уже 3 часа на "это" утомилсО.
Короче, нужен свежий взгляж на даташит в сравнении с моей "творчестью")))
СПС
UPD: Еще проще по просьбе трудящихся: нужно что бы после наступления power_limit=1 и последующей перезагрузке микроконтроллера power_limit=0. УСЁ


