PIC Assembler Probleme

OP #1876180
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
OP #1876582
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
Gast #1876642
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.
OP #1876699
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
Gast #1877355
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren