Forum: Mikrocontroller und Digitale Elektronik Pixelfehler auf Graphikdisplay


von Atomica (Gast)


Angehängte Dateien:

Lesenswert?

Guten Tag,

im Anhang befindet sich ein Bild von unserem Projekt. Das soll ein 
kreisförmiges Logo unserer Hochschule darstellen. Das Logo besteht aus 
16 einzelnen Schaufeln. Wir haben alle Schaufeln in eine 72 x 8 Matrix 
eingegeben. Jetzt treten irgendwie totale Pixelfehler auf. Unser 
Dipl.-Ing. vermutet, dass es am Speicher liegt. Wir haben die 
Speicheradressen über die Watch überprüft und müsste echt an diesem 
Problem liegen. Er hat schon ein paar Zeilen im Linker-Skript 
auskommentiert. Wir sollen da ein bisschen rumspielen, damit der 
Speicher die große Matrix packt.

Hier das Linker-Skript vom PIC18F2620
1
// File: 18f2620i.lkr
2
// Sample ICD2 linker script for the PIC18F2620 processor
3
4
LIBPATH .
5
6
FILES c018i.o
7
FILES clib.lib
8
FILES p18f2620.lib
9
10
CODEPAGE   NAME=vectors    START=0x0            END=0x29           PROTECTED
11
CODEPAGE   NAME=page       START=0x2A           END=0xFD7F
12
CODEPAGE   NAME=debug      START=0xFD80         END=0xFFFF         PROTECTED
13
CODEPAGE   NAME=idlocs     START=0x200000       END=0x200007       PROTECTED
14
CODEPAGE   NAME=config     START=0x300000       END=0x30000D       PROTECTED
15
CODEPAGE   NAME=devid      START=0x3FFFFE       END=0x3FFFFF       PROTECTED
16
CODEPAGE   NAME=eedata     START=0xF00000       END=0xF003FF       PROTECTED
17
18
ACCESSBANK NAME=accessram  START=0x0            END=0x7F
19
DATABANK   NAME=gpr0       START=0x80           END=0xFF
20
DATABANK   NAME=gpr1       START=0x100          END=0x1FF
21
DATABANK   NAME=gpr2       START=0x200          END=0x4FF
22
//DATABANK   NAME=gpr3       START=0x300          END=0x3FF
23
//DATABANK   NAME=gpr4       START=0x400          END=0x4FF
24
DATABANK   NAME=gpr5       START=0x500          END=0x5FF
25
DATABANK   NAME=gpr6       START=0x600          END=0x6FF
26
DATABANK   NAME=gpr7       START=0x700          END=0x7FF
27
DATABANK   NAME=gpr8       START=0x800          END=0x8FF
28
DATABANK   NAME=gpr9       START=0x900          END=0x9FF
29
DATABANK   NAME=gpr10      START=0xA00          END=0xAFF
30
DATABANK   NAME=gpr11      START=0xB00          END=0xBFF
31
DATABANK   NAME=gpr12      START=0xC00          END=0xCFF
32
DATABANK   NAME=gpr13      START=0xD00          END=0xDFF
33
DATABANK   NAME=gpr14      START=0xE00          END=0xEF3
34
DATABANK   NAME=dbgspr     START=0xEF4          END=0xEFF          PROTECTED
35
DATABANK   NAME=gpr15      START=0xF00          END=0xF7F
36
ACCESSBANK NAME=accesssfr  START=0xF80          END=0xFFF          PROTECTED
37
38
SECTION    NAME=CONFIG     ROM=config
39
40
STACK SIZE=0x100 RAM=gpr13





Wäre super, wenn mir jemand weiterhelfen könnte, was ich im 
Linker-Skript verändern muss. An der Eingabe der Matrixelemente liegt es 
10000% ig nicht. DAs haben wir scon überprüft.

Vielen Dank im Vorraus

lg

von Gast (Gast)


Lesenswert?

Wenn Du etwas auf das Display schreibst, gibt es dann den gleichen 
Fehler?

von Gast (Gast)


Lesenswert?

>An der Eingabe der Matrixelemente liegt es
>10000% ig nicht. DAs haben wir scon überprüft.

:-) :-) :-)

von Atomica (Gast)


Lesenswert?

Also wie schon gesagt, ist es eine 72 x 8 Matrix.

Bin in der Watch bis zur Spalte 64 alle Pixel durchgegangen und man 
konnte erkennen, dass sich die Werte von 0 auf 1 wechseln. D.h. er hat 
die 1 in die Matrix geschrieben. Ich bin immer Step für Step 
weitergegangen und mir ist aufgefallen, dass ab Spalte 64 keine 1 
reingeschrieben wird. Er schreibt in dem Bereich nichts in die Matrix 
aber verschiebt diese abgeschnittenen Schaufeln einfach in die Mitte 
(wie man erkennen kann auf dem Bild). Woran könnte das liegen?

