Hallo Leute, ich habe hier einen Baustein für ein Proggi. Ein LCD wird in einer ISR ohne das Hauptproggi aktualisiert. Der Inhalt des Display liegt als ASCI Werte im RAM 1:1 ab 60h Das Display liegt mit D4 an P1.0 bis D7 an P1.3, RS an P1.4 und E an P1.5. RD/WR liegt an Masse !!! Da die ISR alle 7 ms einen Wert ausgibt muß Busy nicht gelesen werden. Die Routine ist noch nicht getestet und es können noch Fehler drin sein. Ist der 1. Entwurf !!!! Doppel Alpha !!! Ich will auch nicht über den Sinn oder UnSinn dieser ISR diskutieren. Ich möchte nur wissen ob es auch kürzer gehen würde ?? Ideen, Anregungen sind gesucht. JA JA ich weis das 1. Swap hätte ich sparen können wenn ich das Display im Schaltplan auf 1.4 - 1.7 gelegt hätte. Asche auf mein Haupt !!! Nobody is perfect !! Wo würde sich Code sparen lassen ?? Die 7 ms sind nicht absolut. Aber bei 32 Stellen kommt man auf ca. 4 Display Durchläufe / Sekunde. Wie gesagt ein Baustein !! Kein Push, kein Init , etc.. Nur die blanke ISR. Danke Euch
warscheinlich braucht der Eine oder Andere das noch dazu. So denn Danke Stephan
moin moin, kleine Anmerkung von mir... Bist Du Dir sicher, das der Zugriff mit movX a,@R0 beim ED2 auf den XRAM einmalig ist? Daten: JNB daten, pause_init DJNZ ZZ,Zeile1 ; SZ=Sz-1, schon 16 stellen ? JMP Zeile2 ; ja ;den Teil hierher und 2!!! Bytes gespart Zeile2: JB zeile2,home ; 2. Zeile geschrieben ?? MOV ZZ,#10h ; Zeilenzähler rüsetzen MOV befehlbyte,#C0h ; Display Cursor an Anfang 2. Zeile SETB Befehl SETB zeile2 JMP Ende_ISR Zeile1: MOV R0,SZ ; ^^ hoo, nicht gepusht!! besser XCH R0,SZ ; zurück nicht vergessen!!! Mit Gruß Pieter
@Pieter,, moin moin... Wer sagt was von ED2 ?? Aufmerksamer Leser..... Ich denke das sollte MOV A,@R0 sein. Habe kein ext RAM. Fehler !! Jetzt nur noch einfach Alpha ;-)) Nicht gepusht !!! "Mov R0,SZ" Wozu auch?? SZ ist einem DPTR gleichzusetzen und ein Byte im RAM. Genau deswegen will ich das ja als ISR haben. Da muß ich mir im Proggi um nichts Sorgen machen. Einzig R0 und A wird geändert. let´s pushen !! Den Teil 2 Byte gespart schaue ich mir heute Abend mal an. Bin auf Arbeit. ;-( Danke so denn Stephan
moin moin, vergiss das mal mit dem xch... Mach lieber eine Bankumschaltung über PSW und nimm eine Bank zur Sicherung und als Variablenspeicher. mal schnell (bin auf arbeit)-: SZ EQU 12 ;R4 Dispaly Stellenzähler pausenwert EQU 13 ;R5 Wert für Pause * 25ms befehlbyte EQU 14 ;R6 Wert für Befehl ZZ EQU 15 ;R7 Zeilenzähler für Display mov 11,psw orl psw,Bank1 mov 10, a zeichenausgabe Daten: JNB daten, pause_init DJNZ R7,Zeile1 ; SZ=Sz-1, schon 16 stellen ? JB zeile2,home ; 2. Zeile geschrieben ?? MOV R7,#10h ; Zeilenzähler rüsetzen MOV R6,#C0h ; Display Cursor an Anfang 2. Zeile SETB Befehl SETB zeile2 JMP Ende_ISR Zeile1: mov A,@R0 ; Wert für Display holen SWAP A ; Nibble tauschen ANL A,#0Fh ; Maske orl A,#10h ; RS auf high MOV A,p1 ; wert ausgeben SETB Enable ; LCD aktivieren CLR Enable ; Display übernimmt Daten mov A,@R0 ; ANL A,#0Fh ; Maske orl A,#10h ; RS auf high MOV p1,A SETB Enable CLR Enable Ende_ISR: mov a,10 mov psw,11 reti Mit Gruß Pieter
Anbei mal meine 4Bit LCD-Routinen in Assembler. Ich programmiere aber hauptsächlich in C. Peter
@Peter, nicht schlecht. Allerdings machst Du das gesamte Handling des LCD (Zeilenschaltung) dann im Hauptproggi.Die Idee das nibblen als 1 gemeinsame Routine für Befehle und Daten zu nehmen hatte ich auch, allerdings verworfen. Warum ?? Keine Ahnung !! Schaue ich mir noch mal in Ruhe an. Wird zwar weniger Code, aber die Runtime wird wohl warscheinlich länger wegen der Rücksprünge. Muß ich mal durchrechnen. Sag mal ist Dir ein Tool bekannt mit dem man die Laufzeit einer Routine berechnen kann ??( ne kein Taschenrechner ) . Ähnlich dem Codegenerator von Buchmann. OSZ Freq. eingeben ASM Code reinkopieren und Wert ablesen. Wäre manchmal sehr hilfreich. PS.: "C" wäre für Berechnungen manchmal wirklich hilfreich. Kann ich aber nicht. Habe nicht so viele Klammern auf der Tastatur ;-/ Nee im Ernst habe schon 2 Mal Anlauf genommen............ Gruß Stephan
@Pieter, wenn unsere Chefs wüßten........ Schaue ich mir heute Abend mal an. Aber eigentlich ist der Hintergrund, wo wenig wie möglich am MCU Status zu fummeln. Macht dem Hauptproggi nur unnötige Arbeit. Wenn ich Speicherstellen nehme kann mit PSW passieren was will. Ich bin immer sauber !!! Allerdings brauchte ich die Bänke auf 8051 bisher nicht. Habe ich auf Z80 auch nur SEHR sparsam benutzt. 1 Mal den Überblick verloren........... Und da ich ohne Struktugramm schreibe....... Danke ich melde mich dazu. Stephan
moin moin, - Mit Z80 Assembler bin ich großgeworden. - Mein Float-modul ist aus dem sdcc "nachgenutzt". - Als LCD verwende ich meist 4x20 - Takte berechnen, geht nur bei Gradeausprogrammen, werde mal sehen ob ich das noch in meinen Assembler einbauen kann.. Gruß Pieter
@Pieter und Peter So Jungs, ich habe mir Eure Vorschläge und Codes mal angeschaut. Danke erstmal. Ich hofftte ja auf mehr Meinungen, aber offensichtlich nutzt der Hobby Programmierer doch lieber verkrüppelte "RISC" MCU´s. Naja, da muß man nicht so "VIELE" Befehle lernen und überlegen was man damit machen kann. Wie dem auch sei.... @Peter Deine Routine ist genial kurz. Aber wie ich auf Arbeit in der Kürze schon feststellte, das LCD Handling bleibt leider außen vor. Nimmst Du Auto Inkrement oder setzt Du den Cursor jedes Mal vor den ASCI Werten ?? ABER ein Tip von mir.... so ich denn darf... Ich weis nicht was Du an P1.6-7 dran hast. Ich würde die Zeile ANL P1,#0F0 mit ANL P1,#20h ersetzen. Du willst ja warscheinlich nur CLR RS machen. Wenn an P1.6 und 7 zB. nen Motor mit Drehrichtungsumkehr hängen würde, würdest du Dich wundern!! Never Change a running System. !! Ändere nur die Bits die Du wirklich brauchst !!!! Für nen "C" Freak trotzdem guter Code !!!! Danke Dir. Hätte aber gern ein Kommentar von dir zum Timing meiner ISR. wie geasgt, die läuft alles 7 ms auf. Vergesst alles wo 25 ms steht !!! War die 1. Idee und die Kommentare sind noch drin. @Pieter, wir sollten wirklich nicht auf Arbeit....die Chefs ...... Dabei hast Du einige Sachen vergessen bzw. übersehen.... na auf Arbeit.... Unsere Routinen funzen auf gleiche Weise. Nur nimmst Du nen anderen Registersatz und ich Speicherstellen in int. RAM. Wo bleibt bei Dir der INC R4 ??? Dein Display gibt auf allen Stellen den gleichen Wert aus !! Wozu dient "Maske" ANL A,0FH ?? Hinterher setzt Du ein Bit von denen die Du vorher runter gerissen hast, (RS) wieder auf 1. Ich denke..überflüssig !!! OK. Du sparst 3 RAM Bytes ein, aber involvierst Reg Bank 1. Die muß ich im Programm unnötig berückschtigen. Aber sonst 1:1 wie mein Code. Fehler bei mir: ANL A,#1Fh um RS auf P1.4 zu setzen geht ja so nicht. Es sei P1.4 wäre schon 1. Richtig von Dir ..NUR ORL A,#10h. Den "AND A,#0Fh" können wir komplett formatieren. Wozu alles nullen ???? Was meintest Du mit "Maske " ?? Bei dem Befehl ?? Resüme ? 2 Fehler mehr entdeckt. Die Routine geht von Alpha nach Beta. Und ich Danke EUCH Beiden.
"Ich weis nicht was Du an P1.6-7 dran hast. Ich würde die Zeile ANL P1,#0F0 mit ANL P1,#20h ersetzen." P1.6 und P1.7 werden mit 1 verundet, bleiben also unverändert. Es sollen ja nur die Datenbits gelöscht werden, und danach werden mit "orl p1,a" wieder die nächsten Datenbits gesetzt. Ich hab das schnell mal aus meinem C-Programm extrahiert und die Pins geändert. Ich häng mal das komplette C-Programm ran mit dem erzeugten Assemblerlisting. Da siehst Du auch die Zeilenumschaltung für ein 2*16 LCD (10->40, 50->00). Peter
"Ich hofftte ja auf mehr Meinungen, aber offensichtlich nutzt der Hobby Programmierer doch lieber verkrüppelte "RISC" MCU´s. " Quatsch, was Besseres und Schnelleres gibt es im 8Bit-Bereich doch nicht ;) Ich nutze halt nur überwiegend C, deshalb halte ich mich aus solchen Topics raus.
moin moin, @Stephan der Teufel steckt wie immer im Detail, daher R4 ev. übersehen. Wollte nur Deine Routine mal anders schreiben. Im Anhang meine derzeitige LCD Ausgabe sowie die Float aus dem sdcc mit kurzem Demo. Da "normale" Assembler nicht mit Floatzahlen arbeiten, habe ich meinen dahin erweitert. Kannst Dir ja mal ansehen. @Peter Hast Du schon mal mit dem 89C5131 (USB) gearbeitet? Irgendwie komme ich bei der Enumeration nicht richtig weiter. Guurgel bringt auch nichts brauchbares. Mit Gruß Pieter
@Andreas ich hoffe Du fühlst Dich nicht angegriffen. Nicht meine Absicht !! Wie sagt Peter immer .. "Wer in der Lage ist über seinen Tellerrand zu schauen wird sehen...." Es gibt übrigens auch 1 State MCU´s mit 8051 komp. Kern und richtigem Interruptsystem mit Prioritäten. Bei vollem Befehlssatz !!! Wenn ich Basic nehmen würde, bräuchte ich wohl auch was schnelleres. Was macht man eigentlich mit so viel Rechenpower ?? Nur mal so....Nicht perönlich gemeint !!! Machs gut. Stephan
@Pieter, @Peter, es ist vollbracht. Bild anbei. Ich mache noch den schaltplan fertig und poste es dann in der Codesammlung. Dann habe alles was davon. Nach 30 Min Fehlersuche ( Display zeigte auf Zähler 1 und 01 nur Müll an) hat´s Klick gemacht. Zähler 1 und 01 werden ja mit 29H = ASCII 0-1 vorgeladen. ( was gelernt ) :-o Das habe ich natürlich Brav wie ich bin im Init getan....... und such und such und such......Display spinnt immer noch. Nur die Punkte, V und A und die 1/100 Volt stehen wie Brumme. und such und such...........Klick..... Raus aus Init und rein in die Routine.... I see..............It works. I´m so happy !! nice Day Today Also ich danke Euch für die Tips. Wir sehen uns Stephan ps.: Sorry ... keine Kamera....habe nur nen Nokia 6230i.
Stephan, HALT!
>>Zähler 1 und 01 werden ja mit 29H = ASCII 0-1 vorgeladen
'0'-1 ==>> 2FH!
Gruß
Pieter
wie wahr......Schreibfehler!!!! ...... da Routine ja geht. ASCII 0= 30h -1 immer noch 2Fh !!! Pieter, ich suche noch ne Idee für den I/U Wandler, außer OPV und Widerstände. Hast Du ne Idee ?? Habe schon mal nen wenig bei Linear und Analog geschnüffelt. wie zB AD8201, AD8202, LT6100 Hast Du Erfahrungen damit ???
Hi Stephan, hab mir mal den AD8202 angesehen, brauch auch einen R und geht nur bis 35V. Von LT habe ich mir mal das LTSpice (swcadiii.exe)geladen, damit kann man fast gut Schaltungen berechnen. Anbei mal eine Netzteilsimulation. Per Spannung (0..4V) wird Ua eingestellt und Ia begrenzt. Ua und Ia werden im Bereich 0..4V zurückgegeben. Mit Gruß Pieter
@Pieter, was sind das für Daten ??? Womit Anzeigen ??? Ich habe mit heute Samples LT ( 6101) und MAXIM ( MAX4172ESA) und AD bestellt. Mal sehen was kommt. Im Moment ist nur nen Widerstandsnetzwerk drin ( siehe Foto). Reicht aber zum testen. Stelle Projekt online. Was hältst Du davon ??? Danke Dir .. Machs gut Stephan
Hi Stephan, Womit Anzeigen ???-->>swcadiii.exe von LT. Dann werde ich mal auf das Projekt warten. Mit Gruß Pieter
ist schon online !!!! Ausgeschlafen....?.... Tastaur noch auf der Stirn ?? Spaß !!! so denn
tja Pieter hätte Dich ja exclusiv benachrichtig, aber Peter antwortet ja auch nicht auf Mails. Und Dein E-Mail Adresse... .... suche ich noch
@stephan Henning (Stephan) "aber Peter antwortet ja auch nicht auf Mails" Meine letzte Antwort ist vom 22.02.2006 Seitdem habe ich keine E-Mails mehr von Dir erhalten. Wenn Du Deinen E-Mail Account nicht gewechselt hast, sollten sie auch weiterhin durchs Spamfilter kommen. Kannst ja mal ne Testmail schicken. Peter
@Peter, da muß ich doch glatt noch mal wühlen......... ich melde mich. Danke
@Peter, die Mail ist am 4.4. raus gegangen. An danni@specs.de. Kam auch nicht als unzustellbar zurück. Naja ist ja jetzt eigentlich auch erledigt. Also machs gut
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.