Labor at or 6
Labor at or 6
Lucrarea de laborator nr. 6 Denumirea lucrarii: Programarea microcontrollerelor AVR in C Obiective: - Familiarizarea cu mediul de programare CodeVisonAVR prin rezolvarea unor exercitii de programare a interfetei de comunicatie seriala. - Deprinderea tehnicilor de creare a unor proiecte care contin mai mult de un fisier sursa. Exemple de aplicatii simple de folosire a intefetei seriale Exemplul nr. 1 Sa se scrie un program care face primeste pe linia seriala caracterele emise de un terminal ASCII. Face ecou la toate caracterele, dar schimba case de la literele mici la literele mari. Se parcurg urmatorii pasi: a. Se creaza un nou proiect folosind CodeWizardAVR. Sa zicem ca il denumim serial1. b. Se selecteaza tab-ul USART. se obtine urmatoarea fereastra de dialog:
Fig. 6.1 Dialogul in cazul initializarii USART-ului la ATMEGA16 Se bifeaza check-box-urile Receiver si Transmitter pentru validarea lor.
Fig. 6.2 Dialogul pentru initializarea USART-ului Restul perifericelor se lasa la initializarile default. c. Se editeaza codul generat pentru a obtine urmatoarele fisiere-sursa: Un fisier distinct USART.C cu urmatorul continut:
#include <mega16.h> #define #define #define #define #define #define #define #define #define #define #define #define RXB8 1 TXB8 0 UPE 2 OVR 3 FE 4 UDRE 5 RXC 7 FRAMING_ERROR (1<<FE) PARITY_ERROR (1<<UPE) DATA_OVERRUN (1<<OVR) DATA_REGISTER_EMPTY (1<<UDRE) RX_COMPLETE (1<<RXC)
bit rflg; unsigned char rxdata; void send_char(char ch); void init_usart(void);
// USART Receiver interrupt service routine interrupt [USART_RXC] void usart_rx_isr(void) { char status,data; status=UCSRA; data=UDR; rflg=1; rxdata=data; } void send_char(char ch) { UDR = ch; while ( !( UCSRA & (1<<UDRE)) ); } void init_usart(void) { // USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: On // USART Transmitter: On // USART Mode: Asynchronous // USART Baud Rate: 9600 UCSRA=0x00; UCSRB=0x98; UCSRC=0x86; UBRRH=0x00; UBRRL=0x67; }
{ rflg=0; rxdata=change_case(rxdata); send_char(rxdata); } }; } /* Caracterele ASCII pentru litere mici sunt in plaja 0x61 ("a") pana la 0x7A ("z") Caracterele coresunzatoare literelor mari sunt in plaja 0x41 ("A") pana la 0x5A ("Z"). Conversia consta in stergerea bitului 5 (0x20) */ unsigned char change_case(unsigned char ch) { // verificam daca parametrul corespunde unei litere mici if((ch<0x61)||(ch>0x7A)) return(ch); else { ch=ch&0xDF; return(ch); } }
Exemplul nr. 2 Sa se scrie un program care activeaza releul conectat pe PORTB.0 cand pe linia seriala se primeste ASCII 1 si il dezactiveaza cand se primeste ASCII 0. Se face ecou la toate caracterele primite, pentru control. Se modifica modulul principal in urmatoarele aspecte: a. Se schimba initializarea portului B in asa fel incat PORTB.0 sa fie configurat ca linie de iesire b. Se modifica bucla infinita din functia main() in felul urmator: