Go to most recent revision | Blame | Last modification | View Log | Download
#include ".\menic.h"
#define RAZENI 100 // Po kolika ms se bude menit rychlost pro rozjizdeni
#define REFNOM 107 // Hodnota odpovidajici 1,2V pri nominalnim zatizeni
#define REFSTART 80 // Hodnota odpovidajici 1,2V pri nezatizenych clancich
#define PIEZO PIN_A6 // Jeden pol piezo reproduktoru
#define LED PIN_A7 // LED
#define MENIC PIN_B3 // Spinani tranzistoru menice
#define REFPWR PIN_B1 // Napajeni zdroje referencniho napeti
#define MOTOR PIN_B2 // Spinani tranzistoru motoru
#byte SSPBUF = 0x13 // Registry jednotky SSP
#byte SSPCON1 = 0x14
#byte SSPSTAT = 0x94
// Vzorky pro generovani PWM pomoci SSP
unsigned int8 const Pattern[8] = {0x02,0x06,0x0e,0x1e,0x3e,0x7e,0xfe,0xff};
unsigned int8 MotorPattern;
#INT_SSP
void IntSSP()
{
SSPBUF=MotorPattern; // znovu vysli stejnou hodnotu
}
void pip() // pipnuti a bliknuti
{
int1 beep;
int i;
for(i=0; i<250; i++)
{
output_bit(PIEZO, beep);
beep=~beep;
output_bit(LED, beep);
delay_us(100);
};
output_high(PIEZO);
output_high(LED);
}
void cvak() // pouze cvaknuti piezoelementem bez bliknuti
{
output_bit(PIEZO,~input(PIEZO));
}
void main()
{
int8 n;
int8 perioda;
setup_adc_ports(ADC_CLOCK_INTERNAL|sAN4|VSS_VDD);
setup_adc(ADC_CLOCK_INTERNAL);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
setup_timer_1(T1_DISABLED);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
output_low(MENIC); // Vsechno zastav
output_low(MOTOR);
output_low(REFPWR);
output_high(LED);
output_high(PIEZO);
set_adc_channel(4); // Vyber AD kanal pro pomerne mereni napeti
set_pwm1_duty(0); // Spust PWM, ale zatim s trvalou 0 na vystupu
setup_ccp1(CCP_PWM); // PWM pro zatizeni clanku v seru
setup_timer_2(T2_DIV_BY_1,100,1); // perioda
setup_oscillator(OSC_4MHZ|OSC_INTRC); // rozjed PIC (zvysi se odber)
// jsme v depu?
set_pwm1_duty(2); // PWM pro zatizeni clanku pri malem osvetleni
n=0;
do
{
output_low(REFPWR);
delay_ms(100);
if (4==n++) {cvak(); n=0;};
output_high(REFPWR); // zapni napajeni napetove reference
delay_ms(1);
} while (read_adc()>REFSTART); // Odkryl starter clanky?
output_low(REFPWR);
pip(); // potvrzeni odstartovani
// regulace
perioda=100; // nastav optimalni periodu pri jedne 500W zarovce
for(n=0;n<=7;n++)
{
set_pwm1_duty(0);
setup_timer_2(T2_DIV_BY_1,perioda,1); // perioda
set_pwm1_duty(19); // delka sepnuti
delay_ms(100);
output_high(REFPWR); // zapni napajeni napetove reference
delay_ms(1);
if (read_adc()<REFNOM) perioda--; // zvyseni zatizeni menice
output_low(REFPWR); // konec mereni, odpoj napajeni reference
};
// nabíjíme
delay_ms(14000);
// rozjezd
SSPSTAT = 0;
SSPCON1 = 0x22; // SPI OSC/64
enable_interrupts(global);
for(n=0; n<=7; n++) // razeni osmi rychlostnich stupnu
{
disable_interrupts(INT_SSP); // zastav preruseni od SSP
MotorPattern=Pattern[n];
SSPBUF=MotorPattern; // data pro vyslani
enable_interrupts(INT_SSP); // az budou vyslana, prijde interrupt od SSP
delay_ms(RAZENI); // Pockej na dalsi razeni
};
SSPSTAT = 0;
SSPCON1 = 0; // SPI stop
disable_interrupts(INT_SSP); // zastav preruseni od SSP
// jedem co to da
output_high(MOTOR);
delay_ms(1000);
output_low(MOTOR);
set_pwm1_duty(0); // zastav menic
// vybiti kondenzatoru pro ucely mereni
pip();
delay_ms(2000);
pip();
output_high(MOTOR);
while(true)
{
output_high(LED);
output_low(PIEZO);
delay_ms(300);
output_low(LED);
output_high(PIEZO);
delay_ms(300);
}
// priprava na dalsi jizdu
delay_ms(5000);
reset_cpu();
}