Forum: Mikrocontroller und Digitale Elektronik AVR Einsteigerproblem


von Ralf D. (dreilira)


Angehängte Dateien:

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

von Jürgen W. (juergen_w) Benutzerseite


Lesenswert?

Hallo,
1
cbi    DDRD,2          ; Port D 2 und 3 input
2
  cbi    DDRD,3
3
  sbi    DDRD,2          ; Port D 2 und 3 Pullup aktiv
4
  sbi    DDRD,3
5
  sbi    DDRB,0          ; Port B 0 und 1 Ausgang
6
  sbi    DDRB,1

Um die Pullups zu aktivieren musst du anstatt  sbi    DDRD,2 , sbi 
Portd,2 schreiben.
Oben schaltest du deine Eingänge sofort wieder als Ausgänge um.

Grüsse

von spess53 (Gast)


Lesenswert?

Hi

Als erstes: Finger weg von der Tabulatortaste.

>sbi  DDRD,2  ; Port D 2 und 3 Pullup aktiv
>sbi  DDRD,3

Das muss sbi PortD,n heissen

MfG Spess

von Daniel P. (avr-isp-stick)


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.

von Daniel P. (avr-isp-stick)


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.

von Jürgen W. (juergen_w) Benutzerseite


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

von Ralf D. (dreilira)


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

von Hc Z. (mizch)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.