Liegt das am Speicher??

Wo oder wie kann ich den vergrößern?

Oder hat jemand ne andere Idee, wie man das lösen kann mit der Matrix?


Wäre echt super, wenn sich jemand melden würde und mir einen sinnvollen 
Vorschlag gibt.

Dankeee

von Magnus Müller (Gast)


Lesenswert?

> Wäre echt super, wenn sich jemand melden würde und mir einen sinnvollen
> Vorschlag gibt.

Wäre echt super, wenn du mal dein Programm posten könntest. Eine Info 
über den genauen Displaytyp (evtl. mit Link zum Datenblatt) wäre auch 
nicht verkehrt.

Gruß,
Magnetus

von Thomas B. (detritus)


Lesenswert?

Wie adressiert ihr denn die Matrix intern durch? Kann es sein, dass euch 
ein Index überläuft?

von Oliver (Gast)


Lesenswert?

Habt ihr schon mal versucht, ein Pixel auf der rechten Displayhäfte zu 
setzen, unabhängig von irgendwelchen Matrizen?  Geht das überhaupt?

Oliver

von Atomica (Gast)


Lesenswert?

Hier mal ein Beispiel für 1 Schaufel:

1
void Schaufel_1(int zustand)
2
{
3
//Page 0 Column 6
4
5
Feld[49][0].bit2 = zustand;
6
Feld[49][0].bit3 = zustand;
7
Feld[49][0].bit4 = zustand;
8
9
Feld[50][0].bit2 = zustand;
10
Feld[50][0].bit3 = zustand;
11
Feld[50][0].bit4 = zustand;
12
13
Feld[51][0].bit3 = zustand;
14
Feld[51][0].bit4 = zustand;
15
16
Feld[52][0].bit4 = zustand;
17
Feld[52][0].bit5 = zustand;
18
19
//Page 0 Column 5
20
21
Feld[41][0].bit7 = zustand;
22
23
Feld[42][0].bit6 = zustand;
24
Feld[42][0].bit7 = zustand;
25
26
Feld[43][0].bit4 = zustand;
27
Feld[43][0].bit5 = zustand;
28
Feld[43][0].bit6 = zustand;
29
Feld[43][0].bit7 = zustand;
30
31
Feld[44][0].bit3 = zustand;
32
Feld[44][0].bit4 = zustand;
33
Feld[44][0].bit5 = zustand;
34
Feld[44][0].bit6 = zustand;
35
Feld[44][0].bit7 = zustand;
36
37
Feld[45][0].bit2 = zustand;
38
Feld[45][0].bit3 = zustand;
39
Feld[45][0].bit4 = zustand;
40
Feld[45][0].bit5 = zustand;
41
Feld[45][0].bit6 = zustand;
42
Feld[45][0].bit7 = zustand;
43
44
Feld[46][0].bit2 = zustand;
45
Feld[46][0].bit3 = zustand;
46
Feld[46][0].bit4 = zustand;
47
Feld[46][0].bit5 = zustand;
48
Feld[46][0].bit6 = zustand;
49
50
Feld[47][0].bit2 = zustand;
51
Feld[47][0].bit3 = zustand;
52
Feld[47][0].bit4 = zustand;
53
Feld[47][0].bit5 = zustand;
54
Feld[47][0].bit6 = zustand;
55
56
Feld[48][0].bit2 = zustand;
57
Feld[48][0].bit3 = zustand;
58
Feld[48][0].bit4 = zustand;
59
Feld[48][0].bit5 = zustand;
60
61
//Page 1 Column 4
62
63
Feld[40][1].bit0 = zustand;
64
Feld[40][1].bit1 = zustand;
65
Feld[40][1].bit2 = zustand;
66
Feld[40][1].bit3 = zustand;
67
Feld[40][1].bit4 = zustand;
68
Feld[40][1].bit5 = zustand;
69
Feld[40][1].bit6 = zustand;
70
Feld[40][1].bit7 = zustand;
71
72
//Page 1 Column 5
73
74
Feld[41][1].bit0 = zustand;
75
Feld[41][1].bit1 = zustand;
76
Feld[41][1].bit2 = zustand;
77
Feld[41][1].bit3 = zustand;
78
Feld[41][1].bit4 = zustand;
79
Feld[41][1].bit5 = zustand;
80
Feld[41][1].bit6 = zustand;
81
Feld[41][1].bit7 = zustand;
82
83
Feld[42][1].bit0 = zustand;
84
Feld[42][1].bit1 = zustand;
85
Feld[42][1].bit2 = zustand;
86
Feld[42][1].bit3 = zustand;
87
Feld[42][1].bit4 = zustand;
88
Feld[42][1].bit5 = zustand;
89
Feld[42][1].bit6 = zustand;
90
Feld[42][1].bit7 = zustand;
91
92
Feld[43][1].bit0 = zustand;
93
Feld[43][1].bit1 = zustand;
94
Feld[43][1].bit2 = zustand;
95
Feld[43][1].bit3 = zustand;
96
Feld[43][1].bit4 = zustand;
97
Feld[43][1].bit5 = zustand;
98
Feld[43][1].bit6 = zustand;
99
Feld[43][1].bit7 = zustand;
100
101
Feld[44][1].bit0 = zustand;
102
Feld[44][1].bit1 = zustand;
103
Feld[44][1].bit2 = zustand;
104
105
//Page 2 Column 4
106
107
Feld[40][2].bit0 = zustand;
108
Feld[40][2].bit1 = zustand;
109
110
//Page 2 Column 5
111
112
Feld[41][2].bit0 = zustand;
113
Feld[41][2].bit1 = zustand;
114
Feld[41][2].bit2 = zustand;
115
116
Feld[42][2].bit0 = zustand;
117
Feld[42][2].bit1 = zustand;
118
Feld[42][2].bit2 = zustand;
119
Feld[42][2].bit3 = zustand;
120
121
Feld[43][2].bit0 = zustand;
122
Feld[43][2].bit1 = zustand;
123
Feld[43][2].bit2 = zustand;
124
Feld[43][2].bit3 = zustand;
125
Feld[43][2].bit4 = zustand;
126
Feld[43][2].bit5 = zustand;
127
128
Feld[44][2].bit2 = zustand;
129
Feld[44][2].bit3 = zustand;
130
Feld[44][2].bit4 = zustand;
131
Feld[44][2].bit5 = zustand;
132
Feld[44][2].bit6 = zustand;
133
134
Feld[45][2].bit6 = zustand;
135
}

