Forum: Mikrocontroller und Digitale Elektronik atmega8535 und indirekte Adressierung


von Binraus S. (linuxdxs)


Lesenswert?

Hallo Forum

ich habe ein kleines Problem mit meinem ATmega8535. Ich möchte mit 
folgendem Progrämmchen herausfinden wieviel Ram in einem AVR-Proz 
vorhanden sind. Also ich speichere nacheinander erst den Wert 00 dann 
den Wert 255 in die einzelnen Speicherstellen, lese dann die Werte 
wieder und vergleiche sie mit den eingespeicherten Werten, stimmen diese 
Überein wird die Adresse an einer Stelle im Ram abgespeichert und der 
Zähler um eins erhögt. Titt ein Fehler auf, ist an dieser Stelle kein 
Speicher mehr, wird abgebrochen. Im AVR-Sim funktioniert das ganze, wenn 
ich dann das Prog mit meinem PonyProg auf dem Chip speichere Läuft 
dieser sich zu "tote", er kommt nicht mehr aus der Schleife raus. 
Warum?. Wenn kein Ram mehr da ist, muß doch normalerweise ein Fehler 
auftreten.


.equ temp1 = R18
.equ temp2 = R19
.equ temp3 = R20

   lds temp1,00
   lds temp2,255

   lds XL,96
   lds XH,00

up1:
   st X,temp1
   ld temp3,X
   cp temp1,temp3
   brne up2
   st X,temp2
   ld tempr,X
   cp tem2,temp3
   brne up2
   sts ramlow,XL
   sts ramhigh,XH
   ld temp3,X+
   st X+,temp1
up2:

von Sascha (Gast)


Lesenswert?

Hallo,

1. deine 4 'lds' Befehle am Anfang sollen doch wohl eher 'ldi' Befehle 
sein!?
2. wenn das alles ist, kann ich keine Schleife erkennen, die 
wasauchimmer testet und dann hängenbleibt

Der Speicher wird doch nicht weniger oder mehr - warum willst du dann 
testen ob er noch da ist. Oder hast du externen Ram angeschlossen.

Sascha

von Binraus S. (linuxdxs)


Lesenswert?

Naja kleinen Fehler beim Abtippen. Ich möchte dieses Programm als 
Baustein auf allen Mitgliedern der AVR-Familie einsetzten und mir ist 
aufgefallen, daß wenn ich Ramend benutze das nicht immer stimmt. 
Zumindest bei den ATmegas die ich als Testprozessoren einstzte. Weis der 
Geier warum. Für externen Ram wäre es natürlich auch von Vorteil wenn 
man diese Routine einsetzen könnte.

von Michael U. (amiga)


Lesenswert?

Hallo,

Thomas Sachs wrote:
> Naja kleinen Fehler beim Abtippen. Ich möchte dieses Programm als
> Baustein auf allen Mitgliedern der AVR-Familie einsetzten und mir ist
> aufgefallen, daß wenn ich Ramend benutze das nicht immer stimmt.
Ist mir noch nie begegnet, daß die Definition von RAMEND falsch war.
Falls doch, würde ich das eben im include-File korrigieren...
Da ja sowieso für den passenden Prozessor assembliert/compiliert werden 
muß, stimmt es auf jeden Fall. Der Ram ist ja im gleichen Typ immer 
gleich groß.

> Zumindest bei den ATmegas die ich als Testprozessoren einstzte. Weis der
> Geier warum.
Da würde ich doch die Ursache suchen und statt des Geiers mal wen anders 
fragen. ;-)

 Für externen Ram wäre es natürlich auch von Vorteil wenn
> man diese Routine einsetzen könnte.
Da würde ich es noch akzeptieren, sinnvoll wäre es da aber auch nur bei 
den AVR mit XMEM-Interface (das z.B. der 8535 nicht hat).
Bei Ram, der per Port-I/O angebunden ist, müssen ja sowieso eigene 
Routinen für den Zugriff geschrieben werden.

Der C64 hat sich z.B. darauf beschränkt, 0x55 zu schreiben und wieder zu 
lesen, bis es nichtmehr übereinstimmte.

ldi ZH,high(RamBegin)
ldi ZL,low(RamBegin)

loop:
 ldi temp,0x55
 st Z,temp
 ld temp,Z+
 cpi temp,0x55
 brne loop

 in Z steht dann die letzte gültige Adresse +1

Nicht sehr zuverlässig, weil Spiegelbereiche nicht erkannt werden.

Gruß´aus Berlin
Michael

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Vor allem wäre ich da vorsichtig, da du ggf im I/O Bereich rumschreibst 
und irgenwelche hardware/interupts aktivierst...

von Michael U. (amiga)


Lesenswert?

Hallo,
ich korrigiere mal selber:

 loop:
  ldi temp,0x55
  st Z,temp
  ld temp,Z+
  cpi temp,0x55
---------->  brne loop muß natürlich hier heißen
  breq loop

Gruß´aus Berlin
Michael

von Binraus S. (linuxdxs)


Lesenswert?

Eure Einwände sind eindeutig nachvollziehbar. Aber ich weis mir halt 
nicht anders zu helfen. Ich habe da ein Problem, welches sich so äußert, 
wenn ich im AVR-Assembler für den Stapel RAMEND benutze funktioniert das 
ganze Prgramm nicht. Setzte ich das end auf z.B dezimal 200 funktioniert 
es. Setzte ich den Stapel auf 512 funktioniert es wieder nicht. Jetzt 
weis ich als Anfänger natürlich nicht weiter, also habe ich mir eine 
Routine überlegt, die mir die Lösung meines Problemes aufzeigt und im 
nachhinein kann ich, wie oben erwähnt, auch bei anderen Pozessoren die 
Ramgröße erkennen. Mag von Profis im ersten Augenblich mit einem kleinen 
Lächen bewertet werden, aber für mich hat das ganze Ding einen Sinn. Im 
Simmulator funktioniert das Programm aber wenn ich es in die 
Pollin-Schaltung mit dem PonyProg übertrage funkioniert das ganze Ding 
nicht mehr. Jetzt hätte mich Interresiert warum nicht. Eines kann ich 
sagen, der Zähler zählt sich tot. Ich habe zwischenergebnisse in das 
EEprom Schreiben lassen und das letzte Zwischenergebnis das 
eingeschrieben worden ist, war 4ff. Jetzt war da doch ein neuer Aspekt 
"Speigelbereiche" was sind Spiegelbereiche?

von spess53 (Gast)


Lesenswert?

Hi

>Ich habe da ein Problem, welches sich so äußert,
>wenn ich im AVR-Assembler für den Stapel RAMEND benutze funktioniert das
>ganze Prgramm nicht. Setzte ich das end auf z.B dezimal 200 funktioniert
>es. Setzte ich den Stapel auf 512 funktioniert es wieder nicht. Jetzt...

Vergiss dein Testprogramm. Deine Fehlerbeschreibung deutet auf massive 
Programmierfehler hin. Ich tippe auf nicht komplementäre 
Push/Pop-Anweisungen, Sprünge in oder aus Unterprogramme(n).... Also 
Fehler bei Instruktionen, die den Stack beeinflussen.

MfG Spess

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Und ich tieppe auf falsche Reihenfolge beim beschreiben der High/Low 
Register!

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.