Forum: Mikrocontroller und Digitale Elektronik Problem bitweiser vergleich PIC ASM


von Hugolein (Gast)


Lesenswert?

Servus

bräuchte mal kurz hilfe, vielleicht fällt einem eine elegante lösung 
ein:
uC PIC in assembler

ich lese in meinem projekt unter anderem meine ports ein, und habe immer 
2 pins mit entgegengesetzem pegel, ich möchte überprüfen, ob das immer 
der fall ist oder ob ein fehler vorliegt und dementsprechend leds 
setzen.

led setzen aber nur pro pärchen ob defekt und das nur wenn mindestens 2 
mal oder öfter dieser fehler hintereinander  beim selbem pärchen 
auftritt.

für jeden möglichen fall jeweils eine abfrage mit abspeicherung zu 
machen finde ich sehr unelegant aufwendig und vorallem verbraucht es 
sicher zu viele ressourcen...

hat jemand eine idee oder kann er mir in assembler schreiben wie es 
aussehen müsste? wären portb also 8 pins, also 4 pärchen.

Ich danke schonmal im vorraus, vielleicht weiß jemand eine elegante und 
kurze lösung

von (prx) A. K. (prx)


Lesenswert?

1xShift und XOR.

von hugolein (Gast)


Lesenswert?

da sieht man den wald vor bäumen nicht xD wenn das so simpel gehen würde 
wäre es genial danke^^

von Michael R. (mexman) Benutzerseite


Lesenswert?

Aber nicht vergessen: Der PIC rotiert immer durch's Carry. Also je nach 
linkem oder rechten Bit (bei RLF bzw. RRF) das C zuerst setzen!

Gruss

Michael

von Hugolein (Gast)


Lesenswert?

wäre das demnach so richtig? wie muss die fehlerausgabe dann sein?

[code]
sigveri
    rrf altshift,f      ; rightshift in f
    movfw alt           ;
    xorwf altshift,f    ; exclusiv-oder in f
    rrf neushift,f      ; rightshift in f
    skpz                ; skip if zero
    incf fehler         ; increment fehler
    movfw neu           ;
    xorwf shiftfehler,f ; exclusiv-oder in f
    skpz                ; skip if zero
    incf shiftfehler    ; increment fehler
    btfss shiftfehler,1 ; wenn fehler = 2
    b  fehler
    clrf shiftfehler  ; clear fehler
    b   sigend
;---------------------------
fehler  btfsc
    bsf LED_A_Fehler
    btfsc
    bsf LED_B_Fehler
    btfsc
    bsf LED_C_Fehler
    b  sigend

von Hugolein (Gast)


Lesenswert?

meine signale sehen nämlih so aus:

0 0 -C C -B B -A A

geht das dann überhaupt so? schiebe ich überhaupt richtig, wie muss ich 
das carry setzen?

von Michael R. (mexman) Benutzerseite


Lesenswert?

Hallo Hugolein,

rotieren war doch wohl die falsche Idee...lass mich nochmal nachfragen, 
bevor ich falschen Code schicke:

Du hast einen Port (B), als Eingang oder Ausgang? (R-M-W Problem!)
jedenfalls sind es hier nur noch drei Paerchen A..C.
Du willst immer einen Alarm erzeugen, wenn A = -A ODER B = -B oder C = 
-C, richtig?


Gruss

Michael

von Michael R. (mexman) Benutzerseite


Lesenswert?

war ein irrtum, rotieren geht doch und das Carry ist egal, da nur die 
geraden Bits vergelichen werden:

[code]

rrf   PortB, w    ;rotiere Port B nach rechts in W
movwf mirror      ;und speichere ab
comf  PortB, w    ;lade PortB invertiert nach W
xorf  mirror, w   ;vergleiche
andlw b'00010101  ;maskiere bit 0,2,4
bnz  fehler       ;wenn bit 0 oder bit 2 oder  bit 4 = 1 -> fehler
goto weitergehts

von Hugolein (Gast)


Lesenswert?

wunderbar vielen dank...

habe auch festgestellt, das ich in die verkehrte richtung schiebe...
aber deins ist eh kürzer und eleganter=)

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.