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 :-(
> 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).
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).
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.