Forum: Mikrocontroller und Digitale Elektronik Suche c-code DOG-M Display Spi AVR


von Puppetmaster (Gast)


Lesenswert?

Ich hab inzwischen leider jeden Tread den ich in der Suche zu DOGM / 
DOG-M gefunden hab durchgeschaut aber irgendwie find ich nirgends eine 
Lösung für C und SPI.

Deshalb wollte ich mal fragen ob hier jemand eine Funktionierende Source 
für das Dog-m Display hat(für nen Mega). Denn irgendwie bekomm ich da 
nie auch nur ein Lebenszeichen von dem dummen Ding und ich habs leider 
als Aufbau mit Spi und wollte das nur umändern wenn es nicht anders geht 
^^

Wäre für Hilfe dankbar da ich leider keinen Ansatz von Code bisher habe 
außer halt verschiedenen die ich getestet hab aus den Treads. Ich wollte 
mich nur wegen mangels an Zeit nicht unbedingt Tage hinsetzen und 
versuchen als relativer Anfänger die Timings im Datenblatt nachzubauen.

Nur noch eine allgemeine Frage dazu: Wie schwer ist es das Teil in Spi 
zum laufen zu bekommen? Oder soll ich lieber gleich auf 4bit ausweichen?

P.s. hab schon andere Displays zum laufen bekommen also etwas Kentniss 
ist da ^^ (auch Taster, LED´s, Entprellen, ADC, USART usw.) nur Spi 
hatte ich bisher noch nicht gehabt. Ganz vergessen Hardware ist Mega8 
auf dem Stk500 @ 8Mhz interner Quarz falls das irgendwie relevant sein 
sollte. Das Display (2 Zeilen) ist Spi 5V Aufbau aus dem Datenblatt.

Grüße Puppetmaster

von Rik (Gast)


Lesenswert?

Wow, noch einer, der auch Nachts noch an seinem Projekt arbeitet :-)

Also, das LCD was du benutzt hat eine parallele Schnittstelle. Das SPI 
ist aber eine serielle Schnittstelle. Das umzubauen waere echt ein 
fieser Aufwand. Loete deine Platine um, alles andere macht leider wenig 
Sinn.

von Puppetmaster (Gast)


Lesenswert?

Danke für die Antwort aber ich würd jetzt mal behaupten das das Display 
beide hat ^^ behauptet zumindest das Datenblatt : 4-Bit, 8-Bit und 
SPI-Interface

Ich arbeite an den Programmen fast immer abends und nachts ^^ Da hat man 
wenigstens seine Ruhe und es ist extrem störend wenn man beim schreiben 
von Schleifen usw abgelenkt wird =) da hatte ich schon die schönsten 
Fehler.

Na wenn ich bis morgen Abend das nicht hinbekomme nehm ich das einfach 
als 4bit oder 8bit ^.^ Dann häng ich halt nen µC direkt drann der mir 
dann Übersetzer RS232-8Bit-Display spielt. Aber erst versuch ich das mit 
dem Spi das brauch weniger Hardware.

Grüße Puppetmaster

von Rik (Gast)


Lesenswert?

Jau, stimmt das mit dem SPI, hab mir gerade noch einmal das Datenblatt 
angeschaut. Entschuldige, ich hatte im Hinterkopf, dass das auch bloss 
diesen 08/15-Hitachi-Controller drin haette. Dann kann ich dir leider 
nicht helfen, sorry. Viel Erfolg noch!

von Manfred B. (vorbeigeschlendert)


Lesenswert?

Puppetmaster wrote:
> Ich hab inzwischen leider jeden Tread den ich in der Suche zu DOGM /
> DOG-M gefunden hab durchgeschaut aber irgendwie find ich nirgends eine
> Lösung für C und SPI.
>
> Deshalb wollte ich mal fragen ob hier jemand eine Funktionierende Source
> für das Dog-m Display hat(für nen Mega). Denn irgendwie bekomm ich da
> nie auch nur ein Lebenszeichen von dem dummen Ding und ich habs leider
> als Aufbau mit Spi und wollte das nur umändern wenn es nicht anders geht
>[...]ollte. Das Display (2 Zeilen) ist Spi 5V Aufbau aus dem Datenblatt.
>
> Grüße Puppetmaster


ist nicht das Problem? du schiebst einfach die Daten für das LCD über 
die interne Harware Spi-Schnittstelle raus... SPI im Datenblatt ab Seite 
122 (zumindest in meiner, zugegeben alten Version)

also (Pseudocode)
1
irgendwo vorher eimmal : SPI Initialisieren
1
Chipselect_Display set
2
Registerselect_Display  set // (Daten oder Befehl)
3
Daten per SPI raus 
4
Registerselect_Display reset 
5
Chipselect_Display reset

von Puppetmaster (Gast)


Lesenswert?

Macht überhaupt nix ^^ irren ist menschlich.