von Atomica (Gast)


Lesenswert?

1
union v8bit
2
{
3
   struct
4
   {
5
       unsigned char bit0 : 1;
6
       unsigned char bit1 : 1;
7
       unsigned char bit2 : 1;
8
       unsigned char bit3 : 1;
9
       unsigned char bit4 : 1;
10
       unsigned char bit5 : 1;
11
       unsigned char bit6 : 1;
12
       unsigned char bit7 : 1;
13
   };
14
   unsigned char _byte;        // word (or int)
15
};

von Atomica (Gast)


Angehängte Dateien:

Lesenswert?

Ich übergebe der Funktion entweder 1 oder 0.

Datenblatt vom Display befindet sich im Anhang


Vielen Dank im Vorraus.

Wie kann ich verhindern, dass die Matrix überläuft?

von Magnus Müller (Gast)


Lesenswert?

Sorry, aber entweder bin ich zu doof, oder mit deinem Codeschnipsel kann 
man wirklich nichts anfangen.

von Magnus Müller (Gast)


Lesenswert?

Kleine Info für meine Kollegen:

Bei dem Displaycontroller handelt es sich wohl um einen S1D10605D04B. 
Wer sich mit dem schon mal beschäftigt hat, darf sich gerne an der 
Problemlösung beteiligen ;)

Gruß,
Magnetus

von hs_mat (Gast)


Lesenswert?

Genau richtig. So heißt der interne Treiber.

Werde nachher versuchen mal auf der rechten seite des displays was 
anzeigen zu lassen unabhängig von der Matrix. Uns ist z.b. aufgefallen, 
wenn wir z.b. nur 1 pixel aus der Schaufel 1 z.b. auskommentieren, dann 
erscheint die Schaufel am richtigen Platz. Sobald ich dieses pixel 
wieder mit reinnehme, wird die ganze schaufel nach links verschoben. 
Kein Plan woran das liegt. Ich geb euch gegen spätnachmittag neue infos.

danke schonmal für die tipps

von Oliver (Gast)


Lesenswert?

Stell doch mal den ganzen Code hier rein. Mit dem Ausschnitt kann keiner 
was anfangen.

Oliver

von Arc N. (arc)


Lesenswert?

Entweder Stacküberlauf: 72  8  16 = 9216 Bytes (1152 Bytes wenn das 72 
* 8 Bit sind) und die Displayroutinen bauen bei durch 32 teilbaren 
Adressen Mist oder nur letzteres.

