Code:
;+----------------------------------------------------------------------------
;| Schaltung : ATmega8515
;| B.2 & B.3 Analogeingang Dämmerungsschalter
;| C.0 & C.1 Eingänge für Bewegungsmelder
;| D.3 LED Dämmerungsschalter
;| B.0 pulsweitenmoduliertes Signal (Licht)
;|----------------------------------------------------------------------------
;| Prozessor : ATmega8515
;| Sprache : Assembler
;| Version :
;+----------------------------------------------------------------------------
;
/* KOMMENTAR
Wenn Du willst, dass auch jemand anderes mit weniger Zeit, als ich sie habe, Dein Programm
lesen und verstehen kann, musst Du nicht nur viele Kommentare schreiben (das hast Du ja
schon sehr gut gemacht :-)!), sondern auch aufschreiben, was Du Dir sonst noch so gedacht
hast. Z.B.:
; Registerzuordnung:
; r18 : Laufzeit 5
; r19 : Laufzeit 6
; r20 : Wartezeit in Sekunden
Das hilft Dir übrigens auch selber, wenn Du später einmal wieder verstehen willst, was Du
damals so angestellt hast.
ENDE KOMMENTAR */
/* KOMMENTAR
Mein erster Tip war falsch - Sorry. Die „dec“-Anweisung VERÄNDERT das Zero-Flag.
Nur das Carry-Flag wird nicht beeinflusst. Das kann es also nicht geweswen sein.
Versuch' doch mal, die folgende "include"-Anweisung statt der Zeile
".include avr.h"
ENDE KOMMENTAR*/
.include "m8515def.inc"
;-----------------------------------------------------------------------------
;Reset and Interrupt vector ; VNr. Beschreibung
rjmp main ;1 POWER ON RESET
reti ;2 Int0-Interrupt
reti ;3 Int1-Interrupt
reti ;4 TC1 Capture
reti ;5 TC1 Compare Match A
reti ;6 TC1 Compare Match B
reti ;7 TC1 Overflow
reti ;8 TC0 Overflow
reti ;9 SPI, STC Serial Transfer Complete
reti ;10 UART Rx Complete
reti ;11 UART Data Register Empty
reti ;12 UART Tx Complete
reti ;13 Analog Comparator
reti ;14 Int2-Interrut
reti ;15 EEPROM Ready
reti ;16 TC0 Compare Match
reti ;17 Store Program Memory Ready
;-----------------------------------------------------------------------------
;Start, Power ON, Reset
main:
/* KOMMENTAR
Der AVR-Studio-Assembler kennt die Anweisung "lo8" und "hi8" nicht.
Er erwartet in den Zeilen unten die Anwweisungen "low" und "high".
ENDE KOMMENTAR*/
ldi r16,low(RAMEND) ;Konfiguration des Stackspeichers
out SPL,r16 ;ans Ramende (Low-Byte)
ldi r16,high(RAMEND) ;Konfiguration des Stackspeichers
out SPH,r16 ;ans Ramende (High-Byte)
;Konfiguration des Analogsignals
cbi ACSR,7 ;Comperator ON
cbi ACSR,6 ;ext. Referenzspannung (Vref AIN0)
;Konfiguration des pulsweitenmodulierten Signalausgangs
sbi DDRB,0 ;PORT B.0 = Ausgang
ldi r16,0b01110010 ;Konfiguration PWM-Signal
out TCCR0,r16 ;
;Ein- Ausgangskonfiguation
sbi DDRD,3 ;PORT D.3 = Ausgang
cbi DDRC,0 ;PORT C.0 = Eingang
cbi DDRC,1 ;PORT C.1 = Eingang
sbi PORTC,0 ;Entstöre Eingang PORT C.0
sbi PORTC,1 ;Entstöre Eingang PORT C.1
;Grundwerte laden
ldi r16,0x00 ;Register 16 = 0
ldi r17,0x00 ;Register 17 = 0
;-----------------------------------------------------------------------------
;Hauptprogrammschleife
Hauptprog:
in r17,PINC
sbrs r17,0
rjmp Lichtan
in r17,PINC
sbrs r17,1
rjmp Lichtan
cbi PORTD,3
rcall WARTEZ
rcall ADIMM
rjmp Hauptprog
Lichtan:
sbi PORTD,3
rcall EDIMM
rjmp Hauptprog
;-----------------------------------------------------------------------------
;Unterprogramm Eindimmen
EDIMM:
rcall V_DIMM ;Rufe Unterprog Dimmgeschwindigkeit auf
cpi r16,0xFF ;Prüfe Beleuchtungsstärke
breq END_EDIMM ;Wenn Beleuchtung = MAX springe zu END_EDIMM
inc r16 ;Wenn Beleuchtung < MAX erhöhe Beleuchtungsst.
out OCR0,r16 ;Speicher neue Beleuchtungsstärke
rjmp EDIMM ;Starte Unterprog Eindimmen neu
END_EDIMM:
ret ;Eindimmen Abgeschlossen - zurück zum Aufruf
;-----------------------------------------------------------------------------
;Unterprogramm Ausdimmen
ADIMM:
rcall V_DIMM ;Rufe Unterprog Dimmgeschwindigkeit auf
cpi r16,0x00 ;Prüfe Beleuchtungsstärke
breq END_ADIMM ;Wenn Beleuchtung = MIN springe zu END_ADIMM
dec r16 ;Wenn Beleuchtung > MIN verringere Beleuchtungsst.
out OCR0,r16 ;Speicher neue Beleuchtungsstärke
rjmp ADIMM ;Starte Unterprog Ausdimmen neu
END_ADIMM:
ret ;Ausdimmen Abgeschlossen - zurück zum Aufruf
;-----------------------------------------------------------------------------
;Unterprogramm Wartezeit
WARTE_1s:
push r18 ;r18 sichern
ldi r18,19 ;Lade Zeitkonstante 01
WARTE_1s_3:
push r18 ;r18 sichern
ldi r18,255 ;Lade Zeitkonstante 02
WARTE_1s_2:
push r18 ;r18 sichern
ldi r18,255 ;Lade Zeitkonstante 03
WARTE_1s_1:
dec r18 ;r18 -1
brne WARTE_1s_1 ;Wenn r18 nicht 0, springe zu WARTE_1s_1
pop r18 ;Lade r18 aus Speicher
dec r18 ;r18 -1
brne WARTE_1s_2 ;Wenn r18 nicht 0, springe zu WARTE_1s_2
pop r18 ;Lade r18 aus Speicher
dec r18 ;r18 -1
brne WARTE_1s_3 ;Wenn r18 nicht 0, springe zu WARTE_1s_3
pop r18 ;Lade r18 aus Speicher
ret ;Zurück zur Aufrufadresse
;-----------------------------------------------------------------------------
;Unterprogramm Wartezeit
WARTEZ:
ldi r20,30 ;Lade Wartezeit in Sekunden
WARTEZ_1:
rcall WARTE_1s ;Springe in Unterprogramm WARTE_1s
dec r20 ;r20 -1
brne WARTEZ_1 ;Wenn r20 nicht 0, springe zu WARTEZ_1
ret ;Zurück zur Aufrufadresse
;-----------------------------------------------------------------------------
;Unterprogramm Dimmgeschwindigkeit
V_DIMM:
ldi r18,255 ;Laufzeit 5
LAUFZ_5:
ldi r19,255 ;Laufzeit 6
LAUFZ_6:
dec r19 ;Zähler 6 -1, hier Kalibrierung auf Quarz-Takt
brne LAUFZ_6 ;Solange nicht NULL
dec r18 ;Zähler 5 -1
brne LAUFZ_5 ;Solange nicht NULL
ret ;Zurück zur Aufrufadresse
Ich hoffe, das löst das Problem.
Lesezeichen