32bits naar 10 digits unpacked

Beste mede leden.

Mijn alias is almera.

Het is al enige jaren geleden op dit forum en moet er weer inkomen.

Heb een vraag over het volgende.

Zie listing compleet hieronder.
programma MPLAB 8.92

Als ik alles omzet voor een PIC16F688 werkt het goed,
maar na dagen puzzelen krijg ik het niet aan de gang met een PIC18F4520
Zou er iemand mij kunnen helpen met de oplossing ?

B.V.D
PS del listing met pic 16f688 staat onderaan.

#include "p18f4520.INC"

; CONFIG OSC=INTIO67
; CONFIG PWRT=ON ; PWRT enabled
; CONFIG BOREN=SBORDIS,BORV=0 ; 0 = Maximum setting
CONFIG WDT=OFF
; CONFIG MCLRE=ON
; CONFIG LPT1OSC=OFF
; CONFIG PBADEN=OFF
; CONFIG LVP=OFF
; CONFIG XINST=OFF
; CONFIG DEBUG=OFF

cblock 0x000

BCD9 ; MSD
BCD8
BCD7
BCD6
BCD5
BCD4
BCD3
BCD2
BCD1
BCD0 ; LSD
digcnt
bitcnt
ACb0 ; LSB
ACb1
ACb2
ACb3 ; MSB
dummy
endc

org 0x00
goto test1

org 0x04
goto test1

org 0x0c

;============================================================================
; Quadruple Precision (32-bit) unsigned Binary to BCD conversion
; BCD9 to BCD0 comprise one ten digit unpacked Binary-Coded-Decimal number.
; The upper nibble of each digit is zero (00008421). BCD9 is the MS-Digit.
; ACb3 to ACb0 comprise a four-byte (32-bit) binary accumulator.
; ACb3 is the MS-Byte.
; The 32-bit binary number in ACb in converted to a ten digit BCD number.
;

test1:
LFSR FSR0,0
call Q_b2bcd
sleep
Q_b2bcd
clrf BCD9 ; Clear all bcd digits
clrf BCD8
clrf BCD7
clrf BCD6
clrf BCD5
clrf BCD4
clrf BCD3
clrf BCD2
clrf BCD1
clrf BCD0
movlw D'32' ; Outer loop
movwf bitcnt ; bit counter
; eigen binaire waarde invullen.
movlw B'11111111'
movwf ACb0
movlw B'00000000'
movwf ACb1
movlw B'00000000'
movwf ACb2
movlw b'00000000' ; MSB
movwf ACb3

b2bcd1
rlcf ACb0,f ;Shift 32-bit accumulator
rlcf ACb1,f ; left to
rlcf ACb2,f ; put ms-bit
rlcf ACb3,f ; into Carry

LFSR FSR0,BCD0
movlw D'10' ;Inner loop
movwf digcnt ; digit counter

b2bcd2:

rlcf INDF0,W ;Shift Carry into bcd digit
movlw D'10' ;Subtract ten from digit then
subwf INDF0,W ; check and adjust for decimal overflow

btfsc STATUS,C ;If Carry = 1 (result >= 0)
movwf INDF0 ; adjust for decimal overflow
decf FSR0L,f ;Point to next bcd digit
decfsz digcnt,f ;Decrement digit counter
goto b2bcd2 ; - go if digcnt > 0
decfsz bitcnt,f ;Decrement bit counter
goto b2bcd1 ; - go if bitcnt > 0
retlw 0

END

#include <p16F688.inc>

__config _WDT_OFF
cblock 0x20

BCD9 ; MSD
BCD8
BCD7
BCD6
BCD5
BCD4
BCD3
BCD2
BCD1
BCD0 ; LSD
digcnt
bitcnt
ACb0 ; LSB
ACb1
ACb2
ACb3 ; MSB

endc

org 0x00
goto test1

org 0x04
goto test1

org 0x0c

;============================================================================
; Quadruple Precision (32-bit) unsigned Binary to BCD conversion
; BCD9 to BCD0 comprise one ten digit unpacked Binary-Coded-Decimal number.
; The upper nibble of each digit is zero (00008421). BCD9 is the MS-Digit.
; ACb3 to ACb0 comprise a four-byte (32-bit) binary accumulator.
; ACb3 is the MS-Byte.
; The 32-bit binary number in ACb in converted to a ten digit BCD number.
;

