Seltsames Programmieren

Begonnen von picass, 17.10.2024, 19:02:29 CEST

Vorheriges Thema - Nächstes Thema

picass

Versuche schon seit geraumer Zeit, so etwas Einfaches wie eine Übersetzung eines Progs, welches in der Alt-Form der Assemblersprache unter MPASM geschrieben wurde. Übrigens von dem Übervater "Sprut". Da gibts Dinge, rsp. Ausdrücke, an denen ich mich festbeiße, aber auch solche, über die ich nur den Kopf schütteln kann. Das erste Beispiel passt wohl für Beides. Da geht es in einem Prog - geschrieben für einen PIC16F84 - um die Initialisierung und letztlich die Ausgabe von Text auf ein LCD-Display. In der Ausgaberoutine "Hallo ausgeben" finden sich solche Zeilen wie:
- movlw 'H'
- movwf OutLcdDaten

Was habe ich übersehen? Bei diesem Befehl wird doch eine Zahl übergeben und kein Buchstabe?!
Grüße, picass

Ottmar

Nochmals, da ist was dumm gelaufen, daher eine Bitte an den ADMIN den vorhergehenden Beitrag zu löschen!

movlw "H"                  schreibt den Wert Ascii(72) ins WREG
movwf OutLcdDten überträgt den  Inhalt des WREG in die Variable OutLcdDaten

Danach wird eine Subroutine zur Ausgabe des Zeichens aufgerufen.
Bei mir etwa so:

movlw  "H"
CALL        OutLcd_Data:
;..........................
  OutLcd_Data:
      ;sends 1 data-byte through the LCD 4bit-interface (2 nibbles)
  movwf    LcdData          ;copy Instruction from WREG to variable
  CALL    LcdBusy          ;LCD ready to receive next instruction?
  movf    LcdData,w        ;contents LCD-Data (Charakter)
  ANDLW    b'11110000'      ;Bitmask to select HI-nibble
  BANKSEL  LCD_LAT          ;Wechsel zu Bank 2
  movwf    LCD_LAT          ;LCD_PORT write Nibble to 4bit-databus
  bsf      LCD_RS            ;1=LCD-Data-mode
  bsf      LCD_E            ;enable LCD 4bit-databus
  nop                        ;toggle
  bcf      LCD_E            ;disable databus
  BANKSEL  0
  swapf    LcdData, w        ;change the nibbles
  andlw    b'11110000'      ;Bitmask to select the LO-nibble
  BANKSEL  LCD_LAT
  movwf    LCD_LAT          ;LATx /LCD_PORT write Nibble to 4bit-bus
  bsf      LCD_RS            ;1=LCD-Data-mode
  bsf      LCD_E            ;enable LCD 4bit-databus
  nop                        ;toggle
  bcf      LCD_E            ;databus is now disabled  
  bcf      LCD_RS            ;=0 LCD-control-mode
  BANKSEL  0                ;bank 0
  RETURN


Funktion:
LcdData = b'01001000' = d'72" = 0x48
Mit LcdBusy wird gefragt, ob das LCD mit etwas anderem beschäftig ist, z.B. einer anderen Ausgabe. Das Byte wird nun in sein oberes, bzw. unteres Nibble zerlegt und jedes Nibble wird einzeln mit
bsf Lcd_E in das LCD übertragen.
bsf LCD_RS schaltet das LCD auf Datenempfang um.
Daten: ausgebbare zeichen
bcf LCD_RS wird verwendet wenn eine Instruktion, z.B. eine Ausgabeadress verwendet werden soll.

mfG Ottmar

Ottmar


pic18


picass

Sicher ist ein Apostroph richtig.
Anbei: das ist typisch für die vieeeelen Stolperstellen, mit denen man leben muss, wenn man nicht täglich und beruflich, sondern als Gelegenheitstäter sich auf Assembler einlässt.

Danke, Ottmar, für deine Erläuterung und dein Beispiel. Werde heute im Laufe des Tages das zu verarbeiten versuchen. Bitte bleibt in diesem Fred am Ball, es gibt noch Anderes, was mir die vermeindlich "einfache Übersetzung" vom alten MPASM zur mittleren Version des MPASM X [bis Version 5.35] schwer macht.
Grüße, picass

pic18

Zitat"einfache Übersetzung" vom alten MPASM zur mittleren Version des MPASM X

kannst Du den Assembler MPASM nicht integrieren? Ich mache es schon immer mit dem C-Compiler, benutze noch den alten C18 Compiler auf MPLABX

Ottmar

