Forum: Mikrocontroller und Digitale Elektronik EA - DOG S 102 will nicht


von Ben S. (theben)


Lesenswert?

Hallo Leutz ich habe mich mal an die Programmierung eines Grafikdisplays 
gewagt. Dazu nehme ich das EA-DOGS102-6 und einen ATMega 8535L.

Größten teils habe ich alles aus den Manuals des ATMega's und den 
Manuals des EADOGS102-6. Als dies nicht funktionierte habe ich mir auch 
viel von einem älteren Forumtreat ab geschaut 
Beitrag "EA-DOG S 102 Ansteuerung"

Doch nichts half, ich bekomme noch nicht mal wilden Pixelschnee auf das 
Display

Das Display habe ich wie folgt an den µC angesclossen.

Port B
0 Kommando/Daten
1 Chip Select
2 Display Reset
3
4
5 MISO (Display Daten)
6
7 SCK (Display Takt)

und mein Programm sieht wie folgt aus:
1
#include <avr/io.h>
2
#define F_CPU 1000000UL  // Systemtakt in Hz - Tesboardtakt = 3686400UL
3
#include <util/delay.h> 
4
5
#define CHIPSELECT    PORTB &= ~(1<<1);
6
#define CHIPUNSELECT          PORTB |=  (1<<1);
7
8
#define DATEN      PORTB |= (1<<0);
9
#define KOMMANDO    PORTB &= ~(1<<0);
10
11
#define RESETHIGH    PORTB |= (1<<2);  
12
#define RESETLOW    PORTB &= ~(1<<2);
13
14
void SPI_MasterInit(void); //SPI Intialisierung
15
unsigned char spi_out(char byte); //übergibt Kommandos oder Daten an das SPI Register
16
void sendekommando(char kommando); //Display Kommandos senden
17
void sendedaten(char daten); // Anzeige Daten aufs Display senden
18
void displayInit(void); //Initialisiert das DOGS Display
19
20
int main(void)
21
{
22
  
23
  SPI_MasterInit();
24
  
25
      
26
  displayInit();
27
      
28
      
29
  /*Ein Paar Daten testweise senden.
30
  Erwartung: Schwarzes Kästechen von 5*8 Pixeln in der
31
  oberen linken Ecke*/
32
  sendekommando(0b00000000);
33
  sendekommando(0b00010000);
34
  sendedaten(0xFF);
35
  sendekommando(0b00000001);
36
  sendekommando(0b00010000);
37
  sendedaten(0xFF);
38
      
39
  sendekommando(0b00000010);
40
  sendekommando(0b00010000);
41
  sendedaten(0xFF);
42
  sendekommando(0b00000011);
43
  sendekommando(0b00010000);
44
  sendedaten(0xFF);
45
  sendekommando(0b00000100);
46
  sendekommando(0b00010000);
47
  sendedaten(0xFF);
48
  
49
  sendekommando(0xA4);
50
  
51
        while(1);
52
  
53
  return(0);
54
}
55
56
void SPI_MasterInit(void) //SPI Intialisierung
57
{
58
  // Set MOSI and SCK output (aus Handbuch)
59
  DDRB = (1<<5)|(1<<7); //DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK);
60
  
61
  //PB0, PB1 und PB2 als Ausgang (für Chipselekt, Reset und Daten/Kommando)
62
    DDRB |= ((1<<0)|(1<<1)|(1<<2));
63
  
64
  // Enable SPI, Master, set clock rate fck/16 (aus Handbuch)
65
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
66
}
67
68
unsigned char spi_out(char byte) //übergibt Kommandos oder Daten an das SPI Register
69
{
70
  //Byte übergeben
71
  SPDR = byte;
72
  
73
  //Warten bis Sendevorgang komplett ist
74
  while(!(SPSR &(1<<SPIF)));
75
  
76
  //SPIF löschen durch auslesen des SPDR Registers
77
   return SPDR;
78
}
79
80
void sendekommando(char kommando) //Display Kommandos senden
81
{
82
  CHIPSELECT;
83
  
84
  // PB0 auf low -> Kommando!
85
  KOMMANDO;
86
  
87
  //Byte senden
88
  spi_out(kommando);
89
90
  CHIPUNSELECT;
91
}
92
93
void sendedaten(char daten) // Anzeige Daten aufs Display senden
94
{
95
  CHIPSELECT;
96
  
97
  //PB0 auf high -> Daten!
98
  DATEN;
99
  
100
  //Byte senden
101
  spi_out(daten);
102
  
103
  CHIPUNSELECT;
104
}
105
106
void displayInit(void) //Initialisiert das DOGS Display
107
{
108
  //Display reset
109
  RESETLOW;
110
  _delay_ms(1);
111
  RESETHIGH;
112
  _delay_ms(5);
113
  
114
  //Display Initialisierungskommandos
115
  sendekommando(0x40);
116
  sendekommando(0xA1);
117
  sendekommando(0xC0);
118
  sendekommando(0xA4);
119
  sendekommando(0xA6);
120
  sendekommando(0xA2);
121
  sendekommando(0x2F);
122
  sendekommando(0x27);
123
  sendekommando(0x81);
124
  sendekommando(0x10);
125
  sendekommando(0xFA);
126
  sendekommando(0x90);
127
  sendekommando(0xAF);
128
}
erkennt jemand eien Fehler?

