Hallo Hannes, hallo Oliver,
> Direkten Asnchluß ans memory-i/O hab ich noch nie gemacht, aber auch da
> muß das Timing eingehalten werden. Wie stellst du das denn sicher?
Direkte Delays gibt es da wirklich nicht. Es wird habt über die
Definition der Waitstates geregelt (z.B. Datenblatt Mega128 S. 31ff)
Ist sehr schick das spo zu machen, denn der Code für die harwarenahen
Funktionen reduziert sich praktisch auf eine Zeile und zu
programmierende Wackeln an den Steuerleitungen entfällt.
Für ein Command-Write sieht das dann ungefähr so aus
1 | void ks0108WriteCommand(uint8_t cmd, uint8_t chip) {
|
2 | lcd_BusyWait(chip); // wait until LCD not busy
|
3 | *(volatile unsigned char *) (LCD_CONTROLLER0_CTRL_ADDR + LCD_CONTROLLER_ADDR_OFFSET*chip + LCD_CONTROLLER_WRITE) = cmd;
|
4 | }
|
mit
1 | void lcd_BusyWait(uint8_t controller)
|
2 | {
|
3 | // wait until LCD busy bit goes to zero
|
4 | while(*(volatile unsigned char *) (LCD_CONTROLLER0_CTRL_ADDR + LCD_CONTROLLER_ADDR_OFFSET*controller + LCD_CONTROLLER_READ) & LCD_STATUS_BUSY);
|
5 | }
|
P.S. Habe gerade die Lib gewechselt. Nutze jetzt die von Maximilian
Thiele, weil dort die Textausgabe an beliebigen Pixeln direkt
implementiert ist. Die Umsetzung des direkten I/O Memoryzugriffs ist
noch ein wenig buggy. Mal sehen, was hier aus meinem ursprünglichen
Problem geworden ist.
Phili