#include #include #include // PINC #define LS 1 #define NOT_AUS 2 #define T_START 3 #define T_STOP 4 #define VENTIL 5 // PIND #define AMPEL1_ROT 0 #define AMPEL1_GRUN 1 #define AMPEL2_ROT 2 #define AMPEL2_GRUN 3 #define MOTOR 4 #define STATUS1 6 #define STATUS2 5 #define OR_LED 7 // PINB #define SIRENE 0 uint8_t Befullvorgang = 0; uint8_t FZS_En = 0; //FehlerzählschleifeEnable uint8_t FZS = 0; uint8_t OR_LED_En = 0; uint8_t Sirene_En = 0; uint8_t Status_En = 0; uint8_t TMR2Hz = 0; uint16_t ADC_MIN = 200; // ADC 10-Bit (0 - 1024) 5V/1024 = 4,88mV/Einheit uint16_t ADC_MAX = 600; uint8_t LKWZS = 0; uint8_t LKWZS_En = 0; void ADC_Init(void) { uint16_t result; // interne Referenzspannung als Refernz für den ADC wählen: //ADMUX = (1<= 10) Alarm(); // Befüllen dauert zu lange if(PINC & (1 << LS)) Alarm(); // Lichtschranke während des befüllens nicht mehr unterbrochen if(ADC_Read(0) < ADC_MIN) Alarm(); // Waage ist kleiner als LKW mindestgewicht } void Alarm(void) { while(1) { PORTD |= (1 << AMPEL1_ROT); PORTD |= (1 << AMPEL2_ROT); PORTD &= ~(1 << AMPEL1_GRUN); PORTD &= ~(1 << AMPEL2_GRUN); PORTD &= ~(1 << MOTOR); PORTC &= ~(1 << VENTIL); OR_LED_En = 1; Sirene_En = 1; Status_En = 1; } } void LKWWeg(void) { PORTD |= (1 << AMPEL1_ROT); PORTD |= (1 << AMPEL2_GRUN); PORTD &= ~(1 << AMPEL1_GRUN); PORTD &= ~(1 << AMPEL2_ROT); while (LKWZS <= 3) { // LS muss min 3 sek. offen sein if(PINC & (1 << LS)) { //LICHTSCHRANKE OFFEN LKWZS_En = 1; // Zählschleife aktivieren } else { LKWZS = 0; // Lichtschranke wieder unterbochen, Zählschleife zurücksetzen } } Befullvorgang = 0; // Abgeschlossen, alles auf Anfang } ISR(TIMER0_OVF_vect) { TCNT0 = 11; TMR2Hz++; if(TMR2Hz == 7) { if(Sirene_En) PORTB ^= ( 1 << SIRENE ); // Sirene toggeln } else if(TMR2Hz == 15) { if(LKWZS_En) LKWZS++; // LKW ist Weg-Zählschleife if(Sirene_En) PORTB ^= ( 1 << SIRENE ); // Sirene nochmal toggeln (2Hz) if (OR_LED_En) PORTD ^= ( 1 << OR_LED ); // OR Blitzleuchte im sektakt toggoln if (Status_En) { PORTD |= (1 << STATUS2); PORTD ^= ( 1 << STATUS1 ); // status-duo-led im sektakt toggeln } if(FZS_En) FZS++; // ggf. fehlerzählschleife +1 TMR2Hz = 0; } } int main(void) { DDRC = 0x20; // 1 = Ausgang PORTC = 0x1F; // Alle Pull-Ups an DDRD = 0xFF; // 1 = Ausgang DDRB = 0x01; // 0 und 1 Ausgang ADC_Init(); TIMSK |= (1 << TOIE0); TCCR0 |= (1 << CS00) | (1 << CS02); TCNT0 = 0xFF; sei(); PORTD |= (1 << STATUS1); PORTD &= ~(1 << STATUS2); while(1) { LKWZS = 0; //alles auf Anfang FZS = 0; LKWZS_En = 0; FZS_En = 0; if(PINC & (1 << LS)) { //LICHTSCHRANKE OFFEN PORTD |= (1 << AMPEL1_GRUN); PORTD |= (1 << AMPEL2_ROT); PORTD &= ~(1 << AMPEL1_ROT); PORTD &= ~(1 << AMPEL2_GRUN); } else { //LICHTSCHRANKE UNTERBROCHEN PORTD |= (1 << AMPEL1_ROT); PORTD |= (1 << AMPEL2_ROT); PORTD &= ~(1 << AMPEL1_GRUN); PORTD &= ~(1 << AMPEL2_GRUN); while(PINC & (1 << T_START)){ } Befullvorgang = 1; while (Befullvorgang){ Fehler(); if(!(PINC & (1 << T_STOP))) { // Manuell Stop // oder if(ADC_Read(0) > ADC_MAX) { // ADC_MAX überschritte (LKW ist voll) PORTD &= ~(1 << MOTOR); PORTC &= ~(1 << VENTIL); PORTD &= ~(1 << OR_LED); OR_LED_En = 0; FZS = 0; LKWWeg(); // Fkt um zu checken, ob Befüllplatz frei ist } } else { PORTD |= (1 << MOTOR); PORTC |= (1 << VENTIL); OR_LED_En = 1; // Motor an, Ventil auf, Blitzleuchte enable } } } } }