Подпрограмма установок и инициализации
//Watchdog initialize
// prescale: 2048K
void watchdog_init(void)
{
WDR(); //this prevents a timout on enabling
WDTCR = 0x0F; //WATCHDOG ENABLED - dont forget to issue WDRs
}
void port_init(void) //инициализация портов
{
DDRA = 0b00110100;
PORTA = 0b000000000;
DDRD = 0b11111111;
PORTD = 0b00000000;
DDRB =0b11111111;
PORTB = 0b00000000;
}
void timer1_init(void) //инициализация таймера на время 18мкс
{
TCCR1B = 0x00; //stop
TCNT1H = 0x3C; //setup
TCNT1L = 0xB0;
OCR1AH = 0xC3;
OCR1AL = 0x50;
OCR1BH = 0xC3;
OCR1BL = 0x50;
ICR1H = 0xC3;
ICR1L = 0x50;
TCCR1A = 0x00;
}
void init_devices(void) //инициализация устройств
{
CLI();
watchdog_init();
port_init();
timer1_init();
SREG = 0b10000000;
ADCSRA = 0b10000110; //инициализация АЦП (режим)
ADMUX = 0b11100011; // инициализация АЦП (выбор РА3)
MCUCR = 0x00;
TIMSK = 0x04; //прерывание по таймеру 1
GICR = 0x00;
SEI();
}
Подпрограмма функций
unsignedint out,set ,Ton;
int high,low,b,tint1,des,edi;
int mas_code[10]={0b01000000,0b01111001,0b00100100,0b00110000,
0b00011001,0b00010010,0b00000010,0b01111000,0b00000000,0b00010000};
void BCD(int b) //BCD-преобразование
{
des=((b%100)/10);
edi=((b%100)%10);
}
void delay_mcs(unsignedint tmp) //задержка
{
unsignedint tmp1;
tmp1=tmp*10;
while(tmp1>0)
{tmp1--;}
}
void start(void) //функция запуска стабилизатора
{
ADCSRA = 0b11000110; //запуск АЦП
delay_mcs(10);
low=ADCL; high=ADCH;
ADCSRA = 0b01000110; //остановка АЦП
Uin = high;
while(Uin != 0)
{delay_mcs (100);}
PORTA = 0b000000100; //VT1
}
void vol(void) //определение напряжения нагрузки и необходимого тока за 2мкс, индикация
{
ADMUX = 0b11110000; // инициализация АЦП (выбор РА0,РА1)
ADCSRA = 0b11000110; //запуск АЦП
low=ADCL; high=ADCH; //считывание напряжения
out = high; //запись в регистр
ADCSRA = 0b01000110; //остановка АЦП
ADMUX = 0b11100110; // инициализация АЦП (выбор РА6)
ADCSRA = 0b11000110; //запуск АЦП
low=ADCL; high=ADCH; //считывание напряжения
set = high; //запись в регистр
ADCSRA = 0b01000110; //остановка АЦП
if(out<set) {Ton++;}
if(out>set) {Ton--;}
BCD(set);
PORTB= mas_code[edi];
PORTD= mas_code[des];
}
#pragma interrupt_handler timer1_ovf_isr:9
void timer1_ovf_isr(void) //подпрограмма прерывания по таймеру 1
{
tint1 = 1;
TCNT1H = 0x3C;
TCNT1L = 0xB0;
}
Основная программа:
// Target : M16
// Crystal: 10.000Mhz
#include <iom16v.h>
#include <init.h>
#include <functions.h>
#include <math.h>
#include <macros.h>
unsignedint T;
void main(void)
{
init_devices();
start();
PORTA&0b001000000 = 0;
PORTA&0b000100000 = 0;
Ton = 10;
while(1)
{
vol();
tint1=0;
TCCR1B = 0x01; //запуск таймера
T = 0;
while (T<=Ton){ PORTA&0b001000000 = 1;T++}
else { PORTA&0b001000000 = 0; PORTA&0b000100000 = 0;} //VT2
while(tint1 != 1)delay_mcs(0);
vol();
tint1=0;
TCCR1B = 0x01; //запуск таймера
T = 0;
while (T<=Ton){ PORTA&0b000100000 = 1;T++}
else { PORTA&0b001000000 = 0; PORTA&0b000100000 = 0;} //VT3
while(tint1 != 1)delay_mcs(0);
}
}