Forum: Mikrocontroller und Digitale Elektronik AVR 32-bit. Externes OLED Display verwenden.


von Lukas (Gast)


Lesenswert?

Hallo,

ich befinde mich aktuell in einem Praktikum und habe die Aufgabe 
bekommen
ein Display von Conrad, 180847, mit Hilfe des ebenfalls von Conrad 
erworbenen, Application Board AVR 32-bit, 192587, in Betrieb zu nehmen.

Da ich in der Programmierung allgemein und bei Mikrocontrollern erst 
recht ein echter Anfänger bin, habe ich keine Ahnung wie ich das Display 
ansteuern kann. Ein leuchtender Pixel (wenn das geht) würde für den 
Anfang reichen, allerdings weiß ich nicht mal ob das Display überhaupt 
kompatibel mit diesem AVR µC ist. Alles was ich bis jetzt auf dem µC 
geschafft habe sind kleinere Programme, zusammengefügt in ein etwas 
größeres, was aber auch nur dank der vorhandenen Demo-Programme gelang. 
(Das Programm beinhaltet einen ADC Eingang, Timer, eine RS232 
Verbindung, Taster, das LCD-Display für Die Messergebnisse des ADC und 
natürlich das momentane Problem OLED Display) Eine externe 
Versorgungsschaltung ist auch vorhanden. (24V in 12V, -12V, 2x 5V)

Das Datenblatt verstehe ich so auch nicht komplett, wobei ich doch sehr 
erleichtert war als ich gehört habe, dass ich das "Serial interface" 
benutzen solle, was zur Folge hat das Pin 5 R/W# und Pin 6 E(RD#) 
wegfallen, oder nicht? (Vermute ich anhand der "DESCRIPTION", da dort 
nur die anderen Interfaces beschrieben werden.

Bis jetzt habe ich in meinem Programm (ein neues Programm zum testen) 
versucht mittels "Port_Attribute" und "Port_WriteBit" zu arbeiten, auch 
wenn ich mir nicht sicher bin ob das der richtige Ansatz ist.

Insofern möchte ich mich, hoffentlich noch nicht am Ende, für die 
falschen Annahmen o.ä. und für die fehlenden Informationen 
entschuldigen, da dies mein erster Forum Beitrag überhaupt ist.

Grüße Lukas.

von Lukas (Gast)


Lesenswert?

PS:
Mit dabei ist die "C-Control PRO AVR32-Bit Unit, 192573, auch von 
Conrad.

von Andreas (Gast)


Lesenswert?

Hallo,

da kommt wahrscheinlich noch eine Menge Arbeit auf Dich zu.

Hier die Schritte die ich Dir raten möchte, um möglichst zügig 
voranzukommen.

1.) HW-Anbindung machen, Basis-Kommunikation aufbauen, 
Minmal-Initialisierung des Displays und Pixel anzünden. Das sind auch 
die ersten Schritte, die Du machen musst - zumindest um mal zu sehen ob 
das Display anspricht (erster großer Meilenstein).

Wenn das erledigt ist, musst Du die

2.) Initialisierung verfeinern (Display-Timings, Orientierung des 
Displays, ...). Das ist auch noch nicht die große Sache und man kann 
hier später noch Feinjustierungen vornehmen.

3.) Dann willst Du aber brauchbare Inhalte (am wichtigsten ist Text) am 
Display darstellen. Der verwendete Display-Controller (SSD1305) hat 
keine internen Fonts. Du schreibst lediglich die Pixel, die angezündet 
werden müssen in den Videospeicher. Wenn Du hier angekommen bist, würde 
ich das Netz durchforsten (nach PC-Tools die Deine gewünschte Font z.B. 
in ein C-File konvertieren und entsprechende Ausgaberoutinen, die Du zu 
Deinem Programm mitkompilierst). Ich bin mir sicher, dass es hier schon 
was von der Community gibt. Glücklcherweise sind sich die meisten 
Display-Controller in der Ansteuerung monochromer Displays in den 
Auflösungen 128x64 und 132x64 SEHR ähnlich (auch zwischen LCD und OLED), 
sodass sich die Anpassungen zwischen den einzelnen Display-Controllern 
oft nur auf den Initialisierungs-Code beschränken. Das Anpassen solcher
Treiber ist dann meist nicht mehr die große Sache - vorausgesetzt man 
hat schon etwas Erfahrung mit den Display-Controllern.
Alternativ gibt es auch kommerzielle Anbieter für Treiber / 
Display-Routinen (z.B. www.ramtex.dk), die vermutli.


Für den ersten Part (BasisInbetriebnahme des Displays) kann ich ein paar 
Tipps geben:

1.1) HW-Anbindung (SPI):
offensichtlich verwendest Du die 5V-Variante (VDD) des Displays 
(VGY(G)12864L-03)
Pinout des Display-Controllers:
1 -> GND
2 -> 5V (VDD)
3 -> 12V
4 -> D/C mit beliebigem GPIO des AVR32 verbinden;
5 -> N.C. (not connected)
6 -> N.C.
7 -> SCLK (SPI)
8 -> MOSI (SPI)
9 -> N.C.
10 -> N.C.
11 -> N.C.
12 -> N.C.
13 -> N.C.
14 -> N.C.
15 -> CS# (SPI)
16 -> RES# am besten mit einem beliebigen GPIO des AVR32 verbinden, 
diesen als Ausgang konfigurieren, bei jedem Programmstart erst eine ms 
high setzen, eine ms low setzen, wieder high setzen, 100 ms warten und 
dann erst mit den SPI-Commands beginnen - ohne dass ich mir das 
RESET-Timing des SSD1305 jetzt genau angeschaut habe - kannst Du selber 
machen & Timings optimieren -> Datenblatt des SSD1305 runterladen!);
17 -> GND (select SPI as interface)
18 -> GND (select SPI as interface)
19 -> N.C.
20 -> GND

