PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LCD geht in Bascom, in C aber nicht



R2D3212
02.08.2006, 15:37
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 :
https://www.roboternetz.de/wissen/index.php/LCD-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

pebisoft
02.08.2006, 18:14
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....

R2D3212
02.08.2006, 23:12
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
https://www.roboternetz.de/wissen/index.php/LCD-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

izaseba
02.08.2006, 23:47
würd mich interessieren, wie das mit den Delays realisiert wird.
z.B so:


void warte(uint16_t word) {
_delay_loop_2(word);
}

Die Funktionen um Daten an das Display zu schicken könnten so aussehen:


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:

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
:^o

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

R2D3212
03.08.2006, 17:37
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(0x00C8);
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

izaseba
03.08.2006, 20:14
die Funktion _delay_looop_2, in welchem Include is die drinnen?

util/delay.h

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


Dataport, Enableport... wo sind die definiert?


Ach ja, das habe ich natürlich vergessen :-s
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



#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 :wink:

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

R2D3212
05.08.2006, 18:30
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

izaseba
05.08.2006, 21:12
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 :-$