test1:
call Q_b2bcd
sleep
Q_b2bcd
clrf BCD9 ; Clear all bcd digits
clrf BCD8
clrf BCD7
clrf BCD6
clrf BCD5
clrf BCD4
clrf BCD3
clrf BCD2
clrf BCD1
clrf BCD0
movlw D'32' ; Outer loop
movwf bitcnt ; bit counter
; eigen binaire waarde invullen.
movlw B'00001001'
movwf ACb0
movlw B'00000000'
movwf ACb1
movlw B'00000000'
movwf ACb2
movlw b'00000000' ; MSB
movwf ACb3

b2bcd1
rlf ACb0,f ;Shift 32-bit accumulator
rlf ACb1,f ; left to
rlf ACb2,f ; put ms-bit
rlf ACb3,f ; into Carry
movlw BCD0 ;Point to address of least
movwf FSR ; significant bcd digit
movlw D'10' ;Inner loop
movwf digcnt ; digit counter
b2bcd2
rlf INDF,f ;Shift Carry into bcd digit
movlw D'10' ;Subtract ten from digit then
subwf INDF,w ; check and adjust for decimal overflow
btfsc STATUS,C ;If Carry = 1 (result >= 0)
movwf INDF ; adjust for decimal overflow
decf FSR,f ;Point to next bcd digit
decfsz digcnt,f ;Decrement digit counter
goto b2bcd2 ; - go if digcnt > 0
decfsz bitcnt,f ;Decrement bit counter
goto b2bcd1 ; - go if bitcnt > 0
retlw 0

END

Arco

Special Member

"Krijg het niet aan de gang" is nogal cryptisch: wat werkt er wel / niet?

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Beste arco,

Ja ik heb het niet goed omschreven inderdaad.

Als ik het programma compileer geeft hij geen foutmelding.

Daarna test ik het met de debugger.

Maar als ik naar de registers kijk in het watch scherm,
zie je dat het niet goed gaat met het omzetten.

Echter met de PIC16f688 zie je dat alles goed gaat en de digits
de goede waardes bevatten.

Hoop zo voldoende informatie te hebben gegeven.

Bedankt alvast voor de snelle reactie.

Ik DENK dat je

code:


char * itoa (int i, char *b)
{
  int t, p;
  if (!i) {
    b[0] = '0';
    b[1] = 0;
    return b;
  }
  t = 1;
  while (t <= i) t *= 10;
  t = t/10;
  p=0;
  while (t > 0) {
    b[p] = i/t;
    i -= b[p] * t;
    b[p++] += '0';  
    t = t / 10;
  }
  b[p++] = 0;
  return b;
} 

wil schrijven. Dit is voldoende makkelijk dat je het in 1x goed kan schrijven. Tenminste: Dat is wat ik hier heb gedaan in deze maak een posting gewoon ingetikt, en dan copy-paste naar eeen bestandje om het te testen. In 1x goed.

Een "randconditie" waar dit ding niet goed mee omgaat is als je getal meer dan 1 miljard is.

Maar goed. Moraal van het verhaal: Gebruik een hogere programmeertaal, dan kan jij tijd besteden aan de belangrijke details inplaats van zitten te vechten met basis dingen die toch al in een library horen te zitten.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
JoWi

Special Member

Op 16 juli 2021 17:15:15 schreef rew:
...Maar goed. Moraal van het verhaal: Gebruik een hogere programmeertaal, dan kan jij tijd besteden aan de belangrijke details inplaats van zitten te vechten met basis dingen die toch al in een library horen te zitten.

Dan hoop ik wel dat die routine in de bibliotheek wat slimmer is dan de code die je postte. Loops met multiply en divide op een micro die dat niet in zijn hardware heeft. (en je geheugen zat hebt)

Ik denk dat het probleem zit doordat er van een 16F naar een 18F type processor bent gegaan en de instructieset subtiele verschillen heeft wat tot problemen leidt met het 1 op 1 kopiëren van assembly code.

Ignorance is bliss
Arco

Special Member

Codetags toevoegen aan de startpostcode zou ook wel handig zijn: zo is het (bijna) onleesbaar.

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

hoop dat het zo goed is.
wil het graag in assambly geen C of zo.

; LIST p=18f4520,r=hex,n=80,x=off,st=off

#include "p18f4520.INC"

; CONFIG OSC=INTIO67
; CONFIG PWRT=ON ; PWRT enabled
; CONFIG BOREN=SBORDIS,BORV=0 ; 0 = Maximum setting
CONFIG WDT=OFF
; CONFIG MCLRE=ON
; CONFIG LPT1OSC=OFF
; CONFIG PBADEN=OFF
; CONFIG LVP=OFF
; CONFIG XINST=OFF
; CONFIG DEBUG=OFF

cblock 0x000
dummy
BCD9 ; MSD
BCD8
BCD7
BCD6
BCD5
BCD4
BCD3
BCD2
BCD1
BCD0 ; LSD
digcnt
bitcnt
ACb0 ; LSB
ACb1
ACb2
ACb3 ; MSB

endc

org 0x00
goto test1

org 0x08
goto test1

org 0x0c

;============================================================================
; Quadruple Precision (32-bit) unsigned Binary to BCD conversion
; BCD9 to BCD0 comprise one ten digit unpacked Binary-Coded-Decimal number.
; The upper nibble of each digit is zero (00008421). BCD9 is the MS-Digit.
; ACb3 to ACb0 comprise a four-byte (32-bit) binary accumulator.
; ACb3 is the MS-Byte.
; The 32-bit binary number in ACb in converted to a ten digit BCD number.
;

test1:

call Q_b2bcd
sleep
Q_b2bcd
clrf BCD9 ; Clear all bcd digits
clrf BCD8
clrf BCD7
clrf BCD6
clrf BCD5
clrf BCD4
clrf BCD3
clrf BCD2
clrf BCD1
clrf BCD0
movlw D'32' ; Outer loop
movwf bitcnt ; bit counter
; eigen binaire waarde invullen.
movlw B'11111111'
movwf ACb0
movlw B'00000000'
movwf ACb1
movlw B'00000000'
movwf ACb2
movlw b'00000000' ; MSB
movwf ACb3

b2bcd1
rlcf ACb0,f ;Shift 32-bit accumulator
rlcf ACb1,f ; left to
rlcf ACb2,f ; put ms-bit
rlcf ACb3,f ; into Carry
;
movlw BCD0
movwf FSR0L
; LFSR FSR0,BCD0
movlw D'10' ;Inner loop
movwf digcnt ; digit counter

b2bcd2:

rlcf INDF0,W ;Shift Carry into bcd digit
movlw D'10' ;Subtract ten from digit then
subwf INDF0,W ; check and adjust for decimal overflow

btfsc STATUS,C ;If Carry = 1 (result >= 0)
movwf INDF0 ; adjust for decimal overflow
decf FSR0L,f ;Point to next bcd digit
decfsz digcnt,f ;Decrement digit counter
goto b2bcd2 ; - go if digcnt > 0
decfsz bitcnt,f ;Decrement bit counter
goto b2bcd1 ; - go if bitcnt > 0
retlw 0

END

Als ik het netjes met tabs en zo post,
zijn deze verdwenen na het posten.
Laat maar zitten verder....
in ieder geval bedankt voor de aandacht voor het onderwerp.

Ook het steeds aanprijzen van een hogere programmeertaal door derden
helpt ook niet echt.

RAAF12

Golden Member

Het helpt als je bovenin het edit menu 'code invoegen' gebruikt.

Verder weet ik niet veel van programmeren maar ik vond het reuze leuk om in Telix met scripts te spelen in SALT, dat erg op C lijkt.

[Bericht gewijzigd door RAAF12 op vrijdag 16 juli 2021 22:01:47 (48%)

Op 16 juli 2021 21:42:07 schreef almera:
Als ik het netjes met tabs en zo post, zijn deze verdwenen na het posten.

Klopt, dat werkt altijd zo met HTML pagina's.
Om dat te voorkomen moet je de tekst tussen [code] en [/code] tags zetten.

wilde nog even melden, dat de fout is gevonden.

bij de pic16f688 wordt het status register (Carry)
bij decf xxx,f NIET veranderd.
echter bij de PIC18F4520 wel.

heb nu gebruikt:

decfsz xxx,f
nop
.
.
.
verder bedankt voor de medewerking.