AVR Assembler Tutorial 10 (5 / 10 stap)

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.

Gerelateerde Artikelen

AVR Assembler Tutorial 2

AVR Assembler Tutorial 2

Deze tutorial is een voortzetting van het "AVR Assembler Tutorial 1"Als je niet hebt doorlopen Tutorial 1 moet je nu stoppen en dat men eerst doen.In deze tutorial zullen we onze studie van assembly language programmering van de atmega328p in de
AVR Assembler Tutorial 11

AVR Assembler Tutorial 11

Welkom bij Tutorial 11!In deze korte tutorial, zijn we eindelijk het eerste deel van onze laatste project bouwen.Het eerste wat dat u moet doen is gaat u naar de allerlaatste stap van deze tutorial en Bekijk de video. Dan kom hier terug. [onderbreken
AVR Assembler Tutorial 1

AVR Assembler Tutorial 1

Ik heb besloten om een serie tutorials over hoe te schrijven van assembler programma's voor de Atmega328p die het gebruikt in de Arduino microcontroller is schrijven. Als mensen geïnteresseerd blijven blijft ik stak een een week of zo totdat ik oprak
AVR Assembler Tutorial 6

AVR Assembler Tutorial 6

Welkom bij Tutorial 6!Today's tutorial zullen kort waar zullen we het ontwikkelen van een eenvoudige methode om gegevens tussen een atmega328p en een andere met twee poorten verbinden hen te delen. Wij zullen vervolgens nemen de dobbelstenen rol van
AVR Assembler Tutorial 8

AVR Assembler Tutorial 8

Welkom bij Tutorial 8!In deze korte tutorial gaan we een beetje een afleiding van de invoering van nieuwe aspecten van assembly language programmering te laten zien hoe onze prototyping componenten verplaatsen naar een aparte "gedrukt" printplaa
AVR Assembler Tutorial 9

AVR Assembler Tutorial 9

Welkom bij Tutorial 9.Vandaag zullen wij tonen hoe de controle van zowel een 7-segment display en een 4-cijferige weergave met behulp van onze ATmega328P en AVR assembler code. In de loop doen die we nemen van omleidingen moeten zal op how to use van
AVR Assembler Tutorial 7

AVR Assembler Tutorial 7

Welkom bij Tutorial 7!Vandaag gaan we naar eerste show hoe opruimen van een toetsenbord, en vervolgens laten zien hoe de analoge input poorten gebruiken om te communiceren met het toetsenblok.We zullen dit doen met behulp van interrupts en een enkele
AVR Assembler Tutorial 5

AVR Assembler Tutorial 5

Vandaag gaan we nemen een kijkje op de verschillende geheugenlocaties in de Atmega328p microcontroller en zien als we beter begrijpen kunnen hoe de dingen worden opgeslagen, waar ze worden opgeslagen en hoe de pointers en opzoektabellen werken.De tut
AVR Assembler Tutorial 4

AVR Assembler Tutorial 4

Welkom bij de handleiding voor nummer 4!In deze tutorial zullen we bouwen een circuit om te simuleren het rollen van twee dobbelstenen. Dan zullen we eerst een brute-force-programma welk doet naar de job schrijven. Dan zullen we dat programma op vers
AVR Assembler Tutorial 3

AVR Assembler Tutorial 3

Welkom op tutorial nummer 3!Voordat we beginnen wil ik een filosofische opmerking maken. Wees niet bang om te experimenteren met de circuits en de code die we proberen op te in deze tutorials bouwen. Draden rond wijzigen, nieuwe onderdelen toe te voe
Een geavanceerde benadering van programmering van Arduino & AVR

Een geavanceerde benadering van programmering van Arduino & AVR

Dit instructable is een must read voor iedereen die vertrouwd is met core AVR chips en Arduino.Nou, om meer specifieke, bij het lezen van de instructable, zal u zitten kundig voor:1) weten het juiste verschil tussen AVR en Arduino.2) programmering Ar
Programmeerbare LED

Programmeerbare LED

geïnspireerd door diverse LED Throwies, knipperende LEDs en soortgelijke instructables ik wilde doen van mijn versie van een LED aangestuurd door een microcontroller.Het idee is om de LED knipperende reeks Herprogrammeerbare. Deze herprogrammering ka
De generator van willekeurige golfvorm, voor ~ 20$

De generator van willekeurige golfvorm, voor ~ 20$

een willekeurige golfvorm generator (AWG) is een nuttige maar vaak duur stuk van testapparatuur (ebay voor lacht). Gebruiken om te bepalen component frequentiebereik, genereren van vervoerder signalen, als een LCR-meter als u een bereik, tune resonan
Star Trek deurbel Hack

Star Trek deurbel Hack

Ik heb altijd al een fan van de Star Treks en als zodanig ik was erg opgewonden toen mijn kamergenoot bracht het huis van een originele serie stijl Star Trek comm panel. Ik had nog nooit gezien een van deze, maar een snelle zoektocht nam ons mee naar