Bei Verwendung des SPI-Interface kannst Du nur Daten zum Display 
schreiben - nicht lesen (diese Display-Controller haben keine 
MISO-Leitung); ist aber kein Problem;

1.2) GPIOs / SPI am AVR32 einrichten
Ich kenne Deine Entwicklungsumgebung nicht, aber ich vermute Du 
verwendest das Atmel Software Framework (ASF) oder es sind andere 
Bibliotheken vorhanden; du benötigst nun die SPI-Routinen; schau mal ob 
in Deiner Infrastruktur was da vorhanden ist: schau die verfügbaren 
Code-Examples an und lies das SPI-Kapitel Deines AVR32 aufmerksam durch 
- Du benötigst ein Grundverständnis darüber, wie die SPI funktioniert! 
Du solltest auf ein Oszilloskop zurückgreifen und damit umgehen können. 
Ich gehe davon aus dass Dich jemand im Praktikum unterstützt.

Auf jeden Fall müssen die verwendeten SPI-Pins (zumindest SCLK & MOSI) 
so konfiguriert werden, dass sie vom SPI-Modul gesteuert werden (nicht 
vom GPIO-Modul); die CS-Leitung würde ich in der ersten Phase noch per 
Hand (über das GPIO-Modul) kontrollieren (als Output konfigurieren);
dann musst Du das SPI-Modul (im AVR32)konfigurieren;
wichtig sind u. A.:
- SPI-Frequenz <= 4 MHz (limit des SSD1305); stell sie vorerst mal auf 1 
MHz oder darunter, um Geschwindigkeitsoptimierungen würde ich mich erst 
später kümmern;
- den SPI-Mode einstellen; zumindest manche Bibliotheken benutzen den 
Begriff SPI-Mode; SPI-Mode (beim SSD1305) = 0 (bzw. CPHA=0, CPOL=0); 
Mode 3 könnte auch funktionieren, mit Mode 0 bist Du aber auf der 
sicheren Seite;


hier nochmal zusammengefasst:
1.2.1) GPIOs konfigurieren
RES#, CS#, D/C als Ausgänge am GPIO-Modul konfigurieren;
RES# = high
CS# = high
D/C = low

1.2.2) SPI-Modul konfigurieren (entsprechendes Kapitel im AVR32 
datasheet durchlesen!)
SCLK und MOSI müssen so konfiguriert werden, dass sie vom SPI-Modul 
kontrolliert werden;
SPI-Mode auf 0 setzen (CPHA=0, CPOL=0)
SPI-Frequenz vorerst auf 1MHz oder darunter einstellen;
8 bits pro Transfer (pro SPI-Datenwort) einstellen;
Delays zwischen den einzelnen Transfers (Bytes bzw. SPI-Datenwörtern) 
brauchst Du nicht;

1.2.3) OLED-Display resetieren (siehe Pinout RES#)

1.2.4) OLED-Display Minimalst-Initialisierung
um mal alle Pixel einzuschalten brauchst Du vermutlich nur 2 Befehle 
(lies aber auf jeden Fall das Datasheet vom SSD1305 aufmerksam durch - 
Du musst nicht alles verstehen - Scroll-Features, wie der Video-Speicher 
adressiert wird, Display-Timing, DC-DC-Konverter, Pixel invertiert und 
sogar wie das Display an den Display-Controller angebunden ist 
(COM/SEG), sollten vermutlich vorerst egal sein);

Du brauchst nun eine Routine, die Kommandos an das Display sendet 
(Pseudo-Code):
1
void ssd1305_sendSingleByteCmd (uint8_t cmd)
2
{
3
 uint8_t spiRxDummy; // don't care about the received byte;
4
                     // MISO is not wired anyway;
5
    gpioClr(GPIO_DC);  // informs SSD1305 that it is about to
6
                       // receive a command
7
    gpioClr(GPIO_CS);  // select SSD1305 display controller
8
    spiTransferBuff( &spiRxBuff, &cmd, 1);  // transfer command byte;
9
            // when spi transmits datawords, it's inevidable that the
10
            // same number of datawords is received; this function
11
            // has to wait for the transmission to finish shifting
12
            // the last dataword before returning!
13
    gpioSet(GPIO_CS);  // transmission end;
14
}
15
16
void ssd1305_initMin (void)
17
{
18
    // if ssd1305 has not been reset yet, do it now;
19
    //ssd1305_reset();
20
    ssd1305_sendSingleByteCmd( 0xAF); // turn display on
21
    ssd1305_sendSingleByteCmd( 0xA5); // turn all pixels on
22
}

Wenn alles funktioniert hat, sollten nach Ausführung der init-Routine 
alle Pixel leuchten.

