Assembler Programmierung gestorben?

Begonnen von Ottmar, 08.03.2025, 18:11:49 CET

Vorheriges Thema - Nächstes Thema

Ottmar

Hi Forumsmitglieder!

Programmiert hier noch jemand seine PIC's per MPLAB mit Assembler?
Immer wieder habe ich ein Projekt angesprochen, aber kein kostruktives Echo erhalten.
Auch wurden schon lange nicht mehr Projekte oder Fragen zu  Pic-Assembler angesprochen.

Hrrm.. es kann doch nicht wahr sein, dass ich der letzt Überlebende bin? Sind alle dem C-Virus oder ähnlichen Hochsprachen verfallen?

MfG Ottmar

vloki

Hi Ottmar,

Assembler wird halt schnell anstrengend.
Muss was ganz zeitkritisches und trotzdem einfaches sein,
damit ich das in Assembler schreibe.
MPLABX  XC8  KiCad FreeCAD

pic18

mir geht es mit C genauso, da bin ich auch alleine. :o
Assembler programmiere ich schon, aber eigentlich hauptsächlich Interrupt Routinen, oder Rechenalgorithmen welche schnell abgearbeitet werden. Diese schreibe ich so, dass ich sie von C aufrufen kann. Im Anhang habe ich eine asm-Datei, welche ich vor Jahren programmiert habe. Wahrscheinlich würde ich es heute nicht mehr alles so machen. Hier benutze ich heute noch die Funktion  float4li, welche aus zwei Registern vom Temperaturfühler DS18B20 die Temperatur nach Ascii umwandelnd um sie zur LCD Anzeige zu schicken.

extern void float4li(char *get, char *erg); 
char get0[10]; //scratchpad RAM (temp LSB, temp MSB, TH, TL, Config,rev5678, CRC)
char sr_1[10]; // für ASCII Anzeige ("-012.3456";)

.....

Read_ScratchPad(get0);
temp_int[fu].byte0 = get0[0];
temp_int[fu].byte1 = get0[1];
float4li(get0,sr_1);
LCD_gotoxy(x10,y10);
ausg8b(get0[2]);LCD_Out(' ');sr_1[6]=0;		//Byte 6=0 Endemarkierung Text (6 Zeichen)
LCD_string(sr_1);
.......


(about:invalid)

picass

Bis vor einigen Monaten war nur Assemblieren angesagt. Aber seit den unguten Erfahrungen mit Rechenfehlern - oder sagen wir mal unnötig freundlich: der Notwendigkeit, nur mit Tricks Rechenfehler vermeiden zu können - und vor allem der Unmöglichkeit, eine komplexe Formel mit auch nur annähernd vertretbarem Aufwand unter Assembler lösen zu können, gruselt es mich nur noch vor dieser Prog-Sprache. Das tue ich mir nur noch an, wenn es sich gar nicht vermeiden lässt, wenn also z.B. in meiner alt-ehrwürdigen Rollladen-Steuerung ein Prob auftauchen sollte.
Eher anbei: der Winter geht zuende, das Programmieren kommt auf natürlich Weise zum Erliegen: erst langer Urlaub und nun muss der 1.000 m² große und vernachlässigte Garten in Angriff genommen werden - schon allein, damit nicht nur der potente Maulwurf seine Freude dort hat.

Grüße, picass

^Cobra

Moin Ottmar (und den anderen auch),
ich habe effektiv nur mit Assembler gearbeitet.
Ich habe mehrere Anläufe mit C hinter mir, aber ich werde damit einfach nicht warm.
Meine Projekte sind (noch) sehr klein(einfach), in Assembler habe ich sowas in recht kurzer Zeit am laufen.
Bei C wird der Code i.d.R. größer (hatte schon das Problem das es nicht mehr in den PIC passte) oder es will
einfach nicht gehen(ich weiß, es liegt dann an mir aber wenn ich es nach 30 min nicht finde, greife ich zurück zu assembler...)

Auch meine geplanten Projekte will ich mit Assembler machen.

Gruß
Cobra

Ottmar

Hi Cobra,
...ein Lichtblick nicht ganz alleine mit Assembler dazustehen!
Bin neugierig was Du aktuell in Arbeit hast!
Ich bin gerade dabei mich in I2C mit dem MSSP-Modul eines 18F einzuarbeiten (hat auch jeder andere 16F-Typ, nicht gerade ein 628er oder 84er ;D ). Ein HD44780 LCD soll mittels des Portexpanders PCF8754 angesteuert werden. Wenn das perfekt klappt, woran ich nicht zweifele, kann der Code für jeden xbeliebigen I2C-Sensor, ERPROM, PIC u.a.verwendet werden.
Wenn man da nur ein wenig drinsteckt, sieht das echt einfach aus. Na ja, Knackpunkte wird es immer geben. ;)