von yalu (Gast)


Lesenswert?

Ohne das vollständige Programm kann man nur raten. Das Ganze scheint
aber eher ein Adressierungsproblem zu sein, da die in der Mitte des
Schaufelrads fehlenden Pixel nicht komplett fehlen, sondern am linken
Rand des Displays angezeigt werden.

In der Funktion Schaufel_1() fällt mir auf, dass der erste Index von
Feld[][] für die Column n von 8*n+1 bis 8*n+8 zu laufen scheint. Wäre
ein Bereich von 8*n bis 8*n+7 nicht logischer? Würde das vielleicht
eine horizontale Verschiebung um 8 Pixel nach rechts mit einem
Wrap-around an den Page-Grenzen (auf Grund der Maskierung beim
Schreiben der Adressteile in die Displayregister) erklären?

So ganz passt's mit dieser Erklärung zwar noch nicht, aber vielleicht
ist das ein erster Ansatz. Ich glaube jedenfalls nicht, dass das
Display defekt ist. Der Fehler liegt mit hoher Wahrscheinlichkeit in
eurer Software ;-)

Deswegen musst du uns jetzt endlich verraten, was genau mit den
Inhalten von Feld[][] passiert. Wie werden diese an das Display
geschickt?

von Morpheus (Gast)


Lesenswert?

>Wie kann ich verhindern, dass die Matrix überläuft?

Nimm entweder die Blaue oder die Rote Pille ...!

Duck und weg ...

von Atomica (Gast)


Lesenswert?

Hab auch schon versucht das Logo in 3 horizontale Matrizen aufzuteilen. 
Hat leider auch nicht zum Erfolg geführt. Hätte es vielleicht mehr Sinn, 
das Logo in vertikale Matrizen zu teilen, falls das echt ein Problem ist 
mit der Zahl 32 wie oben genannt.

Im Anhang befindet sich der komplette Quelltext. Man beachte die Dateien 
Schaufeln.c und KSWW_MAIN_C.c


ich probier jetzt mal aus, unabhängig von der Matrix pixel auf dem 
rechten rand des Displays anzeigen zu lassen

meld mich gleich nochmal

von Atomica (Gast)


Angehängte Dateien:

Lesenswert?

Ups hier die datei

von Thomas B. (detritus)


Lesenswert?

1
for (i=0; i<=72; i++)    //Spalte
2
{             
3
lcd_wrdata(Feld[i][j]._byte);    //Übertragung Daten Matrix 1
4
}

und
1
union v8bit Feld[72][8];

Du adressierst das Feld also mit Index 0-72 durch, also 73 Elemente. 
Deklariert ist das Feld mit einem Element weniger.

von Atomica (Gast)


Lesenswert?

Das stimmt allerdings. Hab das Feld jetzt mal mit 73 gemacht. Kommen 
aber immernoch die gleichen Effekte. Zuerst mach ich aus der Matrix ja 
ne 0-Matrix. Dann geh ich in die Schaufel 1-16 Routinen und fülle Die 
Matrix mit 0 bzw. 1. Danach schreib ich des aufs Display.


Habe jetzt mal getestet unabhängig von der Matrix einfach mal ein 
Quadrat am rechten Rand des Displays anzuzeigen. Funkioniert perfekt. 
Also liegt definitiv an der Matrix.

Wäre es sinnvoll, das Logo in 3 24x8 vertikalen Matrizen aufzuteilen. 
Wäre nicht sooo viel Arbeit. Aber ob das Sinn macht.....?

von Atomica (Gast)


Lesenswert?

Ich schreib euch mal paar Adressen hin, wo es in die Matrix nichts 
reinschreibt, obwohl es eigentlich sollte:

Adressen z.b. wie

- 409
- 443
- 42D

usw....

von Thomas B. (detritus)


Lesenswert?

Atomica wrote:
> Das stimmt allerdings. Hab das Feld jetzt mal mit 73 gemacht. Kommen
> aber immernoch die gleichen Effekte. Zuerst mach ich aus der Matrix ja
> ne 0-Matrix. Dann geh ich in die Schaufel 1-16 Routinen und fülle Die
> Matrix mit 0 bzw. 1. Danach schreib ich des aufs Display.

Ohne Debugger halt schwierig nachzuvollziehen...

Machst du in der startup() nicht eher

- eine Schaufel in die Matrix laden
- die Matrix auf Display schreiben
- die nächste Schaufel rein
.
.
.

Und was macht dann die main()? Zyklisch neuzeichnen?

Was bewirkt
1
for (i=0; i<=28; i++)    //Spalte
2
{
3
lcd_wrdata(0x00);    //Übertragung Daten  
4
}
in der startup()?