Ich bin nur selten in den Foren aktiv, also kann es sein, daß ich bei 
Rückfragen nicht in absehbarer Zeit antworte.

Gruß,
Andreas

von Lukas (Gast)


Lesenswert?

VIELEN, RIESIGEN DANK Andreas.^^

Werde mich da jetzt dran setzen und mal schauen wie weit ich da komme.
Ohne den Beitrag säße ich hier wohl einfach nur verzweifelnd rum.
Vielen Dank.

Grüße

von Lukas (Gast)


Lesenswert?

Hallo,

ich habe mich jetzt teilweise durch gearbeitet und so manche Probleme 
festgestellt.^^

Ich benutze die C-Control Pro IDE, da sie standartmäßig drauf oder 
empfohlen war, ist schon ~12 Wochen her.
Bei der "Pinout des Display-Controllers:" kann ich bei P17 und P18 kein 
Inferface wählen, da ich keine Bibliothek oder andere Erklärungen in der 
IDE finden kann. Allgemein gibt es keine Beispiele zum Thema SPI 
lediglich acht Indexeinträge für SPI Abschaltung, SPI_Disable/Enable, 
read, write, chan und das ganze mit Buffern. Da wäre dann das zweite 
Problem. Ich kann keinen SPI-Mode wählen und die Frequenz aussuchen 
funktioniert, allerdings brauche ich für die Frequenz 2 Bit und für die 
anderen Einstellungen 5-7 Bit, möglich sind allerdings nur 4 Befehle... 
. (Bit 0 + 1 für Frequenz. Wenn bei Beiden Bits = 0 steht dann 4 
vermutlich 4MHZ, steht nicht bei.)

Es kann natürlich gut sein das meine fehlende Intelligenz das Problem 
ist allerdings habe ich in so manchen Beiträgen gelesen, dass dieses 
Thema schlecht dokumentiert sein soll. (in C-Control Pro IDE)

Würde ein Umstieg auf eine andere Entwicklungsumgebung für 4 Wochen Rest 
zeit lohnen?
Welche Umgebung wäre besser?
Kennt jemand vernünftige Beispiele, in CompactC, für die SPI?

Bin dann mal weiter rumprobieren. Hoffentlich bis bald.^^

Grüße.

von Andreas (Gast)


Lesenswert?

Hallo,

>Bei der "Pinout des Display-Controllers:" kann ich bei P17 und P18 kein
>Inferface wählen, da ich keine Bibliothek oder andere Erklärungen in der
>IDE finden kann.

...weder die beste Bibliothek noch genialste IDE wird Dir die Arbeit 
abnehmen, Pins anzuschließen. Wie ich im vorhergehenden Beitrag 
angeführt habe, müssen einfach beide Pins mit GND (Masse) verbunden 
werden und es ist damit erledigt. Der Kommentar, den ich dahinter 
angeführt habe war nur zur Erläuterung, was es damit auf sich hat:
Damit wird dem Display-Controller mitgeteilt, dass er über die SPI (und 
NICHT über einen parallel Datenbus oder I2C) mit dem Mikrocontroller 
verbunden ist und entsprechend von dieser Schnittstelle die Befehle 
entgegennehmen muss.

>Allgemein gibt es keine Beispiele zum Thema SPI
>lediglich acht Indexeinträge für SPI Abschaltung, SPI_Disable/Enable,
>read, write, chan und das ganze mit Buffern. Da wäre dann das zweite
>Problem. Ich kann keinen SPI-Mode wählen und die Frequenz aussuchen
>funktioniert, allerdings brauche ich für die Frequenz 2 Bit und für die
>anderen Einstellungen 5-7 Bit, möglich sind allerdings nur 4 Befehle...
>. (Bit 0 + 1 für Frequenz. Wenn bei Beiden Bits = 0 steht dann 4
>vermutlich 4MHZ, steht nicht bei.)
Wo hast Du bloß Diese Bits/Informationen zusammengekratzt? Ich hatte mit 
C-Control noch nie zu tun, aber die Information sind für mich klar (wenn 
Sie auch Details vorenthalten).
Wenn Du von "Indexeinträgen" schreibst und damit Bibliotheksfunktionen 
meinst, sind da noch ein paar Syntax-Barrieren, die wir ausräumen 
müssen.

Jetzt gehst Du mal auf die Seite, wo die Bibliotheks-Funktionen 
beschrieben sind:
http://www.c-control-pro.de/documentation/index.html

Dann navigierst Du dich durch den "Verzeichnisbaum" bis zum SPI-Kapitel 
durch und findest da SPI_Enable:
1
void SPI_Enable(byte chan, dword speed, byte bits, byte mode);
gleich im Anschluss sind die Übergabe-Parameter definiert:
chan   SPI Kanal (0 - 1)
speed   SPI Takt (259000 - 66000000)
bits   Anzahl der Datenbits
mode   SPI Mode

der Parameter bits beschreibt die ANZAHL DER BITS PRO SPI-DATENWORT BEI 
DER ÜBERTRAGUNG (falls Du hier Deine seltsamen Bit-Rückschlüsse 
abgeleitet hast).
In der darauf folgenden Tabelle ist auch der Mode beschrieben (0 f. 
SPI-Mode 0). Der Controller besitzt zwei SPI-Schnittstellen.