@picass
Temp RES 1
............
movlw  d'5'  -> dezimal 5
movlw  .5    -> dezimal 5
movlw  "H"   -> automatische Wandlung zu ASCii(72)
................
movlw  LOW  Temp   -> Adresse Low-Byte des Registers "Temp"
movlw  HIGH Temp   ->         HIG-Byte
.................
Out_LCD_Menue:
;--Ausgabe z.B. Text-Infos oder eine Ausgabemase: "Vdd: ...V" Der Meßwert wird dann
; imweiteren Programmlauf eingefügt
  movlw    HIGH table_start    ;H-Byte der Adresse einer LUT (LookUpTable)
                               ;mit Text zur LCD-Ausgabee
  movwf    pntr1               ;Adresse H-Byte in H-Zeiger
  movlw    LOW  table_start    ;dasselbe, allerdings L-Byte 
  movwf    pntr0 
  movlw    d'4'                ;Übergabe im WREG ->LCD 4zeilige Tabellenausgabe
  CALL     LcdOut_Table_1      ;Subroutine zur Ausgabe im LCD

pic18

Leider kann ich kein Bild-screen hochladen.
Unter " Produktion/ Set Projekt Configuration/Customize.." dann Conf: kannst Du den Compiler auswählen.
Bei mir steht in Compiler Toolchain:
mpasm (v5.54) [C:\Program Files (x86)\Microchip\mplabc18\v3.47\mpasm]

picass

#8
Ottmar....., du Schlingel! Du bist für mich viel zu schnell. Habe gerade erst dein voriges Programm angeschaut und zu einer praktischen Umsetzung - also dem Versuch einer Ausgabe - ist noch ein weiter Weg. Dieses vorige Prog ist - soweit ich das richtig sehe - der gleiche Bestandteil wie der im Sprut-Prog, nur dass andere Konstante/Variable gewählt wurden. Wie auch immer...., gemach.

pic18: einen Screenshot kannst du ohne Problem in das einfache Win-Prog im Zubehör namens "Paint" einfügen und dann in beliebigen Formaten - falls möglich natürlich J-Peg - in eine hier einstellbare Datei exportieren, rsp. speichern.

Gettz... Ottmar....kommt die angekündigte zweite Prob-Stelle. Ich hänge noch viel weiter vorne im Sprut'schen Prog fest. Da definiert er 7 Konstante. Die letzten fünf sind klar, aber mit den beiden ersten kann ich wenig anfangen. Ließe sich aber auch anders sagen: nach meiner Meinung ist er da tückisch fünfmal über Bande gegangen, um nichts anderes zu tun, als einen Port-Status auszulesen. Die beiden ersten Konstanten lauten:
PORTC  Equ PORTB
PORTD  Equ PORTB

Das verstehe ich so, dass der Status von PortB einmal der Constanten PORTC zugewiesen wird und ein ander mal derselbe B-Status der Constanten PORTD. Später in seinem Prog in den Teilprogs "BusyLoop", "OutLcdConrtrol" und "OutLcdDaten" werden diese K's benutzt, meist, um ein Bit zu setzen, einmal aber auch, um Port B zu lesen und das Ergebnis an eine Variable namens "LcdStatus" zu übergeben.

Jetzt frage ich mich recht bange, ob ich spinne oder der Sprut. Bei einem so niedlichen µC wie dem PIC16F84 mit der ungeheuren Portzahl von zwei (!) - in Worten: 2 (!) - führt er gänzlich unnötig zwei Konstante ein mit Namen von Ports, die es gar nicht gibt. Und einer der beiden Konstanten wird nur ein einziges Mal benutzt !!! Einfach gesagt: viel umständlicher geht es wirklich nicht. Statt einfach den Port auszulesen und das in die gewünschte Variable zu übergeben dann so'n Wirrwar! Konstante sollen das Leben erleichtern, aber nicht verdunkeln und zu minutenlangem Kontrollieren, Gegenlesen, Vergleichen, Grübeln und Sich-Wundern führen! Bin gerade stinkig. Und hoffe, dass so richtig gelesen zu haben. Watt'n Veitstanz um das einfache Auslesen eines Ports!!!
Grüße, picass

Ottmar

HI picass
Zitat
[Jetzt frage ich mich recht bange, ob ich spinne oder der Sprut. Bei einem so niedlichen µC wie dem PIC16F84 mit der ungeheuren Portzahl von zwei (!) - in Worten: 2 (!) - führt er gänzlich unnötig zwei Konstante ein...]

Sprut hat wohl früher mal für einen anderen PIC die LCD-Routine entworfen (ändert sich auch in Zukunft nicht mehr). Dabei wurde eben PORTC für die  Controlbits (E, RS, RW) und PORTD für die Datenübrtragung D7:4 verwendet. 

