www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR Einsteigerproblem


Autor: Ralf Dreiling (dreilira)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Jürgen W. (juergen_w) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
cbi    DDRD,2          ; Port D 2 und 3 input
  cbi    DDRD,3
  sbi    DDRD,2          ; Port D 2 und 3 Pullup aktiv
  sbi    DDRD,3
  sbi    DDRB,0          ; Port B 0 und 1 Ausgang
  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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Daniel P. (avr-isp-stick)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Daniel P. (avr-isp-stick)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jürgen W. (juergen_w) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
AVR-Assembler-Code
ldi    r16,high(RAMEND)
out    SPH,r16
ldi    R16,low(RAMEND)
out    SPL,r16

Autor: Ralf Dreiling (dreilira)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht 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
  sbi  DDRB, 1  ; falsch für GNU_Toolchain
muss es
  sbi _SFR_IO_ADDR(DDRB), 1
heißen.

Du kannst auch stattdessen an den Beginn
#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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.