Scroodge писал(а):Антон, извини за назойливость, но повторю вопрос: как на 8 меге собрать контроллер отопителя с индикацией из 8 светодиодов. Интересует код в avr studio 6. Спасибо!
Вот пример кода только в AVRStudio4, в шестую переделать не составит особого труда. Код для Atmega8. Все задержки поменять на указанные в скобках или по своему усмотрению, мин. задержки сделал для симуляции в протеусе
Код: Выделить всё
#include <avr/io.h>
#include <util/delay.h>
unsigned int adc_bufer = 0;
void start_pwm(void)
{
TCCR2 |= (1 << COM21)|(1 << WGM21)|(1 << WGM20)|(1 << CS20); // режим FAST PWM, сброс OC2 при сравнении
PORTB |= (1 << PB1); // включаем светодиод
}
void stop_pwm(void)
{
TCCR2 = 0x00; // выключаем таймер
OCR2 = 0x00;
TCNT2 = 0x00;
PORTB &= ~(1 << PB1); // Выключаем светодиод
}
int main (void)
{
PORTB = 0x00;
DDRB = 0b00000011; // PB0, PB1 - выход
DDRD = 0xFF;
PORTD = 0x00;
ADCSRA |= (1 << ADEN)|(1 << ADPS2)|(1 << ADPS1); // Включаем ADC, предделитель на 64
ADMUX |= (1 << ADLAR)|(1 << MUX0); // Помещаем результат в ADCH, Вход ADC1
ACSR |= (1 << ACD); // Отключаем аналаговый компаратор
stop_pwm(); // Выключаем ШИМ
ADCSRA |= (1 << ADSC); // начало преобразования
while((ADCSRA&(1 << ADIF)) == 0);
{
adc_bufer = ADCH; // Считываем ADC в буфер
}
if(adc_bufer > 50)
{
start_pwm();
for(char a=0; a < 32; a++)
{
_delay_ms(2); // 250ms
}
}
else
{
stop_pwm();
}
while(OCR2 < adc_bufer)
{
ADCSRA |= (1 << ADSC); // начало преобразования
while((ADCSRA&(1 << ADIF))== 0); // Ждем флага окончания преобразования
{
adc_bufer = ADCH; // Считываем ADC
}
OCR2++; // Плавный запуск мотора
_delay_ms(1); // 100ms
}
while(1)
{
ADCSRA |= (1 << ADSC); //Начинаем преобразование
_delay_ms(1);
while((ADCSRA&(1 << ADIF))== 0); // Ждем флага окончания преобразования
{
//adc_bufer = ADCH; // Считываем ADC
OCR2 = ADCH;
if (ADCH > 50)
PORTD = 0b00000001;
else
PORTD = 0b00000000;
if (ADCH > 75)
PORTD = 0b00000011;
if (ADCH > 100)
PORTD = 0b00000111;
if (ADCH > 125)
PORTD = 0b00001111;
if (ADCH > 150)
PORTD = 0b00011111;
if (ADCH > 175)
PORTD = 0b00111111;
if (ADCH > 200)
PORTD = 0b01111111;
if (ADCH > 225)
PORTD = 0b11111111;
}
if(ADCH > 50)
{
start_pwm();
}
else
{
stop_pwm();
}
if(ADCH > 51)
{
if(OCR2 < 50)
OCR2++;
_delay_ms(100); // 100ms
}
}
}