zlepseny schemat i program Tłumaczenie: Ulepszony schemat i program.
// 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
}
}
}
}
}
}