#include #include #include #include #define STRINGIZE(s) #s #define S(s) STRINGIZE(s) // Button: PA4 // Ready-LED: PA5 // Motor: PA6 // Heizung: PA7 // UART-Steuerung #define UART_TX_DDR DDRA #define UART_TX_PORT PORTA #define UART_TX PA0 #define UART_Baud 9600 #include #include // Laminatorsteuerung #define motor_an() PORTA |= (1 << PA6) #define motor_aus() PORTA &= ~(1 << PA6) #define heizung_an() PORTA |= (1 << PA7) #define heizung_aus() PORTA &= ~(1 << PA7) #define Temperatur 180 volatile unsigned char timer_divisor = 0; volatile unsigned int measurement_divisor = 0; volatile unsigned int motorcontrol_divisor = 0; volatile unsigned char motorcontrol = 0; volatile unsigned char button_debounce = 0; volatile bool last_button_state = 0; volatile bool motor_feed = 0; volatile bool ready = 0; int main(void) { ADMUX = (0 << REFS1) | (1 << REFS0) | (0b00010); // Externe Referenz, ADC2 ADCSR = (1 << ADEN) | (0b110); // ADC Prescaler 64, 125kHz ADCfrequenz bei 8Mhz Takt DDRA |= (1 << PA5) | (1 << PA6) | (1 << PA7); // Ausgänge : Ready-LED, Motor, Heizung PORTA |= (1 << PA4); // Pull-Up für Button rs232_init_tx(); motor_an(); // Motor zum aufheizen durchlaufen lassen heizung_an(); rs232_send("Laminator Controller by The-PoWl.de"); rs232_send("Preset temperatur: " S(Temperatur) "°C"); sei(); TCCR0 = (1 << CS00); // Timer0 mit Prescaler 1 TIMSK = (1 << TOIE0); // Timer0 Overflow Interrupt enabled while(1); } ISR(TIMER0_OVF0_vect) { // 8.000.000 / 256 = 31250 / 31 = ~1008 ISRs/s bzw. 0,992ms/ISR if(timer_divisor == 31) { timer_divisor = 0; // 1008 ISRs/s / 1008 = 1 ISRs/s bzw. 1s/ISR if(measurement_divisor == 1008) { measurement_divisor = 0; // Temperaturmessung + Heizungssteuerung ADCSR |= (1 << ADSC); // ADC Messung starten loop_until_bit_is_set(ADCSR, ADIF); unsigned int buffer; char sendbuffer[5]; buffer = ADC; sendbuffer[0] = (buffer / 1000) + 48; buffer %= 1000; sendbuffer[1] = (buffer / 100) + 48; buffer %= 100; sendbuffer[2] = (buffer / 10) + 48; buffer %= 10; sendbuffer[3] = buffer + 48; sendbuffer[4] = 0; rs232_send(sendbuffer); if(ADC > 380 - Temperatur) { heizung_an(); } else { heizung_aus(); if(!ready) { PORTA |= (1 << PA5); // Ready ready = 1; motor_aus(); } } } // Wenn ready if(ready) { // Tasterkennung + Entprellung if(last_button_state != bit_is_clear(PINA, PA4) && !button_debounce) { button_debounce = 10; // 10ms Prellzeit if(bit_is_clear(PINA, PA4)) // Nur auf fallende Flanke reagieren { rs232_send("Tipp :-]"); if(motor_feed) { motor_aus(); motor_feed = 0; motorcontrol_divisor = 0; // Motorsteuerung zurücksetzen motorcontrol = 0; } else { motor_an(); motor_feed = 1; } } last_button_state = bit_is_clear(PINA, PA4); } if(button_debounce) { button_debounce--; } // 1008 ISRs/s / 504 = 2 ISRs/s bzw. 0.5s/ISR // Wenn Motorvorlauf nicht aktiv if(motorcontrol_divisor == 504 && !motor_feed) { motorcontrol_divisor = 0; // Motorsteuerung, 0.5s AN, 2s AUS if(motorcontrol == 0) { motor_an(); } if(motorcontrol == 1) { motor_aus(); } if(motorcontrol < 4) { motorcontrol++; } else { motorcontrol = 0; } } motorcontrol_divisor++; } measurement_divisor++; } timer_divisor++; }