Der Channel (chan) gibt einfach die SPI-Schnittstelle an, mit welcher Du 
das Display mit dem Board verdrahtet hast. Wenn Du für die Anbindung den 
Kanal 0 verwendest, dann werden die Pin-Namen (Labels) aller SPI-Pins, 
die Du verwenden musst, eine 0 enthalten.

heisst im Klartext für die Initialisierung der SPI (bei channel 0):
1
SPI_Enable( 0, 1000000UL, 8, 0);    // vorerst nur ~1 MHz; SPI-Mode 0, 8 bits pro Datenwort

Das war vermutlich schon die komplette Initialisierung der SPI - 
einfacher geht es wirklich nicht. Anhand der API und Doku (hier ist 
zumindest nicht explizit angeführt, dass /CS per Hand gesetzt werden 
muss) lässt sich annehmen, dass die CS-Leitung bereits vom SPI-Modul 
kontrolliert wird (oder von den Funktionen). Das Setzen/Löschen (und 
vermutlich Initialisieren) der CS-Leitung in meinem vorhergehenden 
Beitrag kannst Du Dir also wahrscheinlich sparen (mit Oszilloskop 
nachprüfen).

das macht aus der Funktion ssd1305_sendSingleByteCmd folgendes:
1
void ssd1305_sendSingleByteCmd (byte cmd)
2
{
3
    Port_WriteBit( GPIO_DISP_DC, PORT_OFF);  /* informs SSD1305 that it is about to receive a command; */
4
    SPI_Write((word)cmd); // write single byte command
5
}

Gruß,
Andreas

von Lukas (Gast)


Lesenswert?

Hallo,

zu der Sache mit dem SPI_Enable. Ich habe die Befehle durch die Index 
Suche gesucht und da steht was vollkommen anderes. Hab mir eigentlich 
gedacht, dass durch die Suche genau das was in der Bibliothek steht 
gefunden wird. Das hab ich gefunden --> "void SPI_Enable(byte ctrl);" 
war wohl mein Fehler sorry.^^
Die Bits kommen auch von dem Fund.
------------------------------------------------------------------------
Bit 7 - SPI Interrupt Enable (nicht einschalten, kann von C-Control Pro 
nicht genutzt werden)
Bit 6 - SPI Enable (muss gesetzt sein)
Bit 5 - Data Order (1 = LSB first, 0 = MSB first)
Bit 4 - Master/Slave Select (1 = Master, 0 = Slave)
Bit 3 - Clock polarity (1 = leading edge falling, 0 = leading edge 
rising)
Bit 2 - Clock Phase (1 = sample on trailing edge, 0 = sample on leading 
edge)
------------------------------------------------------------------------
(immer dieses kleingedruckte Mega ...)

Mein Problem ist das, dass ich mir andere Projekte durch x maliges 
Testen beigebracht habe, was hier ja nicht geht.
--->  SPI_Write((word)cmd); funktioniert so nicht (auch nicht mit 
Werten).
Ich habe das word durch Zahlen ersetzen und das cmd löschen müssen, 
damit das Programm wieder funktionstüchtig war. Die Konfiguration der 
SPI, das resetten, der Timer, sowie der Rest klappt soweit.
(jedenfals werden keine Fehlermeldungen angezeigt, das Display zeigt ja 
noch nichts an von daher denke ich, das der Quelltext soweit richtig 
ist).

Was mir noch einfällt, soll man bei "SPI_Write((word)cmd);" für word den 
Befehl einsetzen, der dann abgeschickt wird oder soll man sich einen 
Befehl, auf Seite 12 des Display Datenblattes aussuchen, die Bits in 
"SPI_WriteBuf" schreibt und davor D/C = 0 setzt?

Ich muss schon sagen das ich solch einen Quelltext oder generell auf die 
"Voreinstellungen" niemals selber gekommen wäre. Für mich wäre das wohl 
so etwas wie Zahlen/Buchstaben/Zeichen raten gewesen. Leider.

Wird mich auch mal mit meinem Chef dran setzen.

Ich mag es selber nicht wenn man fertige Ergebnisse vorgesetzt bekommt, 
denn ohne dass man was selber macht versteht man es auch nicht und vor 
allem kann man zukünftige Probleme bei z.B. Umbauten nur sehr schlecht 
lösen.

Vielen Dank für die Antwort und entschuldige meine Inkompetenz.^^
Grüße.

von Andreas (Gast)


Lesenswert?

Hallo,

>--->  SPI_Write((word)cmd); funktioniert so nicht (auch nicht mit
>Werten).
Mit dieser Beschreibung ist es niemandem möglich, zu helfen. Bitte genau 
schildern, wie sich "funktioniert so nicht" bemerkbar macht (gibt die 
IDE beim Kompilieren einen Fehler aus? Wenn ja - wie lautet die 
Fehlermeldung?).

>Ich habe das word durch Zahlen ersetzen und das cmd löschen müssen,
>damit das Programm wieder funktionstüchtig war.

