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
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نمایش دهد
یک