Forum: Mikrocontroller und Digitale Elektronik AVR mehr Speicher (RAM) als erwartet


von Simon G. (sigro)


Lesenswert?

Hallo zusammen,
wenn ich den folgenden Code ausführe steht bei einem ATmega16m1 mit 1k 
Ram der Zeiger Z am Ende der Ausführung auf 0x081F.
Ich würde aber 0x0500 erwarten.

Es sieht für mich so aus, als hätte der AVR einen größeren Speicher als 
im Datenblatt vermerkt.

Kennt jemand dieses "Problem"? Hat jemand ähnliche Erfahrungen gemacht 
oder hat eine Erklärung für dieses Phänomen?

Vielen Dank Simon
1
ldi  r30,  0x00   ;initialisiere Zeiger Z auf
2
ldi  r31,  0x01   ; 0x0100 (Beginn RAM)
3
ldi  r16,  0x00
4
ldi  r17,  0x00
5
loop:
6
st   z,    r16    ; Speichere Register 16 auf Adresse Z
7
ld   r17,  z+     ; Lade Adresse Z in Register 17 und inkrementiere Z
8
cpse r16,  r17    ; Wenn R16 und R17 gleich sind überspringe nächsten Befehl
9
jmp end           ; Springe ans Ende
10
inc  r16          ; inkrementiere Wert von R16
11
jmp  loop         ; wiederhole alles
12
end:
13
jmp end           ; endlosschleife zur Erkennung von Ungleichheit

von Volker (Gast)


Lesenswert?

Vielleicht auch mal mit anderen Werten als 0 testen?

von Volker (Gast)


Lesenswert?

Machst du ja - sorry...

von Georg I. (dschi-ai)


Lesenswert?

Weil der RAM erst bei 0x0100 beginnt. Siehe Datenblatt S. 21

von Volker (Gast)


Lesenswert?

Machst du doch nicht :-)
Du testest pro Speichersteller immer nur einen Wert.
In der Schleife welche wahrscheinlich alle 256 Werte abfragen soll 
darfst du natürlich nicht z inkrementieren.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> st   z,    r16    ; Speichere Register 16 auf Adresse Z
> ld   r17,  z+     ; Lade Adresse Z in Register 17 und inkrementiere Z
Mach da mal noch was anderes zwischen Schreiben und Lesen. Die paar ns 
kann sich sogar eine offene Leitung einen Pegel merken...  :-o

Ich würde z.B. immmer schon die nächste Adresse schreiben und die 
(unterschiedliche) vorherige dann erst zurücklesen...

Am besten wäre es, Zufallswerte auszugeben, und nicht etwas, das sich 1. 
wiederholt und 2 so wiederholt, dass immer die Adressleitungen 0..7 
gleich den Datenleitungen 0..7 sind...

von Uwe (Gast)


Lesenswert?

dir ist schon klar das du r16 in r17 speicherst und danach guckst ob die 
gleich sind ? Die sind immer gleich. Deshalb hast du eine Endloschleife 
programmiert. Diese schreibt irgendwann in den Stackbereich falls dieser 
existiert und irgendwann hinter den gültigen RAM Bereich.

von Simon G. (sigro)


Lesenswert?

Vielen Dank für die schnellen und vielen Antworten.

Georg Ious schrieb:
> Weil der RAM erst bei 0x0100 beginnt. Siehe Datenblatt S. 21

Deshalb initialisiere ich den Z Pointer auch auf 0x0100
0x0100 + 0x0400(1kByte RAM) = 0x0500

Volker schrieb:
> Machst du doch nicht :-)
> Du testest pro Speichersteller immer nur einen Wert.
> In der Schleife welche wahrscheinlich alle 256 Werte abfragen soll
> darfst du natürlich nicht z inkrementieren.

Dieses "Programm" dient nur zur Verdeutlichung des Problems, eigentlich 
möchte ich den Speicher auf festsitzende Bits testen.

Lothar Miller schrieb:
>> st   z,    r16    ; Speichere Register 16 auf Adresse Z
>> ld   r17,  z+     ; Lade Adresse Z in Register 17 und inkrementiere Z
> Mach da mal noch was anderes zwischen Schreiben und Lesen. Die paar ns
> kann sich sogar eine offene Leitung einen Pegel merken...  :-o

Ich habe einfach mal einige nops eingefügt, das ändert aber leider 
nichts am Ablauf.

> Ich würde z.B. immmer schon die nächste Adresse schreiben und die
> (unterschiedliche) vorherige dann erst zurücklesen...
>
> Am besten wäre es, Zufallswerte auszugeben, und nicht etwas, das sich 1.
> wiederholt und 2 so wiederholt, dass immer die Adressleitungen 0..7
> gleich den Datenleitungen 0..7 sind...

Da mir auf anhieb keine einfache Zufallserzeugung einfällt, habe ich 
einfach r16 auf 4 initialisiert. ändert leider auch nichts.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Simon G. schrieb:
>>> st   z,    r16    ; Speichere Register 16 auf Adresse Z
>>> ld   r17,  z+     ; Lade Adresse Z in Register 17 und inkrementiere Z
>> Mach da mal noch was anderes zwischen Schreiben und Lesen. Die paar ns
>> kann sich sogar eine offene Leitung einen Pegel merken...  :-o
> Ich habe einfach mal einige nops eingefügt
Das ändert nichts daran, dass der Datenbus nicht geändert wird. Schreib 
mal mit einem anderen (Y-)Pointer ganz was anderes (z.B. 
Komplementärwert von R16) auf/über/in den Datenbus...

Ich kann mir zwar schon vorstellen, dass einfach ein größerer uC 
umgelabelt wird, aber 0x081F ist irgendwie ein blöder Wert. Hast du da 
auch mal einen anderen ATmega16m1 ausprobiert?

von spess53 (Gast)


Lesenswert?

Hi

Solche Effekte entstehen auch bei unvollständiger Adresscodierung. Dann 
erscheint die gleiche Speicherzelle auf 2 oder mehr Adressen. Allerdings 
hätte ich dann auch einen anderen Endwert erwartet.

MfG Spess

von Simon G. (sigro)


Lesenswert?

Lothar Miller schrieb:
> Am besten wäre es, Zufallswerte auszugeben, und nicht etwas, das sich 1.
> wiederholt und 2 so wiederholt, dass immer die Adressleitungen 0..7
> gleich den Datenleitungen 0..7 sind...

Habe jetzt folgendes Programm benutzt, mit dem Ergebnis, daß das 
Programm bei 0x0850 abbricht.
1
.DEF lfsr0   = r6  ;3 Register bilden ein 23bit-LFSR
2
.DEF lfsr1   = r7  ; (linear rückgekoppeltes Schieberegister)
3
.DEF lfsr2   = r8  ; für den Pseudo-Zufallszahlengenerator
4
.DEF lfsr3   = r9  ; für den Pseudo-Zufallszahlengenerator
5
.DEF xh = r27
6
7
.macro next_down ;(reg, label)
8
  dec @0
9
.if pc-@1 < 64
10
  brne @1
11
.else
12
  breq pc+2
13
  rjmp @1
14
.endif
15
.endmacro
16
17
ldi  r30,  0x00
18
ldi  r31,  0x01
19
ldi  r16,  0x04
20
ldi  r17,  0x00
21
loop:
22
call zufallszahl
23
mov r16,  r26
24
st   z,    r16
25
nop
26
.
27
.
28
.
29
nop
30
ld   r17,  z
31
adiw r30,  1
32
cpse r16,  r17
33
jmp end
34
jmp  loop
35
end:
36
jmp end
37
38
zufallszahl:
39
zufallsz1: ; *** Pseudo-Zufallszahl erzeugen (per LFSR mit 23 Bits)
40
; Input:  R16 = Anzahl n der zu erzeugenden Bits (1 ... 16)
41
; Output: XH:XL = Zufallszahl (in den unteren n Bits)
42
  zuf_lp1: ;n Shift-Operationen mit Rückkopplung
43
    mov xh,lfsr1
44
    lsl xh ;bit 13 des LFSR steht nun in bit 6 von xh
45
  eor xh,lfsr2 ;bit 22 und 13 des LFSR sollen verknüpft werden
46
  lsl xh ;jetzt in bit 7
47
  lsl xh ;jetzt im Carry-Flag
48
  rol lfsr0 ;gesamtes LFSR links-shiften und neues Bit einschieben
49
  rol lfsr1
50
  rol lfsr2
51
  next_down r16,zuf_lp1 ;n "neue bits" stehen bereit in LFSR
52
  movw x,lfsr0
53
ret

von Simon G. (sigro)


Lesenswert?

spess53 schrieb:
> Hi
>
> Solche Effekte entstehen auch bei unvollständiger Adresscodierung. Dann
> erscheint die gleiche Speicherzelle auf 2 oder mehr Adressen. Allerdings
> hätte ich dann auch einen anderen Endwert erwartet.
>
> MfG Spess

Hi,
in die Richtung gingen meine ersten Vermutungen auch, nur schwankt der 
Endwert um einiges, und ich sehe bei höheren Adressen keine Änderungen 
im regulären Adressraum mehr.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Simon G. schrieb:
> st   z,    r16
> nop
> .
> .
> .
> nop
> ld   r17,  z
Immer noch: der Datenbus leibt zwischen Schreiben und Lesen unberührt. 
Und das, was Simon G. schrieb:
> nur schwankt der Endwert um einiges
Deutet irgendwie auf floatende Datenleitungen hin...

von (prx) A. K. (prx)


Lesenswert?

Wie Lothar schon schrieb: Zumindest bei externen Bussystemen ist 
bekannt, dass ein offener Bus geschriebene Daten aufgrund der Kapazität 
noch eine Weile tragen und folglich geschriebene Daten bei alsbaldigem 
Lesen wieder zurück liefern kann.

Ob es etwas damit zu tun hat lässt sich feststellen, indem man in 
aufeinander folgende Bytes verschiedene Werte schreibt und stets den 
Wert des vorletzten kontrolliert.

von Simon G. (sigro)


Lesenswert?

Lothar Miller schrieb:
> Simon G. schrieb:
>> st   z,    r16
>> nop
>> .
>> .
>> .
>> nop
>> ld   r17,  z
> Immer noch: der Datenbus leibt zwischen Schreiben und Lesen unberührt.
> Und das, was Simon G. schrieb:
>> nur schwankt der Endwert um einiges
> Deutet irgendwie auf floatende Datenleitungen hin...

neues Programm, altes Ergebnis.
1
ldi  r30,  0x01
2
ldi  r31,  0x01
3
ldi  r18,  0x55
4
loop:
5
call zufallszahl
6
mov r16,  r26
7
st   z,    r16
8
sts 0x100, r18
9
ld   r17,  z
10
adiw r30,  1
11
cpse r16,  r17
12
jmp end
13
jmp  loop
14
end:
15
jmp end
am Ende steht aber bei 0x100 kein 0x55 mehr. scheint doch irgendwie mit 
unvollständiger Adresscodierung zu tun zu haben.

von MWS (Gast)


Lesenswert?

Simon G. schrieb:
> Habe jetzt folgendes Programm benutzt,

Jetzt dachte ich immer, man müsste den SP initialisieren, wenn man Calls 
benutzt... Per Default steht der beim ATM16M1 auf $0000, wenn der Call 
ausgeführt wurde auf $FFFE. Sollte der Call dann ordnungsgemäß an die 
Ausgangsposition zurückkehren, hast Du ja noch viel mehr Speicher. 
Glückwunsch :D

Sobald der Adresszähler überdreht und in Prozessorregister reinschreibt, 
kann das Ganze chaotisch werden.

Da wär's doch mal Zeit den Gegenbeweis zu suchen. SRam mit Nullen 
vollschreiben, dann auf verschiedene Zellen ab $0500 bis $084F ein $FF 
und im SRam auf die Suche danach gehen.

von Simon G. (sigro)


Lesenswert?

1
ldi  r30,  0x00
2
ldi  r31,  0x01
3
ldi  r18,  0x00
4
ldi  r16,  0x05
5
loop1:
6
st   z+,    r18
7
cpse r31,   r16
8
jmp loop1
9
10
; Initialisierung des Speichers auf 0
11
12
ldi  r30,  0x01
13
ldi  r31,  0x05    ; Start bei 0x500
14
ldi  r18,  0x55
15
loop:
16
call zufallszahl
17
mov r16,  r26
18
st   z,    r16
19
sts 0x100, r18
20
ld   r17,  z
21
adiw r30,  1
22
cpse r16,  r17
23
jmp end
24
jmp  loop
25
end:
26
jmp end
Also bei diesem Programm ist am Ende in der Speicherzelle 0x100 der Wert 
0x54 und bei 0x4FF steht 0x0D.
Der Z Pointer steht bei 0x081C

von Purzel H. (hacky)


Lesenswert?

Interessant waere nun, ob der der Speicher, der zuviel ist allenfalls 
sogar am Wachsen ist...
Dann koennte man einen Kompressor schreiben, der exponentiell mehr Daten 
reinkriegt.

von Osche R. (Gast)


Lesenswert?

Simon G. schrieb:

> Es sieht für mich so aus, als hätte der AVR einen größeren Speicher als
> im Datenblatt vermerkt.

Oft ist auf dem Die der Speicher des größten Typen aus der Familie 
vorhanden (das ist vermutlich der ATmega32) und es wird nur der Teil 
getestet, den Du auch bezahlt hast.

Ans RAM kommt man immer dran (auch wenn die Funktion nicht garantiert 
ist), das Flash ist manchmal im Bootloader gesperrt.

von Simon G. (sigro)


Lesenswert?

om pf schrieb:
> Simon G. schrieb:
>
>> Es sieht für mich so aus, als hätte der AVR einen größeren Speicher als
>> im Datenblatt vermerkt.
>
> Oft ist auf dem Die der Speicher des größten Typen aus der Familie
> vorhanden (das ist vermutlich der ATmega32) und es wird nur der Teil
> getestet, den Du auch bezahlt hast.
>
> Ans RAM kommt man immer dran (auch wenn die Funktion nicht garantiert
> ist), das Flash ist manchmal im Bootloader gesperrt.

Das "Problem" taucht auch bei einem Tiny13 auf. Meiner Meinung nach gibt 
es da keinen Typ mit mehr Speicher.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

om pf schrieb:
> Oft ist auf dem Die der Speicher des größten Typen aus der Familie
> vorhanden (das ist vermutlich der ATmega32) und es wird nur der Teil
> getestet, den Du auch bezahlt hast.

Das würde ich bei den Stückzahlen, in denen der ATmega16 verkauft
wird, nicht erwarten, dass es sich nur um runterskalierte Dies
handelt.

> Ans RAM kommt man immer dran

Eine sehr gewagte Aussage.  Warum sollten die Entwickler nicht auch
die paar Gatter spendieren, um den datenblattmäßigen Adressraum
des angedachten Bauelementes dann tatsächlich zu emulieren?

Nein, des Rätsels Lösung wurde ja schon genannt: die oberen
Adressbits werden einfach ignoriert.

Simon G. schrieb:
> Habe jetzt folgendes Programm benutzt, mit dem Ergebnis, daß das
> Programm bei 0x0850 abbricht.

Wenn das Programm korrekt ist, sollte es nach 0x085F abbrechen,
denn der SRAM eines ATmega16 beginnt bei 0x60.  Die Adresse 0x0860
greift dann also wieder die gleiche Speicherstelle zu wie 0x60.

von spess53 (Gast)


Lesenswert?

Hi

>Das würde ich bei den Stückzahlen, in denen der ATmega16 verkauft
>wird, nicht erwarten, dass es sich nur um runterskalierte Dies
>handelt.

Es ist ein ATMega16M1.

MfG Spess

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

spess53 schrieb:
> Es ist ein ATMega16M1.

OK, missgelesen.  Dann stimmt natürlich auch das mit dem RAM ab 0x60
nicht.

Memory wraparound ist trotzdem normal.  Sollte man sich übrigens
problemlos beim Debuggen über JTAG ansehen können (natürlich nur,
sofern einen die GUI nicht daran hindert, weil sie ja "weiß", dass
der RAM an dieser Stelle zu Ende ist).

Anderer Vorschlag: den gesamten Bereich von 0x100 bis 0xffff mit
0 füllen.  Anschließend ab 0x100 "Hello, world!" reinschreiben und
danach suchen, an welcher Stelle im RAM man überall das "Hello,
world!" wiederfinden kann.

von MWS (Gast)


Lesenswert?

Jörg Wunsch schrieb:
> Anderer Vorschlag: den gesamten Bereich von 0x100 bis 0xffff mit
> 0 füllen.  Anschließend ab 0x100 "Hello, world!" reinschreiben und
> danach suchen, an welcher Stelle im RAM man überall das "Hello,
> world!" wiederfinden kann.

So etwas hatte ich bereits vorgeschlagen, wurde aber ignoriert, genauso 
wie die Frage wo er denn den Stack Pointer initialisiert, wenn er Calls 
verwendet.

