$regfile = "attiny44.dat" $crystal = 1000000 $lib "mcsbyteint.lbx" $hwstack = 48 $swstack = 20 $FRAMESIZE = 20 '=============================================================================== 'OPTIONAL Stop Ac '=============================================================================== '[SYSTEMVARIABLEN] DIM SOFTWARE_TIMER0 AS BYTE DIM SOFTWARE_TIMER1 AS BYTE DIM RESTART_ATTEMPT AS BYTE '=============================================================================== '[KANALVARIABLEN] DIM KANALSTATUS AS BYTE 'KANALSTATUS.0 = KANAL 1 MINDESTSTROM UNTERSCHRITTEN 'KANALSTATUS.1 = KANAL 2 MINDESTSTROM UNTERSCHRITTEN 'KANALSTATUS.2 = KANAL 3 MINDESTSTROM UNTERSCHRITTEN 'KANALSTATUS.3 = KANAL 4 MINDESTSTROM UNTERSCHRITTEN '=============================================================================== '[MESSVARIABLEN] DIM OVERSAMPLE_AKKUMULATOR AS Dword DIM C_BYTE AS BYTE '=============================================================================== '[AUSGÄNGE] KANAL_1 ALIAS PORTA.0:CONFIG KANAL_1 = OUTPUT KANAL_2 ALIAS PORTA.1:CONFIG KANAL_2 = OUTPUT KANAL_3 ALIAS PORTA.2:CONFIG KANAL_3 = OUTPUT KANAL_4 ALIAS PORTA.3:CONFIG KANAL_4 = OUTPUT LED_U ALIAS PORTA.4:CONFIG LED_U = OUTPUT'LED FÜR UNTERSPANNUNG LED_A ALIAS PORTA.5:CONFIG LED_A = OUTPUT'LED FÜR UNTERSTROM VENTILATION ALIAS PORTB.2:CONFIG VENTILATION = OUTPUT'OPTIONAL, IMMER AKTIV MIT KANAL '=============================================================================== '[ANALOGEINGÄNGE] 'ADC6 SPANNUNG 'ADC7 STROM '=============================================================================== '[ANALOG-DIGITAL-KONVERTER] ADMUX = &B00000110'REFERENZSPANNUNG AVCC/SINGLE/ADC6 GESETZT ADCSRA = &B10000100'DIV16@62.5Khz ADCSRB = &B00000000 DIM ADC_MESSWERT AS WORD DIM ADC_LOW AS BYTE AT ADC_MESSWERT OVERLAY DIM ADC_HIGH AS BYTE AT ADC_MESSWERT +1 OVERLAY DIM MINDESTSPANNUNG AS SINGLE DIM MINDESTSTROM AS SINGLE DIM AKTUELLER_STROM AS SINGLE DIM AKTUELLE_SPANNUNG AS SINGLE DIM ZERO_CURRENT_VOLT AS SINGLE DIM AKTUELLER_KANAL AS BYTE CONST MESSAUFLOESUNG = 0.0048828125 CONST FAKTOR = 5.545'R1=10K R2=2k2 für 24V Toleranz CONST DIVISOR = 0.19 '190mV/A Angegeben lt. Hersteller 185mV aber ermittelt mehr MINDESTSTROM = 0.1'A MINDESTSPANNUNG = 9'V ZERO_CURRENT_VOLT = 2.5'V wird wiederholt automatisch ermittelt(sollte aber bei 2.5V sein) '=============================================================================== '=============================================================================== WAITMS 300 FOR SOFTWARE_TIMER0 = 1 TO 10 LED_U = 1:LED_A = 0:WAITMS 250 LED_U = 0:LED_A = 1:WAITMS 250 NEXT LED_U=0 LED_A=0 GOSUB ACS712_NULLABGLEICH KANAL_1 = 1:AKTUELLER_KANAL = 1:VENTILATION = 1'IMMER DIREKT MIT KANAL 1 STARTEN 'HAUPTSCHLEIFE DO 'SOFTWARETIMER0 SPANNUNG&STROM MESSEN 1s IF SOFTWARE_TIMER0 = 50 THEN GOSUB SPANNUNGSMESSUNG GOSUB STROMMESSUNG SOFTWARE_TIMER0 = 0 GOSUB AUSWERTUNG_EVENT_FLAG ENDIF '/SOFTWARETIMER0 SPANNUNGS&STROM MESSEN 1s INCR SOFTWARE_TIMER0 WAITMS 20 LOOP '/HAUPTSCHLEIFE '============================================================================================ '============================================================================================ '============================================================================================ '============================================================================================ SPANNUNGSMESSUNG: 'MESSEN DER EINGANGSSPANNUNG ADMUX.2=1:ADMUX.1=1:ADMUX.0=0'ADC6 WAITMS 10 ADCSRA.6=1 'DUMMY BITWAIT ADCSRA.4,SET'DUMMY WAITMS 10 ADCSRA.6=1 BITWAIT ADCSRA.4,SET ADC_LOW = ADCL:ADC_HIGH = ADCH AKTUELLE_SPANNUNG = ADC_MESSWERT * MESSAUFLOESUNG AKTUELLE_SPANNUNG = AKTUELLE_SPANNUNG * FAKTOR 'AUSWERTUNG&REAKTION IF AKTUELLE_SPANNUNG < MINDESTSPANNUNG THEN LED_U = 1 ELSE LED_U = 0 ENDIF RETURN STROMMESSUNG: REM MESSEN DES STROMS MIT 100x OVERSAMPLING ADMUX.2=1:ADMUX.1=1:ADMUX.0=1'ADC7 OVERSAMPLE_AKKUMULATOR = 0 WAITMS 10 FOR C_BYTE = 1 TO 100 ADCSRA.6=1 BITWAIT ADCSRA.4,SET ADC_LOW = ADCL:ADC_HIGH = ADCH OVERSAMPLE_AKKUMULATOR = OVERSAMPLE_AKKUMULATOR + ADC_MESSWERT WAITMS 1 NEXT OVERSAMPLE_AKKUMULATOR = OVERSAMPLE_AKKUMULATOR / 100 AKTUELLER_STROM = OVERSAMPLE_AKKUMULATOR * MESSAUFLOESUNG AKTUELLER_STROM = AKTUELLER_STROM - ZERO_CURRENT_VOLT AKTUELLER_STROM = AKTUELLER_STROM / DIVISOR 'AUSWERTUNG&REAKTION IF AKTUELLER_STROM < MINDESTSTROM THEN LED_A = 1 ELSE LED_A = 0 END IF RETURN '=============================================================================== ACS712_NULLABGLEICH: 'STROM WIRD BEI AUSGESCHALTETEN KANÄLEN GEMESSEN UND DADRUCH NULLPUNKT FESTGELEGT '100x OVERSAMPLING ADMUX.2=1:ADMUX.1=1:ADMUX.0=1'ADC7 OVERSAMPLE_AKKUMULATOR = 0 WAITMS 100 FOR C_BYTE = 1 TO 100 ADCSRA.6=1 BITWAIT ADCSRA.4,SET ADC_LOW = ADCL:ADC_HIGH = ADCH OVERSAMPLE_AKKUMULATOR = OVERSAMPLE_AKKUMULATOR + ADC_MESSWERT WAITMS 1 NEXT OVERSAMPLE_AKKUMULATOR = OVERSAMPLE_AKKUMULATOR / 100 AKTUELLER_STROM = OVERSAMPLE_AKKUMULATOR * MESSAUFLOESUNG ZERO_CURRENT_VOLT = AKTUELLER_STROM RETURN '=============================================================================== AUSWERTUNG_EVENT_FLAG: 'AUSWERTUNG&REAKTION BEI AUFGETRETENEN EVENT 'SPANNUNGSUNTERSCHREITUNG IF LED_U = 1 THEN KANAL_1 = 0: KANAL_2 = 0: KANAL_3 = 0 : KANAL_4 = 0: VENTILATION = 0 INCR RESTART_ATTEMPT SOFTWARE_TIMER1 = 0 IF RESTART_ATTEMPT > 30 THEN GOSUB KANALWECHSEL ENDIF 'RESTART-LOGIK DO INCR SOFTWARE_TIMER1 WAIT 1 LOOP UNTIL SOFTWARE_TIMER1 = 60 '/RESTART-LOGIK GOSUB KANAL_STARTEN LED_U = 0:LED_A = 0 SOFTWARE_TIMER1 = 0 ENDIF '/SPANNUNGSUNTERSCHREITUNG 'STROMUNTERSCHREITUNG IF LED_A = 1 THEN SOFTWARE_TIMER1 = 0 DO INCR SOFTWARE_TIMER1 GOSUB STROMMESSUNG WAIT 1 IF SOFTWARE_TIMER1 >= 15 THEN GOSUB KANAL_STOPPEN WAIT 3 GOSUB KANALWECHSEL GOSUB KANAL_STARTEN LED_A = 0 ENDIF LOOP UNTIL LED_A = 0 ENDIF '/STROMUNTERSCHREITUNG RETURN '=============================================================================== KANALWECHSEL: 'AUTOMATISCHER WECHSEL VON UNGÜLTIGEN KANAL AUF NÄCHSTEN VERFÜGBAREN RESTART_ATTEMPT = 0 IF AKTUELLER_KANAL = 1 THEN KANALSTATUS.0 = 1 IF AKTUELLER_KANAL = 2 THEN KANALSTATUS.1 = 1 IF AKTUELLER_KANAL = 3 THEN KANALSTATUS.2 = 1 IF AKTUELLER_KANAL = 4 THEN KANALSTATUS.3 = 1 GOSUB KANAL_STOPPEN GOSUB ACS712_NULLABGLEICH 'KANAL 1 AUSWÄHLEN IF KANALSTATUS.0 = 0 THEN AKTUELLER_KANAL = 1 RETURN ENDIF '/KANAL 1 AUSWÄHLEN 'KANAL 2 AUSWÄHLEN IF KANALSTATUS.1 = 0 THEN AKTUELLER_KANAL = 2 RETURN ENDIF '/KANAL 2 AUSWÄHLEN 'KANAL 3 AUSWÄHLEN IF KANALSTATUS.2 = 0 THEN AKTUELLER_KANAL = 3 RETURN ENDIF '/KANAL 3 AUSWÄHLEN 'KANAL 4 AUSWÄHLEN IF KANALSTATUS.3 = 0 THEN AKTUELLER_KANAL = 4 RETURN ENDIF '/KANAL 4 AUSWÄHLEN 'KEIN KANAL AUSWÄHLBAR IF KANALSTATUS.0 = 1 AND KANALSTATUS.1 = 1 AND KANALSTATUS.2 = 1 and KANALSTATUS.3 = 1 THEN LED_U=1:LED_A=1 ADCSRA.7 = 0 CONFIG POWERMODE = POWERDOWN ENDIF '/KEIN KANAL AUSWÄHLBAR RETURN '=============================================================================== KANAL_STARTEN: 'STARTET DEN AKTUELLEN KANAL IF AKTUELLER_KANAL = 1 THEN KANAL_1 = 1 IF AKTUELLER_KANAL = 2 THEN KANAL_2 = 1 IF AKTUELLER_KANAL = 3 THEN KANAL_3 = 1 IF AKTUELLER_KANAL = 4 THEN KANAL_4 = 1 VENTILATION = 1 RETURN KANAL_STOPPEN: 'STOPPT ALLE KANÄLE KANAL_1 = 0 KANAL_2 = 0 KANAL_3 = 0 KANAL_4 = 0 VENTILATION = 0 RETURN