Forum: Mikrocontroller und Digitale Elektronik Probleme mit Variablen & Funktionen | Displayansteuerung


von christian s. (soulcatcher)


Angehängte Dateien:

Lesenswert?

ich probiere gerade, ein display [dogl128] per µC [AtMega168] 
anzusteuern und hab meine kleinen problemchen damit.

*) initialisierung funktioniert
*) datenübertragung funktioniert ([0xAA] ist eine gestrichelte linie)
*) font [8x6] einbinden funktioniert. zumindest teilweise.

Ich habe am Display 4x das gleiche Zeichen (ASCII-Zeichen Nummero 49, 
eine '1'), jeweils mit einer vertikalen Trennlinie versucht darzustellen 
- mit unterschiedlichen Methoden mit unterschiedlichem Erfolg. Die 
Kommunikation mit dem Display scheint zu funktionieren.

Das allererste Zeichen habe ich versucht per Schleife darzustellen, mit 
mäßigem Erfolg:
1
    char mychar;
2
    mychar='1';                           // ASCII-Code 49 bzw. 0x31
3
4
   for(uint8_t i=0;i<=5;i++)              // 1. komisches Zeichen
5
        display_write_byte(font[mychar][i]);

Wenn ich aber die Schleife Schleife sein lasse und die 6 byte einzeln 
rüberschicke, bekomme ich das gewünschte Zeichen dargestellt:
1
    display_write_byte(font[mychar][0]);  // 2. ohne Schleife funktioniert es!
2
    display_write_byte(font[mychar][1]);
3
    display_write_byte(font[mychar][2]);
4
    display_write_byte(font[mychar][3]);
5
    display_write_byte(font[mychar][4]);
6
    display_write_byte(font[mychar][5]);

... und keiner weiß warum.

Weiters habe ich diesen Wert ('1') einer Funktion übergeben, mit dem 
selben mäßigen Erfolg.
Setze ich jedoch die Variable direkt auf '1' bekomme ich es angezeigt:
1
void display_write_char(char temp)
2
{
3
    display_write_byte(font[temp][0]);    // 3. komische Zeichen (direkt übernommen)
4
    display_write_byte(font[temp][1]);    // es hat den Wert 'i' (also ASCII-Code 49),
5
    display_write_byte(font[temp][2]);    // der Wert 49 wurde mehrfach überprüft
6
    display_write_byte(font[temp][3]);
7
    display_write_byte(font[temp][4]);
8
    display_write_byte(font[temp][5]);
9
    display_write_line();
10
11
    temp='1';
12
13
    display_write_byte(font[temp][0]);    // legt man die Variable konkret auf 49
14
    display_write_byte(font[temp][1]);    // (was eigentlich unnötig ist, da sie
15
    display_write_byte(font[temp][2]);    // bereits 49 beinhaltet) funktioniert es ...
16
    display_write_byte(font[temp][3]);
17
    display_write_byte(font[temp][4]);
18
    display_write_byte(font[temp][5]);
19
}

ich habe mehrfach den inhalt der variablen verglichen (mit "wenn gleich 
zeichne gepunktete linie") - und in jedem fall haben die variablen den 
wert "49" ...

ich weiß nicht mehr weiter. irgendwo ist ein hund versteckt - und ich 
bin zu blöd ihn zu finden ...

: Bearbeitet durch User
von Besucher (Gast)


Lesenswert?

1
display_write_byte (data)      // SW-UART, scheint auch korrekt zu sein
2
{
3
  for (uint8_t i=8; i>0; i--)
4
  {
5
    ClrBit(DOGSCLPORT, DOGSCL);  //CLK auf 0
6
   
7
    if (data & 0x80)    //Datenleitung befüllen
8
      SetBit(DOGSIPORT, DOGSI);
9
    else
10
      ClrBit(DOGSIPORT, DOGSI);
11
    SetBit(DOGSCLPORT, DOGSCL);  //CLK auf 1
12
    data <<= 1;
13
  }
14
}
Probier mal in der Funktion erst die Datenleitung zu setzen und danach 
den Impuls auf Clock zu geben. Der erzeugt Code kann sich im Timing 
durchaus unterscheiden wenn du für die Funktionsparameter Variablen 
statt Konstanten verwendest, vielleicht reicht das schon aus um die 
Fehler hervorzurufen.

von christian s. (soulcatcher)


Lesenswert?

du meinst, dass der clk schon hochschnellt noch bevor die datenleitung 
auf high sein könnte?

ich habe schon versucht, vor dem clk-high-signal ein delay einzubauen -> 
ohne erfolg (soweit ich weiß arbeitet der clk des displays per positiver 
flanke)

ich werd einmal überall 1-ms-delays einbauen. vielleicht hilfts.

wenn im code ansich kein fehler ist bin ich mal beruhigt - hab schon an 
meinem verstand gezweifelt ;)

danke

_______
EDIT: ahh du meinst zuerst datenleitung setzen danach clk-low - delay - 
clk-high. auch das werde ich probieren

: Bearbeitet durch User
von christian s. (soulcatcher)


Lesenswert?

leider nein & leider nein.

ich hab den verdacht, dass es an der schleife liegt ... oder an 
irgendwelchen variablen (hab ich bei den typen etwas übersehen?)

nächster test. das erste zeichen ist kryptisch, das zweite korrekt ('1')
1
    for(uint8_t i=0;i<=5;i++)
2
        display_write_byte(font[49][i]);
3
4
    display_write_line();
5
6
    display_write_byte(font[49][0]);
7
    display_write_byte(font[49][1]);
8
    display_write_byte(font[49][2]);
9
    display_write_byte(font[49][3]);
10
    display_write_byte(font[49][4]);
11
    display_write_byte(font[49][5]);

liebe grüße,
jemand der am verzweifeln ist ...

von christian s. (soulcatcher)


Lesenswert?

ich glaub ich hab die lösung gefunden: dem µC ist der speicher 
ausgegangen ...

von christian s. (soulcatcher)


Lesenswert?

korrekto mundo: pgmspace.h hat mein problem gelöst ;)

: Bearbeitet durch User
von jens (Gast)


Lesenswert?

Ja, das kann hässliche Effekte machen.
Oder das timing verändert sich durch das unrolling der Schleife...

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.