von Simon G. (sigro)


Lesenswert?

Jörg Wunsch schrieb:
> Nein, des Rätsels Lösung wurde ja schon genannt: die oberen
> Adressbits werden einfach ignoriert.
Aber mehr als Erwartet
1
ldi  r30,  0x00
2
ldi  r31,  0x01
3
ldi  r18,  0x00
4
ldi  r16,  0x05
5
loop1:
6
st   z+,    r18
7
cpse r31,   r16
8
jmp loop1
9
; initialisierung auf 0
10
11
ldi  r30,  0x00
12
ldi  r31,  0x05
13
ldi  r18,  0x55
14
ldi  r16,  0x08 ; Normaler Speicher am Ende mit 0x00 gefüllt
15
; ldi  r16,  0x09 ; Normaler Speicher am Ende mit 0x55 gefüllt
16
loop2:
17
st   z+,    r18
18
cpse r31,   r16
19
jmp loop2
20
; initialisierung auf 0x55

Jörg Wunsch schrieb:
> Memory wraparound ist trotzdem normal.  Sollte man sich übrigens
> problemlos beim Debuggen über JTAG ansehen können (natürlich nur,
> sofern einen die GUI nicht daran hindert, weil sie ja "weiß", dass
> der RAM an dieser Stelle zu Ende ist).
Ja, leider kann ich mir nicht mehr Speicher anzeigen lassen als der Typ 
haben sollte.
Bei Auswahl des ATmega32M1 läßt das AVR Studio das Debuggen nicht zu.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

MWS schrieb:
> ..., genauso
> wie die Frage wo er denn den Stack Pointer initialisiert, wenn er Calls
> verwendet.

Muss man bei modernen AVRs nicht, der SP steht initial auf dem Ende
des internen SRAMs.  Allerdings sollte man natürlich in einem
Testprogramm tunlichst CALLs vermeiden, denn es hat ja keinen Sinn,
sich den Stack zu überschreiben mit einem Testmuster.

Simon G. schrieb:
> Ja, leider kann ich mir nicht mehr Speicher anzeigen lassen als der Typ
> haben sollte.

Nicht-Klicki-Debugger benutzen.  Oder eben anderes Testprogramm, s. o.

Ich habe deinen Controller leider nicht zur Hand, sonst hätte ich
ihn mal schnell in einen STK<irgendwas> gesteckt und mit dem Debugger
draufgeguckt.

von Simon G. (sigro)


Lesenswert?

> Muss man bei modernen AVRs nicht, der SP steht initial auf dem Ende
> des internen SRAMs.  Allerdings sollte man natürlich in einem
> Testprogramm tunlichst CALLs vermeiden, denn es hat ja keinen Sinn,
> sich den Stack zu überschreiben mit einem Testmuster.

Der Stackpointer wurde erst mit der Einführung der Zufallszahl benutzt, 
davor kab es keine Calls.

Habe Jetzt auch den Call bei der Version mit der Zufallszahl entfernt, 
immer noch das gleiche Ergebnis.

> Ich habe deinen Controller leider nicht zur Hand, sonst hätte ich
> ihn mal schnell in einen STK<irgendwas> gesteckt und mit dem Debugger
> draufgeguckt.
Danke, die Frage ist ja auch, ob sich dieses Phänomen bei anderen Typen 
zeigt.

von MWS (Gast)


Lesenswert?

Jörg Wunsch schrieb:
> Muss man bei modernen AVRs nicht, der SP steht initial auf dem Ende
> des internen SRAMs.

Nun, dann lade Dir doch mal das Datenblatt von Atmel und schau Dir auf 
Seite 15 die Werte von Initial Value an, die stehen auf $0000.

http://www.atmel.com/Images/doc8209.pdf

Kann natürlich sein, dass das DB 'nen Fehler hat und die Initialisierung 
tatsächlich auf RAMEND stattfindet. Dann werd' ich in Zukunft nicht mehr 
in's DB schauen, sondern Dich fragen ;D

von Simon G. (sigro)


Lesenswert?

MWS schrieb:
> Jörg Wunsch schrieb:
>> Muss man bei modernen AVRs nicht, der SP steht initial auf dem Ende
>> des internen SRAMs.
>
> Nun, dann lade Dir doch mal das Datenblatt von Atmel und schau Dir auf
> Seite 15 die Werte von Initial Value an, die stehen auf $0000.
>
> http://www.atmel.com/Images/doc8209.pdf
>
> Kann natürlich sein, dass das DB 'nen Fehler hat und die Initialisierung
> tatsächlich auf RAMEND stattfindet. Dann werd' ich in Zukunft nicht mehr
> in's DB schauen, sondern Dich fragen ;D

Das AVR Studio zeigt nach einem Reset an, daß der Stack Pointer auf 
0x04FF(RAM Ende) zeigt, ohne das ich ihn initialisiert habe.

von Alex W. (Gast)


Lesenswert?

Das kann aber auch ein Bug in AVRStudio sein!

von MWS (Gast)


Lesenswert?

Simon G. schrieb:
> Das AVR Studio zeigt nach einem Reset an, daß der Stack Pointer auf
> 0x04FF(RAM Ende) zeigt, ohne das ich ihn initialisiert habe.

AVR-Studio zeigt mir manchmal beim Debuggen einen *JMP $0000* an, obwohl 
da keiner ist. Das ist hier sicher nicht das Maß der Dinge.

Normalerweise ist schon das DB das Entscheidende, von etwas anderem 
auszugehen kannst Du Dir u.U. leisten, wenn Du es in der aktuellen HW 
selbst überprüft hast. Und das würd' ich bezweifeln.

von Simon G. (sigro)


Lesenswert?

Alex W. schrieb:
> Das kann aber auch ein Bug in AVRStudio sein!

Ich debugge direkt auf dem Controller. Angebunden ist dieser über das 
debugWIRE On-chip Debug System. Trotzdem kann ich natürlich einen Bug 
nicht 100%ig ausschließen.

von Peter D. (peda)


Lesenswert?

MWS schrieb:
> Kann natürlich sein, dass das DB 'nen Fehler hat und die Initialisierung
> tatsächlich auf RAMEND stattfindet.

Wird ein Copy&Paste-Fehler sein.
Alle AVR ab ATtiny13/ATmega48 setzen den Stack selber richtig. Warum 
sollte ein neuer Typ wieder einen Rückschritt machen?


Peter

von (prx) A. K. (prx)


Angehängte Dateien:

Lesenswert?

Peter Dannegger schrieb:

>> Kann natürlich sein, dass das DB 'nen Fehler hat und die Initialisierung
>> tatsächlich auf RAMEND stattfindet.
>
> Wird ein Copy&Paste-Fehler sein.

Steht in DB völlig richtig drin. In der aktuellen Version.
http://www.atmel.com/Images/doc7647.pdf

von Simon G. (sigro)


Angehängte Dateien:

Lesenswert?

Anbei nochmal das Programm.
Ich würde mich sehr freuen wenn ihr noch Verbesserungen einbaut, das 
Programm auf anderen Typen testet und wir eine abschließende Antwort 
finden.

von Peter D. (peda)


Lesenswert?

A. K. schrieb:
> Steht in DB völlig richtig drin. In der aktuellen Version.
> http://www.atmel.com/Images/doc7647.pdf

Das ist aber das Automotive Datenblatt.


Peter

von MWS (Gast)


Lesenswert?

A. K. schrieb:
> Steht in DB völlig richtig drin. In der aktuellen Version.
> http://www.atmel.com/Images/doc7647.pdf

Das von mir verlinkte DB kam von der Atmel Produktseite:
http://www.atmel.com/devices/atmega16m1.aspx?tab=documents
Also von dort, wo man danach suchen würde.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Peter Dannegger schrieb:
> Das ist aber das Automotive Datenblatt.

Allerdings gibt es keinen vernünftigen Grund, warum die non-
automotive-Typen ihre Register anders belegen sollten. ;-)  Die
automotive-Teile haben halt nur eine bessere (aufwändigere)
Qualifizierung hinter sich.

von (prx) A. K. (prx)


Lesenswert?

Jörg Wunsch schrieb:

> automotive-Teile haben halt nur eine bessere (aufwändigere)
> Qualifizierung hinter sich.

Offenbar nicht nur die Chips, sondern auch deren Datenblätter. ;-)

von MWS (Gast)


Lesenswert?

Simon G. schrieb:
> Angebunden ist dieser über das
> debugWIRE On-chip Debug System.

Du müsstest sicherstellen können, dass das Messmittel nicht die Messung 
verfälscht. Aufgrund des per Debugwire aufgesetzten Protokolls kannst Du 
das m.E. nicht.

Dein Programm muss ohne Debugwire funktionieren. Dazu sollte es in der 
Lage sein einen Adressüberlauf zu erkennen und selbst kein SRam zu 
verwenden, Stichwort Stack. Gleichzeitig müsstest Du darauf achten, dass 
die Prozessorregister beim Überlauf selbst nicht überschrieben werden 
und letzten Endes Dein Ergebnis Ad Absurdum führen.
Denn genau das kann im Moment passieren, kann verhindert werden indem Du 
z.B. R0 auf 'nen definierten Wert setzt und laufend prüfst. Genauso 
wenig braucht's Zufallszahlen, es reicht einmal auf $00 und auf $FF 
zusetzen und jeweils das Ergebnis zu testen. Am Ende des Tests kannst Du 
dann im einfachsten Fall die ermittelte Adresse auf 2 Ports ausgeben.

von MWS (Gast)


Lesenswert?

Jörg Wunsch schrieb:
> Allerdings gibt es keinen vernünftigen Grund, warum die non-
> automotive-Typen ihre Register anders belegen sollten. ;-)

Ist lustig, wie sich da rumgewunden wird.

Normalerweise bekommt jeder unschuldige Frager den Rat, er möge doch 
in's Datenblatt sehen. Und wenn's dann jemand vorher tatsächlich macht 
und sich das nicht mit der eigenen Ansicht deckt, dann werden Annahmen 
getroffen. Diese Sorte Kreativität ist natürlich nur den Profis erlaubt 
:D

Unabhängig davon, was andere, ältere oder neuere µC's da jetzt machen 
werden, wäre der Zweifel der sich aus dem DB ergibt, mehr als 
ausreichend dafür den SP explizit zu initialisieren.

Schau' halt mal in AVR GCC nach, ob der glaubt sich den SP-Init sparen 
zu können. Und da Du Jörg, mit allem Respekt, im AVR GCC eine Koryphäe 
bist, solltest Du das am Besten wissen.

von unl34shed (Gast)


Lesenswert?

Die Frage, die sich mir stellt ist, ob der "erweiterte" RAM auch die 
Daten hällt. RAM muss ja refreshed werden, vllt. wurde da ja was raus 
genommen.
Und ob Adresse 0x500 nicht doch auf 0x100 schreibt.

Warum baust du dein Code nicht so um, dass er über UART funktioniert?

Kannst dann auch mehrere Modi einbauen, Alles mit 0 füllen, alles mit FF 
füllen, Zahlenfolge 0 - X, ...
Wäre nur ne kleine Abfrage am Anfang des Programms nötig. (natürlich 
über polling, keine Interrupts!)

Dann schreibst du den RAM voll und liest ihn wieder aus.

Das Ausgelesene dann über den UART wieder zurück an den PC und zB.  in 
Excel gepackt.


Vor allem mit der Zahlenfolge könntest du dann feststellen, ob Adresse 
0x500 nicht doch auf 0x100 schreibt (natürlich nur, wenn du es nicht so 
füllst, dass es sich bei 0x500 wiederholt).

Um die Datenhaltung zu testen, einfach mal 5min Warten und wieder 
auslesen.
Entsprechen am Ende des Programms dann UART pollen für weitere Befehle

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

MWS schrieb:
> Normalerweise bekommt jeder unschuldige Frager den Rat, er möge doch
> in's Datenblatt sehen.

Ist ja auch völlig korrekt, aber es ist eben (leider) auch nicht
der erste Bug in einem Datenblatt, der einem so über den Weg
läuft.

Sicher, in produktivem Code würde ich mich auf nichts verlassen, was
nicht im Datenblatt steht, aber hier geht's um ein simples
Testprogramm, und der Anwender hat sich empirisch mit dem Debugger
versichert, dass der initiale Inhalt des Stackpointers seinen
Erwartungen entspricht.  Die Chance, dass man per debugWIRE nur durch
puren Zufall aus dem SP ein 0x4FF statt einer tatsächlich vorhandenen
0 ausliest ist drastisch geringer als die, dass das Datenblatt
einfach mal nur (infolge von copy, paste & die) falsch liegt.

Aber das ist nun komplett abschweifend und bringt uns in der
eigentlichen Frage nicht weiter.  Entweder müsste Simon also das
Programm mal ändern und nachschauen, an welchen Stellen der wrap
around passiert, oder er müsste jemandem, der mit was anderem als
AVR Studio debuggen kann, einen IC leihen.

von spess53 (Gast)


Lesenswert?

Hi

>RAM muss ja refreshed werden, vllt. wurde da ja was raus
>genommen.

AVRs haben SRAM (Static Ram). DRAM (Dynamic Ram) brauchen einen Refresh.

MfG Spess

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

unl34shed schrieb:
> RAM muss ja refreshed werden

Nein.  Das ist doch kein dRAM.  Solange das Zeug Spannung anliegen
hat, hält er die Daten.  [Edit: spess war schneller]

von Peter D. (peda)


Lesenswert?

Probier mal folgendes:

Fülle den SRAM mit 0x55.
Fülle die Register mit 0xAA.
Machen einen kompletten Dump über 64kB und sende ihn als Hex über die 
UART zum PC.
Dann sollte man sehen, ob Adreßbits ignoriert werden.


Peter

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Simon G. schrieb:
> Ich würde mich sehr freuen wenn ihr noch Verbesserungen einbaut, das
> Programm auf anderen Typen testet und wir eine abschließende Antwort
> finden.

Programm auf einem ATmega16:
1
start:  ldi     r30, 0x60
2
        clr     r31
3
        clr     r1
4
1:      st      Z+, r1
5
        mov     r24, r30
6
        or      r25, r31
7
        brne    1b
8
        ldi     r24, 'H'
9
        sts     0x0060, r24
10
        ldi     r24, 'i'
11
        sts     0x0061, r24
12
2:      rjmp    2b

Hier das Ergebnis im GDB:
1
(gdb) x/256bx 0x800000
2
0x800000:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
3
0x800008:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
4
0x800010:       0x00    0x00    0x00    0x00    0x00    0x00    0x19    0x00
5
0x800018:       0x69    0x00    0x00    0x00    0x00    0x00    0x61    0x00
6
0x800020:       0x00    0xf8    0xfe    0xff    0x00    0x00    0x00    0x00
7
0x800028:       0x00    0x00    0x00    0x20    0x00    0x00    0x00    0x00
8
0x800030:       0xff    0x00    0x00    0xc3    0x00    0x00    0xff    0x00
9
0x800038:       0x00    0xff    0x00    0x00    0x00    0x00    0x00    0x00
10
0x800040:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
11
0x800048:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
12
0x800050:       0x00    0x00    0x00    0x00    0x12    0x00    0x00    0x00
13
0x800058:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x02
14
0x800060:       0x48    0x69    0x00    0x00    0x00    0x00    0x00    0x00
15
0x800068:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
16
0x800070:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
17
0x800078:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
18
0x800080:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
19
0x800088:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
20
0x800090:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
21
0x800098:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
22
0x8000a0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
23
0x8000a8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
24
0x8000b0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
25
0x8000b8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
26
0x8000c0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
27
0x8000c8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
28
0x8000d0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
29
0x8000d8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
30
0x8000e0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
31
0x8000e8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
32
0x8000f0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
33
0x8000f8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
34
(gdb) x/256bx
35
0x800100:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
36
0x800108:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
37
0x800110:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
38
0x800118:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
39
0x800120:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
40
0x800128:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
41
0x800130:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
42
0x800138:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
43
0x800140:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
44
0x800148:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
45
0x800150:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
46
0x800158:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
47
0x800160:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
48
0x800168:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
49
0x800170:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
50
0x800178:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
51
0x800180:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
52
0x800188:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
53
0x800190:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
54
0x800198:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
55
0x8001a0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
56
0x8001a8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
57
0x8001b0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
58
0x8001b8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
59
0x8001c0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
60
0x8001c8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
61
0x8001d0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
62
0x8001d8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
63
0x8001e0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
64
0x8001e8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
65
0x8001f0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
66
0x8001f8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
67
(gdb) x/256bx
68
0x800200:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
69
0x800208:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
70
0x800210:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
71
0x800218:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
72
0x800220:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
73
0x800228:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
74
0x800230:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
75
0x800238:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
76
0x800240:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
77
0x800248:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
78
0x800250:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
79
0x800258:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
80
0x800260:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
81
0x800268:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
82
0x800270:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
83
0x800278:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
84
0x800280:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
85
0x800288:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
86
0x800290:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
87
0x800298:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
88
0x8002a0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
89
0x8002a8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
90
0x8002b0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
91
0x8002b8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
92
0x8002c0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
93
0x8002c8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
94
0x8002d0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
95
0x8002d8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
96
0x8002e0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
97
0x8002e8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
98
0x8002f0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
99
0x8002f8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
100
(gdb) x/256bx
101
0x800300:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
102
0x800308:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
103
0x800310:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
104
0x800318:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
105
0x800320:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
106
0x800328:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
107
0x800330:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
108
0x800338:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
109
0x800340:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
110
0x800348:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
111
0x800350:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
112
0x800358:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
113
0x800360:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
114
0x800368:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
115
0x800370:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
116
0x800378:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
117
0x800380:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
118
0x800388:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
119
0x800390:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
120
0x800398:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
121
0x8003a0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
122
0x8003a8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
123
0x8003b0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
124
0x8003b8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
125
0x8003c0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
126
0x8003c8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
127
0x8003d0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
128
0x8003d8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
129
0x8003e0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
130
0x8003e8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
131
0x8003f0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
132
0x8003f8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
133
(gdb) x/256bx
134
0x800400:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
135
0x800408:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
136
0x800410:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
137
0x800418:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
138
0x800420:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
139
0x800428:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
140
0x800430:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
141
0x800438:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
142
0x800440:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
143
0x800448:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
144
0x800450:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
145
0x800458:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
146
0x800460:       0x48    0x69    0x00    0x00    0x00    0x00    0x00    0x00
147
0x800468:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
148
0x800470:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
149
0x800478:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
150
0x800480:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
151
0x800488:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
152
0x800490:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
153
0x800498:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
154
0x8004a0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
155
0x8004a8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
156
0x8004b0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
157
0x8004b8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
158
0x8004c0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
159
0x8004c8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
160
0x8004d0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
161
0x8004d8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
162
0x8004e0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
163
0x8004e8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
164
0x8004f0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
165
0x8004f8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
166
(gdb) x/256bx
167
0x800500:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
168
0x800508:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
169
0x800510:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
170
0x800518:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
171
0x800520:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
172
0x800528:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
173
0x800530:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
174
0x800538:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
175
0x800540:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
176
0x800548:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
177
0x800550:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
178
0x800558:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
179
0x800560:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
180
0x800568:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
181
0x800570:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
182
0x800578:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
183
0x800580:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
184
0x800588:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
185
0x800590:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
186
0x800598:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
187
0x8005a0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
188
0x8005a8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
189
0x8005b0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
190
0x8005b8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
191
0x8005c0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
192
0x8005c8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
193
0x8005d0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
194
0x8005d8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
195
0x8005e0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
196
0x8005e8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
197
0x8005f0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
198
0x8005f8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
199
(gdb) x/256bx
200
0x800600:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
201
0x800608:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
202
0x800610:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
203
0x800618:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
204
0x800620:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
205
0x800628:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
206
0x800630:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
207
0x800638:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
208
0x800640:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
209
0x800648:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
210
0x800650:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
211
0x800658:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
212
0x800660:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
213
0x800668:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
214
0x800670:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
215
0x800678:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
216
0x800680:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
217
0x800688:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
218
0x800690:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
219
0x800698:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
220
0x8006a0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
221
0x8006a8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
222
0x8006b0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
223
0x8006b8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
224
0x8006c0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
225
0x8006c8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
226
0x8006d0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
227
0x8006d8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
228
0x8006e0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
229
0x8006e8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
230
0x8006f0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
231
0x8006f8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
232
(gdb) x/256bx
233
0x800700:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
234
0x800708:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
235
0x800710:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
236
0x800718:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
237
0x800720:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
238
0x800728:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
239
0x800730:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
240
0x800738:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
241
0x800740:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
242
0x800748:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
243
0x800750:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
244
0x800758:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
245
0x800760:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
246
0x800768:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
247
0x800770:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
248
0x800778:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
249
0x800780:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
250
0x800788:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
251
0x800790:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
252
0x800798:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
253
0x8007a0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
254
0x8007a8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
255
0x8007b0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
256
0x8007b8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
257
0x8007c0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
258
0x8007c8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
259
0x8007d0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
260
0x8007d8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
261
0x8007e0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
262
0x8007e8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
263
0x8007f0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
264
0x8007f8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
265
(gdb) x/256bx
266
0x800800:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
267
0x800808:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
268
0x800810:       0x00    0x00    0x00    0x00    0x00    0x00    0x19    0x00
269
0x800818:       0x69    0x00    0x00    0x00    0x00    0x00    0x1e    0x08
270
0x800820:       0x00    0xf8    0xfe    0xff    0x00    0x00    0x00    0x00
271
0x800828:       0x00    0x00    0x00    0x20    0x00    0x00    0x00    0x66
272
0x800830:       0xff    0x00    0x00    0xc3    0x00    0x00    0xff    0x00
273
0x800838:       0x00    0xff    0x00    0x00    0x00    0x00    0x00    0x00
274
0x800840:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
275
0x800848:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
276
0x800850:       0x00    0x00    0x00    0x00    0x12    0x00    0x00    0x00
277
0x800858:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x02
278
0x800860:       0x48    0x69    0x00    0x00    0x00    0x00    0x00    0x00
279
0x800868:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
280
0x800870:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
281
0x800878:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
282
0x800880:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
283
0x800888:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
284
0x800890:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
285
0x800898:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
286
0x8008a0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
287
0x8008a8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
288
0x8008b0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
289
0x8008b8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
290
0x8008c0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
291
0x8008c8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
292
0x8008d0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
293
0x8008d8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
294
0x8008e0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
295
0x8008e8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
296
0x8008f0:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
297
0x8008f8:       0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00

Ich denke, den Rest kann ich mir sparen:

. der RAM wird hinter RAMEND im Adressraum repliziert, das "Hi" von
  Adresse 0x60 sieht man auf 0x460 erneut
. die oberen Adressbits werden gar nicht dekodiert, auf 0x800 findet
  man den Mirror der CPU-Register von Adresse 0 wieder, auf 0x20 sieht
  man wieder die IO-Register von 0x20

(Der Offset 0x800000 zeigt innerhalb des GDB an, dass man den SRAM-
Bereich zugreift und nicht den Flash.  Da es sich um einen ATmega16
handelt, sind SPL und SPH natürlich initial gleich 0 und nicht gleich
RAMEND.)

von MWS (Gast)


Lesenswert?

Jörg Wunsch schrieb:
> Die Chance, dass man per debugWIRE nur durch
> puren Zufall aus dem SP ein 0x4FF statt einer tatsächlich vorhandenen
> 0 ausliest ist drastisch geringer als die, dass das Datenblatt
> einfach mal nur (infolge von copy, paste & die) falsch liegt.

Wegen 4 Zeilen Code den er spart, irgendwelchen Annahmen?
Macht man doch nicht, das kannst Du auch nicht für Testcode 
rechtfertigen.

So hätt' ich mir besagten Test vorgestellt:
1
.include "m16M1def.inc"
2
LDI    R16,  low(RAMEND)
3
LDI    R17,  high(RAMEND)
4
OUT    SPH,  R17
5
OUT    SPL,  R16
6
MOVW   R30,  R16
7
ADIW   R30,  1
8
LDI    R16,  $AA
9
MOV    R0,   R16
10
LDI    R16,  $00
11
LDI    R17,  $FF
12
Nextcell:
13
ST     Z,    R16
14
NOP
15
NOP
16
NOP
17
TST    R0
18
BREQ   Ovrtrn
19
LD     R18,  Z
20
TST    R18
21
BRNE   Outofsram
22
ST     Z,    R17
23
NOP
24
NOP
25
NOP
26
LD     R18,  Z+
27
CPI    R18,  $FF
28
BRNE   Outofsram
29
RJMP   Nextcell
30
Outofsram:
31
Ovrtrn:
32
LDI    R18,  $FF
33
OUT    DDRB, R18
34
LDI    R18,  $FF
35
OUT    DDRC, R18
36
OUT    PORTB,R30
37
OUT    PORTC,R31
38
Testend:
39
RJMP   Testend

von Simon G. (sigro)


Lesenswert?

Vielen Dank euch allen!

von Simon G. (sigro)


Angehängte Dateien:

Lesenswert?

