Forum: Mikrocontroller und Digitale Elektronik PIC-Assembler-Anfängerfrage


von Petersch90 (Gast)


Lesenswert?

Guten Tag,
Ich versuche ein Byte Bit für Bit durchzugehen und habe dafür einen 
Zähler programmiert. Wie kann ich es schaffen,dass z.B bei "btfss 
Multiplikator,Zaehler" das Bit Nr. "Zählerwert" geprüft wird und nicht 
die Adresse des Zähler-Bytes?
Mfg Petersch90.

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

zeig mal deinen vorhandenen code

von Petersch90 (Gast)


Lesenswert?

Multiplikation
MOVWF b
b = 4
MOVLW b
Multiplikant Equ 0x10
Multiplikator Equ 0x20
Zaehler Equ 0x30
Ergebnis Equ 0x40
Zwischenergebnis Equ 0x50

MOVLW 8 ;alles auf Nullsetzen
MOVWF Zaehler
MOVLW 0
MOVWF Ergebnis
MOVWF Zwischenergebnis
Rechnung



ADDLW 1;  WREG++

goto Hochsetzen
Addition
MOVLW 0
ADDWF Multiplikant,0 ; WREG mit  Multiplikant  addieren
ADDWF Zwischenergebnis,1;Addition des Multiplikanten auf das 
Zwischenergebnis
Additionuebersprungen
MOVLW 0 ;WREG auf Nullsetzen

ADDLW 1
ADDWF Zwischenergebnis,1;
DECFSZ Zwischenergebnis,1
rlcf  Zwischenergebnis,1  ;Zwischenergebnis nach links rotieren

goto Rechnung

Hochsetzen
MOVF Zaehler,0 ;Zaehler->WREG
ADDLW -1;  WREG++
MOVWF Zaehler ;WREG->Zaehler
btfss Multiplikator,Zaehler ; Addition, Bit = 1
goto Additionuebersprungen
goto Addition

von Max H. (hartl192)


Lesenswert?

btfss geht nur mit Konstanten, "Zaehler" ist in diesem Fall konstant die 
Adresse der Speicherzelle und nicht der Inhalt.
Ich würde bei jedem Schleifendurchlauf "Multiplikator" mit rlf nach 
links verschieben und immer das MSb mit btfss Multiplikator,7 abfragen.


Petersch90 schrieb:
> MOVF Zaehler,0 ;Zaehler->WREG
> ADDLW -1;  WREG++
> MOVWF Zaehler ;WREG->Zaehler
Das geht einfacher mit decf Zaehler,f


P.S. PIC18 haben eine 8x8 Single-Cycle Hardware Multiplier

: Bearbeitet durch User
von Petersch90 (Gast)


Lesenswert?

Danke für die Antwort
Wenn man aber das Byte nach links verschiebt, woher weiß man dann wann 
das LSB der eigentlichen Zahl ist?

von Max H. (hartl192)


Lesenswert?

Petersch90 schrieb:
> Wenn man aber das Byte nach links verschiebt, woher weiß man dann wann
> das LSB der eigentlichen Zahl ist?
Sry, ich verstehe deine Frage nicht.

> MOVLW 0
> ADDWF Multiplikant,0 ; WREG mit  Multiplikant  addieren
Das könnte man durch ein einfaches MOVF Multiplikant,w ersetzen

> MOVLW 0 ;WREG auf Nullsetzen

> ADDLW 1
> ADDWF Zwischenergebnis,1;
> DECFSZ Zwischenergebnis,1
Das ergibt keinen Sinn: Du addierst 1 zum Zwischenergebnis und 
dekrementierst es dann.

> rlcf  Zwischenergebnis,1  ;Zwischenergebnis nach links rotieren
Vor dieser Anweisung würde ich zur Sicherheit das Carry löschen.

> MOVF Zaehler,0 ;Zaehler->WREG
> ADDLW -1;  WREG++
> MOVWF Zaehler ;WREG->Zaehler
Das könnte man durch ein decf Zaehler,f ersetzen.

: Bearbeitet durch User
von Max H. (hartl192)


Lesenswert?

Falls es dich interessiet, ich habe eine 8x8 multiplizier Routine für 
Mid-Range PICs (PIC16 und PIC12) in ASM  geschrieben:
factor1 wird mit factor2 und das Ergebniss sthet dann im Doppelregister 
product.