Kann mir das anhand der bisherigen Schilderung z.B. so erklären, dass Du 
"SPI_Write((word)cmd);" irgendwo willkürlich in dein Programm (main?) 
reinkopiert hast und "cmd" dort nicht bekannt ist, anstatt - wie 
angegeben - in dieser Funktion verwendest (in der "cmd" als 
Übergabeparameter dient):
1
void ssd1305_sendSingleByteCmd (byte cmd)
2
{
3
    Port_WriteBit( GPIO_DISP_DC, PORT_OFF);  /* informs SSD1305 that it is about to receive a command; */
4
    SPI_Write((word)cmd); // write single byte command
5
}
cmd ist vom Typ "byte", weil der Display-Controller grundsätzlich für 
8-Bit breite SPI-Datenwörter ausgelegt ist; die Bibliotheksfunktion 
SPI_Write hingegen verwendet ein 16-Bit-word als Übergabeparameter, weil 
das SPI-Modul bis zu 16-Bit-Breite Datenwörter unterstützt (wenn die SPI 
mit 8-Bit breiten Datenwörtern konfiguriert wurde, werden die oberen 
8-Bit des Übergabeparameters ignoriert); auch um auf die 
unterschiedlichen Datentypen aufmerksam zu machen, wurde ein expliziter 
type cast (Typenkonvertierung) gemacht:
1
SPI_Write((word)cmd); // explicit type cast
Es wird in diesem Fall jedoch genauso funktionieren (der typecast 
erfolgt implizit - ohne Dein Zutun):
1
SPI_Write( cmd); // implicit type cast

GPIO_DISP_DC musst Du natürlich selber ZUVOR definieren (je nachdem, an 
welchen Pin Du das Signal am AVR32 angeschlossen hast).
z.B. bei D/C-Signal an PB00:
1
#define GPIO_DISP_DC    PB00 // das selbe wie #define GPIO_DISP_DC   32


>Mein Problem ist das, dass ich mir andere Projekte durch x maliges
>Testen beigebracht habe, was hier ja nicht geht.
Das Problem ist, dass Dir offensichtlich fundamentale C-Kenntnisse 
fehlen. Ist nicht böse gemeint, aber Du wirst es sehr schwer haben, wenn 
Du Dir diese Grundkenntnisse nicht aneignest.

Am besten geht das, indem man ein C-Buch liest und jemanden kennt, den 
man zwischendurch mit Fragen durchlöchern kann. Vielleicht kann Dich 
hier Dein Chef oder Projekt-Begleiter unterstützen. Die Grundkenntnisse 
über C wird Dir vermutlich keiner über ein Forum beibringen 
können/wollen.

Gruß,
Andreas

von Lukas (Gast)


Lesenswert?

Hallo,

>Mit dieser Beschreibung ist es niemandem möglich, zu helfen. Bitte genau
>schildern, wie sich "funktioniert so nicht" bemerkbar macht (gibt die
>IDE beim Kompilieren einen Fehler aus? Wenn ja - wie lautet die
>Fehlermeldung?).

Syntax Fehler 1 + 2:
 Quelltext:

void ssd1305_sendSingleByteCmd (byte cmd)
{
    Msg_WriteText("Ausgabe erfolgt...\r\r");
    Port_WriteBit( GPIO_DISP_DC, PORT_OFF);
    SPI_Write((word)cmd);                      <--- Markierte Zeile
}

Meldung:
Verzeichnis: Syntax Fehler - unerwartetes Symbol: 'word'
Verzeichnis: Syntax Fehler - unerwartetes Symbol: 'cmd' (selbe Zeile)

Wenn ich das cmd lösche und für word beispielsweise eine 1 einsetze 
bekomme ich bei dem Versuch auf die Funktion zuzugreifen folgendes zu 
lesen:

Syntax Fehler:
 Quelltext:

void Beispiel(void)
{
    ssd1305_sendSingleByteCmd();               <--- Markierte Zeile
}

Meldung:
Verzeichnis: Syntax Fehler - Zuwenig Argumente für Aufruf von Funktion 
ssd1305_sendSingleByteCmd.

Mit,
> void ssd1305_initMin (void)
>{
>    ssd1305_sendSingleByteCmd( 0xAF); // turn display on
>    ssd1305_sendSingleByteCmd( 0xA5); // turn all pixels on
>}
,
klappt das allerdings ohne Fehlermeldung, ist aber nicht das aktuelle.







> Kann mir das anhand der bisherigen Schilderung z.B. so erklären, dass Du
>"SPI_Write((word)cmd);" irgendwo willkürlich in dein Programm (main?)
>reinkopiert hast und "cmd" dort nicht bekannt ist, anstatt - wie
>angegeben - in dieser Funktion verwendest (in der "cmd" als
>Übergabeparameter dient):

In main oder in sonst einer Funktion ist es nicht.
Ich habe deine Funktion kopiert und wollte, wie weiter oben schon 
beschrieben, auf deine Funktion zugreifen.