Tut mir Leid, aber ich muß das Thema noch einmal öffnen.
Ich habe jetzt folgendes Testprogramm:
1
.include "m16M1def.inc"
2
3
; Fülle den Speicher
4
ldi r30, 0x00
5
ldi r31, 0x01
6
ldi r24, 0x00
7
ldi r25, 0x00
8
9
loop2:
10
st  z+, r24
11
st  z+, r25
12
ADIW r24:r25, 1
13
ldi r18, 0x08
14
cpse r31, r18
15
jmp loop2
16
17
18
19
;LINBRR = (((F_CPU * 10 / PRESCALE / BAUD) + 5) / 10) - 1;
20
LDI    r24,    0x33
21
LDI    r25,    0x00
22
STS    LINBRRH,  r25
23
STS    LINBRRL,  r24
24
25
;LINBTR = BV(LDISR) | PRESCALE;
26
LDI    r24,    0x90
27
STS    LINBTR,    r24
28
29
;LINCR = BV(LENA) | BV(LCMD2) | BV(LCMD1) | BV(LCMD0);
30
LDI    r24,    0x0F
31
STS    LINCR,    r24
32
33
34
ldi    r30,    0x00
35
ldi    r31,    0x01
36
37
;übertrage Low Byte Z Pointer
38
loopZL:
39
LDS R18, LINSIR
40
SBRC R18, 4
41
RJMP loopZL
42
;LDI r24, 0x55
43
STS LINDAT, r30
44
45
;übertrage High Byte Z Pointer
46
loopZH:
47
LDS R18, LINSIR
48
SBRC R18, 4
49
RJMP loopZH
50
;LDI r24, 0x55
51
STS LINDAT, r31
52
53
;übertrage  L Wert
54
loopL:
55
LDS R18, LINSIR
56
SBRC R18, 4
57
RJMP loopL
58
LD r24, z+
59
STS LINDAT, r24
60
61
;übertrage L
62
loopL:
63
LDS R18, LINSIR
64
SBRC R18, 4
65
RJMP loopL
66
LD r24, z+
67
STS LINDAT, r24
68
ldi r18, 0x08
69
cpse r31, r18
70
RJMP loopZL
71
end:
72
RJMP end

Der Output ist in der angehängten Datei.
Hat aber im Prinzip nur folgenden Inhalt:
z    | *(z)
00 01 00 00
02 01 01 00
04 01 02 00
06 01 03 00
.
.
.
F6 07 7B 03
F8 07 7C 03
FA 07 7D 03
FC 07 7E 03
FE 07 7F 03

Wenn Ich das Programm über 0x800 hinaus laufen lasse (füllen und 
auslesen) scheint er bei 0x800 das Register 0 zu beschreiben.

von Simon G. (sigro)


Angehängte Dateien:

Lesenswert?

Hier noch einmal der Output als ASCII

von MWS (Gast)


Lesenswert?

Der Code kann aufgrund doppelter Label nicht funktionieren. Wie schafft 
man das beim Copy/Paste ?
1
;übertrage  L Wert
2
loopL:
3
LDS R18, LINSIR
4
SBRC R18, 4
5
RJMP loopL
6
LD r24, z+
7
STS LINDAT, r24
8
9
;übertrage L
10
loopL:
11
LDS R18, LINSIR
12
SBRC R18, 4
13
RJMP loopL
14
LD r24, z+
15
STS LINDAT, r24
16
ldi r18, 0x08
17
cpse r31, r18
18
RJMP loopZL

von Simon G. (sigro)


Lesenswert?

Ups, habe noch im Post die Label umbenannt, dabei muß sich der Fehler 
eingeschlichen haben.
1
;übertrage  L Wert
2
loopL:
3
LDS R18, LINSIR
4
SBRC R18, 4
5
RJMP loopL
6
LD r24, z+
7
STS LINDAT, r24
8
9
;übertrage H
10
loopH:
11
LDS R18, LINSIR
12
SBRC R18, 4
13
RJMP loopH
14
LD r24, z+
15
STS LINDAT, r24

von Ernst Haft (Gast)


Lesenswert?

So ein lächerlicher Blödsinn.
Ist mehr Speicher vorhanden, als der Hersteller angibt, dann ist das 
Murks.
Atmega ist Profi.

Eigentlich ist dieses Thema so Traurig und nicht mehr lachhaft.

Gruß
Ernst

von MWS (Gast)


Lesenswert?

Von der Formatierung verwirrend. Unter der Voraussetzung dass dieses Log 
original vom hier besprochenen ATM16M1 kommt, so fällt mir für Zellen 
mit Zählerinhalt >= 00 02 keine andere Erklärung ein, als dass 
tatsächlich über den normalen Bereich hinausgehende Zellen existieren.

Der erste Bruch erscheint bei Zelle absolut $0812, aufs SRam bezogen 
$712, dez 1810.

> 0E 08 87 03
> 10 08 88 03
> 12 08 02 03 <---
> 14 08 8A 03

Ganz von der Hand zu weisen wäre die Vermutung nicht, dass bei der 
Produktion eine gewisse Menge Ausschuss entsteht und Bausteine mit 
Defekten im oberen Adressbereich ähnlich dem Speedgrade bei 
PC-Prozessoren zu einem bestimmten Typ der jeweils niedrigeren Serie 
gelabelt und damit recycelt werden. Da wäre ein Test noch interessant, 
wie viel der Flash fasst.

Außer dem akademischen Wissen darum, wirst Du allerdings keinen 
praktisch sinnvollen Nutzen daraus ziehen können, denn Du kannst außer 
den zugesicherten 1024 Byte SRam nichts weiter als garantiert annehmen.
Und Du solltest es unabhängig bestätigen lassen, wenn Dir weiter etwas 
daran liegt.

von Simon G. (sigro)


Lesenswert?

MWS schrieb:
>
> Der erste Bruch erscheint bei Zelle absolut $0812, aufs SRam bezogen
> $712, dez 1810.
Deutet auf eine defekte Speicherzelle hin.
>
> Ganz von der Hand zu weisen wäre die Vermutung nicht, dass bei der
> Produktion eine gewisse Menge Ausschuss entsteht und Bausteine mit
> Defekten im oberen Adressbereich ähnlich dem Speedgrade bei
> PC-Prozessoren zu einem bestimmten Typ der jeweils niedrigeren Serie
> gelabelt und damit recycelt werden. Da wäre ein Test noch interessant,
> wie viel der Flash fasst.

klingt logisch.

> Außer dem akademischen Wissen darum, wirst Du allerdings keinen
> praktisch sinnvollen Nutzen daraus ziehen können, denn Du kannst außer
> den zugesicherten 1024 Byte SRam nichts weiter als garantiert annehmen.
> Und Du solltest es unabhängig bestätigen lassen, wenn Dir weiter etwas
> daran liegt.
Mir ging es nur darum eine Erklärung zu finden.
Atmel wollte dazu keine klare Ausage machen.
Wenn Du Interesse hast, kann ich Dir gerne einen ATMega16M1 zusenden, 
ist aber im QFN Gehäuse.

von (prx) A. K. (prx)


Lesenswert?

MWS schrieb:

> Ganz von der Hand zu weisen wäre die Vermutung nicht, dass bei der
> Produktion eine gewisse Menge Ausschuss entsteht und Bausteine mit
> Defekten im oberen Adressbereich ähnlich dem Speedgrade bei
> PC-Prozessoren zu einem bestimmten Typ der jeweils niedrigeren Serie
> gelabelt und damit recycelt werden.

Dagegen spricht die Replikation des Adressraums ab 0x800, d.h. die 
unvollständige Dekodierung der Adressbits. Ein Chip, der für mindestens 
doppelt so viel RAM gebaut ist, als er offiziell liefert, würde die 
Adressen entsprechend weiter ausdekodieren.  Bei der nächsten üblichen 
Stufe von 2K RAM landet man jenseits von 0x800. Es ergibt keinen Sinn, 
diese Ausdekodierung zusammen mit dem Rebinning umzuschalten.

In der Vergangenheit wurde solches Recycling bei Atmel m.W. nicht 
durchgeführt, auch die 5V/<5V Versionen ergaben sich nicht durch 
Ausfälle, sondern durch unterschiedliche Testprofile. Der Aufwand kann 
bei derart niedrigen reinen Fabrikationskosten höher sein als der 
Gewinn. Die Herstellung von PC-Prozessoren ist da kein Modell, die sind 
immens viel teurer in der Herstellung.

von MWS (Gast)


Lesenswert?

A. K. schrieb:
> Dagegen spricht die Replikation des Adressraums ab 0x800, d.h. die
> unvollständige Dekodierung der Adressbits.

Das war mir schon klar, genauso wie die unterschiedliche Device-ID der 
Bausteine.

> Ein Chip, der für mindestens
> doppelt so viel RAM gebaut ist, als er offiziell liefert, würde die
> Adressen entsprechend weiter ausdekodieren.

