van decimaal naar binair ?

trix

Golden Member

hallo,
ik kan de waarde van een ext. RAM op een display weer geven, maar dat is nu decimaal, en ik zou dat graag binair willen.
ik heb in mijn vorige topic de vraag al gesteld, maar die zat verweven in een andere vraag, waardoor ik denk dat hij een beetje onder gesneeuwd is, wel een reactie gehad van buckfast_beekeeper d.m.v. een link.
https://www.geeksforgeeks.org/program-decimal-binary-conversion/
in die link word die conversie gewoon uit gerekend, wat ook wel zal werken.
maar ik vroeg me af of dit niet simpeler kan.

eigenwijs = ook wijs

Als die ram een externe 8 bits (of breder) databus heeft heb je die informatie toch al (binair) beschikbaar?

trix

Golden Member

het is de 23LC1024.
die comuniceert met de controller (atmega 2560) d.m.v. SPI.

eigenwijs = ook wijs
big_fat_mama

Zie Paulinha_B

Ook ik snap de vraag niet. Laat de communicatie dan gebeuren per SPI of per BlueTooth of wat dan ook, die chip geeft zijn data toch binair buiten, mag ik aannemen? Er zullen toch wel geen ascii-codes van de cifjers uitkomen, zeker?

Laat misschien eens zien wat je nu al hebt, al dan niet werkend?
Of als dat niet kan, vertel dan minstens in welke taal er geprogrammeerd wordt?

hoe beter de vraag geschreven, zoveel te meer kans op goed antwoord
buckfast_beekeeper

Golden Member

SPI is serieel. Dus komen je bits 1 per 1 binnen. If bit = 0 display '0' else '1'.

Anders
getal = 0b1010 (10 decimaal)
getal and 1 = 0
zet 0 op de correcte plaats op het scherm
schift rechts getal = 0b101
getal and 1 = 1
zet 1 op de correcte plaats op het scherm
shift rechts getal = 0b10
getal and 1 = 0
......

Van Lambiek wordt goede geuze gemaakt.
trix

Golden Member

in C.
dat is natuurlijk waar, het komt al binair uit de ext. RAM
ik bekijk het even.

de data komt via de ISP in de SPDR register, dat register copy ik naar een variabele, die als INT is gedeclareerd.

c code:

RAM_content = SPDR;

vervolgens stuur ik die variabele naar het display,.......en daar is de waarde decimaal.
waar nu de conversie: binair --> decimaal is gedaan is mij niet geheel duidelijk ?

[Bericht gewijzigd door trix op zaterdag 11 juli 2020 11:23:24 (66%)

eigenwijs = ook wijs
big_fat_mama

Zie Paulinha_B

In C is het toch niet meer dan printf met een geschikt formaat? %b of zoiets, dacht ik?

hoe beter de vraag geschreven, zoveel te meer kans op goed antwoord
trix

Golden Member

heb mijn vorige post bij gewerkt (gekruisd)

is nu %u

[Bericht gewijzigd door trix op zaterdag 11 juli 2020 11:27:34 (12%)

eigenwijs = ook wijs
big_fat_mama

Zie Paulinha_B

vervolgens stuur ik die variabele naar het display,.......en daar is de waarde decimaal.
waar nu de conversie: binair --> decimaal is gedaan is mij niet geheel duidelijk ?

Laat eens de code zien waarmee je de variabele naar het display stuurt? Als het iets is (zoals me best mogelijk lijkt) in de trant van

c code:

printf("%d\n",vrbl)

dan is het daar dat de conversie gebeurt. Het volstaat om de %d te vervangen door iets anders, nogmaals ik dacht dat het %b was om individuele bitjes te krijgen.

Edit: blijkbaar laat mijn geheugen me (alweer) in de steek, wellicht verwar ik met de formatted print van python of zo. Volgens onderstaande link is het inderdaad nodig om zelf iets te brouwen, er staan voorbeelden bij.

https://stackoverflow.com/questions/111928/is-there-a-printf-converter…

[Bericht gewijzigd door big_fat_mama op zaterdag 11 juli 2020 11:34:47 (24%)

hoe beter de vraag geschreven, zoveel te meer kans op goed antwoord
trix

Golden Member

c code:


if (print_once == 1)
		{
			print_once = 0;
			Lcd4_Clear();
			sprintf(s, "RAM addr = %u", (RAM_value));
			Lcd4_Set_Cursor(2,0);
			Lcd4_Write_String(s);
			
		// below: read the content in the ext. RAM
			PORTG &= ~(1 << PING5); // make SS ext. RAM pin = 0
			SPI_transfer(0b00000011);  // read data from memory
			address = RAM_value; // is address in ext. RAM
			
			SPI_transfer((address>>16)); // adress
			SPI_transfer((address>>8)); // adress
			SPI_transfer((address)); // adress
			
			SPI_transfer(0x00); // dummy when you want to read a byte from ext. RAM		

			PORTG |= (1 << PING5); // make SS ext. RAM pin = 1
			_delay_ms(2); // just for testing
		
			RAM_content = SPDR;
 
		// below: put the content on the display	
			sprintf(s, "content  = %u", (RAM_content));
			Lcd4_Set_Cursor(1,16);
			Lcd4_Write_String(s);	
			
		}
eigenwijs = ook wijs
big_fat_mama

Zie Paulinha_B

Bitgewijs lukt het dus niet op 1-2-3, maar misschien is een hex-weergave al nuttig om een idee te krijgen van de data? Dat kan in C wel:

c code:

int main()
{
	unsigned char a=0x64;
	int b=0xFAFA;
	printf("value of a: %X [%x]\n",a,a);
	printf("value of b: %X [%x]\n",b,b);
	return 0;
}

(voorbeeldje schaamteloos van het www geplukt)

hoe beter de vraag geschreven, zoveel te meer kans op goed antwoord
trix

Golden Member

nee,..wil het echt binair. tnx

eigenwijs = ook wijs
Arco

Special Member

Is toch simpel te maken? Pseudocode:

code:



Dim lChar       As Char[8]
    MyByte, Cnt As Byte

For Cnt = 0 to 7 
  lChar[lCnt] = 0x30 + (MyByte And 0x01))
  Shift Right MyByte,1
Next
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
buckfast_beekeeper

Golden Member

Op 11 juli 2020 11:17:04 schreef trix:
in C.
dat is natuurlijk waar, het komt al binair uit de ext. RAM
ik bekijk het even.

de data komt via de ISP in de SPDR register, dat register copy ik naar een variabele, die als INT is gedeclareerd.

c code:

RAM_content = SPDR;

vervolgens stuur ik die variabele naar het display,.......en daar is de waarde decimaal.
waar nu de conversie: binair --> decimaal is gedaan is mij niet geheel duidelijk ?

Bij het ontvangen van de byte gaat de AVR afhankelijk van bit 5 in SPCR (DORD) SPDR vullen door van links naar rechts of van rechts naar links te shiften. Daarna haal jij die byte op. Je moet nu die byte weer converteren naar bits.

Van Lambiek wordt goede geuze gemaakt.
trix

Golden Member

die byte zijn toch al bits :?

eigenwijs = ook wijs
Arco

Special Member

Decimaal, hex, of binair heeft niets met de inhoud te maken (die is altijd gelijk), alleen hoe het aan de mens gepresenteerd wordt...

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

Golden Member

Op 11 juli 2020 12:04:32 schreef trix:
die byte zijn toch al bits :?

Klopt maar je display werkt niet op bit niveau maar op karakter niveau.

Van Lambiek wordt goede geuze gemaakt.
EricP

mét CE

Ik snap eigenlijk je probleem niet zo. Je hebt in sprintf (of printf) placeholders voor hex, decimaal, character. Maar niet voor binair - blijkbaar gebruikt geen hond dat.
Dus moet je het zelf maken. Arco geeft al een voorzet met de gebruikelijke fouten van een rookie C programmeur... :)

code:

Dim lChar       As Char[8]
    MyByte, Cnt As Byte

For Cnt = 0 to 7 
  lChar[lCnt] = 0x30 + (MyByte And 0x01))
  Shift Right MyByte,1