von Atomica (Gast)


Lesenswert?

Genau, in der Startup geht quasi Schaufel 1 bis 16 nacheinander an. 
Sozusagen als lustiger Startbildschirm. Immer mit nem Delay 
zwischendrin.


for (i=0; i<=28; i++)    //Spalte
{
lcd_wrdata(0x00);    //Übertragung Daten
}


Das bewirkt bloß, dass er in der Mitte vom Display anfängt zum 
schreiben. Als Profi kann man das bestimmt eleganter lösen, aber bin 
Anfänger. tut mir leid.

ich probier jetzt mal, die matrix in 3 vertikale matrizen aufzuteilen.

Ich mach nachher Meldung

Danke

von T. H. (pumpkin) Benutzerseite


Lesenswert?

Atomica wrote:

> Habe jetzt mal getestet unabhängig von der Matrix einfach mal ein
> Quadrat am rechten Rand des Displays anzuzeigen. Funkioniert perfekt.
> Also liegt definitiv an der Matrix.


Hatte dieses mindestens Quadrat die selben Abmaße wie das Logo? Das 
riecht extrem nach einer fehlerhaften Adressierung deiner Bitmap. Leider 
ist das so schräg programmiert, dass ich da nicht durchblicke. Wieso 
legst du das Logo nicht als ein großes Array ab und schreibst es am 
Stück, oder sollen die Schaufeln nacheinander eingeblendet werden?

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Sorry aber nach "Pixelfehler" sieht das nicht aus. Falsch angesteuert 
oder falsche Daten. Einfacher Test: Alle Pixel schwarz und alle weiss 
schalten. Wenn es das tut ist der Speicher offensichtlich OK.

Gruss,
Michael

von Atomica (Gast)


Lesenswert?

All Pixel on funktioniert.

p.s. das Logo ist in einem großen Array abgelegt

von Thomas B. (detritus)


Lesenswert?

Hast du das Problem mit den verschobenen Schaufeln nur in der main() 
oder auch in der startup()?

von Gast (Gast)


Lesenswert?

so so die Herren der FH Ulm. :-)

von Magnus Müller (Gast)


Lesenswert?

Atomica wrote:
> All Pixel on funktioniert.

Schön. Aber das ist eine Hardwarefunktion des Controllers.

Nun fülle mal dein komplettes Array mit 0xFF und übertrage es an das 
Display. Wenn dann die rechte Hälfte tot bleibt, hast du halt einen 
Programmfehler im Bereich der Bilddatenschaufelei µC --> Display.

Gruß,
Magnetus

von Atomica (Gast)


Lesenswert?

HS Ulm lieber Gast :-). Gut erkannt.

Hab jetzt in die komplette Matrix 0xFF reingeschrieben. Wird auf dem 
Display auch richtig angezeigt. Komplett schwarzes Quadrat.

Langsam weiß ich echt nicht mehr weiter :-(

Die Idee mit der Aufteilung in 3 vertikalen Matrizen bringt genau die 
gleichen fehler :-(

von Magnus Müller (Gast)


Lesenswert?

> Hab jetzt in die komplette Matrix 0xFF reingeschrieben. Wird auf dem
> Display auch richtig angezeigt. Komplett schwarzes Quadrat.

Du hast aber das Kommando "All pixel on" vorher wieder raus genommen, 
oder?

von Atomica (Gast)


Lesenswert?

Ach was ich ganz vergessen habe.

Die Pixel sind nicht Quadratisch, was dazu führte, dass das runde Logo 
bisschen eingedrückt wirkte. Diese Matrix hatten wir letzte Woche mit 
der ganz gleichen Taktik in eine einzige Matrix eingegeben. Dort trat 
nur ein Fehler in Schaufel 8 auf. Die Schaufel wurde auch nach links 
verschoben.

Jetzt haben wir ne neue Matrix geschrieben nach der ganz gleichen Taktik 
und gleiches Vorgehen, bloß dass sich die Matrix logischerweise in der 
Breite vergrößert hat (von 64 Breite auf 72 Breite). Und jetzt kommen 
noch mehr Fehler, wie man im oberen Bild sieht.

Also die erste matrix hat garnicht schlecht ausgesehen.

muss doch am speicher liegen???

Kann man da nicht tricksen?

hat noch keiner was zu meinem linkerskript header gesagt?

unser dipl.-ing hat da was verändert. Das könnte man manipulieren hat er 
gesagt.....

von Atomica (Gast)


Lesenswert?

Genau  Magnus Müller, hab das Command wieder rausgemacht,

Dann in die komplette Matrix ne 1 geschrieben und dann mit nem 
Breakpoint nur bis zu der Zeile ablaufen lassen. Da wurde alles schwarz 
angezeigt. Eigentlich super.

Weißt wenn ich die ganze schaufelfunktionen durchgehe und die ganzen 
Aktionen in der Watch beochate, ist klar ersichtlich, wie die ganzen 1en 
in die Matrix geschrieben werden. Sobald ich zu Column 8 komme, schreibt 
er nix rein und alle bits bleiben bei 0x00. Des kann doch nciht sein. 
Bei allen anderen Matrixelementen klappt es doch.....

von Thomas B. (detritus)


Lesenswert?

Kannst du im Debugger den RAM anschauen?

Dein Fehler scheint aufzutauchen, sobald der erste Index deiner Matrix 
über ~65 geht. Es scheint also einfach der Speicher voll zu sein.

Guck doch mal, wo die "fehlenden" 1en hingeschrieben werden.


>HS Ulm lieber Gast :-). Gut erkannt.

Insider sehen das auch schon an dem Schaufelrad ;)