Das mit dem definieren von "GPIO_DISP_DC" ist natürlich so ne Sache bei 
der ich nich geschaltet habe.^^ (Nach der Fehlermeldung habe ich 
"GPIO_DISP_DC" einfach als variable deklariert.



>Das Problem ist, dass Dir offensichtlich fundamentale C-Kenntnisse
>fehlen. Ist nicht böse gemeint, aber Du wirst es sehr schwer haben, wenn
>Du Dir diese Grundkenntnisse nicht aneignest.

Oh ja.
Ist nichts dran, was man "böse" auffassen sollte.
Da kann ich auch keine Ausreden finden.^^
Haben in der Schule "nur" C++ gehabt. C++ in Richtung: ,,Wir schreiben 
jetzt alles in die main Funktion (wusste bis zu meinem Praktikum nicht 
einmal das man x beliebige Funktionen nutzen kann) und lassen das 
Programm stumpf abarbeiten und dann schauen wir mal was kommt... 
(Fachabi Yeahh)
(jetzt weiß ich warum die Lehrer trotz der eins so traurig geguckt 
haben)

Vielen Dank.
Grüße.

von Andreas (Gast)


Lesenswert?

Hallo,

Ohne Erklärungen der folgenden Schritte schlage ich Dir nun folgendes 
vor:

die Funktion void ssd1305_sendSingleByteCmd (byte cmd) wird 
folgendermaßen geändert/erweitert:
1
#define GPIO_DISP_DC 32 // for now; just check if it compiles;
2
void ssd1305_sendSingleByteCmd (unsigned char cmd)
3
{
4
    // Msg_WriteText("Ausgabe erfolgt...\r\r");
5
    Port_WriteBit( GPIO_DISP_DC, 0);
6
    SPI_Write( cmd);
7
}

--> Kompileren; gibt's noch Fehler? wenn ja, welche?

Wenn das alles noch nichts gebracht hat, poste hier Dein ganzes C-File 
(besser als Datei anhängen, nicht in den Beitrags-Text einfügen).

Falls es jedoch funktioniert, aufräumen:
#define GPIO_DISP_DC 32
32 durch das GPIO-Define ersetzen (z.B. "PB00" je nachdem welchen Pin Du 
hierfür verwendest);

Gruß,
Andreas

von Lukas (Gast)



Lesenswert?

Hallo,

> #define GPIO_DISP_DC 32 // for now; just check if it compiles;
Mir wird kein Fehler angezeigt. Scheint zu klappen.



> --> Kompileren; gibt's noch Fehler? wenn ja, welche?
Der einzige Fehler wäre jetzt noch:
Quelltext:
 ...
 if(!(TimerZurAusgabe%10))
 {
     ssd1305_sendSingleByteCmd();
 }
 ...
Ende
Fehlermeldung:
 Verzeichnis:Semantik Fehler - Zuwenig Argumente für Aufruf von Funktion 
ssd1305_sendSingleByteCmd

Ist einfach der Sprung von meiner x beliebigen Funktion auf deine 
empfohlene Funktion.

C-File müsste im Anhang sein.
Ich kann Werktags (außer Samstags) von 9:00Uhr bis 14:00Uhr antworten. 
(oder eher fragen)

Vielen Dank erneut.
Grüße.

von Andreas (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

falls Du nicht schon ein paar Probleme selbst rausgefunden hast, hier 
ein paar Tipps:

1.) Das sich das Programm nicht kompilieren lässt, ist klar. Immerhin 
rufst Du in Deinem Beispiel ssd1305_sendSingleByteCmd ohne 
Übergabeparameter auf - der ist nicht optional! Schließlich willst Du 
der Funktion das Command übergeben, das zum Display-Controller gesendet 
wird. Wie gesagt - die C-Grundkenntnisse musst Du selber lernen.

2.) Du rufst offensichtlich IO-Funktionen (z.B. Port_Attribute) auf, 
ohne zu verstehen, wie die funktionieren. Die Attribute müssen binär 
verodert werden. Rufst Du die Funktion für den selben Pin 2x 
hintereinander mit unterschiedlichen Attributen auf, gelten die letzten 
(ein zuvor als Output konfigurierter Pin wird ggf. zum Input).

3.) Wenn Du SCLK vom Channel 1 des Controllers als /CS verwendest, KANN 
die Leitung nicht automatisch gesetzt werden.
Besser Du setzt die Leitung vorerst manuell (nach dem die korrekt 
initialisiert wurde), wie in meinem ersten Beitrag vorgeschlagen.
Hoffentlich hast Du die anderen SPI-Leitungen besser gewählt.

Generell: probier nicht so viel wahllos rum, sondern ließ die 
Dokumentationen durch - bis Du sie verstehst. Wenn die Pixel erst mal 
leuchten, wirds noch komplizierter - soviel kann ich schon verraten.

Versuch mal das modifizierte File im Anhang. Gut möglich, dass noch ein 
paar Fehler drin sind. Es kommt dem was Du erreichen willst aber näher.

Gruß,
Andreas

von Lukas (Gast)


Lesenswert?

Hallo,

bei dem angehangenen Quelltext funktioniert, außer der "Function 
declarations" am Anfang alles. Ich habe die vier Deklarationen aus 
kommentiert und dann kamen auch keine Meldungen mehr. Geleuchtet hat 
zwar nichts allerdings sieht das Programm schon mal nach etwas aus.^^ 
Danke.


> define GPIO_DISP_CS    PB21    // why THIS pin?

In deiner ersten Antwort stand ja unter 1.2.1
> RES#, CS#, D/C als Ausgänge am GPIO-Modul konfigurieren;
.


> 3.) Wenn Du SCLK vom Channel 1 des Controllers als /CS verwendest, KANN
die Leitung nicht automatisch gesetzt werden.

SCLK also P7 des Displays ist mit SCK PD02 auf dem µC verbunden. Dachte 
mir SCLK und SCK bedeuten das selbe und werden vom µC, wegen der 
Namensgebung, direkt erkannt.

Grüße.

PS:
Die Versorgung ist angeschlossen.

