hallo habe mir ein 8-kanal-dc-dimmer gebaut mit at90s8515 8-kanäle software pwm 8-tasten zum hochregeln und eine ship taste zum runterregeln funktioniert super,das programm habe ich hier mal entdeckt habe es ein wenig umgeändert. habe zuzeit ein 2x16 lcd display dran was anzeigt welche taste grade gedückt wurde das funktioniert auch. meine frage: 1.wie kann ich das realiesieren das im display angezeigt wird wie oft eine taste gedrückt wurde bis die volle helligkeit oder dunkeheit ausgang=0 oder der aktuelle wert angezeigt wird 2.welchen befehl brauche ich wenn ich ein 4x16 lcd display um in zeile 3 oder 4 springe die lcd display`s werden im 4bit modus betrieben programm ist im anhang vieleicht kann mir ja jemand ein bischen weiterhelfen. danke schon mal im vorraus
1. Gib doch einfach den Wert aus, den du gerade für die jeweilige PWM verwendest aus. 2. Das kann dir nur das Datenblatt verraten. Ich liege aber sehr wahrscheinlich richtig, wenn ich sage: "Der gleiche wie für die ersten beiden Zeilen!" Bei Standard-LCD liegt die 3. Zeile hinter der 1. Zeile und vor der 2. Zeile im Speicher.
Hi, zu 2.: Zeile 3 und 4 sind normalerweise die 'Fortsetzung' der Zeilen 1 bzw. 2. Das ist nix anderes als ein abgebrochenes 2x40 Zeichen Display. Also Startadresse Zeile 1 :0x80, Zeile 2: 0xc0, Zeile 3: 0x90 und Zeile 4: 0xd0.
Um was für ein Display handelt es sich denn genau? Ist es ein Display mi dem Controller KS0073 (z.B. EA DIP204) musst du beim initialisieren den 4-zeilen modus aktivieren, indem du die folgende Byte-Sequenz an das Display schickst (s.a. Datenblatt): 0x24 0x09 0x20
Hi Kay... Also das Grundprogramm (8-Kanal-Software-PWM) erkenne ich wieder. ;-) Eine Software-PWM benötigt aber schon etwas Rechenzeit, denn man möchte das Timer-Intervall recht kurz halten um eine möglichst hohe PWM-Frequenz zu erreichen. Der Rest des Programms sollte demnach auch recht effizient geschrieben werden. Wenn Du Feedback über ein LCD haben willst, so ist das machbar. Aber einige Dinge würde ich anders machen. - Das LCD muss nur einmal initialisiert werden, das macht man am besten in der Reset-Routine. Denn die Initialisierung dauert recht lange. - Das Löschen des LCD mit lcd_clear sollte auch recht sparsam eingesetzt werden da dieser Befehl auch recht lange dauert. Das Füllen des LCDs mit Leerzeichen geht bedeutend schneller. - Du solltest Dir unbedingt anschaun, wie man die Ausgabeposition auf dem LCD einstellt (Set DD-RAM-Address) und welcher Adressbereich für welche Zeile verantwortlich ist (wurde oben bereits genannt). Damit kannst Du dann sehr effizient nur die Bereiche des LCDs ändern, die im Moment auch verändert werden sollen. Eine Möglichkeit, die Ausgabeposition des 4x27-LCDs von Pollin zu setzen, ist hier beschrieben: http://www.mikrocontroller.net/forum/read-1-164017.html#164026 Beim 4x20-LCD sieht das etwas anders aus, da es nur einen Controller hat. Siehe LCD-Routinensammlung im Anhang... - Du musst nicht jedes Zeichen einzeln ausgeben, man kann sich Routinen basteln, die ganze Strings (Zeichenketten) ausgeben. Analysiere doch mal diese Routinensammlung http://www.mikrocontroller.net/forum/read-1-164017.html#164028 dann fällt Dir bestimmt ein, wie man es besser machen kann. - Der Einsatz von selbst definierten Macros kann (nicht nur bei LCD-Zugriff) allerhand Schreibarbeit sparen. Wie die oben genannten Routinen mittels Macro aufgerufen werden, findest Du hier: http://www.mikrocontroller.net/forum/read-1-164017.html#164207 http://www.hanneslux.de/avr/stopuhr/index.html http://www.hanneslux.de/avr/zuenduhr/index.html Viel Spaß... ...HanneS...
danke erst mal für die antworten. bin noch nicht son fux in sachen avr, aber am meisten würde mich interéssieren wie ich den momentanen sollwert des ausgabe kanals zB. PB0 oder PB1 im display anzeigen kann,da bin ich noch nicht so dahinter gkommen. als display verwende ich zurzeit noch ein 2x16, sollte aber demnächst ersetzt werden durch ein grössers zB. ein 4x20 wo mann mehr informationen anzeigen kann.
hi HanneS hab noch was vergessen, wie kann ich denn deine LCD_4x20.inc in (mein) programm übernehmen? um zum beispiel den aktuellen ausgabewert von PB0 anzuzeigen ein passendes beispiel (mein)programm wär sehr hilfreich wenn es denn geht. danke schon mal.
Der LCD-Treiber LCD_4x20.inc ist für Interrupt-Betrieb gedacht. Die Zeichenausgabe-Routine sollte per Timer-Interrupt alle etwa 1ms aufgerufen werden und ein Zeichen aus dem Ringbuffer ausgeben. Diese Routinen solltest Du also erst verwenden, wenn Du sie verstehst und an Deine Bedürfnisse anpassen kannst. Ich gab Dir das Beispiel, damit Du Dir das "Locate" ansehen kannst. Es müsste auch mit Deinen LCD-Routinen funktionieren, wenn Du die Variablennamen anpasst. Das Prinzip der Anwendung ist dann ganz einfach, mit locate zeile,spalte legst Du die Ausgabeposition fest, mit printf text1 gibst Du den Text aus dem Flash aus, den Du mit text1: .db "Das ist ein Text!",0 im Flash ablegst, wobei "text1:" das Label (zum Adressieren) ist und doe 0 am Ende die Ende-Kennung für die Stringausgabe-Routine, die mit dem Macro "printf" aufgerufen wird. Es ist darauf zu achten, dass der String incl. Ende-Kennung geradzahlig ist, weil der Flash in nur Doppelbyte-Schritten (Word) adressiert werden kann. Notfalls ist eine zweite 0 anzuhängen. Zum Ausgeben von Variablen (Register oder SRAM) kannst Du die Routinen benutzen, die Du in den oben genannten Links findest. Das wäre die Datei LCDprint.inc. Um Routinen aus einer Include-Datei benutzen zu können, müssen diese ins Programm eingebunden werden. Da sie vor dem ersten Aufruf stehen sollen, bietet sich an, die Include-Directiven zwischen den Interrupt-Vektoren und der Reset-Routine zu notieren. Ein Beispiel, wie man die Routinen einbindet und benutzt, findest Du in den obigen Links in der Datei Uhr2.asm. Den Ausgabewert von PB0 kannst Du nicht ausgeben, PB0 ist ein Bitwert, der kann nur 0 oder 1 sein. Du meinst vermutlich den zugehörigen PWM-Wert, der im Register r0 (r0..r7 für die 8 Werte) liegt. Diese Werte kannst Du ausgeben, indem Du (nach Positionierung des Ausgabecursors mittels Locate) das Register an die Ausgaberputine für 8-Bit-Zahl übergibst, was mit dem Macro print8 r0 erfolgt. Durch eine kleine Änderung an der Ausgaberoutine kannst Du (bei Bedarf) dreistellige Ausgabe (mit Führungsnullen) erzwingen. Da Du aber mit einem PWM-Zählumfang von 100 (.equ pwu=100) arbeitest, dürfte zweistellige Anzeige reichen. Da reicht sogar Dein 2x16-LCD, wenn Du in jeder Zeile 4 zweistellige Werte anzeigen lässt. Allerdings ist dann kein Platz mehr für erklärenden Text. Die Ausgaberoutine sollte dann von der Mainloop etwa 2..4 mal pro Sekunde aufgerufen werden und könnte so aussehen: locate 0,0 ;erste Position der ersten Zeile print8 r0 ;1. Wert print '%' ;Prozent-Zeichen print ' ' ;Leerzeichen print8 r1 ;2. Wert print '%' ;Prozent-Zeichen print ' ' ;Leerzeichen print8 r2 ;3. Wert print '%' ;Prozent-Zeichen print ' ' ;Leerzeichen print8 r3 ;4. Wert print '%' ;Prozent-Zeichen print ' ' ;Leerzeichen locate 1,0 ;erste Position der zweiten Zeile print8 r4 ;5. Wert print '%' ;Prozent-Zeichen print ' ' ;Leerzeichen print8 r5 ;6. Wert print '%' ;Prozent-Zeichen print ' ' ;Leerzeichen print8 r6 ;7. Wert print '%' ;Prozent-Zeichen print ' ' ;Leerzeichen print8 r7 ;8. Wert print '%' ;Prozent-Zeichen print ' ' ;Leerzeichen Falls die Werte dreistellig werden könnten (100) dann solltest Du pwu auf 99 setzen, damit die Werte garantiert zweistellig bleiben. Etwas effizienter wird es, wenn Du die Werte in einer Schleife über Pointerzugriff in ein anderes Register kopierst und die Ausgaberoutine nur einmal schreibst. Das spart Flash, kostet aber geringfügig mehr Rechenzeit. ...
hi hannes, danke erstmal für die mühe werd mir das in den nächsten tagen mal genau studieren damit ich das auch mal begreife,zurzeit habe ich auch nicht soviel zeit. falls ich damit noch probleme habe kann ich mich ja noch mal melden. danke nochmals
hallo hannes, sitze jetzt schon den ganzen tag dran und komm auf keinen grünen zweig. allerdings weiss ich ich nicht so richtig wo ich die richtigen zeilen im programm schreibe, Um den zugehörigen PWM-Wert, der im Register r0..r7 anzeigen zulassen . besteht denn die möglichkeit mal nur für einen wert das programm zum laufen zubringen, wo ich denn weiter üben kann. ihr hab ja da viel mehr erfahrung als ich. habe das programm mal angehängt soweit ich gekommen bin hoffe ich gehe hier keinen aufn geist mfg kay
Also so (wie im Anhang) funktioniert es. Dazu habe ich schnell noch einen LCD-Treiber auf 2x16 angepasst, der folgt im nächsten Beitrag, denn ZIP mag ich im Diskussionsforum nicht so sehr. ...
Und hier ist der verwendete LCD-Treiber. Das eingebundene LCDprint poste ich hier nicht nochmal, es entspricht dem bereits als Link genannten LCDprint. ...
Und so (Anhang) sieht es aus. Ich hoffe, es dient Dir als Basis zum Weiterentwickeln. Das Programm ist übrigens alles Andere als optimal, da müsste Vieles verbessert werden. Zuerst sollte man die 8 Sollwerte aus den Registern ins SRAM verlagern. Dann gibt es die temporäre Variable 'temp', aber auch die temporären Variablen 'wl' und 'wh'. Da könnte mal aufgeräumt werden. Sowas passiert nunmal, wenn man mal schnell Routinen verschiedener Herkunft (oder aus verschiedenen "Epochen") zusammenkopiert. Übrigens: Wenn Du beim Assemblieren Fehlermeldungen bekommst, dann drück mal die F4-Taste oder mach' einen Doppelklick auf die betreffende Fehlermeldung. "Da werden Sie geholfen..." Achja, da ich keinen AT90S8515 mehr da habe (sind alle für die Feuerwerk-Zündgeräte draufgegangen), musste ich das Programm auf Mega8515 umschreiben, indem ich die Interrupt-Sprungtabelle ausgetauscht habe. Ich habe den internen Oszillator auf 8MHz eingestellt. Viel Spaß damit... ...
hi hannes, danke nochmal kann ich mir dann mal genau anschauen und studieren so jetzt muss ich zur arbeit. danke. mfg kay
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.