davidfdg
16.02.2010, 21:28
Hallo zusammen,
ich habe Sorgen beim Programmieren eines winzigen Programms in Asm. Ich nutze zum ersten Mal den mega 8515. Nach dem Flashen und dem ersten Start, dimmt B0 von voller Lichtstärke auf 0 herunter dann geht nichts mehr.
Folgendes hab ich schon versucht, vielleicht hat jemand einen Tipp für einen Anfänger.
- ich nutze myavrwordpad und studio 4 mit mysmartusb mk2
- das Programm lässt sich problemlos einspielen
- wenn ich nur die Unterprogramme EDIMM und ADIMM ins Hauptprog schreibe funktioniert der Dimmvorgang am Ausgang
- Einfache I/O Programme mit den Eingängen auf eine LED an D3 funktionieren auch
- Programm läuft in der Studio-Simu
- Externer Quarz 4MHz und Interner Oszi machen das gleiche (natürlich nicht in der selben Zeit)
- Es funktioniert nur das große Ganze nicht und da hab ich Sleep und Comperator noch nicht drin, es soll ja dann noch mehr rein.
Nun mein kleines Prog
;+----------------------------------------------------------------------------
;| 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 :
;+----------------------------------------------------------------------------
.include "avr.h"
;-----------------------------------------------------------------------------
;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: ldi r16,lo8(RAMEND) ;Konfiguration des Stackspeichers
out SPL,r16 ;ans Ramende (Low-Byte)
ldi r16,hi8(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
Code-Tags sind cool ! (PicNick)
Ich hoffe es lässt sich lesen, bin halt Anfänger und liebe Kommentare.
Vielen Dank im Voraus für eure Hilfe
Davidfdg
Edit 16.02. 22:11
Hab grad ein myMultiProg MK2 zusammen gelötet und den 8515 damit geflasht. Leider ohne Erfolg. Problem bleibt wie beschrieben. Weiß aber nun, dass meine selbst gebastelte ISP-Schnittstelle keine Probleme macht.
ich habe Sorgen beim Programmieren eines winzigen Programms in Asm. Ich nutze zum ersten Mal den mega 8515. Nach dem Flashen und dem ersten Start, dimmt B0 von voller Lichtstärke auf 0 herunter dann geht nichts mehr.
Folgendes hab ich schon versucht, vielleicht hat jemand einen Tipp für einen Anfänger.
- ich nutze myavrwordpad und studio 4 mit mysmartusb mk2
- das Programm lässt sich problemlos einspielen
- wenn ich nur die Unterprogramme EDIMM und ADIMM ins Hauptprog schreibe funktioniert der Dimmvorgang am Ausgang
- Einfache I/O Programme mit den Eingängen auf eine LED an D3 funktionieren auch
- Programm läuft in der Studio-Simu
- Externer Quarz 4MHz und Interner Oszi machen das gleiche (natürlich nicht in der selben Zeit)
- Es funktioniert nur das große Ganze nicht und da hab ich Sleep und Comperator noch nicht drin, es soll ja dann noch mehr rein.
Nun mein kleines Prog
;+----------------------------------------------------------------------------
;| 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 :
;+----------------------------------------------------------------------------
.include "avr.h"
;-----------------------------------------------------------------------------
;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: ldi r16,lo8(RAMEND) ;Konfiguration des Stackspeichers
out SPL,r16 ;ans Ramende (Low-Byte)
ldi r16,hi8(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
Code-Tags sind cool ! (PicNick)
Ich hoffe es lässt sich lesen, bin halt Anfänger und liebe Kommentare.
Vielen Dank im Voraus für eure Hilfe
Davidfdg
Edit 16.02. 22:11
Hab grad ein myMultiProg MK2 zusammen gelötet und den 8515 damit geflasht. Leider ohne Erfolg. Problem bleibt wie beschrieben. Weiß aber nun, dass meine selbst gebastelte ISP-Schnittstelle keine Probleme macht.