von Andreas (Gast)


Lesenswert?

Hallo,

damit wir vom selben sprechen:

>> define GPIO_DISP_CS    PB21    // why THIS pin?

>In deiner ersten Antwort stand ja unter 1.2.1
>> RES#, CS#, D/C als Ausgänge am GPIO-Modul konfigurieren;
>.

Natürlich brauchst Du die CS-Leitung. Aber ich hätte eine verwendet, die 
dediziert als CS vom SPI-Modul eingesetzt werden kann, sodass sie auch 
automatisch vom Modul gesetzt werden kann (wenn auch erst in einer 
revidierten Version). Du verwendest beim Interface offensichtlich für CS 
den Ausgang PB21, der kann vom SPI-Modul selbst nur als SCLK des 
Channels 1 verwendet werden.
Ist egal, bleib vorerst mal bei dem Pinout. Das Manuelle setzen des Pins 
scheint derzeit die beste Variante.

>> 3.) Wenn Du SCLK vom Channel 1 des Controllers als /CS verwendest, KANN
>die Leitung nicht automatisch gesetzt werden.

>SCLK also P7 des Displays ist mit SCK PD02 auf dem µC verbunden. Dachte
>mir SCLK und SCK bedeuten das selbe und werden vom µC, wegen der
>Namensgebung, direkt erkannt.

Das ist auch korrekt. Der Einwand bezieht sich auf die CS-Leitung 
(seitens Display), nicht auf die SCK-Leitung seitens Display.

Der verwendete Controller kann die SPI-Signale ( (CS, MISO,) MOSI, SCLK) 
auf verschiedenen Pins ausgeben (bzw. lesen). Z.B. ist SCLK für Channel 
0 auf PD02 grundsätzlich verfügbar - wie Du richtig erkannt hast - aber 
auch auf PD06 und anderen Pins. Auf welchen Pin der nun wirklich 
verwendet wird, geht aus der Bibliotheks-Doku nicht hervor, da ist ein 
Blick in den Schaltplan (Schematic) bzw. die Pin-Beschriftungen des 
Boards vermutlich der beste Anhaltspunkt.

Ich würde nun nochmals alle SPI-Pins durchchecken.
Anschließend würde ich die Funktion in der Hauptschleife, in der 
Dummy-Commands (NOP) zum Display gesendet werden aktivieren (derzeit 
auskommentiert) und ein Oszilloskop an den von Dir gewählten CS-Pin, 
MOSI, SCLK und D/C anhängen. In der Hauptschleife eine kurze Wartezeit 
zwischen den SPI-Transfers einzubauen wäre auch hilfreich, dann sind die 
einzelnen Transfers besser voneinander zu unterscheiden und die Timings 
besser zu prüfen.
Hier sollten nun permanent SPI-Transfers laufen (alle Leitungen müssen 
Ihre vorgesehene Funktion erfüllen).
Auch die RES-Leitung muss überprüft werden.

