0% found this document useful (0 votes)
36 views5 pages

Labor at or 6

This document discusses a laboratory work project involving programming AVR microcontrollers in C using CodeVisonAVR. It provides two examples of using the serial interface: 1. A program that receives characters from a terminal over the serial line. It echoes all characters back, changing lowercase letters to uppercase. 2. A program that activates a relay connected to PORTB.0 when it receives an '1' over serial and deactivates it when it receives a '0'. It echoes all received characters for control.

Uploaded by

Ioan Susnea
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
36 views5 pages

Labor at or 6

This document discusses a laboratory work project involving programming AVR microcontrollers in C using CodeVisonAVR. It provides two examples of using the serial interface: 1. A program that receives characters from a terminal over the serial line. It echoes all characters back, changing lowercase letters to uppercase. 2. A program that activates a relay connected to PORTB.0 when it receives an '1' over serial and deactivates it when it receives a '0'. It echoes all received characters for control.

Uploaded by

Ioan Susnea
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 5

352,(&7$5($ 6,67(0(/25 &8 0,&52352&(62$5(

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.

/XFUDUHD GH ODERUDWRU QU 

352,(&7$5($ 6,67(0(/25 &8 0,&52352&(62$5(

Se obtine urmatoarea fereastra:

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);

/XFUDUHD GH ODERUDWRU QU 

352,(&7$5($ 6,67(0(/25 &8 0,&52352&(62$5(

// 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; }

Si programul principal serial1.c cu urmatorul continut:


#include <mega16.h> extern unsigned char rxdata; extern bit rflg; extern void send_char(char ch); extern void init_usart(void); void init(void); unsigned char change_case(unsigned char ch); void main(void) { init(); init_usart(); // Global enable interrupts #asm("sei") while (1) { if(rflg==1)

/XFUDUHD GH ODERUDWRU QU 

352,(&7$5($ 6,67(0(/25 &8 0,&52352&(62$5(

{ 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); } }

Nota: Tabelul urmator contine toate codurile ASCII:


Tabelul 1. Codurile ASCII
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 8 9 NUL SOH STX ETX EOT ENQ ACK BEL BS HT DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SP ! " # $ % & ' ( ) 0 1 2 3 4 5 6 7 8 9 @ A B C D E F G H I P Q R S T U V W X Y ` a b c d e f g h i p q r s t u v w x y A B C LF VT FF SUB ESC FS * + , : ; < J K L Z [ \ j k l z { | D CR GS = M ] m } E F SO SI RS US . / > ? N O ^ _ n o ~ DEL

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:

/XFUDUHD GH ODERUDWRU QU 

352,(&7$5($ 6,67(0(/25 &8 0,&52352&(62$5(

while (1) { if(rflg==1) { rflg=0; send_char(rxdata); if(rxdata==0x31) PORTB.0=1; if(rxdata==0x30) PORTB.0=0; } };

/XFUDUHD GH ODERUDWRU QU 

You might also like