PORTC equ PORTB ; LCD-Control-Port
PORTD equ PORTB ; LCD-Daten-Port

damit erfolgt  die Anpassung der LCD-Routinen an den PORTB des 16F84 ohne die LCD-Routine umändern zu müssen.

Ich bevorzuge es da eindeutiger, wie nachstehend, obwohl es an der Auswirkung nichts ändert..
LCD_PORT  equ PORTB
LCD_LAT.....
LCD_TRIS....
LCD_E    equ  RB3 (ist ja tatsächlich nur die .3)
LCD_RW   equ  RB2
LCD_RS   equ  RB1

Control- und Datenport können auch getrennt sein. Die Datenbits 7:4 wird man wohl bei einem PORT belassen. Eine Trennung vom Controlport kann aber dann erforderlich sein wenn PORTB wie z.B. bei Deinem Lieblingspic, nur 4 Bits hat, dann kann wie folgt vorgegangen werden:
PORT C ist  nicht verfügbar, da hiervon die ANSEL/ANSELH-pins für den ADC gebraucht werden
LCD_PORT equ PORTB    ;RB7:4 -> LCD D7:4
LCD_CTRL equ PORTA    ;Controlbits
LCD_E equ    RA2      ;(ist ja tatsächlich nur die .2)
LCD_RW equ   RA1
LCD_RS equ   RA0

Die Controlbits werden dann mit 
bsf/bcf  LCD_CTRI, bsf/bcf LCD_E usw 1/0 gesetzt.

Bei der Initialisierung der Register (SFR's etc) kann man dann die Labels gleich mit  verwenden:
clrf   LCD_PORT
clrf   LCD_LAT       ; nicht beim 16F84
movlw  b......
movwf  LCD_TRIS      ; verwendet werden sollen 
movlw  b'.....
movwf  ANSEL
movlw  b'.....
movwf  ANSELH

Im Hautprogramm verbessert es die Übersicht, werden verschiedene Labels für den gleichen PORT verwendet. Braucht man z.B einen
KEY_PORT für Pushbuttons oder/und einen ADC_PORT für ein paar Analog-pins, weiß man auf den ersten Blick, um was es gerade geht.

Optimal ist es weiterhin die ganzen LCD-spezifischen Deklarationen und Unterprogramme in einer INIT-Datei unterzubringen, benannt nach dem LCD-Prozessor, z. B "HD44780_4Bit_Init.INC", Dann kann diese in jedem anderen Programm, stets wieder verwendbar, eingefügt und hinsichtlich des/der PORTs einfach angepasst werden: 
#include <HD44780_4Bit_Init.INC>

Ich kann Dir auch nicht ersparen, darauf hinzuweisen, daß Deine von Dir bevorzugte Taktfrequenz von 31kHz (wenn ich mich nicht irre), wohl am besten auf wenigstens 4MHz erhöhen werden sollte, falls eine rasche, nicht stotternde LCD-Ausgabe erreicht werden soll. Na, ja funktioniert wird es auch langsamer, dann kann man eben zusehen wie es funktioniert :-) .. :-).
8)
mfG Ottmar

picass

Zitat von: Ottmar in 18.10.2024, 23:48:18 CEST......Sprut hat wohl früher mal für einen anderen PIC die LCD-Routine entworfen......
Das hatte ich mir auch gedacht. Mache ich ja selbst so, dass in aller Regel für ein neues Projekt ein früher verwendetes Prog ausgesucht wird, welches in etwa sinnvoll aufzugreifen wäre und dann geht es ans Anpassen.

Au man......, Ottmar, das hat dich die Nachruhe gekostet, was mir gleich ein schlechtes Gewissen vermittelt. Und dann muss ich noch gestehen, dass ich nicht stante pede dran gehen kann, denn heute kommt zwecks Geburtstagsnachfeier Besuch von der puckeligen Verwandtschaft und bleibt auch bis in späte Stunden. Aber sei gewiss, dass ich den erstellten Ausdruck akribisch bearbeiten werde. Weil....., es muss endlich mal sein, dass auch ich als Spät-Nachzügler LCD-Ausgabe handeln kann. Danke für die Nachtschicht und ich hoffe, dass du ausreichend Zeit zum Ausschlafen gehabt haben wirst.
Danke und In diesem Sinne nun um 12:20 Uhr ein herzlicher Guten-Morgen-Gruß, Bernd


Ottmar

picass,
mach' Dir keine Sorgen um meine Nachtruhe, bin ein "Spät-ins-Bett-Geher". So viel Aufwand war das auch wieder nicht.