Aufpassen auf:
RES - wird das gewünschte Reset-Timing aus der Init-Funktion 
eingehalten? Ist die Leitung nach dem Init wirklich high?
CS (von Dir gewählte) - geht die Leitung vor der Übertragung auf low und 
nach dem die SCLK-Leitung die Takte ausgibt wieder auf high?
CS (nach Board-Beschriftung) - am Board gibt's wahrscheinlich auch eine 
dedizierte CS-Leitung; wenn das der Fall ist, kannst Du sie auch mal 
anhängen und sehen was die macht;
SCLK - sieht man überhaupt Flanken? Welche Frequenz?
MOSI - sind Zustandsänderungen (saubere Flanken) zu erkennen, wenn der 
Clock auf SCLK ausgegeben wird?
DC - ist die Leitung immer auf low (ist für's erste erforderlich!)?

Ein Oszilloskop ist für die Feststellung des Problems von größter Hilfe. 
Ich hoffe es ist eines verfügbar und jemand kann Dir im Umgang damit 
helfen.

Es gibt auch C-Control-Foren. Die Leute dort können Dir sicher bei den 
spezifischen Dingen (SPI-Interface bzw. HW-Anbindung) weiterhelfen.
Ich werd' mich vorerst mal aus dem Thread zurückziehen.
Viel Glück.

Gruß,
Andreas

von Lukas (Gast)


Lesenswert?

Hallo,

wollte gerade meinen Arbeitsplatz wechseln (hab mehrere Projekte) und 
wollte dir nur noch schnell danken.
Heute habe ich leider keine Zeit mehr an dem Projekt, ich werde morgen 
allerdings alles ausprobieren und genauer durchgehen.

In dem Sinne vielen Dank und noch einen schönen Tag.

von Grundschüler (Gast)


Lesenswert?

Andreas schrieb:
> Ich werd' mich vorerst mal aus dem Thread zurückziehen.

so kurz vor dem Ziel sollte man nicht aufgeben. Probiert es doch 
ersteinmal mit einem Software-spi, da kann man die Funktion der pins mit 
entsprechenden delays auch ohne oszi überprüfen. Außerdem läßt sich die 
Funktionn des spi für einen anfänger leichter nachvollziehen.
1
void spi_send (u8 databyte)
2
  {
3
      for(u8 i=8;i>0;i--){
4
    mosi_off;
5
    if(databyte & 128)mosi_on;
6
    databyte <<=1;
7
    sck_on;
8
    sck_off;
9
    }
10
  }

von Lukas (Gast)


Lesenswert?

Hallo,

so war das nicht gemeint.
Meine Deadline wird der 28.08 sein, da das mein letzter Praktikumstag 
ist und ich danach keinen Zugang zur Gerätschaft haben werde.
Außerdem studiere ich etwas später.

Grüße

von Lukas (Gast)


Lesenswert?

Hallo,

@Andreas:
Vielen Dank für deine Hilfe und die Zeit die du dir genommen hast.

Wollte anstatt der Antwort jetzt eigentlich schreiben was als Ergebnis 
raus kam allerdings weiß ich nicht ob das noch Sinn ergibt.
(Kommt davon, wenn man nicht zu ende liest. NENE

@Grundschüler:
Entschuldige bitte die Frage aber soll ich die Funktion in  mein 
Programm integrieren oder soll ich lieber ein neues anfangen?
Und danke für die Antwort.

Grüße auch an die, die eventuell nur mit lesen.^^

von Grundschüler (Gast)


Lesenswert?

das ist die hw-spi-Funktion, die Probleme macht (?)
>    SPI_Write((word)cmd);                      <--- Markierte Zeile

diese ersetzen durch die sw-spi-Funktion...

Vorher prüfen, ob spi-Polarität und spi-Phase stimmen (Datenblatt LCD)

von Lukas (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

bei meinem alten Programm gibt es keine Funktion die für Probleme sorgt.
Das Problem ist bei dem Programm einfach nur das, dass keine Pixel 
leuchten.

Bei dem Programm von Andreas kommt folgendes:

(31,1): Syntax Fehler - unerwartetes Symbol: 'void'
(32,1): Syntax Fehler - unerwartetes Symbol: '{'
(33,24): Syntax Fehler - erwartete ';'  , gefunden ')'
(40,16): Syntax Fehler - unerwartetes Symbol: '|'
(41,5): Semantik Fehler - Funktion Port_Attribute schon definiert
(41,21): Syntax Fehler - unerwartetes Symbol: '54'
(42,5): Semantik Fehler - Funktion Port_Attribute schon definiert
(42,21): Syntax Fehler - unerwartetes Symbol: '53'
(44,5): Semantik Fehler - Funktion SPI_Enable schon definiert
(44,16): Syntax Fehler - unerwartetes Symbol: '0'
(45,5): Semantik Fehler - Funktion SPI_SetChan schon definiert
(45,17): Syntax Fehler - unerwartetes Symbol: '0'

(Quelltexte im Anhang)


Mit deiner Funktion bekomme ich komische Syntax Fehler wie:

Syntax Fehler - unerwartetes Symbol';' --- sck_off;
oder:
Syntax Fehler - unerwartetes Symbol '>' --- for(u8 i=8;i>0;i--){

(nur bei der von dir geposteten Funktion)
Die Variablen sind deklariert werden aber nicht erkannt. Warum auch 
immer.

Grüße.

von jz (Gast)


Lesenswert?

mach mal um dein do - while geschweifte Klammern, also
1
do
2
{
3
 //dein Code
4
}
5
while(/*was auch immer*/);

Das sieht mir an der Stelle nämlich nicht ganz sauber von der Syntax 
aus.

von Grundschüler (Gast)


Lesenswert?

Lukas schrieb:
> Mit deiner Funktion bekomme ich komische Syntax Fehler wie:
>
> Syntax Fehler - unerwartetes Symbol';' --- sck_off;

sck_off muss von dir zuerst definiert werden.

der sck-pin muss als Ausgang gesetzt werden. dann musst du einen Befehl 
sck_off definieren, der den sck-pin auf 0 setzt.

#define sck_off     Port_WriteBit( ???, PORT_OFF)

etc.

Voraussetzung ist aber, dass du zumindest weißt, wie Portpins zu setzen 
und zu löschen sind.

von Grundschüler (Gast)


Lesenswert?

p.s.
> zuerst prüfen, ob spi-Polarität und spi-Phase stimmen

von Lukas (Gast)


Lesenswert?

Hallo,

ich konnte nicht antworten, da ich an einem anderen Projekt beschäftigt 
war.
Vielen Dank für die Antwort, ich probiere es mal aus.

Grüße.

von Lukas (Gast)


Lesenswert?

Hallo,

Es sieht wohl doch so aus, dass ich komplett andere Aufgaben bekomme.
Die SPI-Polarität und auch die SPI_Phase sollten so richtig sein.
Da sich mein Praktikum dem Ende neigt und ich mein Hauptprojekt zum Ende 
bringen möchte würde ich dem Beitrag hier ein Ende setzen, damit niemand 
auf Antworten hofft oder wartet.

Ich bedanke mich sehr bei Andreas und Grundschüler für eure investierte 
Zeit und verabschiede mich hiermit.

Grüße.

von Heiner (Gast)


Lesenswert?

Lukas schrieb:
> ein Display von Conrad, 180847, mit Hilfe des ebenfalls von Conrad
> erworbenen, Application Board AVR 32-bit, 192587, in Betrieb zu nehmen.

Ich hoffe nur du hast das alles nicht selbst bezahlen müssen...
Mich hat ja fast der Schlag getroffen als ich die Preise bei Conrad 
gesehen habe.

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.