Firsrt Session منابع : منابع موجود در www.atmel.com مرجع كامل ميكروكنترلرهاي - AVRانتشارات نص -محمد مهدي پرتوي فر و .. ميكروكنترلرهاي AVRو كاربردهاي آنها -انتشارات نص -امير ره افروز نرم افزارها : CodeVisionAVR Proteus AVR Studio ميان ترم 5 :نمره تمرين 3 :نمره پروژه 3 :نمره پايان ترم 10 :نمره Introduction ATMEL 8 bit Microcontroller Families Tiny 90S (CLASSIC) Mega LCD AVR Execute One Instruction Per Cycle (MIPS) جایگزینی تراشه های قدیمی تراشه قدیمی جایگزین مناسب AT90S2313 AT90S2323 AT90S4433 AT90S8515 ATMEGA103 ATMEGA161 ATMEGA163 ATMEGA323 ATTINY2313 ATTINY25 ATMEGA8 ATMEGA8515 ATMEGA128 ATMEGA162 ATMEGA16 ATMEGA32 نام میکروکنترلر از دو یا سه قسمت تشکیل شده است ATMEGA 16 ATMEGA 8 ATTINY 28L ATTINY 28 V قسمت اول نوع و سری میکرو و قسمت دوم حافظه flashرا بیان می کند. قسمت سوم مخفف low powerو very low powerاست .که در جدول زیر شرح داده شده است: نام میکروکنترلر میکروکنترلر AVRبدون پسوند میکروکنترلر AVRبا پسوند L میکروکنترلر AVRبا پسوند V محدوده ولتاژ تغذیه فرکانس قابل قبول کریستال 4-5.5 v 2.7-5.5 v 1.8-5.5 v 0-16 MHZ 0-8 MHZ 0-4 MHZ PDIP-Package – Mega32 TQFP/MLF Package – Mega32 Architecture RISC: Reduced Instruction Set Computer ==> AVR CISC: Complex Instruction Set Computer Memory Types Data SRAM (Static Random Access Memory) EEPROM (Electrically Erasable Programmable Read Only Memo) Program Flash Program Memory Flash (for mega32) 32K Bytes of In-System Self-Programmable Flash Endurance: 10,000 Write/Erase Cycles Data Memories SRAM (for mega32) 2K Byte Internal SRAM- Register file, I/O Register, Data Address. EEPROM (for mega32) 1024 Bytes EEPROM Endurance: 100,000 Write/Erase Cycles Program Counter (PC) Instruction Register (IR) Instruction Decoder (ID) X-Y-Z Registers ALU Arithmetic And Logic Unit Arithmetic ADD R1,R2 R1R1+R2 Logic AND R1,R2 R1R1 AND R2 فیوز بیت ها قسمتی از حافظه میکرو کنترلر ها هستند که امکاناتی را در اختیار کاربر قرار می دهند و با پاک شدن حافظه میکرو تنظیمات آنها از بين نمی رود Clock Source Clock Sources PDIP-Package – Mega32 External Crystal Oscillator Low Frequency Crystal Oscillator External RC Oscillator Calibrated Internal RC Oscillator External Clock Timer/Counter Oscillator For AVR microcontrollers with Timer/Counter Oscillator pins (TOSC1 and TOSC2), the crystal is connected directly between the pins. No external capacitors are needed. The Oscillator is optimized for use with a 32.768 kHz watch crystal. Applying an external clock source to TOSC1 is not recommended. Clock Distribution Second Session SRAM Management SRAM Data Memory (mega32) Programming With CodevisionAVR Prototype #include <mega32.h> global definition main() { } function1() { local variable; Statements; } function2() { local variable; statements; } local variable; Statements; Prototype چون میکرو همیشه باید در حال فعالیت باشد ،درون تابع mainیک حلقه دائم قرار داده می شود. >#include <mega32.h global definition )( main { ; local variable دستوراتی که باید یک بار اجرا شوند ) While (1 { دستورات و کدهای اصلی برنامه که دائما اجرا می شوند } } نکاتی در مورد برنامه نویس ی خط اول همیشه دستور فراخوانی فایل های حاوی توابع headerاست در انتهای هر عبارت یک سمی کالن قرار داده می شود } و { در ابتدا و انتهای هر حلقه ،عبارت شرطی و یا بلوک قرار داده می شود از //یا ( */و * )/برای نوشتن توضیح در برنامه استفاده می شود Data Type Type bit char unsigned char signed char int short int unsigned int signed int long int unsigned long int signed long int float double Size (Bits) 1 8 8 8 16 16 16 16 32 32 32 32 32 Range 0,1 -128 to 127 0 to 255 -128 to 127 -32768 to 32767 -32768 to 32767 0 to 65535 -32768 to 32767 -2147483648 to 2147483647 0 to 4294967295 -2147483648 to 2147483647 ±1.175e-38 to ±3.402e38 ±1.175e-38 to ±3.402e38 متغير ها و ثابت ها ابتدا باید معرفی شوند نام متغير نوع متغير حافظه مورد نیاز برای متغير eeprom flash eeprom int ;temp int ;temp=10 char ;str float ;a int ;b=30 نام متغير ها می تواند ترکیبی از حروف و اعداد باشد ،فقط نام متغير نباید با عدد شروع شود. Constants flash int x=123; const char y=‘a’; #define C 100; آرایه ها تعدادی متغير دلخواه از یک نوع و یک نام که با اندیس های شماره دار از هم جدا هستند ;]int str[10 }int i[3]= {2,5,6 رشته(:)string به آرایه هایی که حروف اسکی را درون خود نگه می دارند ،رشته می گوییم. ;”Char t[5]= “temp bit Data type bit x,y; x=1; from R2.0 to R14.7 max=104 Set in following menu: Project/Configure/C Compiler/Code Generation/Bit Variable size Operators + * % -== ! < <= & | ^ << -= /= &= ^= >>= / ++ = ~ != > >= && || ? >> += %= *= |= <<= 3th Session Decision and loops if –else while do-while for Switch - case توابع و فرم تابع نویس ی (داده های ورودی) نام تابع نوع داده خروجی } تعریف متغير های محلی دستورات بازگرداندن مقدار خروجی در صورت وجود { مثال: برنامه ای بنویسید که عدد ورودی را به توان 3برساند )func( int x long int { ; long int s ; s=x*x*x ; return s } جایگاه نوشتن توابع توابع را در دو جا می توان نوشت: -1قبل از تابع main -2در زیر کل برنامه >#include<header )Void func(void { دستورات { )(Void main { دستورات { #include<header> Void func(void); Void main(void) { دستورات While(1) { دستورات } } Void func() { دستورات } Libraries math.h stdio.h delay.h Mega16.h And … PORTS Direction Input= 0 Output=1 DDRA.0=0; // PA.0 input DDRA.5=1; // PA.5 output DDRC=0xff ; // PORTC Output Latch Input register Example-1 . را بنویسد0x28 مقدارB برنامه ای بنویسد که بر روی پورت #include <mega32.h> void main(void) { DDRB=0xFF; while (1) { PORTB=0x28; }; } Example-2 تابعي بنويسيد كه يك چراغ راهنمايي را بصورت زير پياده سازي كند: سبز 15 :ثانيه زرد3 :ثانيه قرمز15 :ثانيه ------------------------------------------------------------------نام تابع trafficsignal : ورودي :ندارد خروجي :ندارد زرد PORTA.1:قرمز PORTA.2 : سبز PORTA.0 : Example-2 Header file : delay.h void delay_us(unsigned int n); void delay_ms(unsigned int n); delay_us(100) <== ميكروثانيه100 تاخير: مثال delay_ms(5000) < == ثانيه5 تاخير: مثال Example-2 #include <mega32.h> #include <delay.h> void traficsignal(void); void main(void) { DDRA=0x07; while (1) { traficsignal(); }; } void traficsignal(void) { PORTA.0=1;PORTA.1=0;PORTA.2=0; delay_ms(15000); PORTA.0=0;PORTA.1=1;PORTA.2=0; delay_ms(3000); PORTA.0=0;PORTA.1=0;PORTA.2=1; delay_ms(15000); } Exercise-1 -1 تابعي بنويسد كه يك چراغ راهنمايي را با دريافت تاخيرها توسط برنامه زير ،راه اندازي كند. سبز Gdelay :ثانيه زرد Ydelay :ثانيه قرمز Rdelay :ثانيه ----------------------------------- Exercise-1 #include <mega32.h> void traficsignal(int gdelay,int ydeay,int rdelay); void main(void) { DDRA=0x07; while (1) { traficsignal(x,y,z); }; } void traficsignal(int gdelay, int ydelay, int rdelay) { PORTA.0=1;PORTA.1=0;PORTA.2=0; delay_ms(gdelay); PORTA.0=0;PORTA.1=1;PORTA.2=0; delay_ms(ydelay); PORTA.0=0;PORTA.1=0;PORTA.2=1; delay_ms(rdelay); } Example-3 B خوانده و بر روی پورتA تابعی بنویسید که یک عدد بی عالمت را از پورت .نشان دهد #include <mega32.h> void in_out_port(void); void main(void) { DDRA=0x00; DDRB=0xff; while (1) { in_out_port(); }; } void in_out_port(void) { unsigned char x; x=PINA; PORTB=x; } 7segment Common Anode Common Cathode Example-4 آند مشترك به7segment را بر روي9 تا0 برنامه ای بنویسید که اعداد . فاصله يك ثانيه نشان دهد #include <mega32.h> #include <delay.h> unsigned char seven_seg_code(unsigned char num); void main(void) { unsigned char i; DDRA=0xff; while (1) { for (i=0;i<10;i++) { PORTA=seven_seg_code(i); delay_ms(1000); } }; } Coding num h g f e d c b a 0 1 1 0 0 0 0 0 0 1 1 1 1 1 1 0 0 1 2 1 0 1 0 0 1 0 0 3 1 0 1 1 0 0 0 0 4 1 0 0 1 1 0 0 1 5 1 0 0 1 0 0 1 0 6 1 0 0 0 0 0 1 1 7 1 1 1 1 1 0 0 0 8 1 0 0 0 0 0 0 0 9 1 0 0 1 1 0 0 0 code 0xC0 0xF9 0xA4 0xB0 0x99 0x92 0x83 0xF8 0x80 0x98 Example-4 unsigned char seven_seg_code(unsigned char num) { unsigned char out; switch(num) { case 0:out=0xc0;break; case 1:out=0xf9;break; case 2:out=0xa4;break; case 3:out=0xb0;break; case 4:out=0x99;break; case 5:out=0x92;break; case 6:out=0x83;break; case 7:out=0xf8;break; case 8:out=0x80;break; case 9:out=0x98;break; } return out; } Exercise -2 مثال قبل را براي يك 7segكاتد مشترك پياده سازي كنيد. -3 مثال قبل را با استفاده از ICمبدل BCDبه 7447 ، 7segmentپياده سازي كنيد. -4 با استفاده از 7segmentكاتد مشترك و 7448 ، ICيك شمارنده 0تا 9با فاصله زماني 1ثانيه بسازيد. -5 برنامه اي بنويسيد كه عددي را از پورت Bخوانده و برروي 7segنمايش دهد. -6 يك شمارنده 0تا 99با فاصله زماني 1ثانيه بسازيد Double 7Segment 4th Session LCD شماره پین نشانه نام توصیف 1 VSS Power supply 0V (GND) 2 VDD Power supply Power supply for logic circuit and LCD (+4. 5V~+5. 5V) 3 VEE LCD Supply Voltage Bias voltage level for LCD driving Register select input 4 RS Register select .When RS= “High”, data register is selected .When RS= “Low”, instruction register is selected .Read/Write selection input .When RW= “High”, read operation .When RW= “Low”, write operation 5 RW Read/Write 6 E Read Write enable 7 8 9 10 DB0 DB1 DB2 DB3 11 12 13 14 DB4 DB5 DB6 DB7 15 A back-light anode 16 K back-light cathode Data bus 0-7 Start enable signal to read or write the data DB0-DB3, in 8-bit bus mode, used as low order bi-directional .data bus During 4-bit bus mode, open these pins DB4-DB7, in 8-bit bus mode, used as high order bi-directional data bus. In case of 4-bit bus mode, used as both high and low .order DB7 used for Busy Flag output Initialization /* the LCD module is connected to PORTC */ #asm . equ __lcd_port=0x15 #endasm /* now you can include the LCD Functions */ #include <lcd. h> Lcd_init(20); PORT ADDRESS LCD Configuration With CodeWizard lcd.h – High Level unsigned char lcd_init(unsigned char lcd_columns) void lcd_clear(void) void lcd_gotoxy(unsigned char x, unsigned char y) void lcd_putchar(char c) void lcd_puts(char *str) void lcd_putsf(char flash *str) unsigned char lcd_init(unsigned char lcd_columns) Example: lcd_init(16) void lcd_clear(void) صفحه ال س ی دی را پاک می کند void lcd_gotoxy(unsigned char x, unsigned char y) مکان نما را به سطر و ستون دلخواه می برد Lcd_gotoxy(4,2) void lcd_putchar(char c) Example : lcd_putchar('a'); void lcd_putsf(char flash *str) lcd_putsf(”Hello World"); void lcd_puts(char *str) Example: sprintf(buffer, “tempreture= %d”, temp); lcd_puts(buffer); Example - 7 ‘ و در سطر دوم ستون اول عبارتa’ در سطر اول ستون پنجم كاراكتر . نمايش دهيدLCD 2x16 “ را بر روي يكCodeVisionAVR” #include <mega16.h> #asm .equ __lcd_port=0x1B ;PORTA #endasm #include <lcd.h> #include <delay.h> void main(void) { lcd_init(16); while (1) { lcd_clear(); lcd_gotoxy(5,0); lcd_putchar('a'); lcd_gotoxy(0,1); lcd_putsf("CodeVisionAVR"); delay_ms(200); }; } Example-8 . نمايش دهدLCD را بر رويCodeVision تابعي بنويسيد كه بصورت روان كلمه #include <mega16.h> // Alphanumeric LCD Module functions #asm .equ __lcd_port=0x1B ;PORTA #endasm #include <lcd.h> #include <delay.h> void main(void) { int i; lcd_init(16); while (1) { for (i=0;i<7;i++) { lcd_clear(); lcd_gotoxy(i,0); lcd_putsf("CodeVision"); delay_ms(400); } }; } PULL UP example5 راled كرده و ورودي آن را بخواند چنانچه ورودي صفر شد يكpull up راA برنامه اي بنويسيد كه پين پنجم پورت .روشن نمايد #include <mega32.h> void main(void) { bit x; DDRA.5=0; PORTA.5=1; DDRA.0=1; PORTA.0=0; SFIOR=0x00; while (1) { x=PINA.5; if (x==0) PORTA.0=1; else PORTA.0=0; }; } Keypad Initialization void initial_keypad_port() { SFIOR=SFIOR&0xFB; } unsigned char key, butnum; int s; unsigned char keytbl[16]={0xee, 0xed, 0xeb, 0xe7, 0xde, 0xdd, 0xdb, 0xd7, 0xbe, 0xbd, 0xbb, 0xb7, 0x7e, 0x7d, 0x7b, 0x77}; DDRC = 0x0f; PORTC = 0xf0; delay_us(5); key = PINC; DDRC = 0xf0; PORTC = 0x0f; delay_us(5); key = key | PINC; if (key != 0xff) { for (butnum=0; butnum<16; butnum++) { if (keytbl[butnum]==key) break; } ٍExample-9 برنامه اي بنویسيد كه عددي را از keypadخوانده برروي 7segنمایش دهد. #include<mega16.h> #include<delay.h> int key(); display(int x); int a; main() { DDRB=0xff; a=key(); display(a); } int key() { unsigned char key, butnum; int s; unsigned char keytbl[16]={0xee, 0xed, 0xeb, 0xe7, 0xde, 0xdd, 0xdb, 0xd7, 0xbe, 0xbd, 0xbb, 0xb7, 0x7e, 0x7d, 0x7b, 0x77}; DDRC = 0x0f; PORTC = 0xf0; delay_us(5); key = PINC; DDRC = 0xf0; PORTC = 0x0f; delay_us(5); key = key | PINC; if (key != 0xff) { for (butnum=0; butnum<16; butnum++) { if (keytbl[butnum]==key) break; } s=butnum; } else s=17; return s; } display(int x) { char str[16]= {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D, 0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71}; PORTB=str[x]; } برنامه باال را طوری تغییر دهید که عدد را بر روی LCDنمایش دهد یک