In der Anlage habe ich eine BASCOM-Funktion (LCDBig) beigelegt mit der "große" Zahlen, über alle 4 Zeilen eines 4-Zeiligen LCD angezeigt werden können. Diese Funktion habe ich meiner AVR-ATMega8-Haussteuerung entnommen. Ich verwende diese Funktion zur Anzeige der Uhrzeit, Temperatur und sonstigem, wie z.B. Anzeige/Einstellen der LCD-Helligkeit, RS485-Adresse, Anruflisten, Fehlerspeicher usw. In der Anlage habe ich auch einige Bilder der Anzeige beigefügt. Ich verwende das LCD-Modul 4x20 EA DIP204-4 (Kontroller KS0073) von Conrad, dieses LCD hat die Abmessungen 68 x 27 mm und ist somit ideal für den Einbau in eine Blindabdeckung (normale Schalterdose) geeignet. Sollte Interesse an weiteren BASCOM-Funktionen bestehen so könnte ich Beispiele zu RS485, TWI/I2C, LCD-Ansteuerung usw. liefern.
@ATMega8Tester: ich wäre an den routinen interssiert. i2c und 485. besonders über die haussteuerung würde ich info's haben wollen. hast du verdrillte leitungen oder telefonkabel genommen, wie sind die aktuatoren aufgebaut (Verteilung oder dezentral) tschaui
hätte auch an deinen konzept der haussteuerung interesse. danke für die infos kai
@at_mega@tester auch wenn es nicht fertig oder dir nicht gut genug erscheint. es ist immer interessant für andere. melde dich doch mal. mfg stromi
Hallo mega8tester wäre auch an deiner Haussteuerung interessiert
@ATMega8Tester: Ich habe mir vor kurzem auch das Display EA DIP204-4 gekauft. Leider muss ich feststellen das es mit Bascom AVR nicht richtig läuft. Die Zeilen und Zeichen erscheinen versetzt zur Orginalposition. Das gleiche Programm mit gleichem Prozessor aber anderem Display (HD44780) läuft ohne Probleme. Wer kann mir bei diesem Problem weiterhelfen?? mfg Sepp
Was ich noch vergessen habe, ich möchte das Display im vier - Bit Modus betreiben. mfg Sepp
Hi, tja die Zeilenadressen sind bei dem Display(Controller:KS0073) anders. Ich hab fuer das Display Routinen geschrieben, aber nur fuer HW SPI. Es spart ein paar Leitungen. Liegt hier in der Codesammlung.... ansonsten musste alle Routinen selber schreiben .... Mfg Dirk
@DL7SEP: Ich habe im Dateianhang meine LCD Library für KS0073 EA DIP204-4 angehängt. Diese ersetzt die internen Bascom-LCD-Funktionen: _Init_Lcd _Write_lcd _Lcd_control _CLS Einfach die .LIB in Dein Bascom-LIB Verzeichnis kopieren und wie im Beispiel der beigelegten .BAS verwenden. Achtung, ggf. musst Du die Belegung der Ports und die Taktrate (auch bei den ASM-Delayfunktionen im meiner .LIB) anpassen.
@ATMega8Tester: Erstmal vielen Dank für Deine Hilfe,jetzt läuft alles bestens. Jetzt habe ich nur noch ein Problem. Das Layout für Prozessor und Display habe ich schon fertig, allerdings gibt es bei mir folgende Belegung: RS = PC5 E = PC4 DB4 = PC3 DB5 = PC2 DB6 = PC1 DB7 = PC0 RS RS und E habe ich schon angepasst, aber gibt es in Assembler eine möglichkeit den Nibble PC0-PC3 an die Display-Pins anzupassen?? Leider habe ich von Assembler keine Ahnung,ein kleiner Tipp währe für mich hier bestimmt sehr hilfreich. Nochmals vielen Dank mfg Sepp
@DL7SEP: Ich habe im Dateianhang eine auf Deine Belegung überarbeitete LIB angehängt. Die Änderungen habe ich wie am folgenden Beispiel ersichtlich kommentiert ("Jürgen","Sepp"): ;ldi R24, &B00100100 ;Jürgen 4 Bit-Datenlänge, extension Bit RE=1 ldi R24, &B01000010 ;Sepp 4 Bit-Datenlänge, extension Bit RE=1 Bitte beachte, ich habe die geänderte LIB nicht getestet, sie sollte aber funktionieren. Jürgen
@ATMega8Tester: Hallo folgendes Problem stellt sich bei dieser Lösung ein: Auf dem Display erscheinen andere Zeichen wie ausgegeben. Ich denke das hat folgenden Grund: Der Befehl _Write_lcd ist von der Assemblerroutine aktiv, d.h. die Daten stehen immer gespiegelt an den Portpins. Die Initsialisierung müsste zwar funktionieren, aber der eigentliche Datenstrom eben nicht. Ich habe scho mal versucht folgendes auszukommentieren: ;[_Write_lcd] ;---------------------------------------------------------- ;_Write_lcd: ;sbi PortC, 5 ;rjmp _Write_lcd_Byte Ich dachte, dass dieses dann von der Orginalroutine übernommen wird. Aber leider kommt beim compilieren dann der Fehler Label not found LCD_DELAY_5MS Ich weis zwar nicht was die Delay Routine mit dem _Write_lcd Befehl zu tun hat, aber wie gesagt meine Assemblerkenntnisse.... Kann man vielleicht die .LIB nicht mit dem WordPad Editor bearbeiten? Aber trotzdem vielen Dank und ich werde noch nicht aufgeben. Übrigens in Basic könnte ich ein Byte schon spiegeln. Das Beispiel im Anhang mfg Sepp
Hallo, nachdem ich Assemmbler nicht verstehe,habe die HomeCon Sepp2.Lib versucht in Basic nachzubilden. Das LCD Display wird nun erst mit Bascom AVR und dann mit der eigenen in Basic geschriebenen Initialisierung initialisiert. Jetzt funktioniert alles so weit,nur Zeile 2 und 3 sind vertauscht, aber damit kann ich leben. mfg Sepp
Hi, tja weil der Locate Befehl die falschen Adresszeilen anspringt ... Sub Gotoyx(byval Y As Byte , Byval X As Byte) Local Dat As Byte Select Case Y Case 0 : Dat = &H00 Case 1 : Dat = &H20 Case 2 : Dat = &H40 Case 3 : Dat = &H60 End Select Dat = Dat + &H80 '+ 128 Writecmd Dat Dat = Dat + X Writecmd Dat 'Dat = 0 End Sub Kann sein das du den Stack veraendern musst. Mfg Dirk
Hallo Dirk, vielen Dank für Dein Beispiel,aber natürlich gibt es wieder fragen. Bascom AVR kennt bei mir den Befehl Writecmd nicht.Ist das etwa eine eigene Routine von Dir? Wie übergibt man eine Variable von Bascom AVR an eine eigene Assemblerroutine und wie liest man sie wieder zurück? Welche Register werden von Bascom verwendet? Ich habe in der Help darüber nichts gefunden. Vielleicht könnte mir ein kleines Beispiel auf die Sprünge helfen.. mfg Sepp
Hi, ups wie immer war ich zuschnell .... writecmd ist mein Befehl um ein Kommando an mein LCD zusenden. Bei dir musste es DAT durch Disp aendern und Writecmd durch LCDControl. Wie das mit Bascom ASM hab ich auch nicht kapiert .... deshalb habe ich alle Routinen in Basic programmiert. Eigentlich auch nur zuverstehen wie so ein LCD angesteuert wird. Danach bin ich auf GCC umgestiegen. Mfg Dirk
Hi, ich sollte nochmal die Grundschule besuchen mein Deutsch ist richtig schlimm :/ Mfg Dirk
Hallo Dirk, es hat auch mit dieser Änderung nicht geklappt.Aber das ist nicht schlimm, denn es ist ja nur die LCD-Zeile 2 und 3 vertauscht. Man kann das ja mit dem Locate-Befehl entsprechend regeln. Aha Du bist vermutlich auf einen C-Compiler umgestiegen,ich bin froh wenn ich es mit Bascom schaffe.... mfg Sepp
Hallo, nun habe ich es endlich geschafft, die HomeCon.Lib so zu verändern, damit die Daten gespiegelt an den Pin PC0-PC3 stehen. Es ist somit viel leichter ein Layout zu erstellen,ohne mit den Datenleitungen zu kreuzen. Meine Belegung: PC0 DB7 PC1 DB6 PC2 DB5 PC3 DB4 PC4 E PC5 RS GND RW Es ist übrigens mein erster Versuch in Assembler, ich hoffe die "freaks" möchten es mir verzeihen...:-)
Hi. Ich habe auch ein 'EA DIP204-4'. Ich mache gerade meine Ersten Experimente damit am AT90S2313. Ich habe also die HomeCon.lib in den Lib-Ordner von Bascom kopiert und die dazugehörige bas-Datei geöffnet. Die .lib-Datei hatte ich vorher so abgeändert, dass es zu meines Kontaktbelegung passt: PortB.0 = D4 PortB.1 = D5 PortB.2 = D6 PortB.3 = D7 PortD.0 = RS PortD.2 = E Auch die Bas-Datei habe ich angepasst. Auf dem LCD wird aber nichts ausgegeben.
Hallo, die Belegung der HomeCon.Lib stimmt nicht mit dem was Du geschrieben hast überein. Ich habs mal abgeändert,kanns aber Hardwaremäßig nicht testen. Überigens bei Config Lcd 20 * 4a nicht vergessen,sonst sind die Zeilen vertauscht. Viel Erfolg Sepp
Hi. Ich habe immernoch Probleme mit der BAS-Datei: Error: 10 Line: 13 Unknown LCD Type [20x4a] , in File (blablabla) Aus diesem Grund hatte ich auch das 'a' entfernt.
Hallo, ich habe die HomeCon_1.2.bas bei mir ohne Fehler compiliert. Die Version von Bascom AVR ist 1.11.7.3 Oftmals ist der Fehler auch in anderen Zeilen versteckt, als blabla endeckt. Viele Grüße Sepp
Also ich ahe genau die gleiche Version. Unter Options > Complier > LCD kann ich unter 'LCD-Type' außer den normalen Größen nur '16 * 1a' auswählen. Aber 20 * 4a gibt es da nicht! Woher kommen diese Einträge? Wieso fehlt es bei mir? PS: Der Rest des Codes funktioniert Prima, außer das eben die 2. und 3. Zeile vertauscht sind!
Hallo, bei den Sampels steht:'16 * 1a is intended for 16 character displays with split addresses over 2 lines. Wenn man aber in seinem Programm Config Lcd = 20 * 4a schreibt, funktioniert das eben auch mit einem Vierzeiligen Display(ein kleiner Trick). d.h.Programmcode hat vorrang vor Options Compiler Lcd.. Verwende doch mal das Beispiel das in Dip_lcd_1.2.zip enthalten ist. Ich kann es ohne Fehler Compilieren. Mfg Sepp
Ja, aber bei mir funktioniert das eben nicht! Ich öffne einfach die Beispieldatei aus der Disp_Lcd_1.2.zip und versuche es dann zu compilieren. Und dann bringt er mir den oben genannten Fehler.
Dann kann ich Dir leider auch nicht mehr weiterhelfen :-( Viel Erfolg trotzdem Sepp
Erstmal: Danke "Tester" fuer die Zeichen-Muster. Wird fuer die hier "versammelten" Bascom-Anhaenger wohl weniger interessant sein, aber sozusagen als "was zurueckgeben fuer genommenes": Eine "simple" Uhr welche die Zeichen-Muster benutzt. Implementiert in C (avr-gcc). Code aendert sich wahrscheinlich anfangs eh noch etwas, also Link statt Attachment: http://www.siwawi.arubi.uni-kl.de/avr_projects/lcdclock/ Martin
Hi. Ich habe mein LCD jetzt an ein 8515 angeschlossen. Weil ich nicht selber in der Lage war, die LIB-Datei auf die neue Belegung anzupassen habe ich die EA DIP204.LIB von Sepp verwendet und mir eine eigene bas-Datei geschrieben. Nun habe ich das Problem, dass auf dem LCD eigentlich der Wert "100" ausgegeben werden müsste. Stattdessen erscheint aber immer nur das erste Zeichen. Woran kann das liegen? Ich hab schon einen 4MHz-Quarz ausprobiert, aber da ist es genauso. Kann jemand mal die LIB-Datei überprüfen oder eine frische erstellen?
Hallo, versuchs mal damit, sollte eigentlich funktionieren. Viele Grüße Sepp
Hi. Ich habe damit immernoch Probleme: Wenn ich die Ausgabe auf dem LCD in eine Schleife reinschreibe, also locate 1,1: Print X Dann zeigt er auf dem LCD zwar die Zahl 100 an, aber die mittlere 0 flimmert. Woran kann das liegen?
Hallo, normalerweise ist diese Seite für Source-Code gedacht und nicht als Hilfe. Aber wenn Du eine LCD-Ausgabe in eine Schleife schreibst,wird die Anzeige beim übernehmen des neuen Wertes(auch wenn er sich nicht geändert hat)immer Flimmern. Ich vergleiche z.B. den momentanen Messwert eines AD-Wandlers mit einer Messung vorher,und schreibe auf das Lcd-Display nur wenn der Wert sich geändert hat. Viele Grüße Sepp
Vorher (mit der alten LIB-Datei) hatte ich dieses Flimmern aber nicht, obwohl es auch in einer Schleife stand.
Zeig doch mal deinen Sorce-Code, bei deinem alten Programm stand es nicht in einer Schleife :-)
Die Datei lcd_menu.bas öffnen. darin wird dann auf die anderen Dateien verwiesen. Mit dem Programm möchte ich den PC starten/beenden und den Status (CPU, LAN, ...) abfragen. Die Kommunikation soll über UART hergestellt werden (noch nicht fertig!)
Jetzt ist alles klar, Deine Subroutinen die auf das LCD Display zugreifen haben am Anfang immer den Clear Screen Befehl (CLS) und damit flackert Deine Anzeige. Am einfachsten den alten Wert durch den neuen Wert überschreiben. Wenn dieser Wert verschieden lange Zeichen enthält,dann die Betreffende Zeile mit z.B.Locate 1,1 auswählen und dann einfach " "mit 20 Leerzeichen überschreiben. Es gibt bestimmt noch viele andere Möglichkeiten.... Übrigens Config Lcd 20 x 4a verwenden, dann stimmen auch die Zeilen. So das muss aber jetzt als Starthilfe reichen. Viele Grüße Sepp
Also dass mit dem CLS ist nicht wahr. Mit der alten LIB-Datei hatte es ja funktioniert, da hat nichts geflackert, abst stattdessen zeigte er nur das erste Zeichen bei Variablen dar. Erst seit der neuen Lib flimmert das LCD. Was mir auch noch aufgefallen ist: Unter Verwendung der neuen Lib musste ich auch die Belegung des LCDs am µC ändern. Könntest du mir eine neue Lib schreiben mit folgender Belegung (so hatte es auch mit der alten LIB funktioniert): RS: PC.5 R/W: GND E: PC.4 D4: PC.3 D5: PC.2 D6: PC.1 D7: PC.0
Also bei aller Freundschaft oder so.. Ich habe Dir jetzt einige Tips gegeben und wenn Du Sie nicht glaubst dann musst Du eben selber draufkommen. Ich hatte auch keinen "Helfer" und wenn ma es dann schafft, freut man sich um so mehr. Das ist nicht böse gemeint, aber manche Dinge muss man sich einfach selber erarbeiten. Und ein "Dankeschön" schreibt sich auch nicht schwer oder? Viele Grüße Sepp
Hi. Bist du in der Lage ein kleines Programm für Windows zu erstellen, indem man einfach angibt, welcher Pin wo am LCD angeschlossen wird, und die Software generiert dann daraus die LIB-Datei. Hast du die Möglichkeit sowas zu machen? Vielen Dank für deine bisherige Hilfe.
Ich habe es mittlerweile selbst hinbekommen, die Lib umzuschreiben. Danke für deine Bemühungen.
Hallo miteinander, habe nach dem Vorbild von Atmega8tester auch mal eine Programmierung für große Zahlen vorgenommen. Die einzelnen Zahlen sind fertig und erscheinen auch korrekt auf dem Display. Ich habe die einzelnen Buchstaben so programmiert, das ich nur die Anfangs- "X"- Koordinate eingebe, das heißt, der Buchstabe beginnt immer bei y=1, und dem dementsprechenden X- Punkt (Spalte auf dem Display). Das ist aber alles nur Randbedingung. Das eigentliche Problem ist, das die Darstellung eines Buchstaben in einer SUB abläuft, und nur der X- Parameter übergeben wird, die Berechnung der weiteren Koordinaten erfolgt in der Sub. X1=X+1 wäre somit die Berechnung für die 2. Spalte. Als Testprogramm soll die Zahl über eine FOR- Schleife über den Bildschirm wandern, d.h. bei jedem Schleifenduchlauf wird x um 1 erhöht, der Inhalt von X wird übergeben, und müsste somit der Grundparameter für die Berechnung in der SUB sein. Problem ist jetzt folgendes: NUR der Teil der Zahl läuft durch den Bildschirm, der das "Grund"- X in seinem Locate- Befehl hat, der Rest der Zahl bleibt stehen. Fakt ist: Er berechnet das X1 und das X2 in der Sub nicht, das X kommt aber korrekt an! Meine Frage ist, wieso macht er das? Ich schreib hier mal den entscheidenden Teil des Programms hin, der Rest des Programms ist erstmal uninteressant, und läuft auch korrekt ab. ***************************************************** Dim I as byte do for i = 1 to 10 step 1 cls x= x + 1 locate 1, 12: lcd X !!! Nur Testzeile ob x berechnet wird call zahl2(x) waitms 200 if x= 10 then x= 0 next i loop . . . sub zahl2(x as byte) local x1 as byte: x1 = x + 1 !!!Interessante Zeile!!! local x2 as byte: x2 = x + 1 !!!Interessante Zeile!!! local y1 as byte: y1 = y + 1 local y2 as byte: y2 = y + 1 local y3 as byte: y3 = y + 1 locate 2,12: lcd x1 !!! Nur Testzeile ob x1 berechnet wird locate 3,12: lcd x2 !!! Nur Testzeile ob x2 berechnet wird locate 4,12: lcd x !!! Nur Testzeile ob x überhaupt übergeben wird locate y,x : lcd chr(3) locate y,x1: lcd chr(0) locate y,x2: lcd chr(4) locate y1,x: lcd chr(3) locate y1,x1: lcd chr(0) u.s.w. end sub wie bereits erwähnt, das ist nur ein Auszug des Programms, der Rest funktioniert einwandfrei, die Sub ist auch irgendwo mal entsprechend deklariert. Ich hoffe es gibt eine einfache Lösung dafür, danke schonmal für eure Mithilfe.
Hi, brauche dringend Hilfe. Habe die Lib für auf meine Anschlüsse umgeschrieben, aber es erscheinen nur 2 blinkende schwarze Kästchen (1.Zeile, 16.Spalte und 2.Zeile, 4.Spalte) nach einem "CLS". Was habe ich falsch gemacht. Benutze das EA DIP204-4. Vielen Dank für Eure Hilfe.
Hat sich erledigt, habe es selbst hinbekommen.
Hallo zusammen, bin neu in der uC Materie und hab da mal ne Frage zur HomeCon_1.2.lib. Zunächst mal ein Lob, find ich SUPER was hier läuft mit open source und so. Nun meine Frage: Ich arbeite mit einem Mega16 und hab nach einigen Fehlversuchen mit der HomeCOn Lib mein LCD zum laufen bekommen. Der Pferdefuß dabei ist, dass ich mit maximal 6MHz takten kann. Darüber gibt das Disp nur noch kauderwelsch aus. Habt Ihr evtl. nen Tip? Es schein sich um ein Timing Problem zu handeln, aber ich komm nicht drauf wie ich dsa in den Griff bekommen kann, damit ich die vollen 16MHz ausreizen kann.
Hallo Marko, schau doch mal am Ende der Lib dort solltest Du dieses finden: ********************************************************************* LCD_Delay_5ms: ldi R24, 100 ; R24 Register mit Delaywert 100 * 50us vorbelegen LCD_Delay_5ms2: rcall LCD_Delay_50us ; 50us Pause dec R24 ; R24 Registerinhalt um 1 runterzählen brne LCD_Delay_5ms2 ; Springe bei ungleich zurück zu LCD_Delay_5ms2 ret ; Funktionsende LCD_Delay_50us: ldi R25, 65 ; R25 Register mit Delaywert vorbelegen LCD_Delay_50us2: dec R25 ; R25 Registerinhalt um 1 runterzählen brne LCD_Delay_50us2 ; Springe bei ungleich zurück zu LCD_Delay_50us2 ret ; 1 Takt (Befehlszyklus) bei 3,6864Mhz dauert ca. 271ns ; 50us / 271ns * 3 Takte in der Schleife = 61,5 ********************************************************************* ldi R24, 100 ;kannst Du mit max. 255 vorbelegen ldi R25, 65 ;kannst Du mit max. 255 vorbelegen Wenn es dann immer noch zu schnell ist, dann kannst Du ja die schleife doppelt aufrufen. Viel Erfolg Sepp
Super Danke, für die flotte Antwort Sepp! Manchmal sieht man den Wald vor lauter Bäumen nicht! Hab etwas gespielt mit den Werten und hab für den Mega 16 bzw. 32 auf 16MHz als stabil lauffähig beide Werte auf 200 rausbekommen. Nur so als Anmerkung für andere mit gleichem Problem.
Hallo Zusammen! Also meine Lib funktioniert und auch die Darstellung von großen Zahlen geht. - Eigentlich. Wenn ich z.B. die Zahl "100" anzeigen lassen will, kann ich das über diese Funktion:
1 | Lcdbigspalte = 12 : Lcdbigzahl = 1 : Lcdbig |
2 | Lcdbigspalte = 15 : Lcdbigzahl = 0 : Lcdbig |
3 | Lcdbigspalte = 18 : Lcdbigzahl = 0 : Lcdbig |
Jetzt habe ich aber das Problem, daß sich diese Zahl permanent ändert, wie bei einer Uhr oder einem Thermometer z.B. Was muß ich tun (Beispielcode?), damit meine Zahlen als ganzes angeziegt werden und nicht nur ziffernweise? Oder, falls das nicht geht, wie zerlege ich meine 3-stellig Zahl in die einzelnen Ziffern? Für Eure Hilfe wäre ich sehr dankbar! Frohe Weihnachten! Stefan
Hallo!? :-( Kann mir denn niemand einen Tip geben?
Aus dem Bauch herraus würde ich sagen in String umwandeln und mit left oder so Zahl für Zahl auslesen.
Vielen Dank! Funktioniert auch noch bei 2.0.7.5! :D
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.