ADVERTISEMENT

test-eta.c

Projekt kontrolera Attiny85 do odkurzacza ETA Milio z NiMH i PWM

zlepseny schemat i program Tłumaczenie: Ulepszony schemat i program.


Download file - link to post

// program vysavace ETA dobijeni - PWM

#include & lt; avr/interrupt.h & gt;
#include & lt; avr/io.h & gt;
#include & lt; avr/pgmspace.h & gt;
#include & lt; stdbool.h & gt;
#include & lt; stdio.h & gt;
#include & lt; stdlib.h & gt;
#include & lt; unistd.h & gt;

#define F_CPU 1000000UL
#include & lt; util/delay.h & gt;

#define DEBOUNCE_MILLISEC 20

#define dobijeni PB0
#define tlacitko PB1

void pwm_setup (void)
{
// Set Timer 0 prescaler to clock/64.

//TCCR0B |= (1 & lt; & lt; CS01) | (1 & lt; & lt; CS00);

// Set Timer 0 prescaler to clock/8.

//TCCR0B |= (1 & lt; & lt; CS01);

// Set Timer 0 no prescaler

TCCR0B |= (1 & lt; & lt; CS00);


// Set to 'Fast PWM' mode
TCCR0A |= (1 & lt; & lt; WGM01) | (1 & lt; & lt; WGM00);

// Clear OC0B output on compare match, upwards counting.
// TCCR0A |= (1 & lt; & lt; COM0B1);

// Clear OC0A output on compare match, upwards counting.
//TCCR0A |= (1 & lt; & lt; COM0A1);

// SET OC0A output on compare match, downwards counting.
TCCR0A |= (1 & lt; & lt; COM0A1) | (1 & lt; & lt; COM0A0); //inverze vystupu

}

void pwm_write (int val)
{
// OCR0B = val;
OCR0A = val;
}


void adc_setup (void)
{
// Set the ADC input to PB2/ADC1
ADMUX |= (1 & lt; & lt; MUX0);
ADMUX |= (1 & lt; & lt; ADLAR);

// Set the prescaler to clock/128 & enable ADC
ADCSRA |= (1 & lt; & lt; ADPS1) | (1 & lt; & lt; ADPS0) | (1 & lt; & lt; ADEN);
}

int adc_read (void)
{
// Start the conversion
ADCSRA |= (1 & lt; & lt; ADSC);

// Wait for it to finish
while (ADCSRA & (1 & lt; & lt; ADSC));

return ADCH;

}

static int pwm(void) { return (PINB & (1 & lt; & lt; PB3)) == 0; } //zapnuti dobijeni

int main (void)
{
int pwm_result = -1;
while (1) {
int setup;
{ int pwm_val = pwm();
setup = pwm_val != pwm_result;
pwm_result = pwm_val;
}

if (pwm_result) { // napeti_24V pripojeno

if (setup) {
// dobijeni PINB0 jako vystup
DDRB = (1 & lt; & lt; dobijeni);

adc_setup();
pwm_setup();
}

// cist ADC1 voltage hodnotu na PINB2
int adc_in = adc_read();
// zapsat hodnotu PINB2 do PWM /rozmitani/
pwm_write(adc_in);

} else { // napeti_24V odpojeno

if (setup) {
// tlacitko PINB1 jako vystup
DDRB = (1 & lt; & lt; tlacitko);

// zruseni pwm_setup()
TCCR0A =0;
}

uint8_t i = 0; // citani
uint8_t zmacknuto = 0; // tlacitko zmacknuto 0 false, 1 true

while (!pwm()) {

// cist ADC1 voltage hodnotu na PINB2
adc_setup();
int adc_in = adc_read();

if ( adc_in & lt; 140 ) {
PORTB = (0 & lt; & lt; PB1) | (0 & lt; & lt; PB0);
}

else if ( adc_in & gt; 140 ) {

if (((PINB & (1 & lt; & lt; PB4)) == 0) & & zmacknuto == 0 ) {
// PB4 je zmacknuto v 0, bylo setovano, zmacknuto tlacitko,
if(i & lt; 2) // cita mezi 0 az 2
i++;
else
i = 0;

PORTB = (1 & lt; & lt; i) | (1 & lt; & lt; PB4); // preklopi bit portu podle icka na zmacknute tlacitko PB4
zmacknuto = 1; // tlacitko zmacknuto
_delay_us(1000); // proti zachvevum tlacitka

} else if (((PINB & (1 & lt; & lt; PB4)) != 0) & & zmacknuto == 1 ) {
// PB4 je nezmacknuty v 1, bylo uvolneno tlacitko,
zmacknuto = 0; // reset tlacitko zmacknuto
_delay_us(1000); // proti zachvevum tlacitka
}
}
}
}
}
}