Binär omvandling

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Hedis
Inlägg: 2488
Blev medlem: 8 december 2003, 15:10:44
Ort: Vänersborg
Kontakt:

Binär omvandling

Inlägg av Hedis »

Har ett problem med mitt I-button kodande.

Ibuttonen skickar ut datan baklänges. Alltså LSB först.

Om Family ID=02 så skickar den alltså ut detta: 0100 0000. Medans 02 igentligen är: 0000 0010

Är det någon som vet hur man skall omvandla det? (hos mig står det iaf still)

I nuläget så läser jag bit för bit o skiftar in det i ett register

Kod: Markera allt

	rol		input	  	       	;0b00101011 -> 0b01010110
read:							         ;Denna hämtar in datan ifrån knappen och lägger det i
	in 		temp2,pind             ;input, läser 8bitar och återvänder sedan
	andi	  temp2,0b00000001       ;maskar bort allt utom pin0 då det är där knappen ansluts
	or		 input,temp2			   ;0b00000001 -> 0b00101011
	out		portc,input			   ;Skickar ut avläsningen till leds för debug
	ret
Precis innan den kör read nästa gång så skiftar den input ett steg åt vänster.
Det funkar inte o skifta åt höger då det bara kommer in 0'or på MSB.
Allt fungerar förövrigt i låset men det hade varit smidigt o kunna mata in allt rättvänt istället för spegelvänt.

Kod: Markera allt

	.db 0b01000000,0b11101111,0b00110110,0b00111111,0b00000000,0b00000000,0b00000000,0b10111101
så ser nyckelns id ut i programmet.
Användarvisningsbild
karlstedt
EF Sponsor
Inlägg: 966
Blev medlem: 14 oktober 2003, 16:55:23
Ort: Lund
Kontakt:

Inlägg av karlstedt »

Läste inte inlägget så noga och är absolut inte insatt i I-button, men det kanske har nåt att göra med Little Endian och Big Endian byte ordering. Det handlar om vilken byte som kommer först, respektive sist.
Det kan vara så enkelt att du bara behöver byta nibblarna(stavning?!). Brukar ju finnas nån swap-instruktion i asm. Annars får du fixa en egen "swap".
sprawl
Inlägg: 299
Blev medlem: 9 juni 2004, 13:01:33
Ort: Göteborg

Inlägg av sprawl »

beroende av vad det är för datatyp så kan man behöva byta mer än byte ordningen

är det en 4-bytes integer så ska nog först båda byte paren swappas sen ska nog worden byta plats

start:
|1|2|3|4
steg ett (byte paren swappas)
|2|1|4|3
sista steget (word paren swappas)
|4|3|2|1

Vilket jag nu ser blir spegelvändning :D

/a
Användarvisningsbild
Hedis
Inlägg: 2488
Blev medlem: 8 december 2003, 15:10:44
Ort: Vänersborg
Kontakt:

Inlägg av Hedis »

Fick hjälp utav en kompis.
Såhär ser det ut nu o fungerar klockrent.

Kod: Markera allt

	ror		input				 ;0b00101011 -> 0b01010110
read:   						    ;Denna hämtar in datan ifrån knappen och lägger det i 
	in 		temp2,pind 		 ;input, läser 8bitar och återvänder sedan 
	andi 	temp2,0b00000001   ;maskar bort allt utom pin0 då det är där knappen ansluts 
	lsl 	temp2   				;0b00000010	
	lsl 	temp2   				;0b00000100
	lsl 	temp2   				;0b00001000
	lsl 	temp2   				;0b00010000
	lsl 	temp2   				;0b00100000
	lsl 	temp2   				;0b01000000
	lsl 	temp2   				;0b10000000
	or  	input,temp2   		;0b10000000 -> 0b00101011 
	out 	portc,input   		;Skickar ut avläsningen till leds för debug 
	ret 


key:
	.db $02,$EF,$36,$3F,$00,$00,$00,$BD
Användarvisningsbild
Melker
Inlägg: 410
Blev medlem: 26 maj 2003, 22:17:34
Ort: Umeå

Inlägg av Melker »

Kod: Markera allt

read:
sec                        ;Sätt carry
sbis PIND,0             ;Om PIND,bit0 är satt, låt carryn vara satt
clc                         ;annars ta bort carryn
ror/rol input            ;ror eller rol beronde på vilken ordning du vill ha byten i.
ret
Vet ej om det funkar, var längesedan körde asm, men om jag inte tänkt helt fel och det funkar så kan du enkelt ändra vilken ordning du får in datan i.

edit: code-taggar kan vara bra att använda. :)
Skriv svar