Смекни!
smekni.com

Транзисторний перетворювач з дроселем в первинному ланцюзі (стр. 3 из 3)




Подпрограмма установок и инициализации

//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);

}

}