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:
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
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.
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
Vor allem wäre ich da vorsichtig, da du ggf im I/O Bereich rumschreibst und irgenwelche hardware/interupts aktivierst...
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
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?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.