AVR Einsteigerproblem

OP #1671437
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:
Persönliche Seite #1671446
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
#1671454
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
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.