-
        

Ergebnis 1 bis 3 von 3

Thema: Problem beim programmieren des mega8515

  1. #1
    Neuer Benutzer
    Registriert seit
    01.03.2007
    Ort
    Brockwitz
    Alter
    35
    Beiträge
    2

    Problem beim programmieren des mega8515

    Anzeige

    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.

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.12.2005
    Beiträge
    535
    Davidfdg,

    na, Du machst es Deinen Helfern auch nicht gerade leicht! Quellprogramme musst Du mit der Direktive "eckige Klammer auf" "code" "eckige Klammer zu" und "eckige Klammer auf" "/code" "eckige Klammer zu" einschliessen. Dann bleibt auch die Formatierung erhalten und man den Text ordentlich lesen. So wie Du's hier gemacht hast, ist das eine ziemliche Zumutung .

    Vorschläge für mögliche Fehlerursachen habe ich als Kommentare in den Quelltext geschrieben.
    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.

    Ciao,

    mare_crisium

    Edit: Fehler im Kommentar verbessert.

  3. #3
    Neuer Benutzer
    Registriert seit
    01.03.2007
    Ort
    Brockwitz
    Alter
    35
    Beiträge
    2
    Hallo mare_crisium,
    erstmal vielen Dank für die Mühe, nächstes Mal wirds besser.
    Habs grad geflasht, uuuuund 100 Punkte es LÄUFT. Auch wenn ich es noch nicht ganz verstehe. Ich werd mich dazu noch etwas belesen. (Es wird im MyAvr Lernbuch so beschrieben und mit dem mega8 läuft es).

    Vielen, Vielen Dank für Deine Hilfe

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •