kettes komplemens számítás

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
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ásSzerző: Sanci76 » 2020. július 26. vasárnap, 18:41

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ásSzerző: Sanci76 » 2020. július 26. vasárnap, 23:02

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: 10066
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: kettes komplemens számítás

HozzászólásSzerző: Robert » 2020. július 27. hétfő, 9:42

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ásSzerző: Sanci76 » 2020. július 27. hétfő, 19:57

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
Chipfüstölő
Hozzászólások: 898
Csatlakozott: 2007. március 25. vasárnap, 6:00
Tartózkodási hely: Kecskemét

Re: kettes komplemens számítás

HozzászólásSzerző: winnerbt » 2020. július 28. kedd, 10:39

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: 106
Csatlakozott: 2008. március 14. péntek, 6:00

Re: kettes komplemens számítás

HozzászólásSzerző: Sanci » 2020. július 31. péntek, 14:24

Í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: 151
Csatlakozott: 2012. január 22. vasárnap, 7:00
Tartózkodási hely: Budapest

Re: kettes komplemens számítás

HozzászólásSzerző: aaszabo » 2020. augusztus 5. szerda, 19:21

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)


Vissza: “Bascom-AVR nyelvű programozás (AVR programozásának lehetőségei)”

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 1 vendég