Seriekommunikation med valfri pinne, BitBanging

Tillbaka till startsidan

Den inbyggda USARTEN med sina buffer-register är mycket effektiv vid seriekommunikation. En nackdel med processorn ATmega328/P är att den bara har en sådan USART, ibland skulle man behöva fler. En del mindre AVR-processorer saknar dessutom helt inbyggd USART.

Om man inte har så höga krav på seriekommunikationen (hög Baudrate, full duplex), kan man mycket väl programmera en "valfri" portpinne att Bit för Bit utföra seriekommunikationen. Detta kallas för BitBanging.


Tidsdiagram för seriell sändning/mottagning ett tecken.

Funktionerna  getchar_BB()  och  putchar_BB().

Funktionerna  getchar_BB()  och  putchar_BB()  för BitBang motsvarar funktionerna  getchar_uart()  och  putchar_uart()  för USART.

Ibland vill man att processorn "ekar" alla mottagna tecken så att användaren ser vad som skrivs. Ett program med BitBang rutiner kan antingen ta emot ett tecken eller sända ett tecken, så inga tecken kan mottagas medan programmet sänder. Detta kallas för halv duplex. Om man matar in bokstäver för hand så blir tiden mellan tecknen tillräckligt lång för att processorn ska hinna med att både ta emot tecknen och att eka dem, men sänder man hela strängar från terminalen så "missas" tecken. På en Windows-dator innebär varje tryckning på enter-tangenten att två tecken skickas (dvs. egentligen skickas en sträng  "\r\n"), och i det fallet så kan man missa det sista tecknet när man ekar det första.

Arduinos terminalfönster har en inmatningsbuffer där man skriver (och kanske redigerar) den sträng man tänker sända. Eftersom man ser vad man skriver i inmatningsbuffern så behöver processorn inte eka tillbaka tecknen. I Arduino miljön blir det naturligt att kommunicera med hela strängar.
Inmatningsbuffern i terminalfönstret kan dessutom minska behovet av att behöva programmera motsvarande inmatnings och redigeringsfunktioner i själva Arduino-processorn.

Ett typiskt användningsområde för BitBang rutiner är att vänta på och ta emot en sträng, för att därefter sända en svarssträng. Detta är i princip vad som programexemplet nedan gör.

Programmet  bb_serial

  Programmet  bb_serial  använder samma pinnar som USART  PD0  och  PD1  - eftersom Arduino-terminalprogrammet redan är anslutet till dessa pinnar. Pinnarna styrs med BitBang rutiner - så USART slås aldrig på.

I programmet kallas sändarpinnen för  TX_BBpin  och mottagarpinnen för  RX_BBpin. Genom att i början av koden definiera namn på pinnar och register behöver man bara ändra här om man vill byta till andra pinnar för seriekommunikationen.

/* Redefine if you want to BitBang with other pins! */
#define RX_BBpin PD0
#define RX_DDR DDRD
#define RX_PORT PORTD
#define RX_PIN PIND

#define TX_BBpin PD1
#define TX_DDR DDRD
#define TX_PORT PORTD 

Använda andra pinnar

Byter man pinnar kan man fortfarande prova programmet med Arduinos terminalfönster. Dom nya pinnarna kopplas i så fall parallellt med  PD0  och  PD1  med två ledningar.
Riktningsregistret  DDRD  ska nu använda båda pinnarna  PD0  och  PD1  som ingångar (och det är detta som är registrets default värde).

#define RX_BBpin PD2
#define RX_DDR DDRD
#define RX_PORT PORTD
#define RX_PIN PIND

#define TX_BBpin PD3
#define TX_DDR DDRD
#define TX_PORT PORTD 

Det fullständiga programmet finns här:


Tillbaka till startsidan

 


William Sandqvist    willsandqvist@gmail.com