Hallo zusammen,
seit wenigen Wochen beschäftige ich mich der interessanten Welt der
AVR's, bin also ziemlich neu in dem Gebiet. Programmieren versuche ich
mittels C, Restwissen von Basic aus Commondore/Zinclair Zeiten sind
vorhanden, Assembler aus den Zeiten davor eigentlich nicht mehr. Also
alles in allem recht blutiger Anfänger.
Nun stehe ich vor einem "Problem", bei dem ich doch nicht weiter komme.
Für ein Projekt wollen wir ggf. das S65 Display als Anzeige benutzen,
dazu habe ich mir auch schon reichlich Informationen hier anlesen
können. In einem ersten Schritt habe ich das S65 am SPI angeschlossen,
wie ich es bisher auch immer gesehen habe. Nach anfänglichen
Schwierigkeiten (Modifikation der SW von Marc Seiffert, Juergen Eckert,
Christian Kranz) läuft es stabil.
Da wir aber den AVR als SPI-Slave ansteuern wollen um den Hauptprozessor
zu entlasten, habe ich in einem nächsten Schritt das S65 am USART als
SPI des ATmega644P angeschlossen.
Dazu ist die USART folgendermassen initialisiert:
1 | UBRR1 = 0; //must be zero berfore initialization, see also ApNote317
|
2 | OUTPUT(LCD_SCK); //set XCK1/SCK as output to enable Master Mode
|
3 | UCSR1C = (1<<UMSEL11) | (1<<UMSEL10); //set MSPI mode of operation and SPI data mode 0
|
4 | UCSR1B= (1<<TXEN1); //Enable transmitter, RX1 can be used as normal I/O
|
5 | UBRR1= 7; //sets baud to 16Mhz/(2*(1+UBRR1) = 16MHz / 8 = 1MHz
|
Die Daten werden folgendermassen ausgegeben:
1 | CLR(LCD_CS); //select Display
|
2 | SET(LCD_RS); //Daten sind Befehle
|
3 | for(uint8_t i=0; i<size; i++){
|
4 | UDR1 = (data[i]>>8);
|
5 | SPI_Wait();
|
6 | UDR1 = (data[i]);
|
7 | SPI_Wait();
|
8 | }
|
9 | while (!(UCSR1A & (1<<TXC1))); //wait for transmission complete, as USART in SPI mode uses the buffer!
|
10 | CLR(LCD_RS); //First RS to Low, then
|
11 | SET(LCD_CS); //CS to H for processing of commands
|
Mit dem Befehl UBBR1=7 bekomme ich das Display nicht ans laufen,
ebenfalls bei UBBR1=1, was einer SPI Frequenz von 4MHz entsprechen
würde. Eigentlich immer wenn UBBR1 > 0 gesetzt wird. Nur mit UBBR1=0
läuft es einwandfrei.
Testweise habe ich den ATmega auf 8MHz intern umgestellt (entspricht ja
dann UBBR1=1 bei 16MHz), auch hier der gleiche Effekt, nur bei UBBR1=0
läuft das Display. An der Taktfrequenz der SPI kann es also nicht
liegen. Beim Anschluss an die "richtige" SPI kann ich auch die Taktrate
deutlich nach unten setzen, ohne dass es Probleme mit dem Display gibt.
Hat jemand da eine Idee, woran das liegen könnte? Das Timing der SPI
düfte doch eigentlich nicht von der Einstellung von UBBR1 abhängig sein.
Oder initialisiere ich die USART als SPI mit UBBR1=1...7 als letzten
Befehl doch falsch?
Über Hinweise würde ich mich freuen.
Grüße
Ralf