Forum: Mikrocontroller und Digitale Elektronik #define in ASM30


von Max H. (hartl192)


Lesenswert?

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.

: Bearbeitet durch User
von holger (Gast)


Lesenswert?

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

von Max H. (hartl192)


Lesenswert?

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

: Bearbeitet durch User
von holger (Gast)


Lesenswert?

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

von Max H. (hartl192)


Lesenswert?

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.

: Bearbeitet durch User
von holger (Gast)


Lesenswert?

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

von Max H. (hartl192)


Lesenswert?

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?

von holger (Gast)


Lesenswert?

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

von Carsten S. (dg3ycs)


Lesenswert?

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

von Max H. (hartl192)


Lesenswert?

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.

von Mark B. (markbrandis)


Lesenswert?

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:
>
1
#define LCD_D7 LATB,7
2
> ...
3
> bsf LCD_D7
4
>

Vielleicht so?

1
.macro LCD_D7
2
LATB,7
3
.endm

Siehe auch hier:
http://www.microchip.com.edgekey.net/forums/m647703-print.aspx

von unleashed (Gast)


Lesenswert?

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.

von Max H. (hartl192)


Lesenswert?

Ich habe jetzt noch etwas gefunden. Nicht 100% das was ich suche aber 
nahe dran.
1
.macro LCD_D7 bitop
2
  \bitop LATB,#8
3
.endm 
4
.macro LCD_D6 bitop
5
  \bitop LATB,#6 
6
.endm 
7
.macro LCD_D5 bitop
8
  \bitop LATB,#5 
9
.endm 
10
.macro LCD_D4 bitop
11
  \bitop LATB,#4
12
.endm 
13
.macro LCD_En bitop
14
  \bitop LATB,#3 
15
.endm 
16
.macro LCD_RS bitop
17
  \bitop LATB,#2
18
.endm 
19
...
20
21
send_8bit:
22
  LCD_En bclr
23
  LCD_D7 bclr
24
  ...
25
  return

: Bearbeitet durch User
von Meister E. (edson)


Lesenswert?

Bitte alle informieren, wenn du in mehreren Foren postest.

http://www.fernando-heitor.de/index.php?topic=4837.msg28020

von Max H. (hartl192)


Lesenswert?

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.

von Max H. (hartl192)


Angehängte Dateien:

Lesenswert?

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.

: Bearbeitet durch User
von Max H. (hartl192)


Lesenswert?

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:
1
  mov #(LCD_D7_LAT-0x04),w0  ;[LATx]-0x04 = [TRISx]
2
  bclr [w0],#LCD_D7_BIT
3
  
4
  mov #(LCD_D6_LAT-0x04),w0  ;[LATx]-0x04 = [TRISx]
5
  bclr [w0],#LCD_D6_BIT
6
  
7
  mov #(LCD_D5_LAT-0x04),w0  ;[LATx]-0x04 = [TRISx]
8
  bclr [w0],#LCD_D5_BIT
9
  
10
  mov #(LCD_D4_LAT-0x04),w0  ;[LATx]-0x04 = [TRISx]
11
  bclr [w0],#LCD_D4_BIT
12
  
13
  mov #(LCD_En_LAT-0x04),w0  ;[LATx]-0x04 = [TRISx]
14
  bclr [w0],#LCD_En_BIT
15
  
16
  mov #(LCD_RS_LAT-0x04),w0  ;[LATx]-0x04 = [TRISx]
17
  bclr [w0],#LCD_RS_BIT

: Bearbeitet durch User
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.