PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem beim programmieren des mega8515



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.

mare_crisium
25.02.2010, 07:00
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.



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

davidfdg
25.02.2010, 21:09
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