Es ist für Atmel kein Problem, den Chip mit einer Device-ID des als 
schließlich gut geprüften Typs auszustatten, genauso wäre es möglich die 
Adressdekoder passend zu konfigurieren.

Dagegen wäre es ein zusätzlicher Aufwand, exakt bei $04FF den Hahn 
zuzudrehen, da dies eben nicht so einfach durch Abschalten des 12. 
Adressbits geschehen kann.

> Der Aufwand kann bei derart niedrigen reinen Fabrikationskosten höher
> sein als der Gewinn.

Kann, wissen wir aber nicht. Sollten die Chips zum Schluss grundsätzlich 
einer Funktionsprüfung unterzogen werden, dürfte sich der Aufwand ein 
paar Fuses zu schreiben aber in Grenzen halten.

> Die Herstellung von PC-Prozessoren ist da kein Modell, die sind
> immens viel teurer in der Herstellung.

Das war nur dazu gedacht das grundlegende Geschäftsmodell zu 
beschreiben, das aber im Prinzip das Gleiche ist:

Erhöhe den Ertrag durch nachträgliches Aussortieren und Einordnung in 
verschiedene Leistungs- oder Qualitätsklassen.

Allerdings gibt's auch noch 'ne andere Erklärung: der Produktionsprozess 
ist einfach komplett identisch für die 16/32/64er und zum Schluss wird 
einfach der Typ draus gemacht den man braucht, indem man bestimmte 
Adressbits abschaltet und die Device-ID passend schreibt.

von MWS (Gast)


Lesenswert?

Simon G. schrieb:
> Mir ging es nur darum eine Erklärung zu finden.
> Atmel wollte dazu keine klare Ausage machen.

Das verstehe ich, denn einer der zwei von mir angeführten Gründe wird es 
sein. Egal welcher es dann tatsächlich ist, würde eine offizielle 
Erklärung für Atmel nur einen Nachteil bedeuten.

Simon G. schrieb:
> Wenn Du Interesse hast, kann ich Dir gerne einen ATMega16M1 zusenden,
> ist aber im QFN Gehäuse.

Danke für das Angebot, aber ein Test sollte besser von jemand gemacht 
werden, der Deine Entdeckung bezweifelt. Dazu gehöre ich mittlerweile 
nicht mehr, lies Dir meinen vorherigen Beitrag durch.

von Osche R. (Gast)


Lesenswert?

Üblicherweise besteht eine Chipfamilie aus wenigen unterschiedlichen 
"umbrella devices". Aus denen werden die verschiedenen Derivate 
abgeleitet. Nicht benötigte Funktionen werden nicht getestet bzw nicht 
angeschlossen. Die device ID und der passcode stehen in einem vom User 
nicht löschbaren Bereich des Programm-Flash und werden nach bestandenem 
Wafertest eingeschrieben. So kann man z.B. beim V850 16 Derivate mit 3 
Dies abbilden.

Testausfälle als kleineres Derivat weiterzuverwenden ist unüblich. 
Trotzdem kann es natürlich sein, dass bei kleineren Derivaten die 
undokumentierten Bereiche nicht funktionieren, sie wurden schliesslich 
nicht getestet.


Atmel kenne ich nicht näher, aber vom Prinzip her wird es da ähnlich 
laufen.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Simon G. schrieb:
> Wenn Du Interesse hast, kann ich Dir gerne einen ATMega16M1 zusenden,
> ist aber im QFN Gehäuse.

Das Angebot würde ich gern annehmen, ich würde da gern mal mit dem
Debugger draufgucken.  Im Prinzip müsste man das ja sogar noch mit
einem "dead bug"-Design schaffen (nur GND und VCC mitsamt Kerkos
verlöten sowie /RESET für das debugWIRE).  Eine Platine mit einem
Footprint für QFN32, auf die ich ihn mal schnell auflöten könnte,
hab' ich glaub' ich nicht hier.  Oder ich ätze mir eine.

von Simon G. (sigro)


Lesenswert?

Jörg Wunsch schrieb:
> Das Angebot würde ich gern annehmen, ich würde da gern mal mit dem
> Debugger draufgucken.  Im Prinzip müsste man das ja sogar noch mit
> einem "dead bug"-Design schaffen (nur GND und VCC mitsamt Kerkos
> verlöten sowie /RESET für das debugWIRE).  Eine Platine mit einem
> Footprint für QFN32, auf die ich ihn mal schnell auflöten könnte,
> hab' ich glaub' ich nicht hier.  Oder ich ätze mir eine.
Habe Dir eine E-mail geschrieben.

von spess53 (Gast)


Lesenswert?

Hi

Habt ihr schon mal überlegt, das nicht nur der RAM sonder auch die 
IO-Register und auch r0...r31 mit Z angesprochen werden können? Also 
auch davon Spiegelregister möglich sind.

MfG Spess

von Jacobi (Gast)


Lesenswert?

Ernst Haft schrieb:
> Autor:
>
>         Ernst Haft (Gast)
>
>
>
>
>
>
>
>
>       Datum: 02.04.2012 16:34
>
>
>
>
>
>
>
>
>
>
>       So ein lächerlicher Blödsinn.
> Ist mehr Speicher vorhanden, als der Hersteller angibt, dann ist das
> Murks.
> Atmega ist Profi.
>
> Eigentlich ist dieses Thema so Traurig und nicht mehr lachhaft.
>
> Gruß
> Ernst

Hallo Ernst,
ich denke auch, du hast recht.
Es ist Hobbycram.
Das sollte wirklich keiner für ERNST nehmen.
So etwas ist mir bei Atmel noch nie vorgekommen.
Außerdem sollten die erst mal richtig programmieren lernen.
Wenn ich schon Fehler mit Sprungmarken sehe....   (Kinderkram)
Was soll man dann noch erwarten können?
Haben die keinen Testdurchlauf gemacht?
Finden die bestimmt nicht für nötig.
Welche Qualifikation haben diese Menschen dann?

Übrigens, Atmel zahlt jedem eine hohe Prämie für unendeckten Fehler!!!

Warum?  Produktsicherung! Qualitätssicherung!

Aber die Dummheit der User werden nicht berücksichtigt.

Profis erstellen einen fundierten Bericht mit entsprechenden 
Assemblercode an den Hersteller, und der Hersteller gibt seine Stellung 
zu dem Bericht.

Hat mir schon Erfolg für meinen Geldbeutel gebracht. Waren leider nur 
unwesendliche Sachen in der Rechtschreibung der Unterlagen. Aber 
immerhin sind dort freundliche Menschen, die mit mir reden wollen, wenn 
ich das möchte. Do it.

Gruß
Jacobi

von karl (Gast)


Lesenswert?

spess53 schrieb:
> Hi
>
> Habt ihr schon mal überlegt, das nicht nur der RAM sonder auch die
> IO-Register und auch r0...r31 mit Z angesprochen werden können? Also
> auch davon Spiegelregister möglich sind.
>
> MfG Spess



Hi Spess,

genau, damit kommen die doch nicht zurecht.
Programmieren sollte man auch noch können, ist aber nebensächlich.

Mit freundlichen Güßen
Karl

PS: Das mit Ernst und dem Zitat ist Herb. Vielleicht nicht verkehrt.

von MWS (Gast)


Lesenswert?

spess53 schrieb:
> Habt ihr schon mal überlegt, das nicht nur der RAM sonder auch die
> IO-Register und auch r0...r31 mit Z angesprochen werden können? Also
> auch davon Spiegelregister möglich sind.

Ja, klar, daraus ergibt sich m.E. diese erste Abweichung:

MWS schrieb:
> Der erste Bruch erscheint bei Zelle absolut $0812, aufs SRam bezogen
> $712, dez 1810.
>
>> 0E 08 87 03
>> 10 08 88 03
>> 12 08 02 03 <---
>> 14 08 8A 03

$0812 ist, wenn man eine eine Adressdekodierung von 11 Bit annimmt, also 
eine Spiegelung ab 2048 = $0800, das Prozessorregister R18. Dies ist das 
niedrigste Prozessorregister, das Simon in seine Code benutzt und damit 
verändert.

von MWS (Gast)


Lesenswert?

Jacobi schrieb:
> unwesendliche Sachen in der Rechtschreibung der Unterlagen.

LOL, Du wärst Dein bester Kunde.

von MWS (Gast)


Lesenswert?

Simon G. schrieb:
> Hier noch einmal der Output als ASCII

Simon,

kannst Du den Code posten, mit dem dieses Log erzeugt wurde ?

von Simon G. (sigro)


Angehängte Dateien:

Lesenswert?

