mikrocontroller.net

Forum: Compiler & IDEs LCD ansteuerung/ schieberegister


Autor: henry (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hi leute,

ich möchte ein LCD steuern, nur sie sache ist das ich mit einem 8 Bit 
controller (ATtiny45) arbeite, deswegen wurden dem LCD zwei 
Schieberegister
und ein D-FlipFlop integriert, um die parallele Ansteuerung zu 
simulieren.

Durch diese Zusammenschaltung ist es  möglich, neun Bit parallel an das 
Display anzulegen, dabei handelt es sich um die Datenleitungen D0-D7 
sowie die
Steuerleitung RS.
Die Steuerleitung E direkt vom Mikrocontroller angesprochen.

Meine Frage ist ob es sich schonmal jemand mit diesem Thema befasst hat, 
und ob schon eine .c und .h  Datei dafür liegt.
hab leider die Definition nur für ein Atmega16

bedanke mich im voraus für ihre Hilfe und Ratschläge

: Gesperrt durch Moderator
Autor: henry (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
ich bin zu den folgenden Coden gekommen, und versuche jetzt nur ein I im 
LCD einzugeben. Aber trotzdem tut dem LCD nix.
kann mir bitte jemand helfen
Danke

Autor: henry (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hier das Code für das LCD

Autor: henry (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
.h Datei

Autor: Frank Link (franklink)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
schaumal hier, ich habe so etwas ähnliches für den 74HC595 programmiert. 
Das ganze besteht aus zwei Teilen, einmal die Ansteuerung für den 
74HC595 und darauf aufbauent, die Kommunikation mit dem LCD.

http://www.mikrocontroller.net/articles/Porterweiterungen

Ich denke die notwendigen Anpassungen sollten gering sein.

Gruß
Frank

Autor: henry (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für deine Hilfe Frank ;)

Autor: henry (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leute,
die angehängten Quellcodes wurden von einem Kommilitonen schon 
programiert, und die sind füe ein serielles Senden der Bits zum LCD.
Habe ich die ausprobiert, trotzdem nix passiert.
kann jemand mir sagen warum.ist da am Programm falsch oder eher soll ich 
an meinem Hardware den Fehler suche.
Controller ATtiny 45, arbeite mit einem JTAG MK2
die Seite von Frank konnte ich einbischen verstehen, mir wurde gesagt 
dass es da mehr um ein paralleles Senden als um ein serielles Senden 
geht.
ich wäre ihnen sehr dankbar

Autor: Frank Link (franklink)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Henry,
die Daten werden von mir seriell an das 74HC595 übergeben also genau 
das, was Du mit Deine Schaltung eigentlich bezwecken willst.

Anpassungen sind aus meiner Sicht lediglich in der Header-Datei 
com74hc595.h notwendig, in dem Du Deine anderen Ports angibts und 
eventuell an den Stellen, an denen Deine Compiler mit dem Syntax nicht 
klar kommt.

Eine weitere Anpassung sind in den Routinen com74hc595_lcd_nibble, 
com74hc595_lcd_Byte und com74hc595_lcd_data notwendig, da ich das LCD im 
4 Bit Modus betreibe.

Um das LCD im 8 Bit-Modus zu betreiben musst Du lediglich die 
zusätzlichen Ports in der Headerdatei com74hc595_lcd.h definieren und 
die Routine com74hc595_lcd_nibble anpassen.
#define LCD_PORT           0
#define LCD_B0    0  
#define LCD_B1    1  
#define LCD_B2    2  
#define LCD_B3    3  
#define LCD_B4    4  
#define LCD_B5    5  
#define LCD_B6    6  
#define LCD_B7    7  
void com74hc595_lcd_nibble( unsigned char d )
{
  com74hc595_unsetBit( LCD_B0 );
  com74hc595_unsetBit( LCD_B1 );
  com74hc595_unsetBit( LCD_B2 );
  com74hc595_unsetBit( LCD_B3 );
  com74hc595_unsetBit( LCD_B4 );
  com74hc595_unsetBit( LCD_B5 );
  com74hc595_unsetBit( LCD_B6 );
  com74hc595_unsetBit( LCD_B7 );
  
  if ( d & 1<<0 ) com74hc595_setBit( LCD_B0 );
  if ( d & 1<<1 ) com74hc595_setBit( LCD_B1 );
  if ( d & 1<<2 ) com74hc595_setBit( LCD_B2 );
  if ( d & 1<<3 ) com74hc595_setBit( LCD_B3 );
  if ( d & 1<<4 ) com74hc595_setBit( LCD_B4 );
  if ( d & 1<<5 ) com74hc595_setBit( LCD_B5 );
  if ( d & 1<<6 ) com74hc595_setBit( LCD_B6 );
  if ( d & 1<<7 ) com74hc595_setBit( LCD_B7 );
 
  com74hc595_out();
 
  com74hc595_lcd_enable();
}
void com74hc595_lcd_Byte( unsigned char d )
{
   com74hc595_lcd_nibble( d );
    _delay_us( 45 );
}
void com74hc595_lcd_data( unsigned char d )
{
  // An diese Stelle tritt Deine Ansteuerung von RS
         // com74hc595_setBit( LCD_RS );  
  com74hc595_lcd_Byte( d );
}
void com74hc595_lcd_command( unsigned char d )
{
  // An diese Stelle tritt Deine Ansteuerung von RS
         // com74hc595_unsetBit( LCD_RS );  
    com74hc595_lcd_Byte( d );
    switch( d )
  {
          case 1:
          case 2:
          case 3: _delay_ms( 2 );
    }
}

Ansonsten, sollten alle anderen Funktionen aus meiner Sicht direkt 
funktionieren.

Falls ich nichts übersehen haben sollte.

Gruß
Frank

Autor: henry (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi Frank,
besten Dank für deine Hilfe
habe jetzt versucht die codes zu schreiben, wie du es sagtest
weiss nicht aber ob hier alles richtig ist oder nicht.
eine Frage habe ich noch für die Funktionen die im  (com74hc595.c) 
definiert sind
wie setBit, unsetBit, out, init
soll ich die dann auch in einem c.datei definieren
hier sind meine Codes, und nochmal besten Dank.

henry

Autor: henry (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
display2.h

Autor: henry (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
display2.c

Autor: Frank Link (franklink)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Henry,
soweit ich das auf den ersten Blick überschauen kann, sollte es so 
klappen, Du musst aber in jedem Fall, noch die Funktion 
Seriellsenden_lcd_enable anpassen, da Du das Signale EN (E am LCD) 
direkt über Deinen Kontroller ansprichst.
void Seriellsenden_lcd_enable(void)
{
  // Deine Anpassung zur Ansteurung von E
  // SeriellSenden_setBit( LCD_EN );
  SeriellSenden_out();
    _delay_us(20);                  
  // Deine Anpassung zur Ansteurung von E
  // SeriellSenden_unsetBit( LCD_EN );
  SeriellSenden_out();
}

Meine Idee bei der Bibliothek basierte darauf, dass ich mit drei maximal 
4 Ports eines Mikrokontrollers eine ganze Serie von Ausgängen ansteuern 
kann. Deshalb werden alle Steuerleitungen eines LCDs ebenfalls über die 
Porterweiterung angesteuert. Dies entfällt ja in Deinem Fall.

Grundsätzlich ist es so, dass ich innerhalb der Bibliothek für die 
Ansteuerung des 74HC595 für jeden 74HC595 eine Position in einem Array 
definiert habe. Mit SetBit bzw. unsetBit kann ich innerhalb der Arrays 
ein einzelnes Bit setzten bzw. löschen. Die Funktion out sendet die 
Daten des Array anschließend an den 74HC595. Sie ist somit die 
wichtigste Funktion.

Ich würde an Deiner Stelle zu ersteinmal prüfen, ob die Kommunikation 
zwischen Kontroller und den 4015 saubert funktioniert. In meinem 
Beispiel ist ein einfaches Lauflicht implementiert. Wenn das 
funktioniert, solltest Du den entsprechenden Wechsel an den Ausgängen 
der 4015 messen können.

Anschließend ist das Aufsetzen der LCD-Funktionen nur noch ein Klacks. 
Da die Kommunikation zum LCD dann nur noch vom richtigen 
Timing-Verhalten abhängt. Was die von mir eingebauten Wartezeiten 
angeht, bin ich sehr pessimistisch an die Sache herangegangen. Es kann 
also sein, dass Du die Zeiten an einigen Stellen verkürzen kannst.

Was mir in Deiner Schaltung etwas mehr sorgen macht, ist die Beschaltung 
von RS, wenn ich es richtig deute, wird RS am LCD mit jedem Bit 
geschaltet, dass Du an die 4015 sendest. RS muss High sein wenn ein 
Datenwort an das LCD und LOW wenn ein Commando gesendet wird. Ich weiss 
nicht, wie das LCD mit einem ständigen Wechsel von RS umgeht.

Besser wäre es, Du würdest RS auf den SUB-D9 Stecker legen oder einen 
weiteren 4015 dazu verwenden die Signale für E und RS zu steuern.

Gruß
Frank

Autor: henry (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi frank,
danke für deine wertvolle Ratschläge und Hinweise.
Die Funktion habe ich umgeändert weil ich schon den LCD_EN definiert 
habe
sie sieht dann so aus:

void Seriellsenden_lcd_enable(void)
{
  //SeriellSenden_setBit( LCD_EN );
 PORTB |= (1<<PB1);      //PB1 an PORTB auf High
SeriellSenden_out();
        _delay_us(20);
  //SeriellSenden_unsetBit( LCD_EN );
PORTB &= ~(1<<PB1);       //PB1 an PORTB auf Low
SeriellSenden_out();
}

die andren Funktionen habe ich so umgeändert, aber weisse ich nicht ob 
das umhaut weil ich noch dieses kleines Problem mit dem RS, das Befehl 
und Position definiert habe.
Trotzdem vielen Dank, es war echt sehr Hilfreich.
Gruss Henry

Autor: Frank Link (franklink)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Henry,
aus meiner Sicht, wird Dir nichts anderes übrig bleiben, als RS entweder 
über einen zusätzliche 4015 anzusteuern oder ihn auf den Sub-D Stecker 
zu legen, so wie er jetzt angeschlossen ist, wird es nicht 
funktionieren.

Aber vielleicht kann ja nochmal ein anderer seine Ansicht zur Schaltung 
äußern. Ich kann mich ja auch vollständig vertun.

Alternativ, hast Du natürlich auch die Möglichkeit das LCD im 4-Bit 
Modus zu betreiben, die dann frei werdenen Ports des einen 4015 
verwendest Du dann für die Ansteuerung von E und RS.

Was würde eigentlich gegen einen 4-Bitmodus sprechen?
Eine zusätzliche Frage die auf der Hand liegt, warum schmeisst Du die 
ganzen 40xx nicht raus und nimmst einen einzigen 74HC595?

Dann kannst Du die Bibliothek fast ohne Änderungen übernehmen.

Gruß
Frank

Autor: Mike C. (chaosmike)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hey Leute

Ich hoff ihr könnt mir helfen:

Ich habe ein LCD Modul 1*16 das mit 4Bit angesteuert wird.
Aber ich hab ausversehen im Code (Bascom) das Signal RS 2 mal 
niedergeschrieben, Aber es funktioniert auch nur wenn ich
"Rs = Portd.0 , Db4 = Portd.3 , Rs = Portd.0" schreib
Die Belegung seht ihr im beigefügten Schaltplan.
Sobald der Fehler Rs = Portd.3 weg lass dann lässt sich das Lcd nicht 
mehr beschreiben.

(Schaltplan)
Hab es versucht an einem anderem Port. (Portc) mit und ohne Fehler da 
ging es überhaupt nicht.

Ausserdem wenn es sich beschreiben lässt dann sieht man im Hintergrund 
des Lcd's noch die 16 schwarzen Blöcke (pixel oder so) dunkel leuchten.

Hab ihr schon sowas gehört und hat jemand eine Lösung ???

Bedanke mich schon mal im Voraus
Danke Mike.C

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mike C. schrieb:
> Ich habe ein LCD Modul 1*16 das mit 4Bit angesteuert wird.
> Aber ich hab ausversehen im Code (Bascom)

Ooch nöö.

Du buddelst nen über 2 Jahre alten Thread aus und dann hijackst Du ihn.

Was hat Deine Frage mit Schieberegistern zu tun?
Und seit wann ist Bascom ein C-Compiler?


Ich geh ja auch nicht irgendwo rein und verlange Staubsaugerfilter.
Ich gucke erstmal und wenn da Fleischerei drüber steht, sollte man 
besser nicht nach Staubsaugerfiltern fragen.
Sonst kommen noch die beiden Herren in den weißen Kitteln mit nem 
hübschen Jäckchen für mich.


Peter

Autor: Mike C. (chaosmike)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
JO lol

das hoffe ich doch nicht.
Allerdings hab ich nichts passsendes gefunden und immerhin geht es hier 
ja um LCD ansteuerung.
Da ich auch noch nicht lange bei mikrocontroller.net angemeldet, weiss 
auch auch noch nicht wo man einen neuen Thread anlegt.

Also sorry aber hast du dennoch vielleicht ne Antwort auf meine Frage 
???

Danke

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mike C. schrieb:
> JO lol
>
> das hoffe ich doch nicht.
> Allerdings hab ich nichts passsendes gefunden und immerhin geht es hier
> ja um LCD ansteuerung.

Psst.
Hier im Forum gibt es 4 grosse Themen:
allgemeines Entwicklungsboard aufbauen!
Hilfe, mein Programmer versteht mich nicht!
Hilfe, mein PC versteht den Kleinen nicht!
Warum geht mein LCD nicht?

Einen älteren Thread hijackst du nur dann, wenn das Thema wie die Faust 
aufs Auge zu deinem Problem passt. Und selbst dann überlegst du es dir 5 
mal, wenn es ssich schon um einen älteren Thread handelt. Denn die 
Details sind meistens eben doch ganz anders.

> Da ich auch noch nicht lange bei mikrocontroller.net angemeldet, weiss
> auch auch noch nicht wo man einen neuen Thread anlegt.

Gaaanz nach oben scrollen in der Threadübersicht
Da steht:
Forum: GCC
Fragen zu den GNU-Toolchains für AVR-, ARM- und MSP430-Mikrocontroller, AVR-GCC, MSPGCC, WinAVR, WinARM, ...
Forenliste | Neuer Beitrag | ....

Was könnte wohl "Neuer Beitrag" heißen?
Un dann überlegst du als erstes mal, ob das Forum GCC für dich 
zutreffend ist. Verwendest du den GCC?


Und am Port C schaltest du jetzt erst mal die JTAGEN Fuse ab.

Autor: Mike C. (chaosmike)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh Ok
Ich hab den Text "Neuer Beitrag" auch gesehen alllerdings hab ich unter 
neuer Beitrag, das erstellen einer neuen Antwort im diesem 
Forum,verstanden.
Und mit GCC konnte ich nichts anfangen ???
Aber das sind gute Info's für neue Leute im Forum, was man alles darf 
und nicht tun sollte.
Danke

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mike C. schrieb:
> Oh Ok
> Ich hab den Text "Neuer Beitrag" auch gesehen alllerdings hab ich unter
> neuer Beitrag, das erstellen einer neuen Antwort im diesem
> Forum,verstanden.

Das wär aber unpraktisch, wenn man immer nach oben scrollen müsste.

> Und mit GCC konnte ich nichts anfangen ???

Dann stehen die Chancen gut, dass du nicht ins GCC Forum willst.
GCC ist der Wald und Wiesen C Compiler

Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.