Olen aikani kuluksi rakennellut erään kytkennän, jonka nimi on "AVR Speden Pelit." Kaikki siihen liittyvä löytyy noilta sivuilta:
http://www.ee.oulu.fi/~summeli/elkerho/spelit.htm
Piiri toimii muuten oikein hyvin, mutta pisteiden laskentaan käytettävän siirtorekisterin kanssa on ilmaantunut sellainen ongelma, että se näyttäisi toimivan heksajärjestelmässä, eikä kymmenjärjestelmässä.
Tarkoitan siis sellaista tilannetta, että kun pelaaja on saanut kokoon 9 pistettä, niin näytöissä näkyy numerot 09, niin kuin kuuluukin. Seuraavan pisteen jälkeen näytöissä kuuluisi tietysti näkyä numerot 10, mutta sen sijaan tuleekin merkit 0A, sitten 0b ja sen jälkeen jotain muita merkkejä, joita ilmeisesti käytetään ilmaisemaan heksajärjestelmän merkkejä 7-segmentti-näytössä.
Muutaman heksaluvun jälkeen tulee sitten numerot 10, 11, 12 ja niin edelleen. Nämä luvut eivät tässä enää tarkoita numeroita kymmenen, yksitoista ja kaksitoista, koska heksaluvut ovat "ottaneet niiden paikat."
Sama ongelma esiintyy myöhemmin tultaessa tilanteeseen, jossa pelaaja saa 20:nnen pisteen. Numerot 19 eivät muutukaan numeroiksi 20 vaan numeroiksi 1A ja niin edelleen.
Osaisiko joku kertoa, mitä pitää tehdä, jotta siirtorekisteri toimisi kymmenjärjestelmässä. Sen tyyppi on 74HC595N ja se on kytketty tuolla olevan kytkentäkaavion mukaan:
http://www.ee.oulu.fi/~summeli/elkerho/stuf/skema.html
http://www.ee.oulu.fi/~summeli/elkerho/spelit.htm
Piiri toimii muuten oikein hyvin, mutta pisteiden laskentaan käytettävän siirtorekisterin kanssa on ilmaantunut sellainen ongelma, että se näyttäisi toimivan heksajärjestelmässä, eikä kymmenjärjestelmässä.
Tarkoitan siis sellaista tilannetta, että kun pelaaja on saanut kokoon 9 pistettä, niin näytöissä näkyy numerot 09, niin kuin kuuluukin. Seuraavan pisteen jälkeen näytöissä kuuluisi tietysti näkyä numerot 10, mutta sen sijaan tuleekin merkit 0A, sitten 0b ja sen jälkeen jotain muita merkkejä, joita ilmeisesti käytetään ilmaisemaan heksajärjestelmän merkkejä 7-segmentti-näytössä.
Muutaman heksaluvun jälkeen tulee sitten numerot 10, 11, 12 ja niin edelleen. Nämä luvut eivät tässä enää tarkoita numeroita kymmenen, yksitoista ja kaksitoista, koska heksaluvut ovat "ottaneet niiden paikat."
Sama ongelma esiintyy myöhemmin tultaessa tilanteeseen, jossa pelaaja saa 20:nnen pisteen. Numerot 19 eivät muutukaan numeroiksi 20 vaan numeroiksi 1A ja niin edelleen.
Osaisiko joku kertoa, mitä pitää tehdä, jotta siirtorekisteri toimisi kymmenjärjestelmässä. Sen tyyppi on 74HC595N ja se on kytketty tuolla olevan kytkentäkaavion mukaan:
http://www.ee.oulu.fi/~summeli/elkerho/stuf/skema.html
Vastaukset 9
Vanhimmat
Veikkaisin että ongelma on näytössä. Kerropa sen tyyppi.
Siis tuo siirto rekisterihän vain muuttaa sarjamuotoisen datan rinnakkaismuotoiseksi. Siinä siis ongelmia ei (pitäisi) olla.
Tai sitten yksinkertaisesti näyttöön on kytkeydytty väärin.
Ei näytössä voi olla mitään vikaa. Olen tarkistanut jokaisen segmentin erikseen tuomalla niihin jännitteen suojavastuksen kautta ennen rakentamista.
Olen myös tarkistanut, että näyttöjen erillisellä piirilevyllä ei ole mitään oikosulkuja. Näytöt ovat ihan tavallisia yhteisanodillisia 7-segmentti-näyttöjä.
Siirtorekisteri on kytketty näyttöihin siten, että molempien näyttöjen A-segmentit on kytketty toisiinsa, samoin B-segmentit ovat toisissaan kiinni ja jne...
Näyttöihin saadaan eri numerot siten, että niille kytketään käyttöjännite eri aikaan niin nopeasti, että sitä ei ehdi huomata.
Tuosta siirtorekisteristä tulee näytölle tieto binäärimuotoisena, jos olen oikein ymmärtänyt. Näytössä itsessään muutetaan binäärit 10-numero järjestelmään. Jos kyseessä onkin hexanäyttö, niin hexana näyttää. Jos kyseessä desimaalinäyttö, niin desimaalit näkyy.
Katsos nyt tästä datalehdestä:
http://www.datasheetcatalog.com/datasheets_pdf/7/4/H/C/74HC595N.shtml
Notta annatko näyttösi tiedot, niin katsellaan löytyykö speksejä.
Jokainen oikean nappulan painanta kasvattaa AVR:ssä 8-bittistä rekisteriä, jonka siirrät sarjana siirtorekisteriin 74595. Eli tavun ylä nibble:n suurin arvo voi olla 1001 ja alimman nibblen arvo myöskin 1001, toisinsanoen "nappi"rekisterin arvo voi olla suurimmillaan 1001 1001 =99 -kymmenjärjestelmässä.
Softassa alanibblen saavutettua 1010 seuraa "ylivuoto" ja ylempää nibbleä kasvatetaan yhdellä ja alanibblen arvoksi tulee 0000. Tämä arvo "printataan" näytölle.
Assembler -kielessä käyttäisin käskyä SWAP, muuttamaan nibblen paikkaa ja tekemään tarvittavat muutoksen.
T: Tuija
No niin, kysäisin asiasta pelin suunnittelijalta ja hän sanoi, että heksajärjestelmässä laskeminen on yksi pelin "nörttimäisistä" ominaisuuksista. Kun en tuota koodin kirjoittamista juurikaan hallitse, niin täytynee tyytyä siihen.
Voipi sitten näpytellä pidemmälle, jos taidot riittää.
Ensinnäkin sevenseg-näytöissä ei yleensä ole sisäisiä dekoodereita. jollet ole ottanut tietoa näytölle taulukon kautta niin on selvää ettei se onnistu. Siirtorekisteriä tässä on turha syyttää; se vain siirtää eikä se osaa muuta. Muutat ohjelmaa siten että se käy taulukosta katsomassa jokaisen numeron kohdalla mitä sen pitäisi siirtää. Selityksestäsi päätellen tuntuisi siltä että taulukkon on olemassa mutta se toimii hexana. Mutta se taulukko on prosessorissasi eikä siirtorekisterissä.
Kuten täällä on jo todettu, heksana laskeminen ole siirtorekisterin tai näytön ominaisuus, vaan ohjelman. Tämä kohta löytyy parin minuutin etsimisellä koodista riviltä 451 alkaen:
score_1 ;
if (score_1 == 16) {
score_10 ;
score_1 = 0;
}
Jos tuohon vaihtaa 16 tilalle 10, niin johan pitäisi laskea 10-järjestelmässä. Tai ainakin alempi digitti, ylempi jää vielä laskemaan heksana (99 jälkeen tulee A0).
Tässä on se huono puoli, että 10-järjestelmässä laskettaessa 2-numeroisen näytön kapasitetti loppuu turhan nopeasti, joten olisi hyvä olla 3-numeroinen näyttö. Silloin meneekin jo piirilevy uusiksi ja samoin osa ohjelmasta.
Kiitos vinkistä nimimerkille JKN! Korjasin koodia tuosta kohtaa ja nyt peli toimii 10-järjestelmässä. Se, että ylempi digitti jää laskemaan heksa-järjetelmässä ei haittaa, koska pitää olla aika hurjan nopea sormistaan, että sinne asti pääsisi.