Ich will mit für meinen PIC24 eine Routine für die Ansteuerung eines
HD44780 LCDs schreiben und mit ist dabei ein Problem begegnet. Im MPASM
konnte ich es einfach so machen:
1
#define LCD_D7 LATB,7
2
...
3
bsf LCD_D7
In ASM30 geht das aber nicht. Ich habe in der "MPLAB® ASM30 MPLAB®
LINK30 AND UTILITIES USER’S GUIDE" gelesen, dass .macro das #define
ersetzt, habe aber nicht verstanden wie ich es in diesem Fall einsetzte.
Ich habe in Internet gelesen, dass wenn ich die Dateiendung in .S ändere
das ASM-File vorher durch den C-Präprozessor geht, diese Lösung gefällt
mir aber nicht, da ich dazu erst XC16 installieren muss...
Hat jemand eine Ahnung wie ich das mit .macro mache?
Gruß
Max
P.S: Ich möchte euch bitten Kommentare wie: „installier doch einfach den
XC16“ für euch zu behalten.
>P.S: Ich möchte euch bitten Kommentare wie: „installier doch einfach den>XC16“ für euch zu behalten.
Vergiss es;) Hättest du dein Programm in C geschrieben würde
dein Display schon seit Tagen was vernünftiges anzeigen.
Assembler ist Zeitverschwendung pur.
holger schrieb:> Vergiss es;) Hättest du dein Programm in C geschrieben würde> dein Display schon seit Tagen was vernünftiges anzeigen.
Ich glaube nicht, dass ich es mit C in einer negativen Zeit geschafft
hätte.
Und viel aufwändiger ist es in ASM nicht...
>Und viel aufwändiger ist es in ASM nicht...
Ach was? Du kriegst es aber doch nicht gebacken.
Ist wohl doch ein bisschen aufwändiger.
Lies die Bedienungsanleitung von deinem Assembler
einfach noch mal, noch mal, noch mal.
Bis du es verstehst.
Alternativ könntest du auch mal Mammi fragen.
holger schrieb:> Ach was? Du kriegst es aber doch nicht gebacken.> Ist wohl doch ein bisschen aufwändiger.
Ein bisschen aber nicht viel aufwendiger.
Und empfiehlst du jedem, der Probleme mit der C-Syntax hat ASM?
Wenn du nur über C und ASM streiten und niemandem helfen willst:
Beitrag "µC von 0 auf lernen. ASM oder C?"holger schrieb:> Assembler ist Zeitverschwendung pur.
Wenn man es so sieht, ist jedes Hobby Zeitverschwendung pur.
>Und empfiehlst du jedem, der Probleme mit der C-Syntax hat ASM?
Nein, ich empfehle jedem der Probleme mit ASM hat C;)
>Wenn du nur über C und ASM streiten und niemandem helfen willst:>Beitrag "µC von 0 auf lernen. ASM oder C?"
Ja, kenn ich schon. Immer wieder lustig.
Während die Assemblerprogrammierer in VillaASM noch arbeiten
feiern die C Programmierer in VillaC schon wieder eine Party.
holger schrieb:> Ja, kenn ich schon. Immer wieder lustig.
Dann bleib mit denem ASM-Bashing bitte dort.
Hat jemand vllt. eine ernst gemeinte und hilfreiche Antwort für mich?
>Hat jemand vllt. eine ernst gemeinte und hilfreiche Antwort für mich?
Lies die Bedienungsanleitung von deinem Assembler
einfach noch mal, noch mal, noch mal.
Bis du es verstehst.
Max H. schrieb:> Hat jemand vllt. eine ernst gemeinte und hilfreiche Antwort für mich?
Nur aus dem Kopf:
Versuche mal statt #define LCD_D7 LATB,7
.equ LCD_D7 LATB,7
Macro war glaube ich für ganze Codeabschnitte...
Aber ich gebe zu Assembler ist bei mir schon lange nicht mehr an der
Tagesordnung.
holger schrieb:> Während die Assemblerprogrammierer in VillaASM noch arbeiten> feiern die C Programmierer in VillaC schon wieder eine Party.
Jemanden darauf hinzuweisen das es in C ggf. einfacher sein könnte mag
ja noch angehen, aber wenn jemand trotzdem bei ASM bleiben will dann
sollte man das Akzeptieren, zumindest so lange man nicht selbst
betroffen ist.
Also im Hobbybereich auf jeden Fall.
(Als Chef von jemanden würde ich da aber beispielsweise schon einen
guten Grund für hören wollen das er ein berufliches Projekt in ASM
schreiben will)
Wenn man dann nichts weiter zu sagen hat sollte man sich einfach
raushalten, sonst wirkt man selbst schnell lächerlich.
Gruß
Carsten
Carsten Sch. schrieb:> Nur aus dem Kopf:> Versuche mal statt #define LCD_D7 LATB,7> .equ LCD_D7 LATB,7
Danke für die erste Antwort, die auf mein Problem eingeht. Es
funktioniert so leider nicht, auch nicht wenn ich .equ LCD_D7, LATB,#7
schreibe. .euq funktioniert nur für Konstanten und nicht Textersetzung.
Carsten Sch. schrieb:> Also im Hobbybereich auf jeden Fall.
Und auch wenn's beruflich wäre: holger ist nicht mein Chef.
Max H. schrieb:> Ich will mit für meinen PIC24 eine Routine für die Ansteuerung eines> HD44780 LCDs schreiben und mit ist dabei ein Problem begegnet. Im MPASM> konnte ich es einfach so machen:>
musst dann wohl je ein macro für Pin ein und aus schalten schreiben.
Den Port und den Pin könntest du dann extern denk ich einmalig abfragen
.equ LCD_D7_PIN 7
.equ LCD_D7_PORT LATB //das sollte aber gehen
.macro set_LCD_D7
bsf LCD_D7_PORT, LCD_D7_PIN
.endm
.macro clear_LCD_D7
bcf LCD_D7_PORT, LCD_D7_PIN
.endm
Ist aber auch irgendwie nicht das wahre und müsste eigentlich besser
gehen...
Alternativ nur Port und Pin definieren (.equ) und dann jedes mal selber
mit beiden Begriffen aufrufen.
Mir gefällt die .equ variante gut, da ich dann aus dem .equ LCD_D7_LAT
das TRISbit ableiten könnte. Ich habe im Datenbaltt gelesen, dass die
Adresse [TRISx]=[LATx]-0x04. Damit könnte ich mit die definition der
TRISbit sparen. Ich habe dabei nur das Problem, dass das nicht
funktioniert:
bset LATB-0x04,#7
Fehler: D:/.../main.s:103: Link Error: Cannot access symbol (LATB+8188)
with file register addressing. Value must be less than 8192. Suggest
large-data model.
Da ich mich nach dem letzten Post für die .equ Lösung entschieden habe
ist ein einfacher Code für die Ansteuerung des LCDs ist jetzt fertig :-)
In der LCD_Init fehlt noch des löschen der TRISbits. Wenn ich eine
Lösung für das LATx-0x04 Problem finde ist gut und sonst muss ich die
ganzen .equ LCD_xx_TRIS, LATx hinzufügen.
Am Anfang wird die CPU Frequenz definiert. Das Timing müsste immer
passen, theoretisch auch mit 140MHz
Was sagt ihr? Sollte der Code in die Codesammlung? Hat jemand
Verbesserungsvorschläge?
P.S. Mit knapp 1.5h gar nicht so aufwendig... Mich würde interessieren,
wie lange holger dafür in C gebraucht hätte.
Max H. schrieb:> Wenn ich eine> Lösung für das LATx-0x04 Problem finde ist gut und sonst muss ich die> ganzen .equ LCD_xx_TRIS, LATx hinzufügen.
Ich habe eine, vllt. nicht ganz saubere, Lösung gefunden.
Das kommt noch an den Anfang der Init: