-         

Ergebnis 1 bis 8 von 8

Thema: LCD geht in Bascom, in C aber nicht

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    02.07.2006
    Beiträge
    22

    LCD geht in Bascom, in C aber nicht

    Anzeige

    Hallo Leute!

    Bräucht da wieder mal eure Hilfe.

    Also, ich hab das LCD-Modul:
    http://www.display-elektronik.de/DEM16217SYH-LY.PDF
    welches den KS0070B als Controller verwendet.

    Dieses würde ich gerne mit meinem Atmega8 ansteuern.

    Hab mir dazu die lib von Peter Fleury geholt und alles streng nach vorschrift (lol) aufgebaut, ala :
    http://www.roboternetz.de/wissen/ind...D-Modul_am_AVR
    4-Bit Ansteuerung

    , und die lcd.h angepasst.

    Code ist :
    ---
    #include <stdlib.h>
    #include <avr/io.h>
    #include "lcd.h"

    int main(void)
    {

    /* Initialisiere Display, Cursor aus */
    lcd_init(LCD_DISP_ON);

    /* loesche das LCD Display und Cursor auf 1 Zeile, 1 Spalte */
    lcd_clrscr();

    /* String auf Display anzeigen */
    lcd_puts("Hello world.");
    }
    ---

    Compiliert hab ich das, indem ich den code in test_lcd.c eingefügt hab und make ausgeführt habe.
    JO, nur tut sich leider nicht viel. Also, ich erhalte nur nen blinkenden Cursor....



    Hab das selbe in Bascom probiert
    Code:
    ---
    $regfile = "m8def.dat"
    $crystal = 1000000

    Config Lcd = 20 * 4 'wir verwenden ein 4 x 20 Zeichen Display
    ' Im I/O Mode wird jeder Prozessor Pin einzeln angegeben
    Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.5 , Rs = Portc.4

    Cls 'loesche das LCD Display
    Locate 1 , 1 'Cursor auf 1 Zeile, 1 Spalte
    Lcd "Hello world." 'String auf Display anzeigen
    End
    ---

    Und da funktionierts - also was hardwaretechnisches scheint somit ausgeschlossen, IMHO.

    Könnts womöglich daran liegen, daß dich die R/W Leitung auf Ground gelegt hab und die Lib von Fleury die irgendwie zu Auswertung benötigt?
    Ich stelle wirklich keine Ansprüche an die Schnelligkeit des LCD's, deshalb würd ich mir den Pin lieber für wichtigere Sachen reservieren...



    Wie macht ihr das mit dem Lib-file vom Fleury (nirgends n Howto oder sowas dazu gefunden...) ...? Ich würde es gern relativ "nahtlos" in AVR-Studio einbinden..
    Ich hab das zip in winavr/avr/include entpackt, meine header datei angepasst und make ausgefürt.
    Dann AVRStudio gestartet, eben per include die lcd.h eingebunden und als "Source file" die lcd.c eingebunden.... auf build geklickt...

    Ergebnis:

    ---
    make: *** No rule to make target `..//D/WindowsPlatzXtention/WinAVR/avr/include/lcd.c', needed by `lcd.o'. Stop.
    ---


    Gibts vielleicht noch ne andere Lib? Oder hat jemand nen Beispielcode in C ohne LCD-lib (und ohne inline-assembler...der is mir irgendwie zu umständlich...), ala "Hello World"?

    Tschüß,
    R2D3212

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    20.06.2004
    Beiträge
    1.941
    Könnts womöglich daran liegen, daß dich die R/W Leitung auf Ground gelegt hab und die Lib von Fleury die irgendwie zu Auswertung benötigt?

    so ist es....

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    02.07.2006
    Beiträge
    22
    Schei**e. Ich glaub, dann muss ich das Rad wieder mal neu erfinden und mich mit dem LCD-Controller auseinandersetzen....OAAAH!

    Btw, dann is der Schaltplan bei
    http://www.roboternetz.de/wissen/ind...D-Modul_am_AVR
    falsch. Da ist R/W auf ground gesetzt und anbei steht der C-Code mit der Fleury lib.

    Hat wirklich niemand nen Link zu einer anderen Lib? Ich mein, daß ich jetzt für die R/W leitung extra nen Pin freimachen soll damit's ein paar ns schneller geht, das is für meine Problemstellung (und für viele andere wahrscheinlich auch) absolut suboptimal - mit sowas kann nich einfach leben [-( , aus Prinzip nicht.

    Ne Beispiel - C Datei, ohne diesen lästigen inline Assembler (hab nix gegen Assembler, aber die Syntax mit den ewigen "", ect, geht mir irgendwie auf die Nerven) wär als Anhaltspunkt auch schonmal nich übel - v.a. würd mich interessieren, wie das mit den Delays realisiert wird.

    Tschüß (gefrustet),
    R2D3212

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    würd mich interessieren, wie das mit den Delays realisiert wird.
    z.B so:
    Code:
    void warte(uint16_t word) {
    	_delay_loop_2(word);
    }
    Die Funktionen um Daten an das Display zu schicken könnten so aussehen:
    Code:
    void lcd_command(uint8_t data) {
              warte(0x00C8);
            uint8_t temp = data;
    	DATAPORT = (data>>4);
    	enable();
    	DATAPORT = temp;
    	enable();
    }
    
    void lcd_data(uint8_t data) {
            warte(0x00C8);
            RSPORT |=(1<<RS);
    	uint8_t temp = data;
    	DATAPORT = (data>>4);
    	enable();
    	DATAPORT = temp;
    	enable();
    	RSPORT &= ~(1<<RS);
    	
    }
    Enable Puls so:
    Code:
    void enable(void) {
    	ENABLEPORT |= (1<<ENABLE);
    	__asm volatile ("nop");
    	__asm volatile ("nop");
    	__asm volatile ("nop");
    	__asm volatile ("nop");
    	ENABLEPORT &= ~(1<<ENABLE);
    }
    hab nix gegen Assembler, aber die Syntax mit den ewigen "", ect, geht mir irgendwie auf die Nerven


    Das dürfte schon ein guter Ansatz sein, Ich benutze Diese Funktionen bei meinen Programmen, es reicht vollkommen, man braucht nicht weiß Gott was für Bibliotheken um die einfachen Sachen zu Programmieren...

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    02.07.2006
    Beiträge
    22
    Vielen Dank, izaseba, für die Erläuterungen!
    Ja, dann werd ich wohl meine eigene "lib" machen

    Sag, ganz kurz noch ein paar Fragen...

    die Funktion _delay_looop_2, in welchem Include is die drinnen?
    Dataport, Enableport... wo sind die definiert?

    Und...ähh (meine C-Kenntnisse lassen mich grad wieder im Stich)...

    ---
    void lcd_command(uint8_t data) {
    warte(0x00C;
    uint8_t temp = data;
    DATAPORT = (data>>4);
    enable();
    DATAPORT = temp;
    enable();
    }
    ---

    hängt das "data >> 4" mit den 2 nibbels zusammen, die ich brauch wg. dem 4-Bit bus? Vertauscht das bits wie bei
    "swap temp"?

    Ansonsten ist alles klar! Danke nochmals für die Hilfe!

    Tschüß,
    R2D3212

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    die Funktion _delay_looop_2, in welchem Include is die drinnen?
    util/delay.h

    sehe http://www.nongnu.org/avr-libc/user-...il__delay.html

    Dataport, Enableport... wo sind die definiert?
    Ach ja, das habe ich natürlich vergessen
    Hab einfach copy/paste aus meinem Code gemacht....

    Die mußt Du Dir am Anfang des Programms definieren, irgendwo in den Anfangsfeierlichkeiten nach den #includes

    Code:
     
    #define DATAPORT PORTB
    #define ENABLEPORT PORTD
    #define ENABLE PD3
    ...
    So bleibst Du flexibler und wenn Änderungen kommen brauchst Du das nur an der einen Stelle machen

    hängt das "data >> 4" mit den 2 nibbels zusammen, die ich brauch wg. dem 4-Bit bus? Vertauscht das bits wie bei
    "swap temp"?
    Jein, es hängt mit den Nibbles zusammen es vertauscht aber nicht wie swap sondert schiebt alles um 4 Stellen nach rechts

    Am sonsten kann ich Deine Entscheidung beglückwünschen sich die Lib selber zu schreiben , es ist wirklich kein Akt.

    Wenn sonst noch fragen offen sind dann frag einfach mal, ich habe irgendwo auch die Init Routine für den KS0070B (falls Du mit dem Dattenblatt nicht klarkommst)

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    02.07.2006
    Beiträge
    22
    Dank deiner ausführlichen Erklärung hab ich jetzt den Code so weit am laufen. Ich hab ne Funktion geschrieben, wo ich an beliebigen Stellen des Displays strings schreiben lassen kann - das reicht mir eigentlich schon.

    Jedoch hab ich noch ein kleines Problem. Momentan verwende ich die auch von dir benutzte _delay_loop2 Funktion...(und da immer maximalen delay ... ist halt noch in der Entwicklung)... jedoch fände ich die _delay_ms bzw. _delay_us Funktion hübscher, da ich mit anderer Taktgeschwindigkeit nix am Code ändern müsste.
    Wenn ich allerdings diese Funktionen verwende wird das Hexfile ~14kb gross - das gibts doch nicht, oder?? Ist das ein Bug?
    Auch das alleinige Verwenden der _delay_ms in deiner Funktion statt _delay_loop2 lässt die Grösse explodieren...
    Verwende die Winavr-20060421.exe

    Anbei hab ich das .c File angehängt...

    Btw, deine lcd_data funktion hab ich ein bisschen abgeändert, weils sonst Probleme gibt, wenn RS auf dem gleichen Port wie Dataport angeschlossen ist (wie im schlatplan vom Wiki...alles auf portc).
    Deine restlichen funktionen hab ich eigentlich ala copy&paste übernommen..funktionieren prächtig - danke nochmal!


    Tschüß,
    R2D3212
    Angehängte Dateien Angehängte Dateien

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    Hallo,
    Ich freue mich, daß ich Dir helfen konnte

    Du kannst natürlich _delay_ms _delay_us verwenden, was dabei wichtig ist, Du mußt die Optimierung einschalten

    Es werden irgendwelche Fließkommafunktionen benutzt, und die brauchen halt Platz (irgendwo auf http://www.mikrocontroller.net/ gibt es ein Thread dazu, kannst mal danach suchen wenn Du mehr erfahren willst )

    Schau mal in Deinem Makefile ob da ein Flag -Os aktiviert ist.

    Gruß Sebastian

    EDIT: Wenn Deine lib gut funktioniert kannst Du sie in Wiki schreiben, da ist sie besser aufgehoben, und hilft sicher auch mal anderen
    Software is like s e x: its better when its free.
    Linus Torvald

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •