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

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      : 		
;+----------------------------------------------------------------------------

.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.