Zu dem Hardware Spi: Das Problem mit dem Display soll ein überkritisches 
Timing sein weshalb ich noch keine Lösung mit hardware sondern nur mit 
Software Spi versuchen gesehen hab. Leider ist es mir nie gelungen die 
so zum laufen zu bekommen wenn ich den code kompilierbar an meinen µC 
angepasst hab.
Na werds nacher noch mal versuchen. Vielen Dank vllt geht es ja mit 
hardware Spi.

Grüße Puppetmaster

von Manfred B. (vorbeigeschlendert)


Lesenswert?

Puppetmaster wrote:
> Macht überhaupt nix ^^ irren ist menschlich.
?? wie? wo? was?

> Zu dem Hardware Spi: Das Problem mit dem Display soll ein überkritisches
> Timing sein

wie kommt er darauf?

von Thilo M. (Gast)


Lesenswert?

Ich hatte hier in der Codesammlung mal was gepostet:
Beitrag "Dog-M / ST7036 Routine für 1-Zeiliges Display SPI-Mode"

Zeitkritisch ist beim DOG-M per SPI nix, 4 Mbit sind kein Problem 
(interne AVR-SPI-Schnittstelle).

von Puppetmaster (Gast)


Lesenswert?

@Manfred B.: Das mit dem Irren meinte ich zu Rik einen Post über deinem 
^^

Und Danke ich versuch das gleich mal deinen Code zu übernehmen @Thilo.

Das es nicht Zeitkritisch ist wundert mich aber etwas weil überall steht 
das eben das das Problem des Displays wäre. Wenns nicht stimmt um so 
besser.

Grüße Puppetmaster

von Was anderes (Gast)


Lesenswert?

Zeitkritisch sind nicht die 4M-Bit, sondern die Bytes, die nacheinander 
geschickt werden. Also wenn der CLS Befehl geschickt wird, darf erst 
nach x ms der nächste Befehl geschickt werden, ansonsten verschluckt er 
welche!

von Puppetmaster (Gast)


Angehängte Dateien:

Lesenswert?

Ok Danke ^^ ich hätte nur grade mal eine Frage zu deinem Code Thilo:

In dem werden oben die Pins definiert:
1
#define CTRL_RS PORT3
2
#define CTRL_SS PORT4
3
#define CTRL_MOSI PORT5
4
#define CTRL_MISO PORT6
5
#define CTRL_SCK PORT7
Jetzt hab ich die Frage wie häng ich das Display da dran.

Ich hab LCD-Data (Si) würde ich an MOSI hängen
dann hätte ich noch LCD-SCL würde ich an SCK
und dann noch LCD-RS das dann an RS kommt

Stimmt das so oder hab ich da etwas falsch?

2. Du hast unten hingeschrieben:
// Output-Stream VOR main zuweisen:
// FILE lcd_str = FDEV_SETUP_STREAM(write_char, NULL, 
_FDEV_SETUP_WRITE);
//
// stderr für fprintf IN main zuweisen:
// stderr = &lcd_str;

Was heißt ich soll das vor der Main zuweisen?

Ich hätte die main bisher so:
1
FILE lcd_str = FDEV_SETUP_STREAM(write_char, NULL, _FDEV_SETUP_WRITE);
2
3
int main(void)
4
{
5
SPI_Init ();
6
display_init ();
7
stderr = &lcd_str;
8
9
_delay_us(10);
10
11
clear_home();
12
set_cursor(0);
13
fprintf(stderr, "TEST");
14
15
  while(1)
16
  {
17
  _delay_us(20);
18
  }
19
}
Stimmt das so und wenn ja was bedeutet das FILE?
Grüße Puppetmaster

von Thilo M. (Gast)


Lesenswert?

@ Puppetmaster:
Sollte so stimmen.
Mit FILE legst du den Output-Stream für fprintf fest.

von Peter D. (peda)


Lesenswert?

Thilo M. wrote:
> Mit FILE legst du den Output-Stream für fprintf fest.

Ich nehme immer sprintf mit lcd_puts, dann spart man sich, extra SRAM 
für das malloc zu reservieren und den ganzen malloc Verwaltungsoverhead.
Das macht sich deutlich im Codeverbrauch bemerkbar.


Peter

von Thilo M. (Gast)


Lesenswert?

Peter Dannegger wrote:
> Thilo M. wrote:
>> Mit FILE legst du den Output-Stream für fprintf fest.
>
> Ich nehme immer sprintf mit lcd_puts, dann spart man sich, extra SRAM
> für das malloc zu reservieren und den ganzen malloc Verwaltungsoverhead.
> Das macht sich deutlich im Codeverbrauch bemerkbar.
>
>
> Peter

Gute Idee, habe grade ein kleines Platzproblem beim mega168, werde ich 
mal probieren!

von Puppetmaster (Gast)


Angehängte Dateien:

Lesenswert?

So langsam bin ich am verzweifeln. Entweder ich bin zu doof um das an 
den Mega( anzupassen oder aber mein Display hat irgendwoher das 
zeitliche Gesegnet und rührt sich deshalb nicht.

Kann mir vllt mal jemand drüberschauen ob er irgend einen groben Fehler 
findet da ich irgendwie nichts mehr daran sehe was ich noch ändern 
könnte.
Das ist meine main und im Anhang wäre dann die nur ganz leicht 
abgeänderte Version von Thilos Source.
1
#include <avr/io.h>
2
#include <util/delay.h>
3
4
#include <avr/interrupt.h>
5
#include <stdint.h>
6
#include "DOGM163_SPI.c"
7
8
FILE lcd_str = FDEV_SETUP_STREAM(write_char, NULL, _FDEV_SETUP_WRITE);
9
10
int main(void)
11
{
12
SPI_Init ();
13
display_init ();
14
stderr = &lcd_str;
15
16
_delay_us(10);
17
18
clear_home();
19
_delay_us(10);
20
set_cursor(0);
21
_delay_us(10);
22
fprintf(stderr, "TEST");
23
24
  while(1)
25
  {
26
  _delay_us(20);
27
  }
28
}

Vielen Dank schon mal. Grüße Puppetmaster

von Thilo M. (Gast)


Lesenswert?

Hast du das Display an einem Labornetzteil?
Bei langsam ansteigender Versorgungsspannung hat das Teil Probleme mit 
der Initialisierung.
Mach einfach bei laufendem System mal 'nen Reset.
Hast du einen 16MHz-Quarz und die Fuses richtig gesetzt? Ansonsten muss 
die Taktfrequenz angepasste werden (SYSCLCK).
Ansonsten sollte es laufen.

von Peter D. (peda)


Lesenswert?

Puppetmaster wrote:
> So langsam bin ich am verzweifeln. Entweder ich bin zu doof um das an
> den Mega( anzupassen oder aber mein Display hat irgendwoher das
> zeitliche Gesegnet und rührt sich deshalb nicht.

Was machst Du denn mit dem CSB-Pin?
Ich sehe da nirgends Code.
Ich verwende den wie bei SPI üblich, d.h. auf Low setzen vor dem Byte 
und auf High setzen nach dem Byte.
Wie soll denn sonst das Display wissen, wo ein Byte zuende ist?
Auch kannst Du sonst keine weiteren SPI-ICs mit anschließen.

Es kann sein, daß Display und MC nach sehr sauberem Power on zufällig 
synchron sind.
Aber das ist definitiv keine zuverlässige Arbeitsweise.
Einmal Reset gedrückt mitten im Byte und sie sind asynchron und fangen 
sich nie wieder.

Und nimm mal dieses komische FILE raus und mach die Ausgabe direkt.
Ich weiß nicht, ob das so funktioniert, wie Du Dir das vorstellst.

Ich häng mal in die Codesammlung meinen funktionierenden Code.


Peter

von Puppetmaster (Gast)


Lesenswert?

Vielen Dank aber ich hab den Code nicht selbst geschrieben sondern hab 
nur versucht ihn zu verwenden deshalb weiß ich nicht so genau wie ich 
das umschreiben könnte da ich dafür erst mal genau verstehen müsste was 
alles bewirkt. Da ist es bei egenem Code doch leichter etwas zu ändern 
^^
Leider bekomme ich es auch nicht mit deiner Source zum laufen @Peter. 
Ich geh langsam davon aus das das LCD irgendwoher beschädigt ist und ich 
werd mir irgendwann mal die Zeit nehmen es Paralell anzusteuern und 
versuchen ob es so geht.

Aber leider hab ich momentan nicht die Zeit dazu.
Ach noch zu dem CSB pin den hatte ich wie in der Grafik markiert an 
Masse gelegt. Gehört der an einen Controler Pin? Ich hab leider SPI noch 
nie verwendet und weiß es um ehrlich zu sein auch nicht was genau da wie 
angeschlossen werden muss. Sollte ich vllt mal nachlesen bevor ich das 
weiter versuch mit dem Display.

Allerdings nur als Frage hab ich es richtig bei dir angeschlossen ? 
@Peter
1
#define  LCD_DI    SBIT( PORTB, 3 ) //LCD-Data (pin 28)
2
#define  LCD_DDR_DI  SBIT( DDRB, 3 ) 
3
4
#define  LCD_RS    SBIT( PORTB, 2 ) //LCD-RS (pin 39)
5
#define  LCD_DDR_RS  SBIT( DDRB, 2 )
6
7
#define  LCD_SCK    SBIT( PORTB, 0 ) //LCD-SCL (pin 29)
8
#define  LCD_DDR_SCK  SBIT( DDRB, 0 )
9
10
#define  LCD_CS    SBIT( PORTB, 1 ) //LCD-CSB (pin 38)
11
#define  LCD_DDR_CS  SBIT( DDRB, 1 )
Und nochmal Danke für die Hilfe. Grüße Puppetmaster

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.