Sida 1 av 1

Binär omvandling

Postat: 18 oktober 2004, 19:35:49
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.

Postat: 18 oktober 2004, 20:59:21
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".

Postat: 18 oktober 2004, 21:10:46
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

Postat: 18 oktober 2004, 21:14:58
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

Postat: 18 oktober 2004, 21:18:22
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. :)