von Atomica (Gast)


Lesenswert?

Genau Thomas, z.b. ab Spalte 65 spinnt es. er verschiebt die 
Schaufelelemente, die ab spalte 65 kommen einfach automatisch in die 
Mitte auf ca. Spalte 35 oder so.

Was kann man dagegen tun, wenn der Speicher voll ist?

Kann man den nicht erhöhen, Manipulieren, etc????

wird das in der Linkerdatei gemacht?

Schau dir mal oben das Linker-skript an. Unser Dipl.-Ing. hat die zwei 
zelen auskommentiert und eine Zeile drüber irgendeine Zahl verändert....


Gute Frage, ob ich im Debugger den Ram anschauen kann, ich weiß es nicht 
wie es geht....

von Atomica (Gast)


Lesenswert?

Hier ein Auszug aus dem Datenblatt des MC PIC18F2620

Program Memory (Bytes): 65536
Data Memory (Bytes): 3968

von Thomas B. (detritus)


Lesenswert?

Dafür sollte man sich mit der PIC-Architektur auskennen... Kann ich zwar 
nicht von mir behaupten, aber ich versuchs mal:

Wenn ich das DB richtig verstehe, ist der RAM in Blöcke a 256Byte 
unterteilt und diese Blöcke heissen GPR. (-->Linker-File)

Über einen Block kommst du augenscheinlich problemlos drüber, aber beim 
Wechsel auf den dritten hängts wohl.

72x8=576Bytes-->2GPRs+64Bytes. Und diese 64Bytes sind 8 Matrixzeilen. 
73-8=65! Das ist so der Index, ab dem es kracht.

Wenn du 8 Matrixzeilen weniger machst, geht es dann?

DB S.59

von Dieter W. (dds5)


Lesenswert?

Die 256 Byte gpr RAM-Blöcke sind nur bei direkter Adressierung von 
Interesse (wegen 8 Bit Adressfeld im Befehl), indirekt kann man alle RAM 
Adressen erreichen (über die 3 pointer mit Namen fsr).

Es sollte also auch möglich sein, mehr als 256 Byte zu einem gpr Bereich 
zusammen zu fassen.
Kann aber sein, dass man dazu ein anderes memory model wählen muss.

von Atomica (Gast)


Lesenswert?

Hab ich jetzt nicht ausprobiert. Aber die alte Matrix von letzte Woche 
War ein Array 64 x8. Da ging die Matrix bis 64 und kamen nur leichte 
Fehler in der Grafik. Wir wollten das ja nur neu machen, weil das Logo 
eingestaucht war wegen der nichtquadratischen Pixelform. Die Frage ist, 
welche Paramter ich verändern muss/darf in dem Linkerskript, um den 
Fehler zu vermeiden....

Ich frag mal morgen nochmal den Dipl.-Ing. und geb dann Feedback hier.


Vielen Dank schonmal für die super Hilfe....

Bis morgen schlaft gut....

von yalu (Gast)


Lesenswert?

Kleine Anmerkung: In Schaufel_8 ist ein Fehler:
1
  Feld[46][7].bit0 = zustand;
2
  Feld[46][7].bit1 = zustand;
3
  Feld[46][7].bit2 = zustand;
4
  Feld[46][1].bit3 = zustand;
5
           ^
Betrifft aber nicht das eigentliche Problem.

von Frank L. (franklink)


Lesenswert?

Hallo,
ich mag ja nur ein blöder Delphi Entwickler sein und meine C-Kenntnisse 
sind eher bescheiden, aber ein Array [72][8] hat doch 0 bis 71 und 0 bis 
7 Elemente?

