PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hilfe beim programmieren von ATmega8515



Stefan_84
09.02.2006, 17:29
Guten Tag!
Letztes Jahr haben wir in der Schule die Theorie der µController gelernt, jetzt möchte ich das Theoretische mal in die Praxis umwandeln.

Hab mir einen ATmega8515 besorgt, da wir im Unterricht hauptsächlich über diesen µC gesprochen haben.
Dann hab ich mir noch ein Adapterkabel zum übertragen des Programms von der seriellen Schnittstelle zum µC gebaut.
An den µC hab ich an XTAL1 und XTAL2 einen 4MHz Quartz mit 2 27pF Kondensatoren angschloßen. Der Reset Pin ist über einen 10k Widerstand mit VCC verbunden.

Ich hab ein Programm in AVRStudio getippt, das alle Ports auf 1 schalten soll. Im Studio kann man es ja testen und da funktioniert es.
Dann lad ich das Programm mit Ponyprog zum µC. Das funktioniert auch ohne Fehler.
Nun sollte der µC das doch machen, oder? Macht er aber nicht. Alles bleibt ausgeschalten. Kann mir vielleicht jemand einen Tip geben was ich falsch gemacht haben könnte, oder was ich noch vergessen habe? Oder muss ich den irgendwie einschalten?
Hier der Code meines Programms:


;************************************************* ****************************
;*
;* DATEINAME : Led.asm
;* TITEL :
;* DATUM : 9.2.06
;* AUTOR : STK
;* VERSION : 1.0
;*
;*
;************************************************* ****************************
.CSEG
.org 0x0000
.include "m8515def.inc"

rjmp MAIN ; Springe um den Prozedurcode herum zum Start des Hauptprogrammes
rjmp UnusedInt_ISR
rjmp UnusedInt_ISR
rjmp UnusedInt_ISR
rjmp UnusedInt_ISR ;Externes Interrupt-Ereignis zum Stoppen der Zeit
rjmp UnusedInt_ISR
rjmp UnusedInt_ISR
rjmp UnusedInt_ISR
rjmp UnusedInt_ISR
rjmp UnusedInt_ISR
rjmp UnusedInt_ISR
rjmp UnusedInt_ISR
rjmp UnusedInt_ISR
UnusedInt_ISR: reti



;--KONSTANTENDEKLARATION---------------------------------------------
; status register bits
.equ CarryFlag = 0
.equ ZeroFlag = 1
.equ NegativeFlag = 2
.equ TwosFlag = 3
.equ SignFlag = 4
.equ HalfCarryFlag = 5
.equ TransferFlag = 6
.equ GlobalFlag = 7

;--VARIABLENDEKLARATION----------------------------------------
.def work = R16 ;Temp. Variable
;--Unterprogramme-----------------------------------------------------
init:
ser work
out ddra, work ;Port A, B, C,
out ddrb, work ;und D als Ausgang
out ddrc, work ;definieren
out ddrd, work

rjmp main_loop


;--HAUPTPROGRAMM-----------------------------------------------------
.CSEG

MAIN:
;Stackpointer initialisieren
ldi work,low (RAMEND) ; RAMEND ist eine im include file vorgegebene Konstante,
out SPL,work
ldi work, high(RAMEND)
out SPH,work

rjmp init

Main_loop:
ldi work, 0b11111111
out PortA, work;
out PortB, work;
out PortC, work;
out PortD, work;
rjmp Main_loop;


Findet da jemand einen Fehler?

Danke
MFG Stefan

Mehto
09.02.2006, 17:49
Hi,

sei mir nicht böse, aber das ist der unstrukturiertester Code den ich bisher gesehen hab ;-)

Definitionen kommen normalerweise imer als erstes und die ganzen unterprogramme als letztes.

Mich wundert es echt das der Assembler das so angenommen hat...

Ich hab dir das mal schnell neu zusammen kopiert:



;************************************************* ****************************
;*
;* DATEINAME : Led.asm
;* TITEL :
;* DATUM : 9.2.06
;* AUTOR : STK
;* VERSION : 1.0
;*
;*
;************************************************* ****************************

.include "m8515def.inc"

;--KONSTANTENDEKLARATION---------------------------------------------
; status register bits
.equ CarryFlag = 0
.equ ZeroFlag = 1
.equ NegativeFlag = 2
.equ TwosFlag = 3
.equ SignFlag = 4
.equ HalfCarryFlag = 5
.equ TransferFlag = 6
.equ GlobalFlag = 7

;--VARIABLENDEKLARATION----------------------------------------
.def work = R16 ;Temp. Variable







.CSEG
.org 0x0000

rjmp MAIN ; Springe um den Prozedurcode herum zum Start des Hauptprogrammes
rjmp UnusedInt_ISR
rjmp UnusedInt_ISR
rjmp UnusedInt_ISR
rjmp UnusedInt_ISR ;Externes Interrupt-Ereignis zum Stoppen der Zeit
rjmp UnusedInt_ISR
rjmp UnusedInt_ISR
rjmp UnusedInt_ISR
rjmp UnusedInt_ISR
rjmp UnusedInt_ISR
rjmp UnusedInt_ISR
rjmp UnusedInt_ISR
rjmp UnusedInt_ISR
UnusedInt_ISR: reti



MAIN:
;Stackpointer initialisieren
ldi work,low (RAMEND) ; RAMEND ist eine im include file vorgegebene Konstante,
out SPL,work
ldi work, high(RAMEND)
out SPH,work

rjmp init

Main_loop:
ldi work, 0b11111111
out PortA, work
out PortB, work
out PortC, work
out PortD, work
rjmp Main_loop;



;--Unterprogramme-----------------------------------------------------
init:
ser work
out ddra, work ;Port A, B, C,
out ddrb, work ;und D als Ausgang
out ddrc, work ;definieren
out ddrd, work

rjmp main_loop


;--HAUPTPROGRAMM-----------------------------------------------------




aber aller anfang ist schwer ;-)

machs doch einfach so:




.include "m8515def.inc"

.def temp, r16




ldi temp, 0xff

out DDRa, temp
out DDRb, temp
out DDRC, temp
out DDRd, temp


main:
ldi temp, 0b11111111
out PortA, temp
out PortB, temp
out PortC, temp
out PortD, temp

ende:

rjmp ende

Das ist jetzt natürlich nur in der schnelle geschriebn und lässt sich noch anpassen, sollte aber funktionieren.

Gruß,
Mehto

Stefan_84
09.02.2006, 18:23
Das ging jetzt aber schnell.
Werd gleich versuchen ob es damit funktioniert.
Die Struktur wurde mir so letztes Jahr in der Schule beigebracht. Wir haben den Code leider nie in einen µC geschrieben.
Dachte immer "der Lehrer hat immer Recht", aber das gilt wohl nicht in der Praxis. Aber ich lerne gerne was dazu.

Danke
MFG Stefan

Ratber
10.02.2006, 03:04
Ja,die Lehrer meinen vieleicht das se immer Recht haben aber meist haben se selber keinen Dunst was se sich da zusammenstricken da das Lehrprogramm fpr Lehrkräfte die reinste Katastrophe ist.

Hab also Mitleid mit ihm "denn sie wissen nicht was sie tun" :lol: