www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik atmega 16, array, assembler, indirekte adressierung


Autor: rudi ratlos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo

versuch jetzt schon stundenlang ein anscheinend simples programm
zuschreiben aber irgendwie steh ich auf der leitung,...

wie kann man bei einem atmega 16 ein array für 15 werte (bytes)
definieren und mittels indirekter adressierung zugreifen?

bzw. wo legt man das arry am besten an? flash? eeprom? daten sollen
nicht flüchtig sein aslo kein sram

bzw. wie kann man dann mittels x,y,z drauf indirekt zufreifen
(pointer)

thx

Autor: Jack Braun (jackbraun)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn Du nicht sagst, in welcher Entwicklungsumgebun Du programmierst,
kann Dir auch keiner helfen

Autor: rudi ratlos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
texteditor

Autor: Tubie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ldi ZL,low(array*2)    ; z-pointer auf startaddresse
ldi ZH,high(array*2)


ldi test,z+            ; test mit dem wert, auf den z+ steht
                         speichern, z +1





array:
.db "Hallo Dies ist ein tst",$13




vielleicht so??? habe leider nicht mehr input, wie du dir das
vorstellst

Autor: rudi ratlos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.section  .text

.global  main

.org 0x0000

feld: .byte 0xff, 0xff, 0xf0, 0xff


main:
  ldi YL,lo8(feld)
  ldi YH,hi8(feld)
  ld  r16, Y
  ldi r17, 0xff
  out DDRC, r17
  out PORTC, r16


rjmp main

mit ld r16, Y soll nach r16 der wert geladen werden auf den Y
zeigt,..es läßt sich fehlerlos übersetzten nur in r16 steht 0x00, es
sollte aber 0xff drinnenstehen

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmmm

so wie ich das sehe versuchst du was ausm Flash zu holen ...

1. geht das nur mitm Z Register
2. geht das nur mit LPM ...
richtiger wäre demnach:

.
.
.

main:
  ldi ZL,low(feld*2)
  ldi ZH,high(feld*2)
  lpm  r16, Z
  ldi r17, 0xff
  out DDRC, r17
  out PORTC, r16

.
.
.

Jedenfalls sagen das meine bescheidenen Assemblerkenntnisse ,,,

Autor: Tubie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Asche auf mein Haupt...

Natürlich LPM anstatt LDI wo habe ich nur meine Gedanken :-(


LPM r16,Z+   ; incrementiert den Z-Pointer nach dem lesen

Gruß,
Tubie

und Sorry für die falsche Antwort

Autor: David W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Indirekte Adressierung geht nur im SRAM.

Sonst haben meine Vorredner schon recht :)

Autor: rudi ratlos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aha also nur im sram

wärs vielleicht möglich mir zu zeigen wie?
wie kann ich die daten dort ablegen?
der zugriff müßte dann ja so gehen oder?

Autor: rudi ratlos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
habs endlich geschafft
thx an alle für eure hilfe

hab im sram speicher reserviert und auf den mittels XL, XH indirekte
adressierung gemacht

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@rudi ratlos:

Vielleicht solltest du wirklich erstmal schreiben, was du vorhast.

Mag ja sein, dass der Begriff 'indiziert adressieren' oder 'Array'
nur für das SRAM gelten, aber es gibt schon Möglichkeiten, Listen oder
Tabellen (mit Konstanten, Texten usw) im Programmspeicher (Flash)
abzulegen und darauf indiziert (also über Index) zuzugreifen.

Die Daten legt man mit .db oder .dw im Flash ab.
Der Zugriff erfolgt über den Z-Pointer und LPM.

Dabei ist zu beachten:
- Die Daten gehören nicht ins .dseg sondern ins .cseg, denn es sind
keine Variablen sondern Konstanten, die wie Code gespeichert werden. --
Die Daten gehören auch grundsätzlich nicht an Adresse 0, denn dort
gehört die Interrupt-Sprungtabelle hin und nix anderes. Also die Daten
immer schön an das Programmende.
- Der Flash ist wordweise organisiert, die Daten müssen also immer
paarweise (bei .db) angelegt werden.
- LPM liest byteweise, der z-Pointer muss also die doppelte Adresse
enthalten.
- Vor den Daten ist ein Label zu setzen, damit die Basisadresse der
Datentabelle verfügbar ist.

Willst du auf das Byte zugreifen, dessen Index im Register r16 steht,
dann ginge das so:

 ldi zl,low(daten*2)   ;Z-Pointer auf Basisadresse
 ldi zh,high(daten*2)  ;des Datenblocks setzen
 add zl,r16            ;Index dazu addieren
 adc zh,null           ;Übertrag (Carry) dazu addieren
 lpm                   ;das gewünschte Byte steht nun in r0

wobei 'null' ein unteres Register ist, das den Wert 0 enthält.

...

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...zu schnell abgeschickt, es fehlen noch die Daten:

daten:
 .db 2,4,6,8,10,20           ;immer geradzahlige Anzahl Bytes
 .db "Das ist ein Text!",0   ;immer geradzahlige Anzahl Bytes

...

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> bzw. wo legt man das arry am besten an? flash? eeprom? daten sollen
> nicht flüchtig sein aslo kein sram

Und warum machst du es dann im SRAM???

...

Autor: rudi ratlos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das ganze ist ein counter von 0-F
wird am portc ausgegeben
und jenachdem ob PINA4 auf "0" oder "1" ist soll der counter
auf/abwärts zählen.
das sram soll verwendet werden um dort das array zu speichern
ist zwar ein flüchtiger speicher, das array wird halt jedesmal neu
geschrieben wenn der baustein vom strom getrennt oder resettet wird.
ist so verlangt das ganze

das mit den daten ablegen im flash würde mich auch interessieren,
allerdings kennt der atmega 16 .db anweisungen nicht. werd nochmals das
manual lesen. allerdings müßte es laut dem gehen so wie ich den
quelltext weiter oben schon gepostet habe....tut es aber nicht

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.