Transcript While (1)

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
 R1R1+R2
Logic
 AND
R1,R2
 R1R1
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‬نمایش دهد‬
‫یک‬