Bitshifta 16-bit tal i 8-bit PIC

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
ankan
Inlägg: 1091
Blev medlem: 12 november 2004, 01:50:35

Bitshifta 16-bit tal i 8-bit PIC

Inlägg av ankan »

Hur gör man om man har ett värde som är 16-bit stor så det är uppdelat i två byte och vill bitshifta hela 16-bit talet åt vänster 4 steg?
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46878
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Bitshifta 16-bit tal i 8-bit PIC

Inlägg av TomasL »

Vilket språk?
Användarvisningsbild
AndLi
Inlägg: 18179
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Re: Bitshifta 16-bit tal i 8-bit PIC

Inlägg av AndLi »

u16 = ((uint16_t) (u8msb <<4))*0x100 + ((uint16_t)(u8lsb)) << 4);
eller?
bearing
Inlägg: 11666
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Bitshifta 16-bit tal i 8-bit PIC

Inlägg av bearing »

Man kan använda sig av swapning och maskning eller rotering vänster 4 steg.

Här är kod för den första metoden, som jag googlade fram:
Den förutsätter att resultatet blir max 16 bitar. Om resultatet ska bli 24 bitar behövs några fler instruktioner.

Kod: Markera allt

;shift accumulator left 4 times
	swapf	ACC1, f
	swapf	ACC0, f
	movf	ACC0, w
	andlw	0x0F
	xorwf	ACC0, f
	iorwf	ACC1, f
ankan
Inlägg: 1091
Blev medlem: 12 november 2004, 01:50:35

Re: Bitshifta 16-bit tal i 8-bit PIC

Inlägg av ankan »

TomasL skrev:Vilket språk?
Glömde nämna att det är pic asm.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46878
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Bitshifta 16-bit tal i 8-bit PIC

Inlägg av TomasL »

Ja det är viktigt att veta, eftersom assemblern skiljer sig så mellan olika prollar, så en rutin skriven för en processor-typ funkar inte för en annan.
Vilken Processor är det? och specifikt vilken assembler, då det finns ett antal olika.
sodjan
EF Sponsor
Inlägg: 43241
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Bitshifta 16-bit tal i 8-bit PIC

Inlägg av sodjan »

Det beror också på hur hårt optimerad kod man vill ha.
Just när det gäller *4* bitar (eller 8, så klart), så finns
det ett par genvägar att ta, så som bearing visade.
Gäller det ett mer generellt fall så får man göra mer
"som vanligt", d.v.s shifta varje bit genom C-biten.

> ...Vilken Processor är det? och specifikt vilken assembler, då det finns ett antal olika.

"8-bit PIC" ger ju inte *så* många alternativ. :-)
Jag tror att bearings kod fungerar på både PIC16F, PIC16F1xxx och PIC18F.
Användarvisningsbild
bit96
Inlägg: 2527
Blev medlem: 3 september 2007, 10:04:29
Ort: Säffle

Re: Bitshifta 16-bit tal i 8-bit PIC

Inlägg av bit96 »

Om det är exakt 4 bitar som skall skiftas funkar det bra med swap-funktionen ihop med lite maskning och move.

Vill man skifta annat antal kan man använda rotering via carry-flaggan ett skift-steg åtgången och med hjälp av carry-flaggan flytta över eller kasta bort en bit åt gången.
Och göra en subrutin av detta som anropas önskat antal gånger.
monstrum
Inlägg: 620
Blev medlem: 13 januari 2005, 05:38:32
Ort: Göteborg

Re: Bitshifta 16-bit tal i 8-bit PIC

Inlägg av monstrum »

Om processorn har nån snabb 8x8=>16 bitars hårdvarumultiplikation så kanske det går snabbast att bara multiplicera med 16.
Har inte så bra koll på PIC:ar men har för mig det fanns en två-cyklers multiplikationsinstruktion på AVR:erna iaf.
Användarvisningsbild
ecenier
Inlägg: 1149
Blev medlem: 13 december 2007, 17:51:42
Ort: Älvsjö
Kontakt:

Re: Bitshifta 16-bit tal i 8-bit PIC

Inlägg av ecenier »

Om det är till esic_clonen och stödet för DS1820 så har jag en fungerande version.

Det är en bitshift med 3 bitar vänster du ska göra.
Jag gör så här,

Kod: Markera allt

    movlw   .3                  ; Rotate left
    movwf   counter
    rlf     TemperatureLo,f
    rlf     TemperatureHi,f
    decfsz  counter,f
    goto    $-3
sodjan
EF Sponsor
Inlägg: 43241
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Bitshifta 16-bit tal i 8-bit PIC

Inlägg av sodjan »

Notera att en "rotate" kommer att "rotera" in de högsta bitarna
från TemperatureHi till de lägsta bitarna i TemperatureLo.
Det kanske inte spelar någon roll, men annars kan man göra:

Kod: Markera allt

    movlw   .3                  ; Number of bits to rotate.
    movwf   counter
shift_loop
    lslf    TemperatureLo, f
    rlf     TemperatureHi, f
    decfsz  counter, f
    goto    shift_loop
LSLF shiftar alltid in en "0" i lägsta biten och den högsta biten till "C".
Notrera att LSLF kom med den nya PIC16F1xxx, men det bör ju vara
de som man använder idag i alla fall.

Sens så, om det nu är en fast shift på 3 bitar så fungerar ju även:

Kod: Markera allt

    lslf    TemperatureLo, f
    rlf     TemperatureHi, f
    lslf    TemperatureLo, f
    rlf     TemperatureHi, f
    lslf    TemperatureLo, f
    rlf     TemperatureHi, f
Det tar 6 cykler istället för 16 cykler för lösningen med loopen.
Användarvisningsbild
ecenier
Inlägg: 1149
Blev medlem: 13 december 2007, 17:51:42
Ort: Älvsjö
Kontakt:

Re: Bitshifta 16-bit tal i 8-bit PIC

Inlägg av ecenier »

Tack sodjan.
Men OM det nu är till esic_clone som är anledningen till ankans fråga, så är pic:en en pic12f675. Där finns inte den instruktionen.

Jag ska väl också tillägga att jag gör en add 0xf8 för att nolla de inshiftade msb:arna i lägsta byten.

ankan: Ds1820 kom med posten idag. Kodade igår kväll och kunde verifiera nu innan läggning. Jag ger mig rn klapp på axeln för att det fungerade direkt ;)

Lägger ut den ikväll om jag hinner. Du kanske löser det själv innan jag fått ut den.
ankan
Inlägg: 1091
Blev medlem: 12 november 2004, 01:50:35

Re: Bitshifta 16-bit tal i 8-bit PIC

Inlägg av ankan »

ecenier skrev:Om det är till esic_clonen och stödet för DS1820 så har jag en fungerande version.

Det är en bitshift med 3 bitar vänster du ska göra.
Jag gör så här,

Kod: Markera allt

    movlw   .3                  ; Rotate left
    movwf   counter
    rlf     TemperatureLo,f
    rlf     TemperatureHi,f
    decfsz  counter,f
    goto    $-3
Visst är det så. Blev sugen på att försöka själv också.

Gjorde en switch case sats där familjekoden för 1wire enheten kollas för att sedan hoppa till enhetsspecifik kod som sedan anropar vissa gemensamma kodsnuttar och fixar temp innan sen hoppar tillbaka.

Om jag får ds1820 att funka så ska jag kolla på 1wire räknaren tänkte jag. Dock hade jag föredragit uC men känns dumt att skriva om allt.
ankan
Inlägg: 1091
Blev medlem: 12 november 2004, 01:50:35

Re: Bitshifta 16-bit tal i 8-bit PIC

Inlägg av ankan »

ecenier skrev:Tack sodjan.
Men OM det nu är till esic_clone som är anledningen till ankans fråga, så är pic:en en pic12f675. Där finns inte den instruktionen.

Jag ska väl också tillägga att jag gör en add 0xf8 för att nolla de inshiftade msb:arna i lägsta byten.

ankan: Ds1820 kom med posten idag. Kodade igår kväll och kunde verifiera nu innan läggning. Jag ger mig rn klapp på axeln för att det fungerade direkt ;)

Lägger ut den ikväll om jag hinner. Du kanske löser det själv innan jag fått ut den.
Kul att det funkade.. Asm känns onödigt bökigt men vad gör man inte när koden är skrivet i det från början.
Men om jag bara orkar sätta in mig tillräckligt i koden så kanske jag kan porta den till uC och utveckla vidare koden för räknare tex.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46878
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Bitshifta 16-bit tal i 8-bit PIC

Inlägg av TomasL »

Men om jag bara orkar sätta in mig tillräckligt i koden så kanske jag kan porta den till uC och utveckla vidare koden för räknare tex.
Vad är "uC", den är ju redan skriven för en Micro-Controller (uC), bättre än att portera gammal asm, är att skriva ned en funktionsbeskrivning, och skriva det hela i C.
Skriv svar