von Ben S. (theben)


Lesenswert?

hm antwortet keiner ich hätte wohl in der überschrifft schreiben sollen 
dass es um ein Display geht?

von Noob (Gast)


Lesenswert?

Du mußt dem Ding erstmal die richtige Initialisierung schicken (Display 
On, Power on, Kontrast etc.)
Steht sehr verkappt im Datenblatt vom Display und ausfürlicher vom 
Controller [1].

Noob

[1] http://www.lcd-module.de/eng/pdf/zubehoer/uc1701.pdf

von Noob (Gast)


Lesenswert?

Noob schrieb:
> erstmal die richtige Initialisierung
Upps. Sehe gerade, die stehck ja in DisplayInit...

Hast Du mal mit dem Oszi die Leitungen kontrolliert, ob da SPI 
rauskommt?
Welche Pegel haben VCC, Reset_n und CS_n?

Noob

von spess53 (Gast)


Lesenswert?

Hi

Setze mal PB4 (SS) als Ausgang und lies dir den Abschnitt 'SS Pin 
Functionality' im Datenblatt durch.

MfG Spess

von cord (Gast)


Lesenswert?

Hallo,
bei EA gibt es jetzt ein funktionierendes Beispiel für den Mega168:

http://www.lcd-module.de/fileadmin/downloads/development%20service/DOGS102_UC1701/Init_and_basic_functions_with_EA_DOGS102_MEGA168.zip

Bisher war ein Fehler in der Ansteuerung des Reset und CD Signals, 
dieser wurde auf meinen Hinweis hin behoben.


Gruß
  Cord

von Alex X. (behindi)


Lesenswert?

Hallo ich hab ne kleine frage

 ich hab mir die lib angesehen und in der Detei lcd.c in der funktion 
"lcd_init" wird die funktion "lcd_send_command();" aufgerufen und ich 
kann die Definition dieser Funktion nicht finden(hab alles abgesucht).
Denn ich würde gerne wissen ob bei jedem Initialisierungskommando das 
geschickt wird die Chip Select Leitung aktiviert und dann deaktiviert 
wird ?,

Danke für jeden Ratschlag:)

von Spess53 (Gast)


Lesenswert?

Hi

> ich hab mir die lib angesehen und in der Detei lcd.c in der funktion
>"lcd_init" wird die funktion "lcd_send_command();" aufgerufen und ich
>kann die Definition dieser Funktion nicht finden(hab alles abgesucht).

Hast du nicht. In der lcd.h findest du:

//--------------- Macrofuncitons ----------
#define lcd_send_command(data) lcd_send(data, 0)
#define lcd_send_data(data) lcd_send(data, 1)
#define lcd_clear_all() lcd_clear(0,0,XPIXEL-1,YPIXEL-1)
#define lcd_fill_all() lcd_fill(0,0,XPIXEL-1,YPIXEL-1)

MfG Spess

von Alex X. (behindi)


Lesenswert?

danke, ich hab mich falsch ausgedrückt,
Ich meinte ich kann den Funktionskörper nicht finden,

danke

von Spess53 (Gast)


Lesenswert?

Hi

>Ich meinte ich kann den Funktionskörper nicht finden,

Ich glaube in C nennt man das 'Macro'.

MfG Spess

von Alex X. (behindi)


Lesenswert?

danke ich habs gesehen und dann hab ich mir schon gedacht wie das 
ungefähr funktioniernen soll, ich hab leider vorher noch nichs von 
Macros gewusst:[,
aber danke für deine Hilfe, jetz hab ich ja gefunden wonach ich suchte:)

von Alex X. (behindi)


Lesenswert?

Ich hab da noch ne blöde frage

kann ich bei den Externen Kondis vom Display auch Elkos nehmen oder muss 
ich da ungepoolte Kondis nehmen(im Datenblatt sind ungepoolte 
gezeichnet)??

danke für jeden Ratschlag

von Spess53 (Gast)


Lesenswert?

Hi

>kann ich bei den Externen Kondis vom Display auch Elkos nehmen oder muss
>ich da ungepoolte Kondis nehmen(im Datenblatt sind ungepoolte
>gezeichnet)??

Probiere es doch mal. Ich habe bei den Dog-Displays bisher immer KerKos 
genommen und damit keine Probleme gehabt. 1µ in 0805 ist sogar wunderbar 
lochrastertauglich.

MfG Spess

von Oliver (Gast)


Lesenswert?

Meine DOG displays liefen bisher sowohl mit Kerkos als auch mit Elkos. 
Was ich noch empfehlen könnte wäre die u8glib 
(http://code.google.com/p/u8glib/) oder deren Vorgänger dogm128-lib 
(http://code.google.com/p/dogm128/). Beide libs haben das DOGS102 
unterstützt. Eine Schritt für Schritt Anleitung hatte ich mal hier 
zusammengestellt: http://code.google.com/p/m2tklib/wiki/as6

Grüße,
Oliver

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.