AVR Einsteigerproblem

OP #1671437
Lesenswert?

Hallo,
ich bin neu in dem Thema, hab aber vor 30 Jahren schon Assembler (8085) 
programmiert. Das Prinzip ist mir also schon klar, behaupte ich.

Jetzt hab ich mir das MyAVR Board MK2 besorgt, funktioniert auch soweit 
mit den Beispiel-Progs. Nur meine eigenen Programme laufen nicht an. 
Sogar die Primitiv-Version, einfach nur LED an, läuft nicht. Irgendeinen 
prinzipiellen Fehler hab ich da noch drin, ich komm aber nicht dahinter. 
Ich hab mal ein PRog angehängt, wird mit AVRStudio übersetzt, und 
gebrannt. Das Board sagt aber dann keinen Pieps, so als ob die CPU gar 
nicht loslaufen würde.

Flash-Rom hab ich ausgelesen, das Programm landet im Speicher. Die 
Board-HW ist ok, das von myAVR gelieferte Testprogramm liest auf PortD 
Schalter ein und steuert die LEDs über PortB, das funktioniert.

Egal welche (kurzen) Codeschnipsel ich aus dem Netz ziehe, sie laufen 
nicht an. Ach ja, im AVR Studio läuft das jeweilige Programm fehlerlos.
Nachdem ich in der SW nichts finde, hab ich dann mal rumgeklickt und die 
ersten beiden ATMegas gehimmelt. Mindestens einer davon steht auf 
ext.Quarz, den muß ich wieder zurückholen. Sobald ich einen 
Taktgenerator auftreibe :-)

Morgen krieg ich eine neue Lieferung von Prozessoren, die will ich nicht 
gleich den ersten beiden hinterherjagen :-((

Wenn jemand Lust ha, kann er ja mal versuchen, mir unter die Arme zu 
greifen. Irgendeine prinzipielle Kleinigkeit fehlt noch ....

Gruß
Ralf
Angehängte Dateien:
#1671454
Lesenswert?

An die Interupttabelle würde ich vorne noch ein ".org 0x0000" anhängen

ldi    r16,hi8(RAMEND)
out    SPH,r16
ldi    R16,lo8(RAMEND)
out    SPL,r16

Kenne ich im AVRStudio nur mir "HIGH" und "LOW", aber das wirst du ja 
nicht von ungefähr haben?

cbi    DDRD,2
cbi    DDRD,3
sbi    DDRD,2
sbi    DDRD,3
sbi    DDRB,0
sbi             DDRB,1

Das ist Käse, in zweierlei Hinsicht. Erstens ist es ziemlich unüblich 
jedes Bit einzeln zu setzen, zweitens frage ich mich, wie du auf die 
Idee kommst, dass mit DDR sowohl die Pinart als auch der Pullup gesetzt 
wird. Richtig:

clr temp1
out DDRD, temp1

ldi temp1, (1<<PD2) | (1<<PD3)
out PORTD, temp1

ldi temp1, (1<<PB0) | (1<<PB1)
out DDRB, temp1

Deine Konstanten im Hauptprogramm sind Käse. Die Register des Mega sin 
acht Bit breit. Nicht vier. Mit den Ports verhält es sich genauso. 
Deswegen fehlen bei dir stets vier Bit.
#1671472
Lesenswert?

ldi  r16,0
sbic  PIND,2    ; wenn Tast1
ori  r16,0b0001  ; dann LED1
sbic  PIND,3    ; dito mit 2. Taste
ori  r16,0b0010
sbr  r16,0b0100  ; bit3 immer an
out  PORTB,r16  ; und raus damit
rjmp  mainloop

Du hast doch die Pullups aktiviert... Ein Tastendruck an Taster1 zieht 
doch den PIN auf logisch-0. In dem Moment soll LED1 leuchten. Also musst 
du den Leuchtbefehl überspringen, wenn der Pin auf high ist "sbis"

   main:
   ldi   temp1, 1<<PB2

   sbis  PIND,  Taster1
   sbr   temp1, 1<<LED1

   sbis  PIND,  Taster2
   sbr   temp1, 1<<LED2

   out   PORTB, temp1
   rjmp main

Was du mit den den "ori" wolltest, verstehe ich auch noch nicht ganz.
Persönliche Seite #1671497
Lesenswert?

Daniel P. schrieb:
> Was du mit den den "ori" wolltest, verstehe ich auch noch nicht ganz.
Bits setzen ^^

@ Ralf:
Deine Main müsste laufen. Die LEDs müssten angehen

Jedoch ist deine Stackini auskommentiert, das funktioniert nur solange 
du keine Unterprogramme, Interrupts push und pop benutzt.

probier mal:
1
AVR-Assembler-Code
2
ldi    r16,high(RAMEND)
3
out    SPH,r16
4
ldi    R16,low(RAMEND)
5
out    SPL,r16
OP #1672987
Lesenswert?

Hallo,
jetzt bin ich wieder etwas beruhigt. Hab viel gelernt dabei!

1. Hochmut kommt vor dem Fall
Auch wenn man vor 30 Jahren mal 8085 programmiert hat, macht man Fehler.

2. manchmal ist es besser, mit kleinen Schritten anzufangen.

3. Das Board hier ist verdammt fix mit Hilfen

Ich hab die neuen ATMegas bekommen, langsam angefangen (LED Dauer-AN), 
dann erst Umschalter dazuprogrammiert. Und dann auch noch die 
Portbehandlung korrekt gemacht (Pullups).

Es funktioniert!

Danke!


Ralf
#1673016
Lesenswert?

Nehme ich richtig an, dass Du mit gas (dem GNU Assembler) arbeitest? 
Ich vermute das wegen hi8 und lo8.  Dann musst Du das Argument von 
I/O-Befehlen in _SFR_IO_ADDR() setzen, also statt
1
  sbi  DDRB, 1  ; falsch für GNU_Toolchain
muss es
1
  sbi _SFR_IO_ADDR(DDRB), 1
heißen.

Du kannst auch stattdessen an den Beginn
1
#define __SFR_OFFSET 0
setzen.

Tust Du keines von Beidem, so setzt der GNU Assembler SRAM-Adressen 
statt der um 0x20 niedrigeren I/O-Adressen ein.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren