Forum: Projekte & Code Display Ansteuerung mit ISR auf 8051


von Stephan H. (stephan-)


Angehängte Dateien:

Lesenswert?

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

von Stephan H. (stephan-)


Angehängte Dateien:

Lesenswert?

warscheinlich braucht der Eine oder Andere das noch dazu.

So denn Danke

Stephan

von Pieter (Gast)


Lesenswert?

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

von Stephan H. (stephan-)


Lesenswert?

@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

von Pieter (Gast)


Lesenswert?

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

von peter dannegger (Gast)


Angehängte Dateien:

Lesenswert?

Anbei mal meine 4Bit LCD-Routinen in Assembler.

Ich programmiere aber hauptsächlich in C.


Peter

von Stephan H. (stephan-)


Lesenswert?

@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

von Stephan H. (stephan-)


Lesenswert?

@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

von Pieter (Gast)


Lesenswert?

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

von Stephan H. (stephan-)


Lesenswert?

@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.

von Peter D. (peda)


Angehängte Dateien:

Lesenswert?

"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

von Andreas (Gast)


Lesenswert?

"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.

von Pieter (Gast)


Angehängte Dateien:

Lesenswert?

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

von Stephan H. (stephan-)


Lesenswert?

@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

von Stephan H. (stephan-)


Angehängte Dateien:

Lesenswert?

@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.

von Pieter (Gast)


Lesenswert?

Stephan, HALT!

>>Zähler 1 und 01 werden ja mit 29H = ASCII 0-1 vorgeladen

'0'-1 ==>> 2FH!

Gruß
Pieter

von Stephan H. (stephan-)


Lesenswert?

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 ???

von Pieter (Gast)


Angehängte Dateien:

Lesenswert?

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

von Stephan H. (stephan-)


Lesenswert?

@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

von Pieter (Gast)


Lesenswert?

Hi Stephan,

Womit Anzeigen ???-->>swcadiii.exe von LT.

Dann werde ich mal auf das Projekt warten.

Mit Gruß
Pieter

von Stephan H. (stephan-)


Lesenswert?

ist schon online !!!!
Ausgeschlafen....?.... Tastaur noch auf der Stirn ??

Spaß !!!


so denn

von Stephan H. (stephan-)


Lesenswert?

tja Pieter
hätte Dich ja exclusiv benachrichtig, aber Peter antwortet ja auch
nicht auf Mails. Und Dein E-Mail Adresse... .... suche ich noch

von peter dannegger (Gast)


Lesenswert?

@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

von Stephan H. (stephan-)


Lesenswert?

@Peter,
da muß ich doch glatt noch mal wühlen.........
ich melde mich.


Danke

von Stephan H. (stephan-)


Lesenswert?

@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
Noch kein Account? Hier anmelden.