Forum: Mikrocontroller und Digitale Elektronik C inline Assembler


von PIC-Anfänger (Gast)


Lesenswert?

Ich habe ein kleines Programm in C programmiert, das an einer Stelle 
sehr genaue Frequenzen erzeugen soll. Deshalb will ich Inline-Assembler 
einsetzen. Diese Frequenzen werden in dem Datentype "unsigned short int" 
angegeben. Ich habe jetzt das Problem das ich nicht weiß wo in meinem 
PIC die Vaiablen angelegt werden, daher weiß ich nicht wie ich auf sie 
Zugreifen soll.

Es müsste sowas wie das möglich sein:
1
unsigned short int T
2
_asm
3
    CLRF [T.byte1]
4
    CLRF [T.byte2]
5
    BSF  [T.byte2],4
6
_endasm
Wie greife ich mit Inline-Assembler im C18-Compiler auf die Bytes einer 
Variable zu?

von Oliver J. (skriptkiddy)


Lesenswert?

Das ist ein Beispiel aus dem C18-User-Guide. Ich nehme an, dass count 
eine 8-Bit Variable aus dem darüberliegenden C-Programm ist.

[code]
_asm
/* User assembly code */
MOVLW 10 // Move decimal 10 to count
MOVWF count, 0
/* Loop until count is 0 */
start:
DECFSZ count, 1, 0
GOTO done
BRA start
done:
_endasm
[code]


PS: Wie kommst du darauf, dass "unsigned short int T" Elemente mit den 
Namen
byte1, byte2, byte3 hat?

Gruß Skriptkiddy

von (prx) A. K. (prx)


Lesenswert?

Bei den meisten Assemblersprachen gilt:
  T+0 ist das erste Byte,
  T+1 ist das zweite Byte.

Erschwerend kommt aber bei PICs hinzu, dass du erst noch die Bank 
festlegen musst, wenn die Variable nicht in der Access Bank liegt oder 
du im Extended Mode bist und daher keine hast.

Sehr genau wird das übrigens mit Timer/PWM, statt Assembler.

von PIC-Anfänger (Gast)


Lesenswert?

Ich habe gerade noch ein anderes Problem. Der Compiler streikt bei 
Inline-Assembler!
Bei diesem Code:
1
unsigned short int T;
2
_asm
3
    BSF PORTB,4
4
    SUBWF T,0
5
    BCF PORTB,3
6
    BCF PORTB,4
7
_endasm
Erhalte ich die Fehlermedung:
C:\xxx\Main.c:37:Error [1251] 'BSF' operand count mismatch
C:\xxx\Main.c:41:Error [1251] 'SUBWF' operand count mismatch
C:\xxx\Main.c:47:Error [1251] 'BCF' operand count mismatch
C:\xxx\Main.c:48:Error [1251] 'BCF' operand count mismatch

Es handelt sich übrigens um einem 18F452. "A. K." meinte ich müsse 
Banken umschalten. Ich dachte das wäre nur bei dem 16F, 12F und 10F 
nötig.

Wie erzeuge ich in PWM lücklos 1Hz-100000Hz? Wenn jemand mir zeigen 
würde wie ich diese Frequenzen in PWM erzeugen kann, wäre mir auch 
gehelfen.

von (prx) A. K. (prx)


Lesenswert?

PIC-Anfänger schrieb im Beitrag #2060845:

> Es handelt sich übrigens um einem 18F452. "A. K." meinte ich müsse
> Banken umschalten. Ich dachte das wäre nur bei dem 16F, 12F und 10F
> nötig.

Die PIC18 können in fast allen Befehlen nur 512 Bytes direkt 
adressieren. Im Standardmodus sind das ein Teil der der ersten Bank (der 
Access Bank), ein Teil der I/O-Bank und 256 Bytes einer wählbaren 
RAM-Bank.

Der hierbei im Standardmodus einzig wirklich substantielle Unterschied 
zu den PIC16 ist die Möglichkeit, das RAM indirekt ohne Banking linear 
zu adressieren, und ein 2-Adress Move-Befehl mit 4KB Adressierung. Das 
können die alten nicht. Im Extended Mode kommt dann noch die 
Stack-bezogene Adressierung hinzu (statt der Access Bank).

> Wie erzeuge ich in PWM lücklos 1Hz-100000Hz?

Lückenlos geht nicht. Nicht mit Timer und nicht programmiert.

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.