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....
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/in...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
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....
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/in...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
z.B so:würd mich interessieren, wie das mit den Delays realisiert wird.
Die Funktionen um Daten an das Display zu schicken könnten so aussehen:Code:void warte(uint16_t word) { _delay_loop_2(word); }
Enable Puls so: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); }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
Linus TorvaldSoftware is like s e x: its better when its free.
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
util/delay.hdie Funktion _delay_looop_2, in welchem Include is die drinnen?
sehe http://www.nongnu.org/avr-libc/user-...il__delay.html
Ach ja, das habe ich natürlich vergessenDataport, Enableport... wo sind die definiert?
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
So bleibst Du flexibler und wenn Änderungen kommen brauchst Du das nur an der einen Stelle machenCode:#define DATAPORT PORTB #define ENABLEPORT PORTD #define ENABLE PD3 ...
Jein, es hängt mit den Nibbles zusammen es vertauscht aber nicht wie swap sondert schiebt alles um 4 Stellen nach rechtshängt das "data >> 4" mit den 2 nibbels zusammen, die ich brauch wg. dem 4-Bit bus? Vertauscht das bits wie bei
"swap temp"?
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
Linus TorvaldSoftware is like s e x: its better when its free.
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
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
Linus TorvaldSoftware is like s e x: its better when its free.
Lesezeichen