P.S. Ist nur für mich neu, kann für andere ja eine olle Kamelle sein.
Mfg Ottmar

pic18

ich sehe hier keine großen Probleme, warum benötigst Du eine Porterweiterung? Geht es um die Übung die Schnittstelle zu programmieren? I2C macht beim 18er die Hardware alleine, man muss nur die Frequenz entsprechend teilen. Die LCD-Anzeige ist auch relativ einfach zu programmieren. Willst Du sie mit vier oder 8 Datenbits ansteuern? Zufällig hatte ich vor ein paar Tagen die Initialisierung angeschaut, da ich den Cursor ein- und ausschalten will. An welchen Prozessor dachtest Du? Ich kann dich hier auch unterstützen. Ich muss mich nur in Assembler wieder einarbeiten.

VG pic18

picass

Zitat von: Ottmar in 12.03.2025, 16:04:05 CET........gerade dabei, mich in I2C mit dem MSSP-Modul eines 18F einzuarbeiten......
......Ein HD44780 LCD soll mittels des Portexpanders PCF8754 angesteuert werden......
Das war auch meine letzte Übung, die allerdings auf einem 32-Bitter und MicroPython umgesetzt werden sollte. Liegt aber genauso auf der langen Bank, wie das Programmieren überhaupt. Die Demenz eines alten Freundes ist seit etlichen Wochen zu allem anderen noch dazu gekommen, der arme Kerl hat sonst niemanden, der sich zuständig fühlt.

Macht mal hinne, ich schaue mit Interesse zu. Aber Unterstützung wird erst mal nicht sein. Leider!
Grüße, picass


Ottmar

Hallo PIC18
Du bist wirklich sehr freundlich und hilfsbereit daumen_hoch !
Mit LCD's und einfachen Grafikdisplays kenne ich mich wirklich gut aus. Die meisten Moeglichkeiten (tableRead, Menueumschaltung, Messwertausgabe, Laufschrift, selbst definierte Zeichen usw.) habe ich durchgearbeitet. Zumindest, was den 4/8bit Modus in indirekter Verbindung mit der PIC16F/18F betrifft.

SPI habe ich bereits hinter mir und da mir bei der Programmierung eines Arduino ein LCD mit PCF8754 untergekommen ist, kam ich auf den Gedanken mir das MSSP Modul (I2C) naeher anzusehen, etwas sinnvolles damit zu tun.

Kurz gesagt, LCD_Init4Bit.INC ist umgestellt, MSSP-Setup und die I2C-Routinen stehen schon (Start,Adressbyte,ACK, SendByte.... STOP, Restart, Readbyte)
Der praktische Test steht noch aus.
Auf jeden Fall: VIELEN DANK FUER DEINE ANGEBOTENE HILFE!

Gruss Ottmar

P.S. Meine Motivation für Assembler:
  • Training alternder Gehirnzellen
  • Macht einfach Spass
  • Keine Absicht stets fertige Geräte zu erstellen
  • Funktion auf Steckbrett genügt meistens

pic18

Freud mich wenn es funktioniert, ich hatte mir gerade das Datenblatt des PCF8754 angeschaut, hier habe ich aber nicht gefunden, wie man die Ports auf Ein- bzw. Ausgabe stellt. Ich kenn nur den Microchip IO MSP23S17 bzw. MSP23017 da ist alles schön erklärt.

Ottmar

So wie ich das lese:
Send slaveadress = h'40' (A0:A2 offen/high)
input mode als slave Pcf8754 Portpins sind OUTputs können nun vom Master gesetzt werden

Send slave adress = h'41' ouput mode als slave Pcf8754 Portpins sind INputs können nun vom Master ausgelesen werden

Schau mir gleich mal das Datenblatt zum MCP23017 an.

pic18


Ottmar

Ist wirklich interessant dieser Expander, die beiden Ports sind getrennt adressierbar. Vielleicht besorge ich mir einmal solch ein Teil bei Reichert fü 1.85€ zum spielen.
Zunächst bleibe ich aber bei pcf8754.

pic18

ich habe gerade gesehen, ich habe den MCP23S17, dieser scheint neuer zu sein.

picass

Ottmar schrieb über seine Motivation fürs Programmieren in Assembler. Dass für mich diese Prog-Art bis auf nicht vermeidbare Andwendungen out ist, hatte ich ja schon gesagt. Hier noch ein Beispiel:
Der Betrieb einer LCD-Anzeige an einem PIC !!! What 'ne funkel-nagel-neue Technik ! Wenn ich so an die Vielzahl der Maschinen denke, welche mit solcher Anzeige ausgerüstet sind, wie nur als Beipspiele: Brotbackgeräte, Rasierer....., dann sollte es an fix-und-fertigen Beispielen und Routinen im Netz nur so wimmeln und NIEMAND sollte es nötig haben, mehr als 4 Minuten nach solch funktionsfähigem Beispiel zu suchen und das dann maximal mit ein paar Port-Änderungen übernehmen können. Und wie sieht die hatte Praxis aus? Zum Fremdschämen !
 
Weder die kleinen noch die großen Verkaufshandlungen kommen auf die Idee, für ihre Produkte zur Verkaufsförderung was anzubieten und in den Foren - egal, welchen - liegt wenn überhaupt ein skurieles Beispiel, das dann letztlich auch nicht funktioniert oder aber nur kryptisch zusammen zu setzende Schnipsel.
Habe mal in ein Handbuch von Microchip geschaut, in das "Embedded Control Handbook" von 1994/95. Das wimmelt von praktischen Beispielen, allerdings sind da PIC16 die fortschrittlichsten µCs. Und - is klar - der Assembler-Speech ist heutzutage kaum mehr verstehbar.
Ne, Jungs, ich bin nicht mehr bereit, für den Einsatz solche stonealter Technik Tage oder gar Wochen zur Verfügung zu stellen. Meine Einsicht und Toleranz sind futsch. Nix mehr mit solcher Technik von irgendwann-dunnemals. Meine grauen Zellen lassen sich auch mit in die Zeit passender Technik in Trab bringen. Und in der vielen gesparten Zeit kann ich mit dem Flugsimulator die atemberaubende Landschaft in Patagonien anschauen - oder aber mal wieder gegen einen aus dem Takt geratenen Windows-PC ankämpfen.
Grüße, picass
lcd1.jpglcd2.jpglcd3.jpglcd4.jpglcd5.jpglcd6.jpglcd7.jpg

pic18

Ich finde es nicht verkehrt, wenn man Assembler programmieren kann. Gerade wenn man so wie ich Schaltungen selbst entwirft, sollte man wissen wie der Prozessor aufgebaut ist und wie er funktioniert. Auch sollte man die Grundkenntnisse haben um die verschiedenen Zahlenformate umzurechnen. Eine 4*20  -zeilige LCD Anzeige hatte ich schon in den 80er Jahren verschaltet. Damals benötigten diese LCD-Anzeigen noch eine negative Kontrastspannung, welche ich mit einem Timer IC (NE555) herstellte. In der Schaltung werkelte ein 8085 Prozessor mit IO 8155, die Porterweiterung wurde mit mehreren CMOS IC CD4502 bewerkstelligt welche mit einem Dekoder CD4028 angesprochen wurden. Was ich nicht verstehe, dass die LCD-Anzeigen bis heute immer noch auf zwei Zeilen arbeiten, also Zeile 1 und Zeile 3 eine Zeile ist.

Ottmar

Hi
Ich kann nicht verstehen, warum die LCD-Ansteuerung, wie von picass dargestellt,
so schwierig sein soll. Ich habe in meinen Anfangszeiten, so um 2010 herum,
angelehnt an "SPRUT" begonnen meine LCD-Initialisierungen und Subroutinen fuer LCD zu schreiben. Diese verwende ich problemlos bis heute. I2C gehe ich nur aus Neugierde an, weniger aus Notwendigkeit.

Mit nachstehenden Subroutinen ist bei mir das komplette Ausgabespektrum einesHD44780- LCD's abgedeckt. Die Subs werden auf einen Rutsch mit
#INCLUDE <HD44780_2Wire.INC> 
in JEDES ASM-File geladen, wurden also nur 1x
erstellt (natürlich habe ich das auch für 8/4bit ohne 2Wire).
Soll dann z.B. "T" & "E" in Zeile 2, in Digit 5 ausgegeben werden, geht das so:

; LINE1 EQU 0x00 ;all LCDs
; LINE2 EQU 0x40 ;" "
;
movlw LINE2+5
CALL   OutDDRAM_Addr
movlw "T"
CALL   OutLcd_Data
movlw "E"
CALL   OutLcd_Data
u.s.w
natuerlich wird ein zusammenhaengender Text in einem Rutsch mit TableRead ausgeben
und nicht so unflexibel wie hier dargestellt.

Mfg Ottmar

