Stap 5: Bedrading de TWI
We gaan de TWI toepassen als een interrupt-subroutine in de slaaf (de 4-cijferige weergave) en als een normale subroutine in het model (de dobbelstenen-roller). Deze manier iedere keer dat er een worp van de dobbelstenen (d.w.z. Wanneer u op de knop) is de rol van de dobbelstenen zullen communiceren het resultaat aan de weergave die het resultaat in de laatste twee cijfers van het display verschijnt.
Dus, bijvoorbeeld, een broodje van dubbele Zessen zou resulteren in de overdracht van het nummer 12 aan de weergave en dit zou worden geparseerd door de routine die we eerder in deze tutorial schreef en weergegeven als een 1 en een 2 op de laatste twee 7-segment displays. Merk op dat we hoeft niet eens het "hoge" register waardoor ons zo veel moeite in de binaire decimale conversie code. Zoals u waarschijnlijk hebt bedacht door nu, is ons uiteindelijke gebruik voor de 4-cijferige weergave niet alleen om de dobbelstenen rollen weer te geven. Dat doen we voor nu want het is een eenvoudige manier om de code van de communicatie gaan zonder toevoeging van te veel nieuwe dingen tegelijk.
Dus laten we beginnen door te analyseren hoe de TWI werkt. We beginnen met onze dobbelstenen roller en voeg een paar regels code gewoon om dingen gaan. In zowel het display en de dobbelstenen rol moeten we de SDA en de SCL-pinnen naar INPUT en hoge. Dat wil zeggen
cbi DDRC,4 <br>sbi PORTC,4<br>cbi DDRC,5<br>sbi PORTC,5
Nu, in de INIT-sectie van de code laten we de volgende toevoegen
lds temp,PRR<br>andi temp,0b01011111<br>sts PRR,temp
Hiermee worden de bits van de PRTWI en de bits van de BRTIM0 van de macht vermindering Register op 0. Zie pagina 45 van het gegevensblad. Dit zorgt ervoor dat zowel de TWI-module en de Timer/Counter0 wakker zijn. We moeten de Timer/Counter0 voor onze "vertraging" opdrachten die we elders in de code gebruikt. De TWI is een enerzijds die concentreren we ons op op het moment.
Nu willen we de SCL (seriële klok lijn) frequentie instellen. We doen dit met behulp van de formule te vinden op bladzijde 213. Nu, voor onze huidige doeleinden, I 'm gonna Stel de frequentie zo laag als ik kan eventueel zodat we het signaal een beetje gemakkelijker kunt analyseren. Ik kan dan stel deze later opnieuw hoger maar voor nu laat het kleine. Hier is de formule:
SCL freq = CPU/[16 + 2*TWBR*Prescaler]
Als ik wil dit zo laag mogelijk, moet ik TWBR en Prescalar zo hoog mogelijk instellen. Het register van de TWI Bit Rate, TWBR, is een 8-bit register en dus de grootste waarde kan ik het maken is 255 (die is al 1, dat wil zeggen TWBR = 0b11111111), ook de prescaler bits worden gedefinieerd in tabel 22-7 op pagina 232. Dit zijn de bits 0 en bit 1 van de TWSR (twee-draads interface Status registreren). De tabel vertelt ons dat als we willen dat de hoogste prescaler ik TWPS1 kiezen moet = 1 en TWPS0 = 1 en dit geeft ons een prescaler factor van 64. Vandaar zal mijn seriële klok frequentie voor mijn TWI-lijn, met behulp van de bovenstaande formule worden
16 MHz / (16 + 2 * 255 * 64) = 16000000Hz/32656 = 489,9 Hz of ongeveer 490 Hz.
Zo zullen wij dit in onze INIT-deel van de code met de lijnen:
ldi temp,255<br>sts TWBR,temp<br>ldi temp,0b00000011<br>sts TWSR,temp
Nu wanneer we beginnen met het TWI zal onze SCL klokfrequentie door 490 cycli per seconde (490 Hz). We nu toevoegen de volgende lijnen aan het opstarten van de TWI zoals gegeven op pagina 217 (d.w.z. meester zender modus):
ldi temp, (1--TWINT)|(1--TWSTA)|(1--TWEN) <br>sts TWCR,temp
en vergeet niet dat de - borden in het bovenstaande zijn verondersteld "minder dan" tekenen maar de stomme Instructables editor houdt niet van hen.
Dit stelt 3 van de bits in de twee draad besturingselement registreren (TWCR) en u kunt lezen over deze bits (aan-uitschakelaars) in de beschrijving van het register op de bladzijden 230 en 231. In wezen, de TWINT bit ingesteld op 1 wist de twee draad interrupt-vlag, de TWSTA bit is ingesteld op een definieert de dobbelstenen rol als de meester van de lijn en een start-voorwaarde signaal beneden de lijn twee draads interface, ten slotte, de TWEN bit ingesteld op één maakt de TWI en activeert de interface.
Dat is alles voor nu! Uitsluitend premieaffaires te ontvangen die lijnen in de INIT-deel van de code, bijeengebracht, en laten we zien wat er gebeurt.
Wij willen dingen haak zodat onze TWI draden gaan van onze diceroller naar onze display. We hoeven niet om iets te schrijven voor de weergave nog behalve dat we willen de SDA en de pinnen SDC INPUT en 5V op zowel de weergave als de dobbelstenen rol. Nu als wij onze diceroller en onze weergave inschakelen en haak een oscilloscoop tussen onze SCL-lijn en de GND zullen we het spoor van de scope weergegeven in de eerste twee foto's zien. U kunt zien dat het 490 Hz is, net zoals we het wilden. [Zie foto's 1 en 2]
Nu, als je hebt gelezen dat het gedeelte van het gegevensblad over de TWI zult u zien dat ze zeggen dat u weerstanden naar 5V op elk van de SDA en SCL lijnen moet optrekken. Waarom is dit? Wij keek alleen maar ons signaal en het ziet eruit als een zeer mooie 490 Hz blokgolf zonder iets anders dan onze interne pullup weerstanden op elk van de pinnen! Dat is precies het soort signaal die we willen voor communicatie (zoals we meer te in een beetje bespreken zullen).
Wat zou pullup weerstanden op de SDA en SCL lijnen? Nou, maken ze gewoon het signaal terug naar 5V sneller. Als ik moest trekken tot 0V en vervolgens loslaten, zou het voorjaar terug naar 5V veel sneller met deze extra externe pullup resistors dan met alleen de interne resources op de pennen. Echter op de frequentie van 490Hz maakt het verschil. Het signaal is enkel fijn zonder hen. In feite, zullen we gebruiken 490Hz als onze TWI frequentie omdat onze applicatie niet hoeft te gaan sneller. Ik denk niet dat iemand zal zorg als u alleen 490 stukjes van de gegevens per seconde verzenden kunt. Als we hadden een toepassing die nodig hoge snelheid van gegevensoverdracht die wij zou verhogen wellicht onze kloksnelheid en dan kunnen we externe pull up weerstanden toevoegen.
Laat me nu u te tonen waarom je kan someday wil pullup weerstanden op de regels. Laten we onze SCL-frequentie te verhogen. Ga terug naar de regels van de INIT-sectie van de dobbelstenen roller code (de kapitein stelt de snelheid van de lijn niet de slaaf) en aanpast zodat onze frequentie de hoogste mogelijke ditmaal in plaats van de laagste is. Dit betekent in onze formule
SCL freq = CPU/[16 + 2*TWBR*Prescaler]
Wij willen de noemer zo klein mogelijk. Dus laten we gewoon laat de prescaler en stel TWBR = 0. Dan zullen onze frequentie 16MHz/16 die 1MHz (merk op dat de CPU wel 16 maal groter dan de SCL).
Nu monteren, voer het uit en onderzoeken van de oscilloscoop trace (ik gebruik een DSO Nano-oscilloscoop van Seeedstudio.com dat is een zeer goedkope oscilloscoop die handig met dit soort dingen). [Zie foto 3]
Nu neem een kijkje op de nieuwe trace. U merkt meteen dat de SCL-lijn op deze hoge frequentie, zelfs tijd opstaan naar 5V voordat het opnieuw terug naar 0 wordt verzonden niet hebben! Zodat we niet een mooie blokgolf krijgen. We moeten een lagere frequentie, zodat ten minste we tussen 0V en 5V oscilleren. Als we nu naar pagina 308 zien we dat de tabel 29-14 de eigenschappen en beperkingen van de TWI geeft. Het zegt dat SCL klokfrequentie moet een maximum van 400kHz. Geen wonder dat onze trace zuigen zo slecht. Dus laten we TWBR ingesteld op 12 en de prescaler bits uitschakelen. Dit geeft SCL freq = 16000/(16+24) = 400kHz. Vervolgens monteren, uploaden en neem een kijkje op de nieuwe trace.
Ik zal niet een foto bijvoegen. Laten we zeggen dat we nog steeds een waardeloze trace die niet vrij naar de top maken. We kunnen toevoegen sommige weerstanden op dit punt aan de lijn, maar laten we de frequentie alleen een beetje lager zodat u kunt echt zien wat er gaande is.
Laat de TWBR ingesteld op 72 pixels. Dit geeft ons een frequentie van 100kHz. Neem een kijkje op de afbeelding van het spoor. [Zie foto's 4 en 5]
Nu zie je dat het signaal is schommelen tussen de 0V en 5V maar het niet opstaan terug naar 5V zeer snel! In feite, duurt het zo lang om terug omhoog naar 5V dat tegen de tijd dat het wordt er is het al tijd om terug naar 0V Ga nogmaals naar beneden. Dit is niet wat we willen als we willen om gegevens te verzenden.
Neem een kijkje op figuur 22-2 op pagina 207. Ziet u hoe de gegevens wordt verzonden. De CPU in wezen vergelijkt de signalen op de twee regels (SDA en SCL) en het beslist wat de gegevens door hoe ze te vergelijken. Daarom moet de CPU-kloksnelheid ten minste 16 keer hogere frequentie dan de SCL-klok. De CPU moet die extra cycli om te onderscheiden wat er gaande is met de SCL en SDA signalen en beslissingen gebaseerd op hen. Het moet twee typen gebieden, zoals wordt weergegeven in het diagram. Het moet regio's waar de gegevens "stabiele" betekenis is het rustig op beide 5V of 0V gedurende een bepaalde periode van tijd. Het moet ook regio's waar het signaal is aan het veranderen, vanaf 0V tot 5V of 5V tot 0V te gaan. Wij zullen bespreken hoe het wordt informatie uit dit in een tweede, maar mijn punt is dat in de 100 kHz-signaal dat we net gekeken, we niet een lang genoeg "stabiel" regio hebben. Wij hebben in wezen niets maar overgangen. Dus zal niet het werken. Om dit te verhelpen toevoegen we pullup resistors aan de twee lijnen. Hierdoor wordt het signaal terug opstaan naar 5V sneller en geven ons een langere stabiele regio aan de bovenkant. Laten we proberen het. Pak twee weerstanden. I 'm gonna gebruiken 4.7kOhm weerstanden. Dan draad hen in de regels zoals in het diagram op pagina 206. Ik zal een foto van mijn baan bedrading hechten. [Zie foto 6]
Kijk nu naar de trace! We hebben het signaal springen terug tot 5V en vervolgens resterende vlak voor een tijdje voordat snel terugvallen naar 0V. Met andere woorden, hebben wij een blokgolf-trace die de CPU gebruiken kunt om gegevens te verzenden. [zie afbeelding 7 afbeelding 8]
Dus dat is waarom ze suggereren dat u pullup weerstanden toevoegen aan de regels. In feite, als u wilt uitzoeken welke grootte weerstand u hebt kon ofwel de lijn capaciteit uitzoeken en gebruik de formule die ze in tabel 29-14 geven of je kon gewoon kijken naar de sporen van de oscilloscoop en ruilen van weerstanden, totdat je een mooi blokgolf.
Hoe dan ook! We gaan om terug te gaan tot 490 Hz zetten wij onze TWBR terug tot en met 255 en onze prescaler terug naar 64 en dan we kunnen ontdoen van de weerstanden pullup helemaal alleen haak een microcontroller naar de andere. De interne pullups boete voor te trekken tot de 490 Hz signaal snel genoeg om een mooie blokgolf zoals we al liet zien in de foto's. Kijk naar de laatste foto [foto 9] vertoning de 490 Hz Golf met de pullup weerstanden en vergelijk deze met de eerste twee foto's waaruit de dezelfde 490 Hz Golf zonder de pullup weerstanden. Zie geen verschil? Ik ook niet. Dus wij afzien van de weerstanden en haak enkel onze dobbelstenen roller rechtstreeks naar onze 4-cijferige display.
Nu dat we weten hoe de SDA en SCL lijnen werken (dat wil zeggen met behulp van signalen van de blokgolf) zullen we nu kijken hoe gegevens is verzonden via hen.