MWS schrieb:
> kannst Du den Code posten, mit dem dieses Log erzeugt wurde ?

klar, die Datei ist angehängt.

von MWS (Gast)


Lesenswert?

Simon G. schrieb:
> klar, die Datei ist angehängt.

Mich wunderte ursprünglich, wie Du in der Log über $0800 hinaus kamst, 
denn da war beim vorherigen Code Schluss, Du hast aber nun auf $0900 
erweitert.

Das hat aber zur Folge, dass Du unvermeidlich, falls wir von einer 
Spiegelung bei $0800 ausgehen, die vom Code selbst verwendeten Register 
beschädigst:
1
ldi    r30,    0x00
2
ldi    r31,    0x01
3
ldi    r24,    0x00
4
ldi    r25,    0x00
5
loop2:
6
st    z+,      r24
7
st    z+,      r25
8
ADIW  r24:r25,  1
9
ldi    r18,    0x09
10
cpse  r31,    r18
11
jmp    loop2
Besonders kritisch, weil Du dann in das Z-Register schreibst, worauf 
dann woanders im Speicher weiter geschrieben wird. Hab's mal simuliert.

In der Simulation hat der Code ZL beschädigt, wodurch im nächsten 
Schritt ZL auf $8F stand. Schreibzugriffe gingen damit zwar oberhalb der 
Prozessorregister weiter, wo kein Schaden entstand, aber Du willst ja 
hier einer Ursache auf den Grund gehen und kannst es nicht brauchen, 
wenn der Code sich selbst ein Bein stellt.

Kannst Du aber leicht beheben, bau' bei der Routine für die 
Speichervorbelegung einen Schutz für die unteren Prozessorregister ein, 
sobald die beschrieben werden, brich' ab und gib ZL/ZH aus.

Das kann im Übrigen einen weiteren Beleg für die Spiegelung erst ab 
$0800 liefern. Und wenn's nicht so ist, wirst Du es auch merken. ;-)

von Simon G. (sigro)


Lesenswert?

MWS schrieb:
> Mich wunderte ursprünglich, wie Du in der Log über $0800 hinaus kamst,
> denn da war beim vorherigen Code Schluss, Du hast aber nun auf $0900
> erweitert.
Ich habe erst nur bis 0x7FF den Speicher genutzt da ich gemerkt habe, 
daß es ab 0x800 Probleme gibt.
> Besonders kritisch, weil Du dann in das Z-Register schreibst, worauf
> dann woanders im Speicher weiter geschrieben wird. Hab's mal simuliert.
Ich bin mir ziemlich sicher, daß bei 0x800 der Wraparound statt findet 
und die Register beschrieben werden. Wobei ich den Eindruck habe, daß 
das Überschreiben des Z-Pointers keine Auswirkung auf den Ablauf hat.
Ich vermute, daß das daran liegt, daß ich den Autoinkrement-Befehl 
benutze.

von Michael U. (amiga)


Lesenswert?

Hallo,

warum erinnert mich das hier so an:

illegale OP-Codes des 6502
illegale OP-Codes des Z80

:-))

Gruß aus Berlin
Michael

von MWS (Gast)


Lesenswert?

Simon G. schrieb:
> Ich habe erst nur bis 0x7FF den Speicher genutzt da ich gemerkt habe,
> daß es ab 0x800 Probleme gibt.

Deswegen wollte ich den Code sehen. Dadurch schreibst Du bis $0900:
1
ldi    r18,    0x09
2
cpse  r31,    r18
3
jmp    loop2

> Ich bin mir ziemlich sicher, daß bei 0x800 der Wraparound statt findet
> und die Register beschrieben werden.

Ich halt's auch für wahrscheinlich, denn wenn das früher passiert, würde 
man das im Log an früherer Stelle recht schnell sehen.

> Wobei ich den Eindruck habe, daß
> das Überschreiben des Z-Pointers keine Auswirkung auf den Ablauf hat.

Dein Eindruck trügt Dich. Er hat, soweit ich simulieren konnte, 
zumindest keinen negative Auswirkung auf die Integrität des Ergebnisses, 
aber er hat definitiv Wirkung auf den Ablauf.

Simon G. schrieb:
> Ich vermute, daß das daran liegt, daß ich den Autoinkrement-Befehl
> benutze.

Das fällt Dir nur nicht auf, weil der Inhalt des Logs ab $0812 
durcheinander ist.

Meine Simulation sagt mir, er schreibt zuerst ein $8F in ZL und dann in 
Folge weiter an $xx8F ein $03, auf $xx90 ein ein $90, auf $xx91 ein $03, 
usw.

Schau' Dir mal das Log bei $0890 an, da wirst Du wieder 'ne gewisse 
Regelmäßigkeit für ein paar Bytes feststellen. Da hast Du nämlich in die 
DAC-Register reingeschrieben, $8F ist "reserved", deswegen kannst Du von 
dort nix zurücklesen.

von Osche R. (Gast)


Lesenswert?

Michael U. schrieb:

> warum erinnert mich das hier so an:
>
> illegale OP-Codes des 6502
> illegale OP-Codes des Z80

Damit hat das eigentlich relativ wenig zu tun. Wobei die Frage schon 
interessant wäre. Ist bei den ATmegas und PICs jedem Hexwert ein Befehl 
zugeordnet oder gibt es Befehle, die es eigentlich nicht gibt?

Größere Prozessoren haben für sowas eine Trap, d.h. bei illegalen 
Opcodes wird ein Interrupt ausgelöst. So kann man sich eigene Befehle 
basteln.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Jörg Wunsch schrieb:
> Das Angebot würde ich gern annehmen, ich würde da gern mal mit dem
> Debugger draufgucken.

OK, ich habe den Chip mittlerweile auf einem kleinen Adapter und
da mit dem Debugger draufgucken können.  Dem Debugger habe ich
"vorsichtshalber" einen ATmega64M1 vorgegaukelt, nicht dass er von
sich aus bereits anfängt, da irgendwelche Speicherzugriffe
einzuschränken.

Ich stimme Simons Erkenntnissen zu, dass das Teil 1792 Bytes nutzbaren
SRAM hat (von 0x100 bis 0x7ff).  Es sieht auf den ersten Blick aus,
als würden ab 0x800 die CPU-Register gespiegelt.  Auf den zweiten
Blick sind sie es aber nicht komplett.  Hier der (beispielhafte)
Zustand nach den Power-On (mit gelöschtem Flash):
1
0x800000:  0xa1  0x8b  0x3f  0x37  0xf2  0x9e  0xf5  0xcd
2
0x800008:  0xed  0xff  0x4e  0x2a  0x77  0xfd  0x27  0xfb
3
0x800010:  0x9f  0xa4  0xef  0xdf  0x2e  0x6c  0xbe  0x57
4
0x800018:  0x86  0x6c  0x3c  0xe1  0xae  0x16  0xcc  0xd4
5
6
0x800800:  0xa1  0x8b  0x3f  0x37  0xf2  0x9e  0xf5  0xcd
7
0x800808:  0xed  0xff  0x4e  0x2a  0x77  0xfd  0x27  0xfb
8
0x800810:  0x9f  0xa4  0xef  0xdf  0x2e  0x6c  0xbe  0x57
9
0x800818:  0x86  0x6c  0x3c  0xe1  0xae  0xae  0x1f  0x08

Man kann erkennen, dass die Spiegelung nur bis r29 funktioniert,
danach wird auf Adresse 0x81d nochmal r29 gezeigt, während Adresse
0x81e und 0x81f jetzt auf 0x81f zeigen.  Möglicherweise handelt es
sich hier um Schattenregister, die debugWIRE selbst benutzt (welches
ja wiederum eine Art ROM-Monitor-Firmware ist).

Ab Adresse 0x820 beginnen dann merkwürdige Effekte, selbst, wenn man
(mit dem Debugger) nur lesend darauf zugreift.  Versucht man, nach dem
ersten Zugriff jenseits der 0x820 eine (gültige) RAM-Zelle zu
beschreiben, so liest man fortan nur noch 0x00 aus dem RAM.  Will man
danach die (nicht vorhandene, also nur aus 0xffff-NOPs bestehende)
Firmware weiterlaufen lassen, verabschiedet sich das debugWIRE auf
Nimmerwiedersehen, und man muss einen power cycle machen, bevor man
wieder irgendwas mit dem Teil anfangen kann.

Falls jemand das kleine Platinchen mit Simons Chip haben will (es ist
nur ein ISP-Stecker noch drauf, sonst nichts), dann versende ich es
auch gern weiter.  Ich häng' mal ein Foto mit an.

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.