Pollin Display 12232, in ASM klappts, in C nicht

#3480005
Lesenswert?

MoinMoin,

ich hatte mal eine Routine in ASM geschrieben, um dieses Datavision 
Display von Pollin anzusteuern. Ich hab versucht diese nun in C 
umzusetzen, aber irgendwie klappt das ganze nicht so recht.
Ich arbeite mit Atmel Studio6, win8.1, nem JTAG ICE3 und nem Tiny2313.

Das Display ist angeschloßen wie im Quelltext, in ASM klappts ja auch...

Die beiden Quelltexte mal als Anhang.

Wenn ich das ganze per debugwire debugge, kann ich in ASM beliebige 
"pixel" senden, wenn ich per Hand den entpsrechenden Port setze, und 
dann per Hand Enable aus und wieder an schalte. Im C-teil geht auch das 
nicht, daher vermute ich, das der Fehler irgendwo in der Initsequenz 
steckt, jedoch finde ich ihn nicht, für hilfreiche Hinweise wäre ich 
dankbar =)

MfG Chaos
Angehängte Dateien:
#3480122
Lesenswert?

Thomas O. schrieb:
> habe gerade mal das .asm File "gebuildet" 235 bytes, jetzt würde mich
> mal das .c File interessieren, leider bekomme ich es nicht gebacken es
> zu compilieren. Oder kann das mal jemand machen der AVR Studio WinAVR
> und Gnu Plugin drauf hat.

Wenn ich die C Datei kompiliere bekomme ich folgendes (mit AVR-GCC):

AVR Memory Usage:
-----------------
Device: attiny2313

Program:     362 bytes (17.7% Full)
(.text + .data + .bootloader)

Data:          1 bytes (0.8% Full)
(.data + .bss + .noinit)


Errors: none

MfG,
Fer_T
#3480152
Lesenswert?

Mhhh fehlerfrei kompilieren kann ich es auch, bei mir wirds aber 364 
byte groß.. ich hatte testhalber auch mal ohne optimierung kompiliert, 
da sind aber 146% speicher voll oder sowas in der Größenordnung 
rausgekommen.
Es sieht auch so aus, als würd er die Wartezeiten wegoptimieren, wenn 
ich nämlich die Wartezeiten zwischen den EN aus an Sequenzen im ASM 
weglasse, läuft es auch nicht mehr....

Ich hab nun auch schon erfolglos versucht, die Wartezeiten zu 
verlängern, jedoch optimiert er die scheinbar weiter weg...

P.S. in C und vor allem den ganzen Toolchain/makefile und 
wer-weiß-nich-was-Geschichten bin ich noch völlig grün hinter den Ohren.
#3480183
Lesenswert?

Grad nochmal kontrolliert, die Fuse ist auf interner 8MHz, mit längster 
Anlaufzeit. Die Optimierung stand aber auf -O1 habs nun auf -Os 
versucht, jedoch auch erfolglos.

Ich hab nun nochmal versucht, nachzuverfolgen, ob er die _delay_ms 
aufruft, jedoch verschluckt er sich irgendwo in meiner DispDel().....
Ich versuche das nochmal näher einzugrenzen.

Danke schonmal für eure Versuche =)
#3480188
Lesenswert?

P.S.
Ja da hast du recht, die Sprungmarke hatte ich anfänglich mal so 
genannt, und mich dann an den Wert rangetastet, wo es dem Display zu 
schnell wurde, und ich hab es nur nicht umbenannt.
Aber dennoch ein guter Hinweis fürs C-Programm wenn es denn mal läuft, 
da kann man dann sicher auf _delay_us(irgendwas in der größenordnung10 
oder so) ausweichen.
#3480202
Lesenswert?

hmmmmmmm....
Also das _delay_ms "führt" er anständig aus...
1
void DispDel(void)
2
{
3
  uint8_t i = 0;
4
  
5
  LCD_Data = 0;
6
  
7
  
8
    DispCtrl &= ~(1<<A0);
9
    DispData = Page0;
10
    ACK();
11
    DispCtrl |= (1<<A0);
12
        
13
    i = 0;
14
    while(i<61)
15
    {
16
      DispWrite();
17
      i++;
18
    }
jedoch optimiert er mir das i hier weg, das wird vermutlich der Grund 
sein, das er sich dort "aufhängt".
Ist dies einer der Fälle für dieses ominöse volatile?

also würde es mit
1
void DispDel(void)
2
{
3
  volatile uint8_t i = 0;
4
  
5
  LCD_Data = 0;
6
  
7
  
8
    DispCtrl &= ~(1<<A0);
9
    DispData = Page0;
10
    ACK();
11
    DispCtrl |= (1<<A0);
12
        
13
    i = 0;
14
    while(i<61)
15
    {
16
      DispWrite();
17
      i++;
18
    }
funktionieren?
Direkt mal testen...
#3480223
Lesenswert?

P.P.S.
Nun ist mir noch etwas aufgefallen. Normalerweise blinkt eine der grünen 
LED´s am ICE3 während des freerunning modus beim Debuggen, aber während 
er in dieser "Hängephase" ist, die übrigens immer wieder laaaange 
braucht, ist diese LED aus....

@Fer_t

Das klingt plausibel, dann werd ich mal versuchen, das i doch nicht 
volatile zu machen, sondern in der Zählschleife etwas zu ändern, danke 
dafür.

Mh aber er ruft doch die DisplayWrite auf, in der ja jedesmal der EN aus 
und angemacht wird... Da wird ja also mehr getan, als nur PortD = 0...
Hach ASM ist so schön direkt, was sowas angeht, aber rechnen damit ist 
anstrengend, darum versuch ich mir ja C zu Gemüte zu führen
#3480287
Lesenswert?

So ich habs hinbekommen. Der Fehler lag in der DispDel.

statt
1
DispCtrl &= ~(1<<A0);
2
    DispData = Page0;
3
    ACK();
4
    DispCtrl |= (1<<A0);


hätte es
1
DispCtrl &= ~(1<<A0);
2
    DispData = Page0;
3
    ACK();
4
    DispData = Collumn0;
5
    ACK();
6
    DispCtrl |= (1<<A0);
heißen müssen.

Ich hatte einfach vergessen den Collumn Zähler zurücksetzen, so hat er 
zwar mehr oder weniger aufs Display geschrieben, aber in Bereiche, die 
man nicht sehen kann, oder gar völlig ins Leere gehen.

Danke für die Hilfsversuche =)

MfG

Chaos

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren