Hallo, ich habe folgendes Display (128x64 Pixel, KS0108 Controller) an meinen AT90CAN128 angeschlossen: http://www2.produktinfo.conrad.com/datenblaetter/175000-199999/181682-da-01-en-GRAFIK-MODUL_STN_BLAU_WEISS_128X64.pdf Und als Treiber verwende ich den hier Besprochenen: Beitrag "KS0108 GLCD Routinen" Nun funktioniert die Ansteuerung prinzipiell schon einmal, jedoch wird alles was ich auf den ersten Controller ausgebe (und somit nur auf der linken Hälfte erscheinen sollte) nochmal auf der rechten Seite angezeigt - ist also doppelt zu sehen. Schreibe ich nur etwas in die rechte Hälfte (x >= 64), dann erscheint das auch nur dort. Also ich kann nicht den ersten Controller allein ansteuern. Woher kann dieser Effekt kommen? Ich hoffe ihr wisst was ich meine - ich experimentiere schon seit Stunden und komm einfach nicht auf den Fehler. Es ist bestimmt was ganz einfaches. Das kann nur noch was ganz einfaches sein. Ein Kabelbruch oder so ;) Vielen Dank für Hilfe Randy Nürnberger
Wie hast Du denn die CS-Leitungen verdrahtet bzw. wie steuerst Du die an?
Jeweils eine CS-Leitung an einen Pin des Steuerports (bei mir PORTF). Also: PF0 = Data/Instruction PF1 = Read/Write PF2 = Enable Signal PF3 = Chip Select IC1 PF4 = Chip Select IC2 Und an PORTA hab ich den 8-bit Datenbus hängen.
Der aus dem Beitrag oben. Hab den Quellcode nochmal angehängt. Hier der Header: #include <inttypes.h> #include <avr/pgmspace.h> #ifndef KS0108_H #define KS0108_H // Ports #define LCD_CMD_PORT PORTF // Command Output Register #define LCD_CMD_DIR DDRF // Data Direction Register for Command Port #define LCD_DATA_IN PINA // Data Input Register #define LCD_DATA_OUT PORTA // Data Output Register #define LCD_DATA_DIR DDRA // Data Direction Register for Data Port // Function Paramters #define INCREMENT_X 0 #define NO_INCREMENT_X 1 // Command Port Bits #define D_I 0x00 // D/I Bit Number #define R_W 0x01 // R/W Bit Number #define EN 0x02 // EN Bit Number #define CSEL1 0x03 // CS1 Bit Number #define CSEL2 0x04 // CS2 Bit Number #define RESET 0x05 // RESET Bit Number // Chips #define CHIP1 0x00 #define CHIP2 0x01 // Commands #define LCD_ON 0x3F #define LCD_OFF 0x3E #define LCD_SET_ADD 0x40 #define LCD_SET_PAGE 0xB8 #define LCD_DISP_START 0xC0 // Fill Modes #define BLACK 0xFF #define CLEAR 0x00 // Uncomment for slow drawing //#define DEBUG struct displayPos { uint8_t x; uint8_t y; uint8_t page; }; struct font { uint8_t width; uint8_t height; PGM_P charData; }; // Function Prototypes void ks0108Enable(void); void ks0108Fill(uint8_t mode); void ks0108GotoXY(uint8_t, uint8_t); void ks0108Init(void); void ks0108SetDot(uint8_t, uint8_t); void ks0108ClearDot(uint8_t, uint8_t); void ks0108PutChar(char c, struct font font); void ks0108NewLine(uint8_t fontHeight, uint8_t offset); void ks0108PutString(char *string, struct font font); void ks0108PutStringP(PGM_P string, struct font font); char ks0108ReadData(uint8_t incXAdd); void ks0108WriteCommand(uint8_t cmd, uint8_t chip); void ks0108WriteData(uint8_t data); #endif
Und ein einfaches: ks0108Init(); ks0108SetDot(0,0); funktioniert (!), aber zeigt den Punkt eben zweimal an - einmal an (0;0) und einmal an (64;0). Wenn ich aber folgendes schreibe: ks0108Init(); ks0108SetDot(64,0); DANN erscheint wirklich nur ein Punkt an (64;0). Muss ich beim Anschließen irgendwas beachten? Habe einfach nen Draht von dem Pin zu dem auf dem Grafikmodul gezogen. An der richtigen Stelle sind sie alle.
Liegt bestimmt an der Verdrahtung. Es scheint ja so, dass bei x<64 CS1 und CS2 gesetzt werden und bei x>=64 nur CS2. Vielleicht ist CS2 immer gesetzt. Bist Du Dir sicher, dass Du dich bei den Pins nicht vielleicht verzählt hast, so dass z.B. der Reset-Ausgang vom µC mit CS2 vom Display verbunden ist?
Hm da haut tatsächlich was nicht hin. Hab, um mal zu messen, ob die Pins nicht vielleicht beim Anlöten des AT90CAN128 vielleicht verbunden worden sind, mal nur folgendes geschrieben: DDRF = 0b11111111; PORTF = 0b01010101; Und wenn ich messe kommen bei den letzten beiden Pins 5V. Hm ich kann nur keine Verbindung erkennen. Also die letzten beiden Pins hängen ja in der Luft - sind nur auf der kleinen Leiterplatte festgelötet, aber dann ist da kein Draht dran. Komisch.
Wegen dem setzen: ich glaub das ist genau invertiert. Also wenn beide CS-Leitungen LO, dann sind beide aktiviert, und wenn beide HI, sind beide deaktiviert. Oder? Ich hab jetzt nochmal die beiden CS-Leitungen an die zwei anderen Pins umgelötet - mit dem gleichen Ergebnis. Aber es MUSS an der Hardware liegen. *seufz Ich schlaf jetzt erstmal und wenn ich wieder aufstehe, funktioniert es ;) (Erstaunlicherweise kriegt man wirklich immer die Probleme, die einen am Vortag unlösbar erschienen, am nächsten Tag ziemlich flott hin - heh). Danke trotzdem für die Hilfeversuche - trotz dass es so spät ist :)
OK PROBLEM GEFUNDEN !!! VIELEN DANK :) Also ich hab jetzt diese CS-Leitungen mal abgelötet und per Hand mal an den Pluspol gehalten und siehe da: es geht. Also der AT90CAN128 hat da irgendwie ein Problem mit seinen Ports. Entweder da ist was verbunden oder k.A.
CS-Signale sind meistens active low, d.h. aktiv=0 inaktiv=1. Ob hier auch, ist aufgrund der doch sehr dicken Wälzer von Datasheets wohl nur praktisch zu ermitteln. Mindestens bei http://www.lcd-module.de/deu/pdf/grafik/j128-6n6.pdf steht das immerhin auch so drin. Dein oben angehängter Code geht freilich von active high aus.
JUHU SUPER DANKE!! An JTAG lag es - habs ausgeschaltet und es geht! Allerdings kann ich jetzt den µC nicht mehr programmieren, wenn JTAG aus ist (also das Fuse-Bit JTAGEN nicht gesetzt ist). Ich muss das vorher immer erst wieder setzen, dann das Programm übertragen, dann wieder löschen (verwende PonyProg dazu). Aber JTAG hat doch nichts mit der Programmübertragung zu tun, oder? Kann man JTAG auch auf dem µC per Software ausschalten?
Wenn du per JTAG programmierst hat das schon was damit zu tun ;) PS: Ja man kann das JTAG per Software ausschalten. Durchsuch das Datenblatt mal nach "JTD".. Soweit ich mich erinnere musst du in MCUCSR das Bit JTD zwei mal hintereinander setzen.
Hm ich programmiere per ISP. Aus dem Datenblatt: "When the JTAGEN fuse is unprogrammed, these four TAP pins are normal port pins and the TAP controller is in reset. When programmed and the JTD bit in MCUCR is cleared, the TAP input signals are internally pulled high and the JTAG is enabled for Boundary-scan and programming." Also muss ich JTD in MCUCR setzen. Nur leider funktioniert das dann trotzdem nicht, also das bleibt aktiviert. PonyProg spinnt jetzt auch irgendwie - jedesmal bringt es jetzt einen Übertragungsfehler (auch wenns richtig übertragen wurde). Naja auch egal erstmal - deaktivier ichs halt jedesmal. Vielleicht löt ich das ganze auch nochmal an einen anderen Port...
Seite 305 (02/07):
1 | In order to avoid unintentional disabling or enabling of |
2 | the JTAG interface, a timed sequence must be followed when changing this bit: The application |
3 | software must write this bit to the desired value twice within four cycles to change its value. Note |
4 | that this bit must not be altered when using the On-chip Debug system. |
Sprich:
1 | ldi temp, (1<<JTD) |
2 | out MCUCR, temp |
3 | out MCUCR, temp |
bzw.
1 | MCUCR = (1<<JTD); |
2 | MCUCR = (1<<JTD); //Und hoffen, dass nichts wegoptimiert wird ;) |
Hi Am einfachsten wäre es, CS mit einem anderen Pin zu schalten. MfG Spess
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.