Hallo,
hab mir zum Basteln ein DOG-M 16x2 geholt, welches per SPI an einen
Mega2561 angeschlossen ist. Display funktioniert soweit, nur wird der
Text an einer falschen Stelle wiedergegeben. Die Wartezeiten zwischen
den Kommandos und Daten sind eigentlich großzügig überdimensioniert, der
SPI läuft in der langsamsten Stufe.
Was könnte ich übersehen haben? Habe mich an den hier zu findenen DOG-M
Routinen und am Datenblatt des Displays orientiert.
Hallo,
Karl-Heinz schrieb:> Was könnte ich übersehen haben?
Habe dir mal meinen Code mit einem Atmega644V angehängt.
Das ist zwar nur ein Software-SPI, dafür funktioniert er auf allen
Atmegas...
Zumindest kannst du den Code mit deinem vergleichen.
Gruß XMEGA
Karl-Heinz schrieb:> Was könnte ich übersehen haben?
Ich will dir mal das von dir gelieferte Informationsniveau an einem
adäquaten Vergleich zeigen. "Mein Auto, VW Golf Baujahr 1992 ist defekt
- weitere Informationen gebe ich nicht heraus - was muss ich machen,
damit er wieder läuft?" Der ADAC-Mann wird bei dieser Informationsfülle
nichts machen können.
Darum:
1. Schaltung, Beschreibung
2. Bild von der Schaltung (Kabel, etc)
3. Source-Code (!)
4. Genaue Fehlerbeschreibung
Diese 4 Punke sollen wir wohl erraten? Fragen wir die Glaskugel ...
Nein im Ernst - bitte bemühe dich um eine konkrete Beschreibung, nur so
können wir effektiv helfen.
> 1. Schaltung, Beschreibung> 2. Bild von der Schaltung (Kabel, etc)> 3. Source-Code (!)> 4. Genaue Fehlerbeschreibung
Dachte eigentlich mit 4. hätte ich gedient. Für 1-3 müsste ich mehr Zeit
investieren als ich in den Aufbau und Programmierung für einen
Schnelleinstieg uC+Display gesteckt habe. Ich bastel das nun auf 4bit
um, wenn der Fehler immer noch auftritt, weiß ich, wo ich suchen muß.
Geht schneller...
Danke XMEGA für den Sourcecode. Werde den mal anschauen, vielleicht
finde ich noch was.
Hi
>Diese 4 Punke sollen wir wohl erraten? Fragen wir die Glaskugel ...
Unterlasse bitte dieses 'wir'. Es gibt hier mit Sicherheit nicht viele,
die mit dir in einen Topf geworfen werden wollen. Und da Text auf dem
Display erscheint, ist die Hardware uninteressant. Die funktioniert ja.
>Was könnte ich übersehen haben? Habe mich an den hier zu findenen DOG-M>Routinen und am Datenblatt des Displays orientiert.
Hast du dir auch das Datenblatt vom Displaycontroller angesehen? Das ist
maßgebend. Manchmal gibt es da kleine, aber feine Unterschiede zum
EA-Datenblatt.
Poste mal deinem Code.
MfG Spess
> Hast du dir auch das Datenblatt vom Displaycontroller angesehen? Das ist> maßgebend. Manchmal gibt es da kleine, aber feine Unterschiede zum> EA-Datenblatt.
Ja, aber ich schau's mir nochmal durch. Vielleicht ziehe ich dem Display
nach nem Kommando zu schnell RS/CS weg? Mal ausprobieren.
> Poste mal deinem Code.
Ja, erst noch etwas säubern. Der entstand so nebenbei bei nem Bierchen
auf'm Balkon :-)
Wie lang ist die Verdrahtung?
Steht ein Oszilloskop zur Verfuegung?
Ist die Stelle immer konsistent gleich falsch?
Ist bekannt dass die Addressluecke bei 44780-artigen Displays mitunter
an bescheuerten Stellen liegt?
> Wie lang ist die Verdrahtung?
4cm.
> Steht ein Oszilloskop zur Verfuegung?
Mehrere. Sauberes Signal. Ist ja auch ein niedriger SPI-Takt. Wobei der
SPI-Takt auf das Symptom keine Auswirkungen zu haben scheint.
> Ist die Stelle immer konsistent gleich falsch?
Nein. Der Text wird an der gewollten Stelle ausgegeben, gelegentlich
wird ein falsches Zeichen dargestellt, entweder im Text oder an einer
zufälligen Stelle. Vermutlich Timingproblem.
> Ist bekannt dass die Addressluecke bei 44780-artigen Displays mitunter> an bescheuerten Stellen liegt?
Ja. Das Display funktioniert ja auch soweit, nur tauchen, besonders bei
schnellem Textwechsel diese Geisterzeichen auf. Ich muß mal noch mit nem
Delay bei Register Select / Chip Select spielen. Kann sein, dass da der
16MHz Mega2561 das Display überrennt.
#define DOGM_DELAY_S 500
#define DOGM_DELAY_L 5000
_delay_us(DOGM_DELAY_L);
SPI_Data(0x06);
_delay_us(DOGM_DELAY_S);
http://linux.die.net/man/3/_delay_us
void _delay_us (double __us):
...
The maximal possible delay is 768 us / F_CPU in MHz.
Wie wärs mit _delay_ms ?
>SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR0);
Der SPI mode ist falsch.
CPHA und CPOL müssen gesetzt sein (mode 3).
Sonst ist der Leerlaufpegel von SCK nicht high, so wie gefordert.
Siehe Seite 47 im Controllerdatenblatt.
Grüße,
Peter
@Igor:
Das ist zwar unschön, dass _delay_us mit 5000 aufgerufen wird, führt
aber schlimmstenfalls dazu, dass die Verzögerung länger ist, als
erwartet.
Siehe:
http://www.nongnu.org/avr-libc/user-manual/group__util__delay.html
"If the user requests a delay greater than the maximal possible one,
_delay_us() will automatically call _delay_ms() instead. The user will
not be informed about this case."
Daran wird es also vermutlich eher nicht liegen. Zudem lässt sich das
mittels Oszi ja leicht prüfen.
Grüße,
Peter
Peter Diener schrieb:> Der SPI mode ist falsch.> CPHA und CPOL müssen gesetzt sein (mode 3).> Sonst ist der Leerlaufpegel von SCK nicht high, so wie gefordert.> Siehe Seite 47 im Controllerdatenblatt.
SPI ist wohl nicht SPI, schon wieder was dazu gelernt. Werde das mal
ändern.
Heißt das auch, daß ich bei mehreren SPI-Slaves ggf. je nach Slave den
SPI-Mode ändern muß?
Vielen Dank!