; File: HD44780_2Wire.INC
; Author: Ottmar
; Created: 2014.01.08
; 2Wire Interfache mit HD74LS164
;******************************************************************
;-SUBROUTINEN - nicht zum direkten Aufruf bestimmt!
; Control8Bit: " mit 8Bit-Interface (nur intern)
; Clear_ShiftReg: " Löscht das Shiftregister
; Delay: " 1,5ms Delay zwischen LCD-Befehlen
; HD44780 Ausfuehrungszeit je cmmand = 37us+4us
; ausgenommen: RETURN HOME] = 1.52ms
; OutLcd: Ausgabe des oberen/unteren Nibbles (nur intern)
;
;-SUBROUTINEN - können aus anderem Code heraus aufgerufen werden
; Lcd_Init: Initialisierung von HD44780-LCD mit 4Bit-Interface
; OutDDRAM_Addr: Ausgabe einer DDRAM-Adresse an das LCD
; OutLcd_Ctrl: Ausgabe einer Instruktion an das LCD
; OutLcd_Ascii: Ausgabe eines Ascii-Zeichens, Wert im WREG
; z.B. movlw .35 -> Ausgabe '[' ROM Code A00!
; OutLcd_Data: Ausgabe eines einzelnen Zeichens Wert im WREG
; z.B. movfw BCD9 (darf nur 1 Stelle enthalten!"
; Lcd_Clear: Löscht den Text im LCD
; Lcd_Ready: Funktionstest! Ausgabe von "LCD 2Wire READY!"
; CGRAM_Load: ;Selbstdifiniertes Zeichen in das LCD laden
;
; Delay1ms: delays 1ms - 255ms /FOSC_MULT
; Delay100ms: delays 0.1s - 25.5s /FOSC_MULT
;*********************************************************************
; LCD-INITIALISIERUNG
; Die Initialisierung des LCD folgt der Vorgabe im Hitachi-Datenblatt
; "HD44780.pdf", Seite 213.
;;*********************************************************************
;; LCD-PROPERTIES (Eigenschaften an aktuellen LCD-Typ anpassen)
;;*********************************************************************
;; LCD_TYPE EQU 1 ;=1 LCD 2x8 und 2x16
;; LCD_TYPE EQU 2 ;=2=LCD 4x16
;; LCD_TYPE EQU 3 ;=3=LCD 4x20
; ;
; IF LCD_TYPE == 1 ;Uncomment LCD_DIGITS 2x8 OR 2x16 !!!
; LCD_LINES EQU .2 ;LCD 2x8 * 2x16
;; LCD_DIGITS EQU .8 ;LCD 2x8
;; LCD_DIGITS EQU .16 ;LCD 2x16
; ENDIF
;;-------------------------------------
;; NO CHANGES AFTER THIS LINE ALLOWED!
;;-------------------------------------
; LINE1 EQU 0x00 ;all LCDs
; LINE2 EQU 0x40 ;" "
; ;
; IF LCD_TYPE==2
; LINE3 EQU 0x10 ;LCDs 4x16 only
; LINE4 EQU 0x50 ;" " "
; LCD_LINES EQU .4 ;Lines
; LCD_DIGITS EQU .16 ;digits/line
; ENDIF
; ;
; IF LCD_TYPE==3
; LINE3 EQU 0x14 ;LCDs 4x20 only
; LINE4 EQU 0x54 ;" " "
; LCD_LINES EQU .4
; LCD_DIGITS EQU .20 ;digits/line
; ENDIF
; ;
; #DEFINE LCD_DATA LCD_LAT,LCDDAT ;Strobe Data (H->L -> Enable)
; #DEFINE LCD_CLK LCD_LAT,LCDCLK ;Strobe Clock (H->L)
; #DEFINE LCD_RS LcdFlags,7 ;0/1 Data-Mode/Instruction-Mode
; #DEFINE NIBBLE LcdFlags,6 ;1/0 send Upper/Lower Nibble to LCD
; ;
; SET_DDRAM_ADDR EQU 0x80 ;Function "SET DDRAM-ADDRESS"
; SET_CGRAM_ADDR EQU 0x40 ;"Set CGRAM Address" b'01000000
; ;
; DISPLAY_OFF EQU 0x08 ;Function "Display Disabled"
; DISPLAY_ON EQU 0x0C ;Function "Display enabled, Crsr On, Blink
Off
; ;; OHM
;;--SONDERZEICHEN gemeinsam HD44780+SPLC780A1 (keine Umlaute)
; OHM EQU b'11110100' ;Omega
; PI EQU b'11110111' ;Pi
; GRAD EQU b'11011111' ;° Grad
; MICRO EQU b'11100100' ;μ
; Komma EQU b'00101100' ;

Schnellantwort

Name:
Verifizierung:
Bitte lassen Sie dieses Feld leer:
Geben Sie die Buchstaben aus dem Bild ein
Buchstaben anhören / Neues Bild laden

Geben Sie die Buchstaben aus dem Bild ein:

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

🡱 🡳

Similar topics (3)