picass

Doch ! >:(  Mache mir doch Sorgen...! So spät in der Nacht und kurz vorm Schlummern sollte "der Tag" nicht nur ruhig ausklingen, sondern zudem nur dem eigenen Wohlbefinden gewidmet sein.

Der Besuch ist beschäftigt und ich habe die Pause natürlich doch genutzt, um in dein Blatt zu schauen. Und schon stoße ich wieder auf Unerwartetes, hier die Nutzung der Ports. Sprut hatte den einen ganzen Port B genutzt (eine LED an PA) und das würde ich aus Gründen der Einfachheit bei der Programm-Übernahme auch verwenden, aber dann halt den kompletten Port C. Nun schreibst du, dass der nicht zur Verfügung stünde, weil "...die ANSEL/ANSELH-Pins für den ADC" gebraucht würden. Hm....., welcher ADC? Im Sprut'schen Prog wird mal der Zustand des PortsB abgefragt, aber von ADC ist nichts zu sehen. Vermute, da ist dir von einem anderen Prog was in dein nächtliches Papier rein gerutscht.
Grüße, picass

Ottmar

NEIN!
Das war doch nur BEISPIELHAFT gemeint!!! - falls man in die Situation kommen sollte UNBEDINGT diese Analogpins verwenden zu müssen!
Natürlich nimmst Du den PORTC der von seinen 8 Pins her gesehen am Besten geeignet ist, die Rolle des LCD_PORT zu übernehmen!

Du schaltest bei Verwendung des PORTC einfach ANSEL und ANSELH mit clrf auf digital, fertig! Falls Du mal Analogpins brauchst, hast Du ja auch noch PORTB und PORTA zur Verfügung.

picass

Eine gute Woche ist rum und das Projekt: "einfaches Umschreiben eines fertigen Programmteils für LCD-Anzeige" zeitigt die berüchtigte "Leere Menge". Anfangs blinkte das erste Zeichenfeld noch, nun ist's völlig ruhig.
Aber was soll man sich beklagen? Offenkundig bin ich der Erste, welcher versucht, via Assembler und der "mittleren" MPLAB X-Version v5.20 so'ne Ansteuerung vorzunehmen. Neuland, wohin man tritt: auf dem Display sitzt der hinlänglich bekannte HD44780A00 . Das müsste ein einzeiliges Disp mit 8 Zeichen sein. Voll grottig.
Von eventuellen freundlich zugedachten Hilfsangeboten bitte freundlichst Abstand nehmen. Is klar, da sitzen wohl noch diverse Böcke drin. Ein oder zwei Runden gönne ich mir noch....und danach schmeiße ich diese Weltraumtechnik in den Müll und kehre zu 7-seg-Anzeigen zurück.
Bestgelaunte Grüße, picass

Passend dazu: Bilder hochladen ist heute nicht! >:(

pic18

Hier der Nachtrag vom 18.10.24, ich habe jetzt den Screnshot als JPEG gespeichert, diese Datei hierher gezogen. Folgende Fehlermeldung kommt.
Der Beitrag verursachte die folgenden Fehler, die behoben werden müssen:
Der Beitrag überschreitet die maximal erlaubte Länge (25000 Zeichen).

Hast Du ein einzeiliges oder 4-zeiliges Display? Kannst du mir mal dein Programmlisting schicken? Mit der Anzeige habe ich schon sehr viel experimentiert.

pic18


Ottmar

Hallo picass
wirf mal nicht so schnell die Flinte ins Korn!
Ich hab' mal für den 18F14K22 rasch ein Programm zur Minimalausgabe im LCD geschrieben.  Dabei mußte ich feststellen, daß die Ausgabe von Text aus eine  Tabelle beim 18F etwas anders läuft als bei den 16F. Nun, da beiß ich mich kurz durch, (vgl. Datenblatt "4.0 FLASH PROGRAM MEMORY). Habe aber keine  Zeit mehr da in den nächsten Tagen was zu tun.
Damit Du nicht die Lust verlierst anbei das Progrämmchen, welches wenigsten sowas ähnliches wie "Hallo" sagen kann.

mfG Ottmar

Ottmar

Die bildchensind nicht mitgegangen ???
1. zu erwartende Ausgabe
2. empfehlenswertes Interface (so ähnlich jedenfalls)
3. Die Steckbrettschaltung

ADMIN

Hallo
Momentan gibt es Probleme mit Dateianhängen. Am Problem wird gearbeitet.

Euer ADMIN.

Schnellantwort

Name:
Tastenkürzel: Alt+S Beitrag schreiben oder Alt+P für Vorschau

Similar topics (1)