Hallo, hab nach Studium des LCD-Tutorials mich mal am Ansteuern einer LCD Anzeige versucht. Es ist ein 4-Zeiliges Disply mit HD44780-Chip. Habe das Display folgendermaßen angeschlossen: (für 4-Bit Modus) Datenleitungen 4-7 hängen an den Ports PC0-PC3 Enabelleitungen E1 und E1 an den Ports PC4 und PC5 Die RS-Leitung liegt am Port B Pin 5! R/W und Datenleitungen 0-3 liegen auf Masse Die Anschlüsse hab ich schon x-mal gecheckt. Ich glaube eher es liegt noch an der Programmierung aber ich komme nicht drauf. Als Anhang findet ihr mein ASM-Programm. Wenn es fertig ist soll es eine Uhr geben. Hab die ASM-Datein einigermaßen ausführlich kommentiert. Kann mal jemand bitte reinschauen? Besonders in die LCD-Routine. Vielen Dank. Gruß Bernd.
Achso. Okay. :-) Eigentlich geht gar nix. Das heißt wenn ich das Disply einschalte seh ich in der erste und dritten zeile jeweils einen schwarzen balken. Das Display trägt die Bezeichnung: WINTEK WD-C2704M-1HNN Vielen Dank! Bernd.
Ich habe deinen Code ueberflogen - das in diesem Display 2 unabhaengige Controller drin sind (deshalb 2 Enable) ist dir entgangen ? oder habe ich da was uebersehen ? Servus, Helmut
Das LCD hat doch sicherlich 2 Controller, oder? Dann versuchs mal hiermit (Anhang) Die "PRINT-Erweiterung" folgt im nächsten Beitrag. ...
Und hier die Print-Erweiterung (Anhang) Damit dürftest du die meisten Probleme erschlagen können. ...
Hallo nochmal, @Helmut: Ja, das hab ich bedacht. Nur die Frage ob ich beide gleichzeitig verwenden kann oder ob ich erst den einen oder den anderen aktivieren muß. @Hannes: Vielen Dank. Nur hab ich bei dem Code das Problem schon von Anfang an, dass die Meldung: C:\Dokumente und Einstellungen\Bernd\Desktop\LCD_4x27.inc(261): error: zl: Unknown instruction or macro C:\Dokumente und Einstellungen\Bernd\Desktop\LCD_4x27.inc(261): error: syntax error, unexpected ',' kommt und zwar bei der Zeile: sbiw zh:zl,1 ;-1 (2 weitere Takte) Danke an Euch beide. Bernd.
Hi Hannes! Eigentlich ist es bei dem Enable-Puls nicht nötig 2 x 7 Takte zu warten, und das bis 16MHz. Probier mal, ob es auch ohne 14 Takte dazwischen geht. Keine Ahnung, ob das an dem KS0066u in meinem LCD liegt oder ob das allgemein so ist. Das mit dem LCD-Busy hatte ich auch mal probiert und es gab nur Probleme. Nach ein paar Stunden Laufzeit ist der µC nicht mehr aus der Busy-Routine rausgekommen weil das LCD den Status No-Busy nicht mehr gesendet hat, keine Ahnung, warum. Jetzt mach ich die Ausgabe Zeichen für Zeichen in einer 10KHz-ISR. Die Zeichen werden aus einem LCD-Buffer im SRAM alle 100µS ausgegeben. Nach einer kompletten LCD-Ausgabe über die ISR laufen die Zeilen- und Spaltenzähler als Timer bis zu einem bestimmten 16Bit-Wert. Dadurch wird eine LCD-Ausgabe auf z. B. 16 mal je Sekunde reduziert. Ausserdem wird nach jeder LCD-Ausgabe der starre Underline-Cursor auf eine bestimmbare Position gesetzt. Mittels eines Blink-Zählers wird dem Underline-Cursor dann noch das blinken beigebracht. Das geht wahrscheinlich nur bei den trägen Standard-LCDs, weniger mit OLED oder PLED. Ich stell das irgend wann mal in die Code-Sammlung rein aber vielleicht kannst Du das vorher mit deinen LCDs testen. Gruß Andi
Hallo Hannes und Andi, hab mal versucht Euer Programm zum laufen zu bewegen. Aber irgendwie kapier ich da einiges nicht. Ich kapier irgendwie nicht was in das Hauptprogram reingehört. Wie muß ich FLAGS und LCDController 1 und 2 definieren? Hab mal mein Hauptprogramme angehängt soweit ich gekommen bin. Gruß Bernd.
";Für die Auswahl des zuständigen Controllers werden die zwei Bits ;"lcdcontroller1" und "lcdcontroller2" im Register "FLAGS" ;des Hauptprogramms genutzt. Sie müssen dort deklariert werden. ;Die Übergabe der Daten erfolgt über das Register "wl", das im Hauptprogramm ;zu deklarieren ist. Weiterhin muss das Register "wh" deklariert sein."
Hallo Andi, hab das schon probiert. Erhalte aber die Fehlermeldung: "syntax error, unexpected REGDEF" und zwar für die Zeile: sbr flags,(1<<lcdcontroller1)|(1<<lcdcontroller2) Habe folgende Definitionen: .def wh=r17 .def wl=r18 .def flags=r19 .def clock=r20 .def lcdcontroller1=r21 .def lcdcontroller2=r22 Danke. Gruß Bernd.
Moin... Hoffentlich vergesse ich jetzt nix... @Bernd: So wird das nix... Erstmal muss m8def.inc als allererstes eingebunden werden, sonst können die anderen Includes nicht auf die Labels der Ports usw zugreifen. Dann darfst du Includes, die Code enthalten, erst nach den Interrupt-Vektoren einbinden, da sonst deine Int-Sprungtabelle nicht stimmt. Die Bits lcdcontroller1 und lcdcontroller2 sind keine Register, sondern nur Bits innerhalb des Registers "flags". Sie werden von LOCATE gesetzt und von IMPULS (LCD-Routinen) ausgewertet. Damit wird der benötigte Controller ausgewählt. Versuchs mal mit dem Code hier im Anhang und versuche mal, es zu verstehen. Wenn was unklar ist, dann frag... Das ist zwar auch nur was Halbfertiges (Unfertiges), zeigt dir aber, wie die Dateien eingebunden werden und einige Anzeigefunktionen aufgerufen werden. Die etwas fortgeschrittene Version des Programms (mit angefangenem Menü und Stellmöglichkeit der Uhr) ist aber für ein LCD mit 8x24 Zeichen (Controller M50530) ausgelegt und gibt daher Zeichen auf Zeilen aus, die das 4x27-LCD nunmal nicht hat. Viel Spaß damit beim Weiterentwickeln... @Andi: Enable 2x7 Takte... Stimmt, es waren auch nur 1x7 Takte geplant. Aber beim Umstellen von 1MHz auf 8MHz gab es Probleme, weshalb ich erstmal den Impuls verlängerte. Es war aber eine kalte Lötstelle an einem Adapter zum STK500, die Änderung ist aber noch nicht zurückgenommen. Nunja, schaden tun die 7 Takte nicht, denn durch die Busy-Abfrage wird die Wartezeit recht kurz gehalten. Das Problem mit dem Festfahren in der Busy-Warteschleife wird es nicht geben, da die Busy-Routine einen "Notausstieg" hat. Das periodische Senden von Zeichen will ich auch noch realisieren. Aber nicht in der ISR, sondern in der Mainloop, aber mit niedrigster Priorität, synchronisiert vom Timer-Int mit 10ms. Aber bis das Konzept steht, werde ich noch etliche male schlafen gehen... ;-) Außerdem ist das nicht besonders dringend, denn die jetzige Version läuft recht gut. Den Underline-Cursor benutze ich nicht (auch nicht beim 8x24 mit M50530), denn ich brauche keine "Eingabeaufforderung", will schließlich keinen PC bauen. Und im Menü lasse ich Text oder Zahlen blinken, so wie im Anhang die Doppelpunkte. @Tobi: Jawoll... Aber ich sehe ein, dass man diese Hinweise auch anders interpretieren kann, was dann zu Missverständnissen führt. ...
Hallo Hannes, Vielen Dank! Ich denke es wird mir weiterhelfen. Das Includen der m8def.inc hab ich natürlich davor eingebunden und die IR-Vektoren auch. Vielen Dank. Gruß vom Bodensee Bernd.
Hallo Hannes, bin noch dabei. Komme wahrscheinlich aber erst an Wochenende dazu.. :-( Gruß Bernd.
Hallo! Es funktioniert soweit! Das heißt...es passiert schonmal was. Ich hab mir das obige Programm mal angeschaut und ein bißchen verändert. Einzelne Bekomme ich nun dargestellt! Nur ist das Problem, dass meine Anzeige ziemliche Probleme mit Störungen hat. Bei jedem mal resetten zeigt sie was anderes an und nur ganz selten das was ich will.... das ist doch nicht normal, oder? Gruß Bernd.
Ich habe auch das WINTEC von Pollin, dazu ein anderes 2x20 von Pollin. Beide haben keinen original HD44780, sondern kompatible Typen. Ich habe die gleichen Probleme wie du und vermute, es liegt am 4-Bit-Mode. Bei 8-Bit am Parallel-Port funktionieren beide immer, egal welches Timing. Jetzt habe ich ein Batron von Pollin mit original HD44780 und das funktioniert. Kannst du nochmal deinen letzten ASM-Code posten, ich würde es bei Gelegenheit mal bei mir probieren. Thomas
Hi... Es kann sein, dass der "Notausstieg" der Busy-Abfrage etwas zu knapp bemessen ist. Ich wollte das 'rcall Delay5ms' hinter lcd_clear entfernen, doch da gab das LCD nur noch Mist aus (falsche Position). Ich habe 'Uhr2.asm' nochmal überflogen und dabei festgestellt, dass ich vergessen habe, die Kommentare zu ändern, als ich halbfertige Dinge gelöscht hatte. Auch einige Register und SRAM-Zellen sind schon deklariert, werden aber von der abgespeckten Version nicht genutzt, sorry... Nun nochmal konkret: Was hast du geändert und was geht jetzt nicht? Wie ist das LCD angeschlossen? Ist r/w auch angeschlossen? Kannst du Hardwarefehler ausschließen? (Ich hatte auch Probleme, das LCD zeigte nur Mist an, manchmal stimmten aber einige Zeichen und Positionen. Es war eine fehlerhafte Lötstelle an einem Adapter zwischen STK500 und LCD.) ...
Ich habe ein gebrauchtes 4x16-er - mag ursprünglich auch von Pollin gewesen sein - das mit dem üblichen Timing auf Kriegsfuss steht. Ob das am Display liegt, oder daran, dass der angeschlossene µC mit 3V arbeitet und die LCD-Controller einen High-Pegel von 2.8V wollen? Jedenfalls funktioniert es wunderbar mit grundsätzlich doppelt so langem Timing.
Habe aus der Datei Uhr2 alles rausgeworfen was ich nicht brauche und rufe jeweils nur die Print Makros auf. Das sieht dann so aus: ----------------------------------------- .include "m8def.inc" ;Hardwaredefinitionen einbinden .equ clock=3500000 ;Taktfrequenz des AVR .def null=r2 ;immer Null .def flags=r23 ;diverse Flags .equ lcdcontroller1=6 ;Flag für Controller 1 .equ lcdcontroller2=7 ;Flag für Controller 2 .def wl=r24 ;Working L .def wh=r25 ;Working H .cseg .org 0 ;Reset- und Interrupt-Vektoren AT-Mega 8 rjmp reset ;Reset Handler .include"LCDprint.inc" ;LCD-Ausgabefunktionen .include"LCD_4x27.inc" ;LCD-Treiber-Routinen für LCDs mit 2 HD44780 reset: ldi wl,low(ramend) ;Stackpointer initialisieren out SPL,wl ldi wl,high(ramend) out SPH,wl clr null ;immer Null rcall lcd_init ;Display initialisieren und löschen locate 1,1 print 'B' locate 4,2 print 'e' wait: rjmp wait ---------------------------------------------------------------- An den anderen Dateien hab ich nix verändert. Werde aber mal die Zeiten alle verdoppeln. Angeschlossen ist das Display richtig. Hab es x-mal durchgemessen. Kann es aber sein, dass bei etwas längeren Zuleitungen vom uP zum Display Störungen das Display durcheinander bringen können? Gruß und vielen Dank Bernd.
Du solltest auch mal die Kommentare in den Includes lesen. Locate geht nur von 0 bis 3. Längere Leitungen können zu Problemen führen. Pollin schreibt in seinen Pseudo-Datenblättern z.B., dass man einen Abblock-C an das LCD anbringen soll, wenn die Strippen länger als einige wenige Zentimeter sind. Läuft denn das Programm, so wie ich es gepostet hatte? - Denn hier lief es stabil (extra getestet auf STK500 und auf externer Testplatine). Die Weiterentwicklung läuft (in einem alten Spritzen-Etui als Gehäuse) mit 4 Mignon-Akkus, einem Mini-Joystick zur Bedienung des Menüs, dem Pollin-LCD 4x27 (WD-C2704M-1HNN), einer kleinen Platine mit Buchse für den Folienleiter und einer kleinen Platine mit Mega8 und Quarz 8MHz. Ist noch nicht fertig, läuft aber. Das LCD wird jetzt aus einem AVR-Port (PD1) mit Strom versorgt und kann per Software ein- und ausgeschaltet werden. Das bringt allerdings nicht das, was ich erhoffte. Der AVR zieht ohne LCD knapp 6mA, mit LCD knapp 8mA, während der Initialisierung etwa 14mA. ...
So... jetzt hab ichs. @Hannes: Das mit dem locate hab ich gerade bemerkt :-) Hab das 5ms Delay auf 15ms verlängert. Jetzt geht es ohne Probleme. Außerdem hab ich in: "LCD_Impuls" noch eine kleine Schleife eingefügt. Dann geht es zuverlässig! Werd morgen nochmal bisschen spielen Danke an Euch alle und speziell an Hannes! Bernd.
Problem ist zwar gelöst aber im Anhang noch eine Busy-Funktion mit einer Notausgangszeit von 1600µS. MfG Andi
Hi Andi... Das müsste leider noch verändert werden, damit es in mein Konzept eingebunden werden kann. Denn mein Konzept geht davon aus, dass jede Steuerleitung auf einem anderen Port liegen kann. Nur die 4 Datenleitungen müssen an ein zusammenhängendes Nibble angeschlossen werden. Dies ermöglicht einen flexiblen Anschluss an den AVR. Man kann sich also erstmal alle benötigten Spezialfunktionspins des AVR reservieren, dann ein Nibble für die LCD-Daten, dann die Steuerleitungen an die AVR-Pins, die noch frei sind. Habe ich alle LCD-Anschlüsse an einem Port, dann wird es (besonders beim Mega8) schwierig, die Sonderfunktionen der internen Hardware bzw. externen Quarz zu nutzen. Ich werde daher den "Notausstieg" meiner Busy-Wait-Routine drastisch vergrößern, die rund 100µs sind wirklich zu kurz. Andi, es geht mir nicht darum, dir zu widersprechen (auch wenn es manchmal so aussehen sollte). Aber du siehst die Dinge aus der Akademiker-Sicht, ich aus der Sicht des Hobby-Bastlers (ohne Abitur, aber mit langjährig antrainiertem Sinn für technische Zusammenhänge). Übrigens haben mir deine Beiträge auch schon oft weiter geholfen. Wenn du dir LCD-Print mal genauer ansiehst, erkennst du sicherlich, dass ich vorher deine Routinen (und die von Peter) analysiert habe und einige Algorithmen übernommen habe (nachdem ich sie verstanden habe!). Ich beziehe mich jetzt auf das hier: http://www.mikrocontroller.net/forum/read-4-127504.html#127504 Mein Dank wird dir also ewig nachschleichen... ;-) Beste Grüße... ...HanneS...
Hab ichs mir doch gedacht, Deine Routinen zur Ausgabe von Zahlenwerten kamen mir doch irgend wie bekannt vor ;-) Schon schön wie der Download-Zähler für die PrintBCD-Routinen hoch geht aber leider schreibt niemand Kommentare rein mit Verbesserungen, Anregungen, gut oder schlecht. Ich aber auch nix Akademiker, pures Hobby und Bastelei. Habe hier nur meine alte Busy-Funktion zur Verfügung gestellt welche ja auch nur Bit-Weise EN, RS und RW ändert. Kann man sich ja leicht am eigenen System anpassen. Evtl. auch den Wert für "out lcd_ddr,r24" noch ändern. Ist halt nur wichtig, das DB4 - DB7 auf Input gesetzt wird. Allerdings fällt mir gerade auf, das ich vergessen habe die Pullups für DB4 bis DB7 aus- oder einzuschalten (testet man durch probieren). Na ja, egal. Seit ich die Zeichenausgabe in eine ISR gepackt habe benutze ich Busy nicht mehr da für je 1 Zeichen/Steuercode aus der ISR nur 45 Takte alle 100µS vergehen und in der "Austastlücke" gerade mal 20. Das Main-Programm läuft auch wesentlich "flüssiger" ab und muß keine 2000µS für die LCD-Ausgabe verschwenden. Ein entsprechendes "Printing-System" zur Ausgabe von Zeichenketten und entsprechende Steuercodes unter Zeichencode 32 welches aus einem "Flash-String" gelesen wird habe ich bereits in Reserve. MfG Andi
Hi Andi... Tja, ich schau mir zwar gern mal fremden Code an, eigne mir dabei auch Algorithmen an, sofern ich sie verstehe, verwende diese fremde Codes aber nicht unverstanden. Ich nutze die einschlägigen Quellen nicht als "Baukasten", aus dem ich meine Programme zusammensetze, sondern schreibe meinen Code selbst. Selbst wenn ich einen kompletten Algorithmus übernehme (z.B. Peters Tasten-Entprellung) ist dieser nicht maschinell kopiert, sondern (an das eigene Konzept angepasst) neu geschrieben (erkennbar an den Kommentaren). Ich habe da lieber ein etwas schlechteres Programm, das ich aber verstehe und jede Zeile nachvollziehen kann, als ein sehr gutes Programm mit zusammengesuchten Modulen, die ich nicht hundertprozentig nachvollziehen kann. Dies ist vielleicht auch der Grund, weshalb ich den Einstieg in C weit vor mir herschiebe. Und mit (Eigenbau-) Modulen wie LCD_Print und den "Treibern" für verschiedene LCDs wird ASM ja auch immer interessanter. Beste Grüße... ...HanneS...
Ist schon gut, brauchst Dich nicht rechtfertigen. Habe in Deinem Code meine Zahlen-ASCII-Wandler-Routinen in veränderter Weise erkannt und ist in Ordnung. Find ich gut, das jemand aus anderen Codes das übernimmt was er versteht und/oder benötigt. MfG Andi
Hallo, ich bin grad dabei meine LCD-routine so umzuschreiben, dass die Daten und Steuerleitungen an verschiedenen Ports hängen können, seid 2 tagen probiere ich alles mögliche aus, habe dabei aber immer das selbe Problem. wenn ich in der Subroutine die für das senden eines Commandos zuständig ist versuche die Datenleitungen die quasi nicht verwendet werden zu erhalten und nicht mit nullen zu überschreiben(einlesen und in das entsprechende Register zu intrahieren), funktioniert gar nichts mehr. bei der routine für die daten funktioniert es auf die selbe weise allerdings einwandfrei. Eigentlich sollten Daten und CommandoBytes aber bis auf das gesetzte RS-Rit beim Senden von Daten auf die selbe weise gesendet werden. Das LCD ist momentan noch an einem einzigen port angeschlossen, das sollte doch aber trotzdem funktionieren? die beiden routienen heissen lcd_data und lcd_command, wobei die beiden auskommentierten zeilen in lcd_command die Probleme machen. vieleich weiss ja jeman wo der Hund begraben liegt. Vielen Dank schonmal mfg DerDings Der
sorry, da bin ich wohl falsch abgebogen, hier ist die richtige datei, die andere bitte nicht beachten
(1) Data/Command Abfolge falsch: E rauf 4-Bit Daten anlegen 1usec warten E runter 1usec warten E rauf 4-Bit Daten anlegen (die anderen) 1usec warten E runter 1usec warten und jetzt erst auf Busy testen. (2) Timing von E in wbf beachten, sieht mir zu schnell aus. Mehr habe ich mir nicht angesehen.
ist es nicht besser wenn die Daten zuers stabil anliegen, und dann der Enable Pin gepunsed wird? sollte doch aber zumindest keinen unterschied machen, ich werds aber mal ausprobieren. was mir aber grad auffällt, im datenblatt stehts tatsächlich so drin, vermutlich werden die Daten erst mit fallender Flanke übernommen. was das prüfen des busy-flags angeht habe ich mir gedacht, dass ich wenn ich unmittelbar bevor einer operation (wenn seit der letzten schon jede menge zeit vergengen ist) das busy-flag prüfe, die wartezeit minimieren kann. wobei hierzu das datenblatt keine eindeutige aussage macht. mfg DerDings Der
Hallo... Du liest den Port ein, maskierst das benötigte Nibble, ORst deine Daten rein und ... Neee, gibst nicht etwa die Daten wieder an den Port aus, sondern rufst erstmal lcd_wbf auf und lässt dir von lcd_wbf den Port (unterm Hintern) ändern... Das sein nix gut... 8-(( in iotmp, LCD_D_PORT andi iotmp, 0b11110000 ;or iobuf, iotmp ----- rcall lcd_wbf ;wait until LCD in ready ----- out LCD_D_PORT, iobuf ;output Abhilfe: Du rufst lcd_wbf gleich am Anfang der Routine auf, noch ehe du den Port einliest. Den Rest habe ich mir nicht näher angesehen, auch nicht lcd_wbf. Übrigens: Einen echten Vorteil hast du erst, wenn du jede LCD-Steuerleitung an einen anderen Port anschließen kannst und auch bei den Datenleitungen das Nibble wählen kannst (oberes oder unteres). Auf diese Art gelingt es dir, die Spezialfunktionspins des AVRs (Mega8) frei zu bekommen. ...
hallo, und danke für die antworten, das problem lag darin, dass lcd_wbf die RW-leiung lich wieder zurückgesetzt hat. jetzt funktioniert es soweit. vielen Dankt auf jeden fall, denn ohne die tipps währe ich wahrscheinlich nicht drauf gekommen mfg DerDings Der
Hallo! Ich wollte wissen, ob mir jemand leicht verständlich erklären kann, wie ich das Pollin-LCD ansteuern muss, damit es klappt. Ich verstehe nämlich Assembler überhaupt nicht. Außerdem wird ein Anfangs richtiger Code wieder berichtigt, weil er doch falsch war, usw. Weil ich hoffe, dass die Lösung hier die richtige ist, bitte ich um eine Anleitung, wie ich alles machen muss. Ich "programmiere" (wenn man es programmieren nennen darf) mit Bascom-AVR und will über einen At90S2313 einen Text auf dem Pollin WINTEK WD-C2704M ausgeben. Hab schon so viel ausprobiert. Oft mit geringem Erfolg. Zeigt eben einfach Zeichen an, die da nicht hingehören. Ich hoffe, mir kann jemand helfen. Danke! Simon
Hallo! Ich wollte wissen, ob mir jemand leicht verständlich erklären kann, wie ich das Pollin-LCD ansteuern muss, damit es klappt. Ich verstehe nämlich Assembler überhaupt nicht. Außerdem wird ein Anfangs richtiger Code wieder berichtigt, weil er doch falsch war, usw. Weil ich hoffe, dass die Lösung hier die richtige ist, bitte ich um eine Anleitung, wie ich alles machen muss. Ich "programmiere" (wenn man es programmieren nennen darf) mit Bascom-AVR und will über einen At90S2313 einen Text auf dem Pollin WINTEK WD-C2704M ausgeben. Hab schon so viel ausprobiert. Oft mit geringem Erfolg. Zeigt eben einfach Zeichen an, die da nicht hingehören. Ich hoffe, mir kann jemand helfen. Danke! Simon
Mit BASCOM kann ich das auch nicht. Wie spricht man unter BASCOM denn ein 4x40-LCD an? Das hat doch auch 2 Controller. Damit müsste das 4x27-LCD doch auch laufen. "Außerdem wird ein Anfangs richtiger Code wieder berichtigt, weil er doch falsch war, usw." Nunja, bei mir läuft der (von mir gepostete) Code stabil, was nicht heißt, dass man ihn nicht verbessern könnte. Der Zähler in der Routine zum Warten auf das Busy-Flag könnte etwas höher gesetzt werden oder auch ganz entfernt werden. Man kann auch das Prüfen des Busy-Flags durch eine Warteschleife ersetzen und die Rechenleistung vertrödeln. Aber dazu sollte man sich schon auf Assemblerebene "herablassen". Da BASCOM ziemlich alles tut, den User zu "verdummen", wird man damit nur schwer Hardware ansprechen können, für die BASCOM keine fertigen Bibliotheken mitbringt. Das ist die Kehrseite des "schnellen Erfolgs" mit diesem "AVR-Baukasten". Man sollte also darauf achten, dass man sich nur BASCOM-kompatible Hardware anschafft. ...
Ist ja komisch, dass meine Antwort nicht hier erscheint, sondern hier: http://www.mikrocontroller.net/forum-extern/read-1-164017.html#168865 ...
Ähm...Hannes... Keine Ahnung, was inzwischen alles war, aber Deine Antwort erscheint doch hier und Du hast mit Deinem Link einen "rekursiven" Link erzeugt der das hier 2 Posts weiter oben anzeigt. Wenn das mal das Forum verkraftet, hoffentlich ist genügend Stack vorhanden ;-) MfG Andi
Ach Andi... Dann schau dir den Link mal genauer an, das eine ist Forum, das andere forum-extern. Es waren vermutlich Wartungsarbeiten. Gruß (und viel Spaß bei der Party mit den bunten Eiern)... ...HanneS...
Ouh :o Jetzt bin ich aber baff! Habe mich immer gewundert, warum beim Klick in einer Benachrichtigung das Format so komisch ist aber nie auf die Adresse gekuckt. Sorry Hannes! MfG Andi
Vier Augen sehen eben mehr als zwei. Eigentlich schade, dass wir keine Nachbarn sind. ...
Hallo Hannes, Du hast geschrieben, dass Du Dein Pollin-LCD 4x27 (WD-C2704M-1HNN) über eine Buchse angeschlossen hast. Ich habe ebenfalls das Display und bin verzweifelt auf der Suche nach einer passenden Buchse zum Anschluß des Folienleiters der vom Display kommt (saubere Lösung). Die Fa. Pollin konnte mir nicht weiterhelfen. Wenn ich es richtig lese, hast Du Dein Display über genau eine solche Folienleiter-Buchse angeschlossen. Könntest Du mir vielleicht sagen um welche Buchse es sich handelt, und wo ich sie bekomme? Danke Viele Grüße Andreas Bachschneider
Hallo Andreas... Der verwendete Steckverbinder hat einige Pins mehr als benötigt, man muss den Folienleiter also vorsichtig und einseitig "auf Anschlag" einführen. Dass Pollin dir nicht helfen konnte hat vermutlich mit deren Kenntnisstand zu tun. ;-) Denn der verwendete Steckverbinder stammt von Pollin, und zwar aus dem Sortiment Computersteckverbinder. Viel Erfolg... ...HanneS...
Hallo, also nachdem ich im anderen Threat den link hierdrauf bekommen hab und mein erstes Problem auch schon gelöst ist, nun noch was anderes: Ich bekomm das "print16" Macro nicht zum laufen ^^ ich weise am Anfang vom Programm temh und teml 2 Werte zu (also einmal das Low und einmal das High von ner Konstanten, zum Testen) .equ temperaturtest = 766 (...) ldi temh, HIGH(temperaturtest) ldi teml, LOW(temperaturtest) ausgabe sollte sein: 76,6 wenn ich jetzt aufrufe: print16 temh, teml , 0, 1 => 766 print16 temh, teml , 1, 1 => 766 print16 temh, teml , 2, 1 => 766 print16 temh, teml , 3, 1 => 0766 print16 temh, teml , 4, 1 => 0766 print16 temh, teml , 5, 1 => ,766 print16 temh, teml , 6, 1 => 766 welches ist der richtige aufruf für 76,6??? keiner der von mir probierten ist es, und das Argument @3 interessiert das programm anscheinend auch nicht wirklcih. Ich habe von der LCD_4x27.inc und LCDprint.inc alles übernommen was gebraucht wird, und sonst nichts geändert... Wär nett wen mir da jemand weiterhelfen kann.
So habs jetz mal mit ner 8 bit zahl probiert (197): print16 temh, teml , 0, 1 => 1,97 print16 temh, teml , 1, 1 => 1,97 print16 temh, teml , 2, 1 => 1,97 print16 temh, teml , 3, 1 => 01,97 print16 temh, teml , 4, 1 => 01,97 print16 temh, teml , 5, 1 => 1,97 print16 temh, teml , 6, 1 => 1,97 sprich immer bei 3 und 4 is was anders^^ das hat doch bestimmt was zu bedeuten, oder? :)
noch einwas: wenn ich 199, 200 und 201 als daten nehm kommt folgendes: 1,99 20 201 sprich nicht der übergang 8 => 16 bit is wichtig sondern wohl 199 => 200 ^^ wünsch euch nen schönen abend und danke!
Also deine Probleme sind mir noch nicht aufgefallen. Ich behaupte aber auch nicht, dass mein Code 100% ok ist. Zum Aufruf: ; print16 H-reg,L-Reg,Komma,[using]+[sig]+[fnul] ;Gibt 16-Bit-Zahl als Ziffern aus ;H-Reg,L-Reg enthält die Zahl ;Komma ist die Anzahl der Nachkommastellen ;using erzwingt formatierte Ausgabe (Print Using) ;sig erzwingt Vorzeichen ;fnul erzwingt Führungsnullen Wobei die Konstanten 'using', 'sig' und 'fnul' die Einzelbits 5, 6 und 7 benennen: .equ using=0b00100000 ;Flag für formatierte Ausgabe (Print Using) .equ sig = 0b01000000 ;Flag für Vorzeichen-Zahl (signed Integer) .equ fnul= 0b10000000 ;Flag für Führungsnullen Im aufrufenden Macro werden dann Kommastellen und die Flags für die Formatierung zu einer Variablen zusammengefasst: ldi wh,(@3 & $e0)|16|(6-(@2 & 15)) ;Mode-Flags und Komma-Position Dein Aufruf: print16 temh, teml , 0, 1 => 1,97 print16 temh, teml , 1, 1 => 1,97 print16 temh, teml , 2, 1 => 1,97 print16 temh, teml , 3, 1 => 01,97 print16 temh, teml , 4, 1 => 01,97 print16 temh, teml , 5, 1 => 1,97 print16 temh, teml , 6, 1 => 1,97 nimmt aber als Formatieranweisung nicht die vereinbarten Konstanten oder deren Bits (5, 6 und 7) sondern die Zahl 1 (die dazu unzulässig ist). Da könnte sich etwas verheddern... :D Ich habe im Moment keine aufgebaute Hardware griffbereit, kann es also im Moment nicht testen. Werde es aber bei Gelegenheit tun. Ich muss die Routinen sowiso überarbeiten, denn ich beginne ein Projekt mit Mega32 und LCD 4x20. Da muss also der 4x20-Treiber geschrieben werden (mit Locate, Umleitung auf UART und Interruptausgabe über Ringbuffer). Ein Equivalent für das 8x24-LCD mit Controller M50530 ist hier schon beschrieben: http://www.hanneslux.de/avr/stopuhr/index.html Und bei der Gelegenheit werden auch die Printroutinen etwas umgestellt, so dass mehr mit SRAM gemacht wird. Ich will dabei die Macros etwas schlanker gestalten. Voraussichtlich bekommt die LCD-Ausgabe auch Exklusiv-Register, das spart dann jede Menge Push & Pop in den Macros. ...
Ok also das mit dem Using usw hab cih jetz verstanden, sprich wenn ich nen vorzeichen haben will mach ich: print16 temh, teml , 6, sig aber wie bekomm ich jetzt bei einer 3 stelligen zahl nach den ersten beiden stellen das komma? das hab ich noch nicht so ganz geraft, hab ich da auch was übersehen?
> aber wie bekomm ich jetzt bei einer 3 stelligen zahl nach den ersten > beiden stellen das komma? Falsche Betrachtungsweise... Du kannst im Vorfeld nicht wissen, wieviele Stellen die Zahl haben wird. Daher kann man die Komma-Ausgabeposition auch nicht von vorn zählen. Die Routinen sind Ganzzahl-Routinen. Daran ändert sich auch nix, wenn sie eine Möglichkeit bieten, in die Ziffernfolge die zusätzliche Ausgabe eines Kommas einzubinden. Sinn der Aktion ist es, dass man, wenn man z.B. einen Wert zweistellig haben will, einfach mit dem Hundertfachen des Wertes rechnet (die Rechenroutine so auslegt, dass das Hundertfache des gewünschten Ergebnisses herauskommt) und dann vor den letzten zwei Stellen das Komma ausgeben lässt. Und damit das Ganze flexibel ist, kann man angeben, wo das Komma ausgegeben werden soll, also wieviele Stellen hinter dem Komma stehen sollen. Folgender Programmcode, noch in der Reset-Routine eines Programms, gibt das aus, was im Anhang zu sehen ist:
1 | ;Debug -------------------------------- |
2 | |
3 | ldi r16,low(12345) |
4 | ldi r17,high(12345) |
5 | |
6 | locate 0,0 |
7 | print16 r17,r16,0,0 |
8 | |
9 | locate 1,0 |
10 | print16 r17,r16,1,0 |
11 | |
12 | locate 2,0 |
13 | print16 r17,r16,2,0 |
14 | |
15 | locate 3,0 |
16 | print16 r17,r16,3,0 |
17 | |
18 | stop: |
19 | rjmp stop |
Da hättest du aber auch selbst drauf kommen können. Eine Analyse des Codes hätte dir das sicher gezeigt, denn die Kommentare stehen da nicht zum Spaß drin. Und eigentlich sollte man nur Code verwenden, den man auch versteht, anderenfalls kann es böse Überraschungen geben. Man muss ja nicht alles selbst schreiben, aber zumindest verstehen... ...
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.