Wenn das korrekt ist, dann haben die Zeilen
1
//Page 4 Column 8
2
3
Feld[72][1].bit0 = zustand;
4
5
//Page 3 Column 8
6
Feld[72][3].bit2 = zustand;
7
Feld[72][3].bit3 = zustand;
8
Feld[72][3].bit4 = zustand;
9
Feld[72][3].bit5 = zustand;
10
Feld[72][3].bit6 = zustand;
11
Feld[72][3].bit7 = zustand;

absolut nichts in der Matrix zu suchen.

Genauso wenig wie diese Funktion korrekt arbeitet:
1
void FieldsInit(void)
2
{
3
  int i,j;
4
  for (j=0; j<=7;j++)
5
  {    
6
    for (i=0; i<=72; i++) //Spalte
7
    {
8
      Feld[i][j]._byte = 0x00;//0-Matrix
9
    }
10
  }
11
}

Gruß
Frank

von Thomas B. (detritus)


Lesenswert?

Frank Link wrote:
> Hallo,
> ich mag ja nur ein blöder Delphi Entwickler sein und meine C-Kenntnisse
> sind eher bescheiden, aber ein Array [72][8] hat doch 0 bis 71 und 0 bis
> 7 Elemente?


Es wird Speicherplatz für 72x8 Bytes reserviert, die man mit den Indizes 
0 bis 71 sowie 0 bis 7 ansprechen kann.
Das Problem mit den zu großen Indizes hatten wir aber schon 
angesprochen.

von Frank L. (franklink)


Lesenswert?

Hallo Thomas,
Du hattest tatsächlich den Indexfehler in der Funktion angesprochen, 
aber den Indexfehler in der Arraydefinition hat noch keiner 
angesprochen. Meine Vermutung ist lediglich, dass hier Pixel auf 0 
gesetzt werden, die eigentlich auf 1 gesetzt werden sollten. Wobei ich 
natürlich nicht weiß, was passiert, wenn auf ein Arrayindex zurück 
gegriffen wird, dass es nicht gibt. Meine Vermutung ist, dass je nach 
Anordnung ein Bit der Nachbarmatrix adressiert wird. Leider hat c keine 
so strikte Überprüfung von Arrayindizes wie Pascal.

Gruß
Frank

von Thomas B. (detritus)


Lesenswert?

Atomica wrote:
> Das stimmt allerdings. Hab das Feld jetzt mal mit 73 gemacht. Kommen
> aber immernoch die gleichen Effekte.

Hätt ich jetzt so interpretiert, dass er die Matrix größer gemacht hat, 
wodurch alle Funktionen, die aus der Matrix lesen oder reinschreiben, 
das Problem nicht mehr haben und die Matrix bis zum Index 72 
durchadressieren können.

Dass es keinen Unterschied macht, heist wohl, dass nach der Matrix nix 
mehr im Speicher kommt.

ok, mal google angeworfen->auf das Problem sind schon andere gekommen:

http://www.chiefdelphi.com/forums/archive/index.php/t-51550.html


"You are only able to declare 256 bytes of variable space in any one 
MPLAB project file."

That is the default. The default is based upon the h/w architecture 
having 256 byte ram banks. PIC18F instructions have 8bit ram address 
offset hence the default of 256 byte banks. However, you can override by 
changing the setup in the lkr file.

This shouldn't be done lightly because it introduces more overhead in 
accessing data - but you essentially tell the linker to merge two 
adjacent ram banks and treat them in software as a single resource. 
Refer to the C18 user guide.

Changed 18f8722.lkr:
DATABANK NAME=gpr2 START=0x200 END=0x2FF
DATABANK NAME=grp3 START=0x300 END=0x3FF
DATABANK NAME=gpr4 START=0x400 END=0x4FF
To:
DATABANK NAME=gpr2 START=0x200 END=0x3FF
DATABANK NAME=gpr4 START=0x400 END=0x4FF


created:
static unsigned char bigarray[500];

Build project, map file shows:

bigarray 0x000202 data static user_routines.c
i 0x0003f6 data static user_routines.c

x3f6-x202 = 500 byte array. Compiles/links/runs ok. I read about this in 
the C18 user guide somewhere. Currently only the "3.2.4 Managing the 
Software Stack" section jumps out at me - but it shows the steps for 
doing the same thing to create larger stack areas. Ram is a limited 
resource... use it wisely.

Bud

von Atomica (Gast)


Angehängte Dateien:

Lesenswert?

@ Yalu: Danke für den Tipp. War echt ein Fehler. Aber kein Wunder, hab 
das ganze Wochenende alle Möglichkeiten von Matrizen ausprobiert. 
Irgendwann verblödet man vor lauter Matrix. Also die 1 sollte echt eine 
7 sein. DANKESCHÖN

@all: Das Array sollte echt 73 x 8 sein und nicht 72 x 8


Nun zur Aufklärung des Problems. Es lag echt nicht an der Matrix sondern 
an der Speicheraufteilung mit diesen Banks wie schon oben angesprochen.

Man musste lediglich "BSR++;" bzw. "BSR--;" reinschreiben.

Hab bei jeder Schaufel geschaut, wo die Spalten größer wie 64 werden, 
davor einfach BSR++; eingeben. Genau das gleiche vor Spalte 32. Kann die 
nächsten Tage mal ein Beispiel hochladen an einer Schaufel.

Es funktioniert zwar, aber so zu 100 % verstanden hab ich das noch 
nicht. Man schiebt die betreffende Matrixelemente einfach in die nexte 
Databank oder?


Funktioniert jetzt alles perfekt und die schaufeln gehen je nach Neigung 
der Platine an oder aus. Elektronische Wasserwaage mit Displayanzeige.

Im Anhang befindet sich ein Bild (sorry ziemlich unscharf)


An dieser Stelle wollte ich allen extrem danken für die schnelle und vor 
allem kompetente Hilfe.

In anderen Foreneinträgen hab ich sehr schlechte Erfahrungen gemacht, 
weil einem keiner Tipps geben will, wenn man merkt, dass man Anfänger 
ist.

Daher DAUMEN hoch.

Tolles Forum....

liebe grüße Matthias


p.s.: Beispielschaufelcode lad ich morgen noch hoch, falls es jemand 
interessiert

von Thomas B. (detritus)


Lesenswert?

Atomica wrote:

>
> Man musste lediglich "BSR++;" bzw. "BSR--;" reinschreiben.
>
> Hab bei jeder Schaufel geschaut, wo die Spalten größer wie 64 werden,
> davor einfach BSR++; eingeben. Genau das gleiche vor Spalte 32. Kann die
> nächsten Tage mal ein Beispiel hochladen an einer Schaufel.
>
> Es funktioniert zwar, aber so zu 100 % verstanden hab ich das noch
> nicht. Man schiebt die betreffende Matrixelemente einfach in die nexte
> Databank oder?


Der Ram ist offensichtlich in Einheiten von 256 Byte unterteilt. In 
diesen kann man mit nem 8bit-Wert adressieren, was auf der 
pic-architectur wohl schnell ist. Jeder Block wird jeweils mit einem 
Wert von den 4Bits des BSR-Reg angeprochen, innerhalb des Blockes wird 
mit den 8bit adressiert.

Will man grössere Blöcke, sagt man das dem Linker. Dazu gibt man Start- 
und Endadresse des gewünschten Blockes an. Dann muss der PIC halt mit 
mehr bits adressieren, was eben länger dauert. Das habt ihr wohl in 
eurem Linkerfile für 2 Blocks gemacht, nicht aber für 3, was wohl nötig 
gewesen wäre.
Aber kein Plan, wie man den Compiler zwingt, die riesen Matrix dann 
ausgerechnet in den grossen Block zu legen.

Alternativ kann man die Bänke mit dem BSR durchadressieren. Und das 
machst du wohl jetzt durch das BSR++, wenn der Index zu groß wird und du 
die Bereichsgrenze überschreitest.


> An dieser Stelle wollte ich allen extrem danken für die schnelle und vor
> allem kompetente Hilfe.
>
> In anderen Foreneinträgen hab ich sehr schlechte Erfahrungen gemacht,
> weil einem keiner Tipps geben will, wenn man merkt, dass man Anfänger
> ist.
>
> Daher DAUMEN hoch.
>
> Tolles Forum....
>
> liebe grüße Matthias

Kein Ding, war doch interessant :D

(Jetzt weis ich, dass es gut war, als ich mich für AVR/8051 statt PIC 
entschieden hab...)

von Dieter W. (dds5)


Lesenswert?

> (Jetzt weis ich, dass es gut war, als ich mich für AVR/8051 statt
> PIC entschieden hab...)

Guter Spruch ... ist wohl mit Augenzwinkern gemeint.

Über AVR kann (besser will) ich nichts sagen - kenn ich nicht, aber der 
8051 ist ja nun nicht so der Brüller wenn es um die Adressierung von 
Daten im (internen oder externen) XRAM geht.

Das soll jetzt aber bitte kein Anstoß zu einer neuen AVR vs PIC 
Diskussion sein, die gab es hier im Forum schon bis zum Abwinken.

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.