En komplett starter guide till AVRs (4 / 10 steg)
Steg 4: USART som en seriell port
USART kringutrustningen som kommer med många AVR micros är en flexibel port som kan agera som många olika protokoll.
Vissa micros har en UART som medan liknande, kan bara utföra som en vanlig seriell port.
Medan det kan agera så många olika typer av seriell port, kommer vi bara att använda det som en grundläggande seriell port, vilket gör det möjligt att enkelt använda XBee radion senare.
Du kan också använda denna seriell port för att ansluta till en gammal dator eller via en FTDI chip att ge dig en USB-seriell anslutning till en ny dator.
Det är faktiskt hur många arduinos fungerar, de använder en FTDI chip för en USB-seriell anslutning till mikrokontroller.
Det här exemplet ska vi programmet två ATtimy2313 micros skicka tecken över följetong till varandra.
Bygga upp på bakbord som visas i bilden.
Låt oss kalla vänstern micro A och den andra en B.
Anslut stift 2 a till stift 3 b.
Anslut stift 3 a till stift 2 b.
Stift 2 är RXD (ta emot) och pin 3 är TXD (överför).
Anslut en LED till B på stift 11 (PD6) och ansluta en knapp på A till pin 19 (PB7).
Använd den bifogade uppförandekoden för att programmera två marker.
Ställa in klockan varje 1MHz
På Chip A avkommentera den här raden:
#define sändnings
och kommentera bort den här raden:
#define får
Chip B gör motsatsen:
#define sändnings
#define får
Nu, när du trycker på knappen på A, LED på B tänds!
Först det kanske inte verkar mycket imponerande, men du kan använda detta för att tala till marker långt bort över en XBee radio, eller en dator som kan vara användbar för att felsöka din kod.
Så, hur fungerar det?
Låt oss titta på de intressanta linjerna:
UBRRH = 0;
UBRRL = 12;
Ta en titt i databladet för UBRR registret.
Detta är lite 12 registrera, så som 2313 är en 8-bitars mikro, detta delas i två byte, hög (UBRRH) och låg (UBRRL).
Det höga registret är inte ett fullständigt register, med den övre halvan (4 bitar) reserverade (inte används, men bör inte vidröras för framtida kompatibilitet).
Om du bläddrar ner till nästa sida, kommer du se en praktisk tabell för olika överföringshastigheter beroende på din micro klocka.
Det här exemplet vill vi 9600 baud (användbart senare för XBee).
Titta på tabellen för 1MHz får vi ett värde av 6 för UBRR.
Men det har en -7% felfrekvens, som är lite för hög.
Men om du ser en kolumn över finns en med 0,2% felfrekvens.
Vad är annorlunda?
U2X-flaggan är angiven, och UBRR är inställd på 12.
Vi kommer att använda det och ange U2X-flaggan.
Nästa vi har olika inställningar för att konfigurera:
UCSRA = (1 << U2X);
UCSRB = (1 << RXEN) | (1 << TXEN);
UCSRC = (1 << UCSZ1) | (1 << UCSZ0);
Dessa 3 register beskrivs i databladet så ska vi titta på dem endast kort.
U2X beskrivs som "dubbel UART överföringshastigheten"
RXEN berättar USART för att ta emot läge och TXEN är att möjliggöra sändnings
UCSZ1 & UCSZ0 anges baserat på tabellen på sidan 133, anger tecknet som 8 bitar.
Nästa på sändnings sida har vi denna kodrad:
medan (! () UCSRA & (1 << UDRE)));
Detta kontrollerar "USART Data registrera tomma" lite "USART kontroll och Status Register A".
När det är 1, slingan avslutar och nästa rad i koden kan köras:
UDR = "F";
Detta går i karaktären "F" till sändnings bufferten, detta kan endast skrivas när det är klart, varför måste vi vänta slingan innan det.
Det är ungefär samma på sidan och ta emot:
medan (! () UCSRA & (1 << RXC)));
Vi vänta här på mottagningsbufferten vara tom, och då vi läser UDR för att se vilket värde den har:
om (UDR == "F")
Du bara kunde lika gärna sätta detta i en variabel som så:
char x = UDR;
Du måste läsa UDR för att klara det, och du kan bara läsa den en gång (efter som det rensar och gör en ny karaktär i), så om värdet är viktigt för dig, se till att du sparar en kopia av värdet på den första Läs!
Nu, detta exempel är uppdelad i sända och ta emot, men du kan ha båda i en, jag ville bara göra ett enkelt exempel