kettes komplemens számítás
kettes komplemens számítás
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
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
Re: kettes komplemens számítás
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
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
Re: kettes komplemens számítás
Ez mit akar tenni?
Hülye kérdés:
kettes komplemens:
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
Re: kettes komplemens számítás
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!
"def: olvasott érték (0...FFFF lehet)
komplemens = FFFF-def+1" Köszönöm, kipróbálom!
Re: kettes komplemens számítás
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.
J.
Re: kettes komplemens számítás
Í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!
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!
Re: kettes komplemens számítás
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)
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)