1
ADD8to16 MACRO _8b, _16b  ;Add 8bit to 16bit variable. Result is saved in the 16 bit variable
2
  movf _8b,w
3
  addwf _16b,f
4
  SKPNC
5
  incf _16b+1,f
6
  ENDM
7
8
LSL16 MACRO _16b  ;Logical shift left 16bit variable
9
  CLRC
10
  rlf _16b
11
  rlf _16b+1
12
  ENDM
13
14
  udata 0x20    ;BANK 0
15
  factor1    res 1
16
  factor2    res 1
17
  product    res 2
18
  mul_cnt    res 1
19
20
  ;udata 0x70    ;ACCESS RAM
21
22
23
  ORG 0x00
24
  goto Init
25
26
  ORG 0x04
27
  retfie
28
29
Init:
30
  BANKSEL factor1
31
  movlw .254
32
  movwf factor1
33
  movlw .254
34
  movwf factor2
35
36
37
mult8x8:
38
  movlw 0x08
39
  movwf mul_cnt
40
  clrf product
41
  clrf product+1
42
mul_loop:
43
  LSL16 product
44
  btfss factor1,7
45
  goto skip_add
46
  ADD8to16 factor2,product
47
skip_add:
48
  rlf factor1,w
49
  rlf factor1,f
50
  decfsz mul_cnt,f
51
  goto mul_loop
52
53
  goto $
54
55
  END

: Bearbeitet durch User
von W.S. (Gast)


Lesenswert?

Petersch90 schrieb:
> Ich versuche ein Byte Bit für Bit durchzugehen und habe dafür einen
> Zähler programmiert. Wie kann ich es schaffen,dass z.B bei "btfss
> Multiplikator,Zaehler" das Bit Nr. "Zählerwert" geprüft wird und nicht
> die Adresse des Zähler-Bytes?

Könntest du etwas verständlicher dein Problem beschreiben?

Wie geht man ein Byte denn Bit für Bit durch? Was meinst du EIGENTLICH 
damit?

zum BTFSS x,y
Die Mnemoniks von MicroChip sind Abkürzungen, hier für
 Bit Test im File und Skip wenn Set
Also Teste in der RAM-Zelle x deren Bit y und überspringe den nächsten 
Befehl, wenn das Bit gesetzt (also 1) ist.
Da gibt es keinerlei "Multiplikator, Zähler".
Und nochwas: So ein Maschinenbefehl steht im ROM und deswegen sind seine 
Bestandteile auch alle konstant. Du mußt dir also vorher überlegen, 
welches Bit in welchem Byte du testen willst. Lies dir mal die Doku zu 
deinem PIC durch, üblicherweise wird dort auch jeder einzelne 
Maschinenbefehl ausführlich beschrieben.

W.S.

von Michael R. (elektr-hobbyist)


Lesenswert?

Petersch90 schrieb:
> Ich versuche ein Byte Bit für Bit durchzugehen und habe dafür einen
> Zähler programmiert.

Hallo Peter (ich nehme mal an dass das dein richtiger Name ist), :-)
Verstehe ich das richtig, dass Du von 0 hoch zählen willst, bis ein Byte 
voll ist?
Wenn das der Fall ist, könntest Du das viel einfacher haben.

incf "Name der Speicherzelle"

Siehe auch

http://www.sprut.de/electronic/pic/assemble/befehle.html#incf

L.G.

Micha

von Max H. (hartl192)


Lesenswert?

Michael R. schrieb:
> Verstehe ich das richtig, dass Du von 0 hoch zählen willst, bis ein Byte
> voll ist?
Ich habe es so verstanden dass er mit btfss ein bit testen will. Welches 
bit getestet wird soll aber nicht konstant, sondern von der Variable 
Zaehler abhängig sein.
Da das mit btfss nicht geht, da wie weiter obernerwähnt wurde keine 
Variablen is ASM befehle eingebaut werden können, würde ich zusätzlich 
zum Zähler die die Variable bei jedem Durchlauf nach links rotieren und 
immer das bit 7 abfragen.

Gerade ist mir noch aufgefallen, dass das Programm des TOs eine 
Endlosschleife ist und also dauernd wiederholt wird.

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.