Gå til innhold

Hvordan få til AVR busskommunikasjon?


Anbefalte innlegg

Jeg går med et lite prosjekt i hodet mitt som innebærer en kommunikasjonslenke som ser ca slik ut:

 

PC --> ATmega (MASTER) --> ATtiny (SLAVE1) --> ATtiny (SLAVE2) --> osv.

 

PC skal kommunisere med ATmega via USB (den biten skal jeg klare ;) ). Deretter skal ATmega chipen "kommunisere" (det er diktatur ;) ) med ATtiny brikkene med følgende enkle protokoll (ATtiny-brikkene skal bare sitte å ta imot)

 

<adresse:1byte><verdi1:1byte><verdi2:1byte><verdi3:1byte>

 

Når en ATtiny-brikke mottar en slik sekvens, skal den sjekke adressen, hvis adressen stemmer med seg selv skal den ta til seg verdiene og deretter sende sekvensen videre (flere ATtiny-brikker kan ha samme adresse).

 

Det jeg ikke har funnet helt ut er hvordan jeg skal få brikkene til å kommunisere med hverandre, har sett litt på SPI og SPI daisy chaining, men ikke helt fått grep runt hvordan det fungerer. Lurer også litt på hvordan jeg skal få til adresseringen, tenkte på å bruke en 8-veis dipswitch men den vil jo da benytte 8 I/O på tiny-brikken.

Et alternativ er jo å programmere hver brikke med sin egen adresse, men dette er jo lite dynamisk ;)

 

Nå skal det være sagt at jeg har foreløpig ingen som helst peiling på AVR programmering, men litt av poenget med å lage dette er at jeg skal lære meg det :)

Men først må jeg få selve logikken inn i hodet mitt ;)

 

-C-

Lenke til kommentar
Videoannonse
Annonse
Det jeg ikke har funnet helt ut er hvordan jeg skal få brikkene til å kommunisere med hverandre, har sett litt på SPI og SPI daisy chaining, men ikke helt fått grep runt hvordan det fungerer.

9058151[/snapback]

Og du har selvfølgelig sett på SPI beskrivelsen på Wikipedia, uten at det hjalp noe?

Og jeg antar at I2C heller ikke er aktuell?

Lenke til kommentar

Du bør absolutt bruke TWI interfacet på AVRene (I2C).

 

Hvis de ATtiny chipenne du har tenkt å bruke har ADC kan du bruke to motstander (eller en pot) og en ADC linje til å generere addresse. Du monterer to motstander i en spenningsdeler mellom Vcc og Vgnd, spenningen mellom motstandene måles av ADCen og en oppslagstabell brukes for å fastsette hvilken adresse chipen skal ha.

 

din Master bør også ha en addresse, og alle vill sende til alle, men adressen vil avgjøre om noe skal utføres eller ikke.

Lenke til kommentar

SPI er best egnet når bare to enheter skal snakke sammen (siden slaven/masteren sender og mottat samtidig). Å koble flere SPI enheter i serie er jo mulig, men det er ikke en god løsning. vil anta at koden blir mer omfattende ved en slik løsning med spi. trur TWI vil være en del enklere med tanke på å bygge ut til flere enheter og at det vil gi en enklere kode.

 

update:

ble litt feil det der; glemte av chip select linja... de står jo ikke i serie (mhm lurer på om det hadde vært mulig...), men slik som på den wiki-siden. Men mener fremdeles at TWI er bedre. grunnen er at SPI også brukes til å programmere kretsene når de står i systemet, noe jeg alltid benytter meg av. I tillegg bruker en del av kretsene MISO og MOSI til JTAG-debugging. Du bør se litt nærmere på de to funksjonene før du bestemmer deg hvordan/om du vil bruke SPI.

Endret av Dr_VingTor
Lenke til kommentar

Sett hver av de to slavene på forskjellige chip selects og aktiver hver enkelt chip select avhengig av hvilken slave du ønsker prate med. krever ikke mange pinner eller komplisert kode (CLK, MOSI, MISO, CS0 og CS1).

 

CS0 og CS1 kan være hvilken som helst ledig pinne du har tilgjengelig siden du har tenkt å kjøre ATmega'en i master mode. På slavesiden benytter du den dedikerte chip select pinnen så du kan gjøre alt med bruk av interrupts.

 

Antar du har en ATUSB siden du ser på USB-delen som triviell :)

 

Lykke til med prosjektet, Atmel har mye demokode liggende på web: http://www.atmel.com/dyn/products/app_note...p?family_id=607

 

Søk etter SPI, f.eks. appnote AVR151 Setup and use of the SPI :)

 

Det er også andre appnotes om I2C (TWI) om du velger å gå den veien. I2C er noe herk å bitbange, så anbefaler å velge devicer som har dette i hardware.

Lenke til kommentar

Dette kan enkelt løses med ren seriell TTL kommunikasjon. Trengs bare to pins per kommuniserende enhet, en for TX, en for RX. Dette har jeg gjort mange ganger, og er ikke noe problem. Hvis du ikke har noe særlig

pins til overs, vil jeg heller gått for SPI eller I2C...

 

edit: sorry, leste ikke hele posten din, ser du vil ha en adresseringsløsning, og da funker ikke dette...

Endret av gamleerik
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...