Это моя первая попытка разобраться в микроконтроллерах, так что прошу сильно не пинать, а, наоборот, помочь по возможности.
Итак. Attiny13. Фотодатчик. Алгоритм такой - АЦП снимает напряжение и сравнивает его с двумя пороговыми (заданными в программе). Если напряжение превысит верхний пороговый уровень, то на выходе МК - лог. 1, если напряжение снизится ниже нижнего порогового уровня, то МК ждет 30 сек и еще раз проводит измерение напряжения, если оно и после этого ниже нижнего уровня - то на выходе лог. 0.
Программу писал в Atmel Studio 7, на С. Компилятор ошибок не показал. Загнал программу в Proteus - на выходе постоянно лог. 1.
Сам, ессно, буду разбираться и искать, но если кто подскажет - буду очень признателен. И еще, подскажите, что можно почитать про C для МК AVR. Есть Прокопенко и Белов.
Текст программы:
/*
* project photocell.c
*
* Created: 06.12.2015 15:30:58
* Author : seagull
*/
#include <avr/io.h>
#include <avr/iotn13.h>
#include <util/delay.h>
int main(void)
{
// Конфигурирование порта B PORT4 (нога 3) на выход
DDRB=(0<<DDB5) | (1<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);
PORTB=(0<<PORTB5) | (1<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
// Отключение компаратора
ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIS1) | (0<<ACIS0);
// Отключение таймера
TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (0<<WGM00);
TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (0<<CS00);
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
// Запрет прерываний
GIMSK=(0<<INT0) | (0<<PCIE);
MCUCR=(0<<ISC01) | (0<<ISC00);
TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (0<<TOIE0);
// Конфигурирование АЦП
ADCSRA=(1<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0);
ADCSRB=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0);
ADMUX=(1<<REFS0) | (1<<ADLAR) |(0<<MUX0)| (0<<MUX1); // Смещение результата влево, Аналоговый сигнал на PB5
unsigned int pcon; // Порог включения
unsigned int pcoff; // Порог выключения
unsigned int tdelay; // Время задержки
char temp; // Стартовое положение
unsigned int vv; // Измереное напряжение
char v_temp;
unsigned int v;
pcon=4.9/5*1024; // Задать порог включения
pcoff=4.4/5*1024; // Задать порог выключения
tdelay=30000; // Задать время задержки
temp=1; // Датчик включен
v_temp=1;
_delay_us(50);
while (1)
{
ADCSRA|=(1<<ADSC); //Начать преобразование
while (!(ADCSRA & (1<<5)));
// loop_until_bit_is_set(ADIF); // while ((ADCSRA&_BV(ADIF))==0x00); //Дождаться окончания преобразования
v=ADCH;
ADCSRA|=(0<<ADSC);
ADCSRA|=(0<<ADIF);;
if (vv>=pcon)
{
temp=1;
v_temp=1;
goto link;
}
if (vv<=pcoff && temp==1)
{
temp=0;
_delay_ms(tdelay);
goto link;
}
if (vv<=pcoff && temp==0)
{v_temp=0;
goto link;
}
link:
PORTB|=(v_temp<<PORTB4);
}
}
И сама программа:
- Вложения
-
- main.c
- (2.07 КБ) 392 скачивания


