Giáo trình AVR - Chương 1: Giới thiệu - Cao Bá Vinh

Mục đích:
. Giúp cho sinh viên làm quen với vi điều khiển mới ATMEGA32.
. Tìm hiểu cấu trúc AVR.
. Làm quen với ngôn ngữ C.
. Làm quen với trình biên dịch Codvision AVR.
Yêu cầu :
Sinh viên cần phải nắm được:
1.các khái niệm PINx,PORTx,DDRx.
2. các chân có chức năng đặc biệt.
3. các tập lệnh C ( if-else, while ,do-while ,swich-case).
4. tạo dự án mới , tạo thư viện , sử dụng chức năng tạo code sẵn.
pdf 28 trang thamphan 27/12/2022 2680
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình AVR - Chương 1: Giới thiệu - Cao Bá Vinh", để tải tài liệu gốc về máy hãy click vào nút Download ở trên.

File đính kèm:

  • pdfgiao_trinh_avr_chuong_1_gioi_thieu_cao_ba_vinh.pdf

Nội dung text: Giáo trình AVR - Chương 1: Giới thiệu - Cao Bá Vinh

  1. Giáo trình AVR Khoa ðinðin TTrưng ðH Lc Hng Chương I: Gii thiu Mc ñích: . Giúp cho sinh viên làm quen vi vi ñiu khin mi ATMEGA32. . Tìm hiu cu trúc AVR. . Làm quen vi ngôn ng C. . Làm quen vi trình biên dch Codvision AVR. Yêu cu : Sinh viên cn phi nm ñưc: 1.các khái nim PINx,PORTx,DDRx. 2. các chân có chc năng ñc bit. 3. các tp lnh C ( ifelse, while ,dowhile ,swichcase). 4. to d án mi , to thư vin , s dng chc năng to code sn. S tit lên lp : 10 tit. Bn phân chia thi lưng: Stt Ni dung S tit 1 1.1 gii thiu vi ñiu khin ATmega32. 4 2 1.2 Tp lnh và cu trúc C. 5 3 1.3 gii thiu trình biên dch Codevision 1 Trng tâm bài ging: • Bt buc sinh viên phi nm ñưc các PORTx,PINx, DDRx. • Nm ñưc các chân ngt ngoài , chân ADC, chân PWM, counter • Sinh viên phi nm ñưc tp lnh và cu trúc C. • Sinh viên phi bit cách to Project mi trong trình biên dch Codevision. 1.1 Gii thiu vi ñiu khin ATMEGA32. Biên son : Ks.Cao Bá Vinh 1
  2. Giáo trình AVR Khoa ðinðin TTrưng ðH Lc Hng gm có 3 thanh ghi DDRx, PORTx,PINx. 1.1.3.1 Thanh ghi hưng DDRx(x=A,B,C,D). • Thanh ghi này có chc năng ñiu khin hung xut hay nhp ca chân ñiu khin. • Nu bít tương ng là 0 thì là hưng vào. • Nu bit tương ng là 1 thì là hưng ra. Vd1: • DDRA.0 =0 thì cng A.0 này là ch là ngõ vào. • DDRA.7=1 thì cng A.7 này là ngõ ra. 1.1.3.2 thanh ghi xut PORTx(x=A,B,C,D) • Thanh ghi này có 2 chc năng . chc năng chính là xut ngõ ra , chc năng th 2 là cho phép ñin tr kéo lên ni khi cng ñiu khin là ngõ vào. • ng dng là ñiu khin các ngõ ra như led ,lcd, ñng cơ Vd2 : • PORTC.5 =1 thì trên Pc.5 là mc 1 khi DDRC.5=1. • PORTC.5 =0 thì trên Pc.5 là mc 0 khi DDRC.5=1. • PORTC.0 =1 thì trên Pc.0 là mc 1 khi DDRC.0=1. 1.1.3.3 thanh ghi nhp PINx(x=A,B,C,D) • Thanh ghi này có chc năng nhn tín hiu ngõ vào . • ng dng như là nút nhn , ñc các tín hiu adc , cm bin Vd3 : • PORTD.0=PINC.0 thì trên chân PC.0 này bng mc gì thì PD.0 bng mc ñy(chú ý là DDRC.0=0, DDRD.0=1,PORTC.0=1). Câu hi hiu bài: Câu 1 : vi ñiu khin ATmega32 có my phn b nh. Câu 2 : vi ñiu khin ATmega32 có bao nhiêu b nh chương trình. Câu 3 : vi ñiu khin ATmega32 có bao nhiêu chân ñiu khin I/O. Câu 4 : có my timer , và nêu ñim ni bt ca nó. Câu 5: thit b ngoi vi ca ATmega32 gm có nhng gì. Câu 6: hãy ñiu khin 4 led ñơn và 4 nút nhn trên cng PC. Câu 7: hãy cho bit trong 1 thi ñim 1 chân VðK có th va là ngõ vào va là ngõ ra ñưc không? Câu 8: khi nào thì dùng PINx , khi nào dùng PORTx, và thanh ghi DDRx dùng làm gì. Câu 9: trong ATMEGA32 có my kênh adc? Biên son : Ks.Cao Bá Vinh 3
  3. Giáo trình AVR Khoa ðinðin TTrưng ðH Lc Hng #define data_led PORTC #define motor_left OCR1AL #define motor_right OCR1BL #define un unsigned #define high(x) (((x) & 0xFF00) >> 8) #define low(x) ((unsigned char)(x)) 1.2.3 . Thay Th Kiu : ð thay th kiu ta có th dung t khóa “typedef” Cu trúc : typedef kiu d liu ñt tên; Vd: typedef int so_nguyen; Typedef char byte; Typedef double so_thuc; Sau khi chúng ta ñt tên thì chúng ta có th s dng tên mi này mà ñt tên cho khai báo bin. Vd: so_nguyen I,j,k,l;// lúc này thì các bin I,j,k,l là kiu s nguyên 16bit. 1.2.4 .LNH IF ELSE IF Lnh if else if là lnh kim tra ñiu kin . If { ðúng ñiu kin 1 thì làm.} Else {ðiu kin 1 sai thì làm.} . Chú ý nu thc hin 1 dòng lnh thì không cn du {}. Vd1: Int i=10; If (i>10) i=i+1; Else i=i1; Vd2: int i=5,j; If (i==7) j=0; Else if(i==10) j=j+2; Else if(i==5) j=i+1; Else j=j+100; 1.2.4 .LNH WHILE(ñiu kin). Lnh while là lnh kim tra ñiu kin trưc ri mi thc thi khi lnh . Biên son : Ks.Cao Bá Vinh 5
  4. Giáo trình AVR Khoa ðinðin TTrưng ðH Lc Hng khèi lÖnh 1 case n2 khèi lÖnh 2 case nk khèi lÖnh k [ default khèi lÖnh k+1 ] } Víi ni l c¸c sè nguyªn, h»ng ký tù hoÆc biÓu thøc h»ng. C¸c ni cÇn cã gi¸ trÞ kh¸c nhau. §o¹n ch−¬ng tr×nh n»m gi÷a c¸c dÊu { } gäi l th©n cña to¸n tö switch. default l mét thnh phÇn kh«ng b¾t buéc ph¶i cã trong th©n cña switch. Sù ho¹t ®éng cña to¸n tö switch phô thuéc vo gi¸ trÞ cña biÓu thøc viÕt trong dÊu ngoÆc ( ) nh− sau : Khi gi¸ trÞ cña biÓu thøc ny b»ng ni, m¸y sÏ nh¶y tíi c¸c c©u lÖnh cã nhn l case ni. Khi gi¸ trÞ biÓu thøc kh¸c tÊt c¶ c¸c ni th× c¸ch lm viÖc cña m¸y l¹i phô thuéc vo sù cã mÆt hay kh«ng cña lÖnh default nh− sau : Khi cã default m¸y sÏ nh¶y tíi c©u lÖnh sau nhn default. Khi kh«ng cã default m¸y sÏ nh¶y ra khái cÊu tróc switch. Chó ý : M¸y sÏ nh¶y ra khái to¸n tö switch khi nã gÆp c©u lÖnh break hoÆc dÊu ngoÆc nhän ®ãng cuèi cïng cña th©n switch. Ta còng cã thÓ dïng c©u lÖnh goto trong th©n cña to¸n tö switch ®Ó nh¶y tíi mét c©u lÖnh bÊt kú bªn ngoi switch. Biên son : Ks.Cao Bá Vinh 7
  5. Giáo trình AVR Khoa ðinðin TTrưng ðH Lc Hng case 6:printf("Trung binh\n");break; case 7: case 8:printf("Kha\n");break; case 9: case 10:printf("Gioi\n");break; default:printf(Vao sai\n); } printf("Tiep tuc 1, dung 0 :") scanf("%d",&diem); if (diem==1) goto tt; getch(); return; } 11 221.2.71.2 .7 . CÊu tróc lÆp víi to¸n tö for : To¸n tö for dïng ®Ó x©y dùng cÊu tróc lÆp cã d¹ng sau : for ( biÓu thøc 1; biÓu thøc 2; biÓu thøc 3) LÖnh hoÆc khèi lÖnh ; To¸n tö for gåm ba biÓu thøc v th©n for. Th©n for l mét c©u lÖnh hoÆc mét khèi lÖnh viÕt sau tõ kho¸ for. BÊt kú biÓu thøc no trong ba biÓu thøc trªn cã thÓ v¾ng mÆt nh−ng ph¶i gi÷ dÊu ; . Th«ng th−êng biÓu thøc 1 l to¸n tö g¸n ®Ó t¹o gi¸ trÞ ban ®Çu cho biÕn ®iÒu khiÓn, biÓu thøc 2 l mét quan hÖ logic biÓu thÞ ®iÒu kiÖn ®Ó tiÕp tôc chu tr×nh, biÓu thøc ba l mét to¸n tö g¸n dïng ®Ó thay ®æi gi¸ trÞ biÕn ®iÒu khiÓn. Ho¹t ®éng cña to¸n tö for : To¸n tö for ho¹t ®éng theo c¸c b−íc sau : X¸c ®Þnh biÓu thøc 1 X¸c ®Þnh biÓu thøc 2 Tuú thuéc vo tÝnh ®óng sai cña biÓu thøc 2 ®Ó m¸y lùa chän mét trong hai nh¸nh : Biên son : Ks.Cao Bá Vinh 9
  6. Giáo trình AVR Khoa ðinðin TTrưng ðH Lc Hng { c=x[i];x[i]=x[j];x[j]=c; } fprintf(stdprn,“\n Day so dao la \n\n”); for (i=0;i<n;++i) fprintf(stdprn,“%8.2f”,x[i]); } C¸ch 2 : #include “stdio.h” float x[]={1.3,2.5,7.98,56.9,7.23}; int n=sizeof(x)/sizeof(float); main() { int i,j; float c; for (i=0,j=n1;i<j;c=x[i],x[i]=x[j],x[j]=c,++i,j) fprintf(stdprn,“\n Day so dao la \n\n”); for (i=0;++i<n;) fprintf(stdprn,“%8.2f”,x[i]); } C¸ch 3 : #include “stdio.h” float x[]={1.3,2.5,7.98,56.9,7.23}; int n=sizeof(x)/sizeof(float); main() { int i=0,j=n1; float c; for ( ; ; ) { c=x[i];x[i]=x[j];x[j]=c; Biên son : Ks.Cao Bá Vinh 11
  7. Giáo trình AVR Khoa ðinðin TTrưng ðH Lc Hng 1.2.8 C©u lÖnh break : C©u lÖnh break cho phÐp ra khái c¸c chu tr×nh víi c¸c to¸n tö for, while v switch. Khi cã nhiÒu chu tr×nh lång nhau, c©u lÖnh break sÏ ®−a m¸y ra khái chu tr×nh bªn trong nhÊt chøa nã kh«ng cÇn ®iÒu kiÖn g×. Mäi c©u lÖnh break cã thÓ thay b»ng c©u lÖnh goto víi nhn thÝch hîp. VÝ dô : BiÕt sè nguyªn d−¬ng n sÏ l sè nguyªn tè nÕu nã kh«ng chia hÕt cho c¸c sè nguyªn trong kho¶ng tõ 2 ®Õn c¨n bËc hai cña n. ViÕt ®o¹n ch−¬ng tr×nh ®äc vo sè nguyªn d−¬ng n, xem n cã l sè nguyªn tè. # include "stdio.h" # include "math.h" unsigned int n; main() { int i,nt=1; printf("\n cho n="); scanf("%d",&n); for (i=2;i<=sqrt(n);++i) if ((n % i)==0) { nt=0; break; } if (nt) printf("\n %d la so nguyen to",n); else printf("\n %d khong la so nguyen to",n); } 1.2.9 C©u lÖnh continue ::: Tr¸i víi c©u lÖnh break, lÖnh continue dïng ®Ó b¾t ®Çu mét vßng míi cña chu tr×nh chøa nã. Trong while v do while, lÖnh continue chuyÓn ®iÒu Biên son : Ks.Cao Bá Vinh 13
  8. Giáo trình AVR Khoa ðinðin TTrưng ðH Lc Hng ++soptd; } printf("\n So phan tu duong la : %d",soptd); printf("\n Tong cac phan tu duong la : %8.2f",tongduong); printf("\n Cuc dai phan tu duong la : %8.2f",cucdai); } 1.2.10 Hàm Mét ch−¬ng tr×nh viÕt trong ng«n ng÷ C l mét dy c¸c hm, trong ®ã cã mét hm chÝnh ( hm main() ). Hm chia c¸c bi to¸n lín thnh c¸c c«ng viÖc nhá h¬n, gióp thùc hiÖn nh÷ng c«ng viÖc lÆp l¹i no ®ã mét c¸ch nhanh chãng m kh«ng ph¶i viÕt l¹i ®o¹n ch−¬ng tr×nh. Thø tù c¸c hm trong ch−¬ng tr×nh l bÊt kú, song ch−¬ng tr×nh bao giê còng ®i thùc hiÖn tõ hm main(). 1.2.10.1 C¬ së : Hm cã thÓ xem l mét ®¬n vÞ ®éc lËp cña ch−¬ng tr×nh. C¸c hm cã vai trß ngang nhau, v× vËy kh«ng cã phÐp x©y dùng mét hm bªn trong c¸c hm kh¸c. X©y dùng mét hm bao gåm: khai b¸o kiÓu hm, ®Æt tªn hm, khai b¸o c¸c ®èi v ®−a ra c©u lÖnh cÇn thiÕt ®Ó thùc hiÖn yªu cÇu ®Ò ra cho hm. Mét hm ®−îc viÕt theo mÉu sau : type tªn hm ( khai b¸o c¸c ®èi ) { Khai b¸o c¸c biÕn côc bé C¸c c©u lÖnh [return[biÓu thøc];] } Dßng tiªu ®Ò : Trong dßng ®Çu tiªn cña hm chøa c¸c th«ng tin vÒ : kiÓu hm, tªn hm, kiÓu v tªn mçi ®èi. Biên son : Ks.Cao Bá Vinh 15
  9. Giáo trình AVR Khoa ðinðin TTrưng ðH Lc Hng printf("\n Max cua ba so x=%8.2f y=%8.2f z=%8.2f la : %8.2f", x,y,z,max3s(x,y,z)); } /* KÕt thóc hm main*/ float max3s(float a,float b,float c) { float max; max=a; if (max<b) max=b; if (max<c) max=c; return(max); } /* KÕt thóc hm max3s*/ Quy t¾c ho¹t ®éng cña hm : Mét c¸ch tæng qu¸t lêi gäi hm cã d¹ng sau : tªn hm ([Danh s¸ch c¸c tham sè thùc]) Sè c¸c tham sè thùc tÕ thay vo trong danh s¸ch c¸c ®èi ph¶i b»ng sè tham sè h×nh thøc v lÇn l−ît chóng cã kiÓu t−¬ng øng víi nhau. Khi gÆp mét lêi gäi hm th× nã sÏ b¾t ®Çu ®−îc thùc hiÖn. Nãi c¸ch kh¸c, khi m¸y gÆp lêi gäi hm ë mét vÞ trÝ no ®ã trong ch−¬ng tr×nh, m¸y sÏ t¹m dêi chç ®ã v chuyÓn ®Õn hm t−¬ng øng. Qu¸ tr×nh ®ã diÔn ra theo tr×nh tù sau : CÊp ph¸t bé nhí cho c¸c biÕn côc bé. G¸n gi¸ trÞ cña c¸c tham sè thùc cho c¸c ®èi t−¬ng øng. Thùc hiÖn c¸c c©u lÖnh trong th©n hm. Khi gÆp c©u lÖnh return hoÆc dÊu } cuèi cïng cña th©n hm th× m¸y sÏ xo¸ c¸c ®èi, biÕn côc bé v ra khái hm. NÕu trë vÒ tõ mét c©u lÖnh return cã chøa biÓu thøc th× gi¸ trÞ cña biÓu thøc ®−îc g¸n cho hm. Gi¸ trÞ cña hm sÏ ®−îc sö dông trong c¸c biÓu thøc chøa nã. C¸c tham sè thùc, c¸c ®èi v biÕn côc bé : Do ®èi v biÕn côc bé ®Òu cã ph¹m vi ho¹t ®éng trong cïng mét hm nªn ®èi v biÕn côc bé cÇn cã tªn kh¸c nhau. Biên son : Ks.Cao Bá Vinh 17
  10. Giáo trình AVR Khoa ðinðin TTrưng ðH Lc Hng if (max =0*/ { long int gtphu=1; int i; for (i=1;i 0 Hm tÝnh n! theo ph−¬ng ph¸p ®Ö qui cã thÓ ®−îc viÕt nh− sau : long int gtdq(int n) { if (n==0 || n==1) return 1; else Biên son : Ks.Cao Bá Vinh 19
  11. Giáo trình AVR Khoa ðinðin TTrưng ðH Lc Hng n l¹i hiÓu l thø nhÊt, nã cã gi¸ trÞ b»ng 3, do vËy gi¸ trÞ cña biÓu thøc trong (*) l 3.2.1=6. ChÝnh gi¸ trÞ ny ®−îc sö dông trong c©u lÖnh printf cña hm main() nªn kÕt qu¶ in ra trªn mn h×nh l : 3!=6 Chó ý : Hm ®Ö qui so víi hm cã thÓ dïng vßng lÆp th× ®¬n gi¶n h¬n, tuy nhiªn víi m¸y tÝnh khi dïng hm ®Ö qui sÏ dïng nhiÒu bé nhí trªn ng¨n xÕp v cã thÓ dÉn ®Õn trn ng¨n xÕp. V× vËy khi gÆp mét bi to¸n m cã thÓ cã c¸ch gi¶i lÆp ( kh«ng dïng ®Ö qui ) th× ta nªn dïng c¸ch lÆp ny. Song vÉn tån t¹i nh÷ng bi to¸n chØ cã thÓ gi¶i b»ng ®Ö qui. 1.2.10.31.2.10.3.2 2. C¸c bi to¸n cã thÓ dïng ®Ö qui : Ph−¬ng ph¸p ®Ö qui th−êng ¸p dông cho c¸c bi to¸n phô thuéc tham sè cã hai ®Æc ®iÓm sau : Bi to¸n dÔ dng gi¶i quyÕt trong mét sè tr−êng hîp riªng øng víi c¸c gi¸ trÞ ®Æc biÖt cña tham sè. Ng−êi ta th−êng gäi l tr−êng hîp suy biÕn. Trong tr−êng hîp tæng qu¸t, bi to¸n cã thÓ qui vÒ mét bi to¸n cïng d¹ng nh−ng gi¸ trÞ tham sè th× bÞ thay ®æi. Sau mét sè h÷u h¹n b−íc biÕn ®æi dÖ qui nã sÏ dÉn tíi tr−êng hîp suy biÕn. Bi to¸n tÝnh n giai thõa nªu trªn thÓ hiÖn râ nÐt ®Æc ®iÓu ny. 1.2.10.31.2.10.3.3 3. C¸ch x©y dùng hm ®Ö qui : Hm ®Ö qui th−êng ®−îc x©y dùng theo thuËt to¸n sau : if ( tr−êng hîp suy biÕn) { Tr×nh by c¸ch gi¶i bi to¸n khi suy biÕn } else /* Tr−êng hîp tæng qu¸t */ { Gäi ®Ö qui tíi hm ( ®ang viÕt ) víi c¸c gi¸ trÞ kh¸c cña tham sè } Biên son : Ks.Cao Bá Vinh 21
  12. Giáo trình AVR Khoa ðinðin TTrưng ðH Lc Hng # include "conio.h" void prind(int n); main() { int a; clrscr(); printf("n="); scanf("%d",&a); prind(a); getch(); } void prind(int n) { int i; if (n<0) { putchar(''); n=n; } if ((i=n/10)!=0) prind(i); putchar(n%10+'0'); } 1.2.11 Bé tiÒn sö lý C ::: C ®−a ra mét sè c¸ch më réng ng«n ng÷ b»ng c¸c bé tiÒn sö lý macro ®¬n gi¶n. Cã hai c¸ch më réng chÝnh l #define m ta ® häc v kh¶ n¨ng bao hm néi dung cña c¸c file kh¸c vo file ®ang ®−îc dÞch. Bao hm file : §Ó dÔ dng xö lý mét tËp c¸c #define v khai b¸o ( trong c¸c ®èi t−îng kh¸c ), C ®−a ra c¸ch bao hm c¸c file kh¸c vo file ®ang dÞch cã d¹ng : #include "tªn file" Biên son : Ks.Cao Bá Vinh 23
  13. Giáo trình AVR Khoa ðinðin TTrưng ðH Lc Hng Ta còng cã thÓ ®Þnh nghÜa c¸c macro cã ®èi, do vËy v¨n b¶n thay thÕ sÏ phô thuéc vo c¸ch gäi tíi macro. VÝ dô : §Þnh nghÜa macro gäi max nh− sau : #define max(a,b) ((a)>(b) ?(a):(b)) ViÖc sö dông : x=max(p+q,r+s); t−¬ng ®−¬ng víi : x=((p+q)>(r+s) ? (p+q):(r+s)); Nh− vËy ta cã thÓ cã hm tÝnh cùc ®¹i viÕt trªn mét dßng. Chõng no c¸c ®èi cßn gi÷ ®−îc tÝnh nhÊt qu¸n th× macro ny vÉn cã gi¸ trÞ víi mäi kiÓu d÷ liÖu, kh«ng cÇn ph¶i cã c¸c lo¹i hm max kh¸c cho c¸c kiÓu d÷ liÖu kh¸c nh−ng vÉn ph¶i cã ®èi cho c¸c hm. TÊt nhiªn nÕu ta kiÓm tra l¹i viÖc më réng cña hm max trªn, ta sÏ thÊy r»ng nã cã thÓ g©y ra sè bÉy. BiÓu thøc ® ®−îc tÝnh l¹i hai lÇn v ®iÒu ny l kh«ng tèt nÕu nã g©y ra hiÖu qu¶ phô kiÓu nh− c¸c lêi gäi hm v to¸n tö t¨ng. CÇn ph¶i thËn träng dïng thªm dÊu ngoÆc ®Ó ®¶m b¶o trËt tù tÝnh to¸n. Tuy vËy, macro vÉn rÊt cã gi¸ trÞ. Chó ý : Kh«ng ®−îc viÕt dÊu c¸ch gi÷a tªn macro víi dÊu më ngoÆc bao quanh danh s¸ch ®èi. VÝ dô : XÐt ch−¬ng tr×nh sau : main() { int x,y,z; x=5; y=10*5; z=x+y; z=x+y+6; z=5*x+y; Biên son : Ks.Cao Bá Vinh 25
  14. Giáo trình AVR Khoa ðinðin TTrưng ðH Lc Hng Câu 5: cu trúc thay th kiu là gì. Câu 6: lnh if và elseif khác nhau ch nào. Câu 7: lnh if và switch case bn hãy so sánh chúng. Câu 8: lnh while {} , và do{}while bn hãy so sánh chúng. Câu 9: khi nào dùng lnh while. Câu 10 : khi nào dùng lnh do{}while. Câu 11: bn hãy cho bit 3 kiu vit này khác nhau gì không: a. while(++i 100;i=i+8) ; Câu 17: bn hãy nhn xét ñúng hay sai ch nào, ti sao? For(i=0,j=10,k=3;k<666;j++,k+=j+i,i=i+8) ; Câu 18: câu lnh break và continue ng dng làm gì ,cho ví d. Câu 19: bn cho bit th nào là bin cc b và bin toàn cc , trong C có bao nhiêu loi bin? Câu 20: hàm và macro ging và khác nhau ch nào?. Câu 21: bn hãy cho ví d hàm có ñi s và không ñi s. Câu 22: bn hãy cho ví d hàm có giá tr tr v và không giá tr tr v. Biên son : Ks.Cao Bá Vinh 27