@aitras попробую пока более простое для понимания, но вашу информацию забрал в заметки, спасибо!)
@солар спасибо!)
И то верно)
Похоже, что компилятор не в курсе, кто такие PB0...PB4 (например, "PB2 = Unknown identifier"). Библиотеки <avr/io.h> недостаточно или что не так?
Виснет при попытке входа в "while (1)" же.
И чисто в справочных целях:
MUX1 пишется только в таком порядке:
ADMUX |= (1 << REFS0) | (1 << ADLAR) | (1 << MUX1);
ADMUX |= (1 << MUX1);
Если в коде:
ADMUX |= (1 << REFS0) | (1 << ADLAR);
ADMUX |= (1 << MUX1);
то MUX1 == 0. Это нормально?
Актуальный код:
#define F_CPU 9600000UL
#include <avr/io.h>
#include <util/delay.h>
#define D1_ON() PORTB |= (1 << PB1) // Direction 1
#define D1_OFF() PORTB &= ~(1 << PB1) //
#define D2_ON() PORTB |= (1 << PB2) // Direction 2
#define D2_OFF() PORTB &= ~(1 << PB2) //
int max_current=5000; // max current (mA)
int action_delay=3000; // max time for openning/closing (ms)
void delay200(void) // delay function
{
_delay_ms(200); // delay of checking (ms)
ADCSRA |= (1 << ADSC); // start conversion
while (ADCSRA & (1 << ADSC)); // check for end of conversion
}
void action(void) // waiting for ending of action
{
int i;
for (i = 0; ((ADCH*1000) < max_current) & (i < action_delay); i += 200) // check for actual current and time
{
delay200();
}
}
int main(void)
{
DDRB |= (1 << PB1) | (1 << PB2);
ADMUX |= (1 << REFS0) | (1 << ADLAR) | (1 << MUX1); // Internal Voltage Reference, Left Adjust, Selected Channel is PB4
ADMUX |= (1 << MUX1);
ADCSRA |= (1 << ADEN) | (1 << ADPS1) | (1 << ADPS0); // ADC Enabled, Division Factor is 8
while (1)
{
while ((1 & PB0) == 0); // check for a positive input signal
_delay_ms(300); // signal length (ms)
if ((1 & PB0) == 1) // check for a true input signal
{
D1_ON(); // start opening
delay200();
if ((ADCH*1000) < max_current) // check for direction
{
action(); // continue opening
D1_OFF(); // end opening
}
else
{
D1_OFF(); // end opening
D2_ON(); // start closing
action(); // continue closing
D2_OFF(); // end closing
}
while ((1 & PB0) == 1); // check for a negative input signal
_delay_ms(300); // delay before new signal (ms)
}
}
}