kettes komplemens számítás

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Válasz küldése
Sanci76
Újonc
Újonc
Hozzászólások: 3
Csatlakozott: 2020. július 26. vasárnap, 18:25

kettes komplemens számítás

Hozzászólás Szerző: Sanci76 »

Szervusztok!

Szeretnék egy 16Bit Wav lejátszó programot írni. (Egy órában szeretném használni.)

A hang anyagot I2C EEprom tárolja, így beolvasásánál High és Low byte -t beolvasom amely értéke így "0000" - "FFFF" ig terjed.
A problémám hogy ebből kettes komplemens eredményt kellene elérnem, mindezt úgy hogy közben leredukálom 12Bit-es értékre.
(Xmega DAC felbontására...)
Számtalan módon megpróbáltam, de sajnos nem jött össze.
Az alábbi kód működik ugyan de sajnos ez sem hozza az elvárt eredményt.

Ennek a megoldásában szeretnék kérni segítséget.
Kerestem megoldást itt a fórumon is, de nem találtam.


Dim Eeprom_adr As Word ' 0 to 65535
Dim Eeprom_high_adr As Byte At Eeprom_adr + 1 Overlay
Dim Eeprom_low_adr As Byte At Eeprom_adr Overlay + 2
Dim Eeprom_adri As Single '-32,768 to +32,767
Dim Dacb_0 As Word

'Eeprom_high_adr = &HAF 'EEPROM BEJOVO
'Eeprom_low_adr = &H00 'ertekek

Eeprom_adri = Eeprom_adr : Print Eeprom_adri '44800
Eeprom_adri = Eeprom_adri * 0.05 : Print Eeprom_adri '2240
Eeprom_adri = Eeprom_adri + 2048 : Print Eeprom_adri '4288
Dacb_0 = Eeprom_adri : Print Eeprom_adri '4288
Sanci76
Újonc
Újonc
Hozzászólások: 3
Csatlakozott: 2020. július 26. vasárnap, 18:25

Re: kettes komplemens számítás

Hozzászólás Szerző: Sanci76 »

Talán így megoldódik, holnap kipróbálom.

Dim Eeprom_adr As Word
Dim Eeprom_high_adr As Byte At Eeprom_adr + 1 Overlay
Dim Eeprom_low_adr As Byte At Eeprom_adr Overlay
Dim Eeprom_adri As Integer
Dim Eeprom_adrs As Single


Eeprom_high_adr = 245 'teszt
Eeprom_low_adr = 255 'Teszt

Eeprom_adri = Eeprom_adr
Toggle Eeprom_adri
Eeprom_adrs = Eeprom_adri * 0.1 'Az értéket még pontosítom hogy bele is férjen 12Bit -be
Eeprom_adrs = Eeprom_adrs + 2048
Eeprom_adr = Eeprom_adrs
Print Eeprom_adrs
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: kettes komplemens számítás

Hozzászólás Szerző: Robert »

Ez mit akar tenni?

Kód: Egész kijelölése

Eeprom_adrs = Eeprom_adri * 0.1

Hülye kérdés:
kettes komplemens:

Kód: Egész kijelölése

def: olvasott érték (0...FFFF lehet)
komplemens = FFFF-def+1
http://www.tavir.hu - a gazda :)
Sanci76
Újonc
Újonc
Hozzászólások: 3
Csatlakozott: 2020. július 26. vasárnap, 18:25

Re: kettes komplemens számítás

Hozzászólás Szerző: Sanci76 »

Eeprom_adrs = Eeprom_adri * 0.1 'Ez a bejövő 16 Bit értéket számolja át 12Bit-re. Persze ez az érték nem lett még pontosítva, csak a tesztelések miatt maradt ez az érték.

"def: olvasott érték (0...FFFF lehet)
komplemens = FFFF-def+1" Köszönöm, kipróbálom!
Avatar
winnerbt
Elektronbűvölő
Hozzászólások: 907
Csatlakozott: 2007. március 25. vasárnap, 6:00

Re: kettes komplemens számítás

Hozzászólás Szerző: winnerbt »

Igen, minden bitet megfordítunk és hozzáadunk 1-et, a szorzást nem értem, 16=>12bit konverzióhoz elég jobbra shiftelni 4 bittel a word-öt (osztás 16-al).
J.
Avatar
Sanci
Bitmanipulátor
Hozzászólások: 107
Csatlakozott: 2008. március 14. péntek, 6:00

Re: kettes komplemens számítás

Hozzászólás Szerző: Sanci »

Így már értem.

Közben picit bonyolítottam a helyzetet, az eredeti Wav fájl-ból egy CRC-vel ellátott HEX állomány készül, abban megoldottam egyéb "saját adatok" elhelyezését és a 16bit -> 12bit átszámítást. Így elég a Wav adatok beolvasásához az xmega -ban a "makeint" is.
Így egyuttal feltöltésnél van hibaellenőrzés (CRC8), saját egyéb adatok elhelyezése a hangfáljban.

Köszönöm a segítséget!
Avatar
aaszabo
Tranzisztorgyógyász
Hozzászólások: 179
Csatlakozott: 2012. január 22. vasárnap, 7:00

Re: kettes komplemens számítás

Hozzászólás Szerző: aaszabo »

A kettes komplemens átalakítása 2 byte méret esetén:
Ha a beolvasott érték (value) első (legmagasabb) helyiértékű bit 0 ( vagyis az érték kisebb mint 0x8000, vagyis 10000000 00000000 ), akkor az érték önmaga és a szám pozitív.
Ha az első bit 1. akkor a szám negatív és az abszolút értékéhez a kettes komplemens képzést vissza kell fejteni.
IF value < 0x8000 , akkor decoded = value
ELSE value = -1*(0xFFFF - value + 1)
Válasz küldése