;---------------------------------------------------------------- ; Programm zur Seuerung einer Brunnenpumpe ; fuer die Fuellung der Regentonne aus der Zisterne ; ; Taster kurz druecken: Pumpe laeuft fuer voreingestellte Zeit ; dabei blinkt die LED ; Taster lang druecken: Pumpe bleibt an, LED leuchtet staendig ; wenn Pumpe an und Taster kurz druecken: Pumpe und LED aus ; ;---------------------------------------------------------------- ; Definitionen und Voreinstellungen ;---------------------------------------------------------------- .include "tn11def.inc" ; Belegung ; ; Tiny 11 PDIP8 ; ;(/RESET) PB5 = 1 8 = VCC ;(XTAL1) PB3 = 2 7 = PB2 (T0) ;(XTAL2) PB4 = 3 6 = PB1 (INT0/AIN1) ; GND = 4 5 = PB0 (AIN0) ; hier ; PB2 LED mit R gegen Vcc ; PB1 Taste gegen GND mit pullup ; PB0 Treiber mit Relais fuer Pumpe ; Takt ist intern .def acc = R16 ;Accu .def acci = R17 ;Accu im INT .def tick = R20 ;INT-zaehler .def key = R21 ;Tastenzaehler .def blink = R18 ;Blinkbyte .def time0 = R19 ;Zeitzaehler low .def time1 = R28 ;Zeitzaehler high .def ssave = R29 ;Rettungszelle SREG .equ zk = 0xF8 ;Zeitkonstante ergibt INT etwa alle 8 ms .equ led = 2 ;LED an PB2 .equ motor = 4 ;Motor an PB4 .ORG 0x00 RJMP start ; rjmp EXT_INT0 ; IRQ0 handler RETI ; rjmp PIN_CHANGE ; Pin change handler RETI RJMP T_INT ;Timer0_Overflow-Interrupt ; rjmp ANA_COMP ; Analog Comparator handler RETI ;---------------------------------------------------------------- ; Initialisierung der Hardware ;---------------------------------------------------------------- start: CLI ;init variablen CLR time0 ;zeit=0 CLR time1 ; CLR key ;Taste CLR blink ;LED ;init ports LDI acc, 0x14 ;Ausgaenge ;PB2= Anzeige-LED PIN 7 ;PB4= Pumpe PIN 3 ;Eingang PB1, PIN6 OUT DDRB, acc LDI acc, 0x00 ;erst mal aus OUT PORTB, acc ;jetzt Timer und INT initialisieren OUT GIMSK, acc ;ext INT0 und Pin-Change-INT abschalten LDI acc,zk ; lade das Timer/Counter0 OUT TCNT0,acc ; mit der Zeit fuer Warten LDI acc,0b00000101 ; 0 0 0 Stop, the Timer/Counter0 is stopped. OUT TCCR0,acc ; 0 0 1 CK ; 0 1 0 CK/8 ; 0 1 1 CK/64 ; 1 0 0 CK/256 ; 1 0 1 CK/1024 ; 1 1 0 External Pin T0, falling edge ; 1 1 1 External Pin T0, rising edge LDI acc, 0x02 ;Timr0 OVF INT erlauben OUT TIMSK, acc ;Watchdog scharf machen LDI acc, 0b00001111 ; OUT WDTCR, acc SEI ;---------------------------------------------------------------- ; Hauptprogrammschleife ; wartet auf Taste ; kurzer Druck startet Timer 12 Minuten ; langer Druck macht ewig ;---------------------------------------------------------------- loop: CLR time0 CLR time1 lo00: CPI key,0 ;warten auf taste losgelassen BRNE lo00 lo01: WDR ;Watchdog triggern CPI key,5 ;solange key<5 warten auf Taste BRLO lo01 SBI PORTB, motor ;dann pumpe einschalten LDI blink, 0x55 ;und LED auf blinken LDI time0,0xC9 ;zeit auf 12 Minuten LDI time1,0x05 ;0x05C9 abhaengig von internem Takt lo02: CPI key,200 ;ab 200=>langer tastendruck BRLO lo03 ;wenn kurzer tastendruck dann weiter ;sonst bei key>200 LDI blink, 0x7F ;dann LED fast Dauerleuchten ;geht kurz aus als Anzeige, ;dass Programm noch laeuft SER time0 ;zeit auf Unendlich SER time1 lo03: WDR CPI key,0 BRNE lo02 ;warten auf loslassen lo05: WDR CLI MOV acc,time0 ;Zeit OR acc,time1 ;abgelaufen? SEI BREQ lo09 ;wenn Zeitende dann raus CPI key,5 ;wenn Taste BRSH lo09 ;dann raus RJMP lo05 lo09: CBI PORTB, motor ;Pumpe aus CLR blink ;LED aus RJMP loop ;zum Anfang ;---------------------------------------------------------------- ; Timer-INT ; alle 8 Millisekunden ; ; Entprellung: taste muss 5 mal hintereinander erkannt werden ; fuer kurzen tastendruck=40 ms ; ab 200 mal erkannt = langer Tastendruck 1,6 sek ;---------------------------------------------------------------- T_INT: IN ssave,SREG ; SREG sichern LDI acci,zk ; nachladen des Timer/Counter0 OUT TCNT0,acci INC tick BRNE t_i01 ;schon 256 INTs rum? LDI tick,-30 ;8x30ms= 240ms Blinkintervall ROR blink BRCS t_i00 ANDI blink, 0x7F SBI PORTB, led ;LED aus SUBI time0,1 ;Zeit Rueckwaerts zaehlen SBCI time1,0 ;mit Uebertrag RJMP t_i01 t_i00: ORI blink, 0x80 CBI PORTB, led ;LED ein t_i01: IN acci,PINB ANDI acci,0x02 ;PB1 Taste BRNE t_i02 ;keine Taste CPI key,0xFF ;Ende erreicht? BREQ t_i03 INC key RJMP t_i03 t_i02: CLR key t_i03: OUT SREG,ssave ; SREG ruecksichern RETI