Forum: Compiler & IDEs Butterfly und Nokia 3310 LCD *grrr*


von Marco (Gast)


Lesenswert?

N'Abend!

NAch langer Zeit habe ich mich mal wieder den AVRs gewidmet.
Ziel war/ist ein Nokia 3310 LCD anzusteuern. Das ganze sollte mit
meinem AVR Butterfly geschehen, da es ja von haus aus mit den
geforderten 3V läuft :)

Da das mein erstes C Projekt für den AVR ist habe ich mir hier
http://www.deramon.de/nokia3310lcd.php alles nötige besorgt und für die
aktuelle WinAVR Version umgeschrieben.
Hier mal ein Beispiel wie ich das gemacht hab... (die ursprünglichen
Befehle hab ich auskommentiert)

  // Init Serial Ports
  //sbi(GLCD_SER_PORT, GLCD_SCLK);
  //sbi(GLCD_SER_DDR, GLCD_SCLK);
  //sbi(GLCD_SER_DDR, GLCD_MOSI);
  //sbi(GLCD_SER_DDR, GLCD_SS);

  GLCD_SER_PORT |= (1 << GLCD_SCLK);
  GLCD_SER_DDR |= (1 << GLCD_SCLK);
  GLCD_SER_DDR |= (1 << GLCD_MOSI);
  GLCD_SER_DDR |= (1 << GLCD_SS);

So, alles fehlerfrei kompiliert, die .efl in AVRStudio4 geladen,
probelaufen lassen, alles schein zu klappen, Butterfly seriell über
Bootloader geflasht, LCD ans Butterfly gebastelt (SCK+SDIN an PortB,
D/C+CS+RST an PortF (JTAG))... nix tut sich.

Auf dem Oszi sehe ich dass beim Drücken des Joysticks nach oben kurz
Signale übertragen werden und beim Loslassen ebenfalls o_O... liegt
wohl am Bootloader?
Zur Fehlersuche habe ich dann nach allen wichtigen Schritten im
Programm einen Code (10,20,30,40 usw) seriell an ein Terminalprogramm
ausgeben lassen: Der Ablauf des Programms ist korrekt.
Außerdem habe ich das LCD am PC über die parallele Schnittstelle mit
dem Programm "Parallelspi" getestet: Läuft wunderbar! Auch mit fest
auf 3,3V gelegter Resetleitung.


Tja was tun? Die 3V sollten doch fürs LCD reichen auch wenn es
"eigentlich" 3,3V will oder?
Ob die Werte für Kontrast etc. richtig sind? Ob der Bootloader
irgendwie "stört"?
"In den AVR" zu gucken wär jetzt super... JTAG ich vermisse dich!


P.S.: Ich hätte eigentlich am Wochenende für eine Klausur lernen müssen
aber letztendlich hab ich nicht wirklich irgendwas geschafft wie so oft.
Ich hasse es dass mich solche Probleme immer so beschäftigen und mir
keine Ruhe lassen :-(

von Jörg Wunsch (Gast)


Lesenswert?

>  GLCD_SER_DDR |= (1 << GLCD_SCLK);
>  GLCD_SER_DDR |= (1 << GLCD_MOSI);
>  GLCD_SER_DDR |= (1 << GLCD_SS);

Eigentlich ein typischer Fall, warum der sbi-Makro nicht mehr da ist.
Über derartigen Code sollte man ein wenig nachdenken.  Wäre nicht

 GLCD_SER_DDR |= (1 << GLCD_SCLK)|(1 << GLCD_MOSI)|(1 << GLCD_SS);

oder gleich

 GLCD_SER_DDR == (1 << GLCD_SCLK)|(1 << GLCD_MOSI)|(1 << GLCD_SS);

sinnvoller?

Ansonsten: versuch' mal bitte, dein Problem jemandem zu erklären, der
zwar einigermaßen weiß, wie der Schmetterling arbeitet, aber keine
Idee hat, wie so'n Nokia-Display aussieht.  Bis jetzt habe ich leider
überhaupt nicht verstanden, was denn genau dein Problem ist (und was
das mit dem Codeschnipsel zu tun haben sollte).

von Marco (Gast)


Lesenswert?

Ja ok ich muss zugeben das war eher lerning by doing&reading g So in
der Art jedenfalls... ich habe parallel im Wiki gelesen. Hast schon
recht, das lässt sich deutlich eleganter schreiben mit dem neuen
Syntax.. den Schnippsel habe ich auch nur eingefügt um deutlich zu
machen WIE ich den Code geändert habe... aber wie gesagt in der
Theorie, also im AVRStudio, tut das Programm auch was es soll.

Aber zurück zum Problem. Dieses Nokia 3310 Display wird wer
(Hardware-)SPI angesteuert. Dazu werden MOSI und SCK verwedet, neben
D/C (um dem Display zu sagen ob es nun ein Kommando oder Daten
bekommt), Reset und CE (Chip enable).
Der Code initialisiert das Display, löscht es indem es 0x00 Muster
schreibt und gibt anschließend einen kurzen Text aus. Das ist alles.
Auf der Seite deren Link ich gepostet habe gibts auch ein paar Fotos
und natürlich den Code :)
Das schöne an diesem LCD ist die pinsparende Ansteuerung, der niedrige
Preis und natürlich die Größe (etwa 4x3cm grob geschätzt).

von mthomas (Gast)


Lesenswert?

JTAG-interface abgeschaltet, um die JTAG-Pins auch wirklich als GPIO
nutzen zu koennen? Fuer den Anfang vielleicht auch erstmal statt mit
den "JTAG-Pins" mit den "USI-Pins" versuchen, die sind "frei".
Sicherstellen, dass das Dataflash nicht an SPI "dazwischenfunkt" also
CS des DF auf high halten.

von Marco (Gast)


Lesenswert?

Danke für die Tipps!

Das JTAG Interface habe ich jetzt deaktiviert und der Dataflash
sollte doch eigentlich Ruhe geben wenn man die Resetleitung auf low
lässt oder?

Trotzdem klappt es noch nicht. Das mit dem USI werde ich mal versuchen,
vielleicht bringt's ja was.

Ach ja. Ich hatte mit sei() die Interrupts aktiviert, das ist jetzt
auch rausgeflogen. Jetzt startet das Programm nicht mehr jedesmal wenn
ich den Button nach oben drück sondern nur 1x nach Reset und Botton
nach oben :)

Und noch zwei Fragen.
Im Originalcode wurde das "Status Register" mit
.
inp(SPSR);
.
gelöscht. Das ist ja "alt" und "böse" wie ich mittlerweile weiß.
Also hab ichs so gemacht (irgendwo im Wiki gefunden):
.
  // Clear Status Register
  volatile char IOReg;
  IOReg=SPSR;
.
Geht das so?

Und ist "pgm_read_byte" das gleiche wie das alte "PRG_RDB"? Es soll
Bytes aus dem Flash lesen die die Inhalte für den Font und Grafiken
enthalten.

Marco

von Marco (Gast)


Angehängte Dateien:

Lesenswert?

Ich hab hier mal meine aktuelle Version angehängt

von Jörg Wunsch (Gast)


Lesenswert?

Im Prinzip funktioniert das mit dem lesen des SPSR so, ja, allerdings
bewirkt das `volatile' sehr umständlichen Code, da IOReg auf diese
Weise in jedem Falle in den Speicher geschrieben werden muss.

(void)SPSR;

ist wahrscheinlich das, was du suchst.

Ja, pgm_read_byte tut das, was PRG_RDB mal getan hat.

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.