Next

Doe de lengte maar op 9. Garandeer dat het ding met een 0 (nul) terminated is. En dan inderdaad zoiets. De 0x30 zou ik vervangen door '0' (inclusief quotes). Iets leesbaarder. En verder werkt de code verkeerd om; deze begint met de LSB en niet met de MSB. Maar dat is een detail.

Vervolgens dump je die string op het display en is het klaar.

Arco

Special Member

de gebruikelijke fouten van een rookie C programmeur...

Ik verkeer in de gelukkige omstandigheden dat ik helemaal geen C programmeur ben... :)

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

Zie Paulinha_B

:) :)
Daarom was het ook pseudo-code - en (voor mij dan toch) behoorlijk helder en verstaanbaar. De uitwerking tot iets dat een compiler kan verhapzakken kan men aan ondergeschikten overlaten ;)

hoe beter de vraag geschreven, zoveel te meer kans op goed antwoord
EricP

mét CE

En ik dat ik meer dan 35 jaar geleden al afscheid van basic-dialecten heb genomen :)

@bfm: ik hoor hier een manager. Niks kunnen. Wel blaten. Als het werkt was jij briljant. Als het niet werkt is het waardeloos geïmplementeerd. :)

[Bericht gewijzigd door EricP op zaterdag 11 juli 2020 14:05:49 (47%)

Arco

Special Member

Aangepaste pseudocode:...

code:


Dim lChar       As Char[9]
    MyByte      As Byte
    Cnt         As Integer

For Cnt = 7 to 0 Step -1
  lChar[lCnt] = "0" + (MyByte And 0x01))
  Shift Right MyByte,1
Next
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
EricP

mét CE

:)

Ik zou de and met 0x80 doen, gewoon optellen (doorgaans efficiënter in assembly en dus ook in C) en dan left shiften.

Vergeet de terminating nul niet. Anders gaat je sprintf het bos in. Maar zoiets is wel het idee ja.

Arco

Special Member

Het varieert per processor. Bij een x86 bijv. is aftrekken efficienter als optellen...

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

Zie Paulinha_B

ik hoor hier een manager

Dan hoor je verkeerd ;) Maar ik las een (voor mij ietwat storend) toontje van superioriteit.

Maar om er de glimlach bij te houden, een citaat uit de dagen dat zelfs ik nog aan Basic deed :) :

In ieder beroep heb je, voor elke honderd medewerkers, negentig die het kunnen, negen die het niet kunnen maar het wel kunnen uitleggen, en eentje die het niet kan en het ook niet kan uitleggen. Die maakt men dan gewoonlijk tot manager, opdat zij/hij het eigenlijke werk niet al te zeer zou ontregelen

[Bericht gewijzigd door big_fat_mama op zaterdag 11 juli 2020 14:43:14 (61%)

hoe beter de vraag geschreven, zoveel te meer kans op goed antwoord