Forum: Mikrocontroller und Digitale Elektronik PIC Assembler Probleme


von Patrick B. (p51d)


Lesenswert?

Hallo miteinander

Ich bin gerade am Überarbeiten eines kleinen Programms für einen 
dsPIC30F6012A. Kern der ganzen Geschichte ist die 
Geschwindigkeitsoptimierung.
Daher habe ich mich entschlossen gewisse, sehr häufig und in rascher 
abfolge verwendete Funktionen in Assembler umzuschreiben.

Doch leider ist das bei mir mit dem Assembler schon etwas länger her und 
so tue ich mich mit ganz einfachen Operationen schon etwas schwer:
1
void clear_ADR(void){                      // Adressbus löschen
2
  asm("BCF PORTC,14");                    // Bit 14 beim PORTC Register löschen
3
  asm("BCF PORTC,13");
4
  asm("BCF PORTC,2");
5
  asm("BCF PORTC,1");
6
}
Hierbei meckert der Compiler (HI-Tech C Compiler dsPIC/PIC24 V9.60) 
betreffend eines Syntaxfehlers pro Assembler-Zeile. Nur sehe ich nicht 
ein, was falsch ist.

Besten dank für die Nachhilfe
MFG
Patrick

von Dieter W. (dds5)


Lesenswert?

Wo ist denn der Code her? Das sieht für mich wie PIC18 ASM aus.

Versuch mal

asm("BCLR PORTC,#14");            // Bit 14 beim PORTC Register löschen

Außerdem ist es sinnvoller, nicht PORTC sondern LATC zu benutzen, damit 
vermeidet man das read/modify/write Problem.

von Patrick B. (p51d)


Lesenswert?

Besten Dank für die Antwort.

Den Code habe ich einserseits von www.sprut.de und andererseits von 
diversen anderen Assembler-Tutorials (also, nur der Syntax in der 
Klammer).
Der Rest habe ich aus dem Handbuch des Compilers entnommen (GCC hat 
glaube ich ähnliche Schreibweise für inline-Comands).

Leider hat der neue Versuch zum alten Syntax-Fehler geführt:
[quote]
..\source_code\dac\dac.c: 124: (876) Syntaxfehler
[/quote]

Aber dennoch, besten Dank für die Hilfe
MFG
Patrick

von Chris (Gast)


Lesenswert?

Der Assemblerbefehl lautet aber: BCLR.b f,#bit3

von SandboxGangster (Gast)


Lesenswert?

So als Tip wegen Optimierung wen die werte des PORT bekant sind bei der 
ausfürung ein:

movlw B’00000000’
movwf PORTC

ist wesentlich schneller als:

bcf PORTC, 1
bcf PORTC, 1
bcf PORTC, 1

bei erster variante wird ein wert in das Passende Register geschriben, 
bei den bcf wird jedesmal das register ausgelesen der eine wert geändert 
und dann wieder ins register geschoben.

von Patrick B. (p51d)


Lesenswert?

Chris schrieb:
> Der Assemblerbefehl lautet aber: BCLR.b f,#bit3

ups, da habe ich wohl die erste Antwort zu ungenau gelesen. Dies 
funktioniert.

SandboxGangster schrieb:
> So als Tip wegen Optimierung wen die werte des PORT bekant sind bei der
> ausfürung ein:

Das Problem ist, dass die Werte nicht direkt bekannt sind. Ich müsste 
zuerst das PORT/LAT Register auslesen, damit ich weiss, was geschrieben 
wurde. und die anderen Bits, dürfen nicht beeinflusst werden.

Besten Dank für die Antworten
MFG
Patrick

von Eschi (Gast)


Lesenswert?

Nochmal was zur Optimierung.
Ich kenn diesen Prozessor nicht genau, aber bei anderen PICs gibts auch 
den ANDLW Befehl.
Die Idee ist den Wert 0011xx1100 (0 wo gelöscht werden soll, 1 wo nicht 
beeinflusst wird) zu laden und mit dem PORTC (oder LAT) zu verUNDen. 
Ergebnis in PORTC. Möglicherweise ist das schneller.

Gruss
Martin

von Maik W. (werner01)


Lesenswert?

mov #0bxxxxxxxxxxxxxxxx,w0
xor w0,LATC

ist das nicht eine gute Idee?

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.