From f836382825ff9e1e01bc0e88eed88540c3a43354 Mon Sep 17 00:00:00 2001 From: Erich Eckner Date: Mon, 17 Oct 2016 18:14:02 +0200 Subject: initial commit --- .gitignore | 2 + Bewegungsmelder.asm | 153 ++++++++++++++++++++++++++++++++++++++++++++++++ Bewegungsmelder.asmproj | 64 ++++++++++++++++++++ Bewegungsmelder.atsln | 20 +++++++ Bewegungsmelder.atsuo | Bin 0 -> 10240 bytes 5 files changed, 239 insertions(+) create mode 100644 .gitignore create mode 100644 Bewegungsmelder.asm create mode 100644 Bewegungsmelder.asmproj create mode 100644 Bewegungsmelder.atsln create mode 100644 Bewegungsmelder.atsuo diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0f3a6b1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +Debug +Release diff --git a/Bewegungsmelder.asm b/Bewegungsmelder.asm new file mode 100644 index 0000000..a87f8d0 --- /dev/null +++ b/Bewegungsmelder.asm @@ -0,0 +1,153 @@ +/* + * Bewegungsmelder.asm + * + * Created: 12.01.2015 13:13:40 + * Author: Erich + */ + +.INCLUDE "tn24def.inc" + +; auf internen 128kHz-Oszillator stellen! + +.DEF statusBits = r25 ; 0: hell, 1: akku voll, 2: akku nicht leer +.EQU hellBit = 0 +.EQU akkuVollBit = 1 +.EQU akkuNLeerBit = 2 +.EQU hellSpannung = 0x80 ; Schwellwert, ab dem es hell ist +.EQU akkuVollSpannung = 0xb9 ; Schwellwert, ab dem der Akku voll ist (= 14,4V) +.EQU akkuLeerSpannung = 0x99 ; Schwellwert, ab dem der Akku leer ist (= 12,0V) +.EQU zaehlerschritte = 0xffff - 0x2d00 ; 90s? + + rjmp RESET + reti + reti + reti + reti + reti + reti + reti + rjmp TIMER1_OVERFLOW ; Timer1 ist übergelaufen + reti + reti + reti + reti + rjmp ADC_INTERRUPT ; ADC-Conversion Interrupt + reti + reti + reti + + RESET: + ldi r16,low(RAMEND) ; Stackpointer initialisieren + out SPL,r16 + + sbi DIDR0,ADC0D ; digitalen Eingang an ADC0 (Phototransistor) deaktivieren + sbi DIDR0,ADC1D ; digitalen Eingang an ADC1 (Akkuspannung) deaktivieren + ldi r16,0x00 + out ADMUX,r16 ; VCC als Spannungsreferenz und ADC0 zur Single-Ended-Messung wählen + ldi r16,0x10 + out ADCSRB,r16 ; linksbündige Ergebnisse, (free-running Mode wählen - wenn Auto-Trigger "an" wäre) + ldi r16,0xc8 + out ADCSRA,r16 ; ADC an, Wandlung starten, Auto-Tigger aus, (Interrupt-Flag), ADC-Interrupt an, Vorteiler = 2 (=> 64kHz) + + ldi r16,0x06 + out PRR,r16 ; Clocks: Timer/Counter 1 an, Timer/Counter 0 aus, USI aus, ADC an ... zum Stromsparen + ldi r16,0x00 + out WDTCSR,r16 ; Watchdog aus + + ldi r16,0x05 + out TCCR1B,r16 ; Timer/Counter 1: Vorteiler auf 1024 + ldi r16,0x01 + out TIMSK1,r16 ; Timer/Counter 1: Overflow-Interrupt an + + ldi r16,0x04 + out PORTA,r16 ; LED2 aus, (3x n.d.), LED1 aus, Akku ein, kein Pull-up an PORTA1 (Akkuspannung) & PORTA0 (Phototransistor) + ldi r16,0x04 + out PORTB,r16 ; Pull-up an PORTB2 (Bewegungsmelder-Signal), Licht aus, Laden aus + ldi r16,0x8c + out DDRA,r16 ; Ausgänge: PORTA7 (LED2), PORTA3 (LED1), PORTA2 (Akkuschalter) + ldi r16,0x03 + out DDRB,r16 ; Ausgänge: PORTB1 (Licht), PORTB0 (Ladeschalter) + + sei ; Interrupts an + +MAINLOOP: + sbrs statusBits,akkuNLeerBit ; Akku leer? + cbi PORTA,2 ; JA! -> Akku abklemmen + sbrc statusBits,akkuNLeerBit ; Akku leer? + sbi PORTA,2 ; nein -> Akku an + + sbrs statusBits,akkuNLeerBit + sbi PORTA,3 + sbrc statusBits,akkuNLeerBit + cbi PORTA,3 + + sbrs statusBits,akkuVollBit ; Akku voll? + rjmp AKKU_NICHT_VOLL ; nein! + + sbi PORTA,7 ; LED2 an + sbi PORTB,0 ; Akkuladeschaltung deaktivieren + + rjmp BEWEGUNG_AUSWERTEN +AKKU_NICHT_VOLL: + cbi PORTA,7 ; LED2 aus + cbi PORTB,0 ; Akkuladeschaltung aktivieren + +BEWEGUNG_AUSWERTEN: + sbic PINB,2 ; Signal am Bewegungsmelder? + rjmp MAINLOOP ; nein! + + sbrc statusBits,hellBit ; ist es hell? + rjmp MAINLOOP ; ja! + + ldi r16,high(zaehlerschritte) + ldi r17,low(zaehlerschritte) + out TCNT1H,r16 + out TCNT1L,r17 ; Timer/Counter 1 resetten + sbi PORTB,1 ; Licht an! +; sbi PORTA,3 ; LED1 an + + rjmp MAINLOOP + +ADC_INTERRUPT: + push r16 ; r16 und SREG pushen + in r16,SREG + push r16 + + in r16,ADCH ; Spannungswert holen + + sbis ADMUX,MUX0 + rjmp ADC_PHOTO +ADC_AKKU: ; Akkuspannung wurde gemessen + cbi ADMUX,MUX0 ; als nächstes Phototransistor messen + + cbr statusBits,((1< + + + 2.0 + 6.2 + com.Atmel.AVRAssembler + {08511b70-0df4-40ae-bf6b-83c4827afcf5} + none + ATtiny24 + $(MSBuildProjectName) + .obj + $(MSBuildProjectDirectory)\$(Configuration) + ASSEMBLY + Bewegungsmelder + Bewegungsmelder + Bewegungsmelder + $(MSBuildProjectDirectory)\Bewegungsmelder.asm + Native + true + false + true + true + 0x20000000 + + true + exception_table + 2 + 1 + + + + + + + + + + + + + + + + + + (%24IncludeFile) + + + Executable + + + + + (%24IncludeFile) + + + + + + Code + + + + \ No newline at end of file diff --git a/Bewegungsmelder.atsln b/Bewegungsmelder.atsln new file mode 100644 index 0000000..2cf23eb --- /dev/null +++ b/Bewegungsmelder.atsln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Atmel Studio Solution File, Format Version 11.00 +Project("{18226A42-8477-4023-8AD2-40C49DA407C9}") = "Bewegungsmelder", "Bewegungsmelder.asmproj", "{08511B70-0DF4-40AE-BF6B-83C4827AFCF5}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|AVR = Debug|AVR + Release|AVR = Release|AVR + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {08511B70-0DF4-40AE-BF6B-83C4827AFCF5}.Debug|AVR.ActiveCfg = Debug|AVR + {08511B70-0DF4-40AE-BF6B-83C4827AFCF5}.Debug|AVR.Build.0 = Debug|AVR + {08511B70-0DF4-40AE-BF6B-83C4827AFCF5}.Release|AVR.ActiveCfg = Release|AVR + {08511B70-0DF4-40AE-BF6B-83C4827AFCF5}.Release|AVR.Build.0 = Release|AVR + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Bewegungsmelder.atsuo b/Bewegungsmelder.atsuo new file mode 100644 index 0000000..d37b887 Binary files /dev/null and b/Bewegungsmelder.atsuo differ -- cgit v1.2.3-70-g09d2