Nguyên văn bởi th43v3r
Xem bài viết
Thông báo
Collapse
No announcement yet.
Lập trình AVR bằng CodeVisionAVR C Compiler cho người mới bắt đầu
Collapse
X
-
các bác xem hộ chương trình lập trình đóng mở cửa dùng ATmega32 giúp em với nó báo lổi hoài em mò cả tuần mà không ra.
chương trình
#include <mega32.h>
#include <1wire.h>
#include <delay.h>
#include <lcd.h>
#include <string.h>
#include <stdlib.h>
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
#define DS1990_FAMILY_CODE 1 // khai bao ma family_code la 01
#define SEARCH_ROM 0xF0 // lenh search rom la 0X0F
#define MAX_DEVICES 8
unsigned char rom_code[MAX_DEVICES][9]; //khai bao kieu mang
unsigned char devices,i;
unsigned char don []=" ---ABCD---" ;
unsigned char don1[]=" GIAO TIEP DS1990A" ;
unsigned char don5[]=" ATMEGA32 " ;
unsigned char don2[]="TRUY XUAT THANH CONG";
unsigned char don3[]=" MA SO KHONG DUNG ";
unsigned char don4[]=" HAY KET NOI DS1990A ";
unsigned char string[] ;
// 1 Wire Bus functions
#asm
.equ __w1_port=0x1B ;PORTA
.equ __w1_bit=0
#endasm
void main(void){
PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x7F;
PORTC=0x00; // khai bao PORTC xuat du lieu
DDRC=0xFF;
PORTD=0x00;
DDRD=0xFF;
ACSR=0x80;
SFIOR=0x00;
lcd_init(20); //KHOI TAO LCD 20 DONG
lcd_clear(); // XOA LCD
_lcd_ready(); // CHO LCD READY
for (i=0;i< strlen(don);i++) // XUAT CHUOI " ---ABCD--" RA lcd;
{
lcd_putchar(don[i]);
};
lcd_gotoxy(0,1); // CHUYEN CON TRO LCD XUONG DONG 2;
for (i=0;i< strlen(don1);i++) // XUAT CHUOI " GIAO TIEP DS1990A" ;
{
lcd_putchar(don1[i]);
};
lcd_gotoxy(0,2); // CHUYEN CON TRO LCD XUONG DONG 3;
for (i=0;i< strlen(don5);i++) // XUAT CHUOI "ATMEGA32 " ;
{
lcd_putchar(don5[i]);
};
while (1)
{ w1_init(); // KHOI TAO W1
devices=w1_search(SEARCH_ROM,&rom_code[0][0]);//TIM THIET BI KET NOI VOI BUS
string[1]= rom_code[0][1]; // DOC MA SERIAL NUMBER
string[2]= rom_code[0][2];
string[3]= rom_code[0][3];
if (devices)
{ // SO SANH NEU DUNG MA LA "123456" THI CHO PHEP
if (string[1]== 0x56 &&string[2]== 0x34 && string[3]== 0x12)
{
lcd_gotoxy(0,3); // CHUYEN CON TRO LCD XUONG DONG 3;
for (i=0;i< strlen(don2);i++) // XUAT CHUOI "TRUY XUAT THANH CONG";
{
lcd_putchar(don2[i]);
PIND.0=1; // CHO PHEP DONG CO CHAY
};
}
else {
lcd_gotoxy(0,3); // CHUYEN CON TRO LCD XUONG DONG 3;
for (i=0;i< strlen(don3);i++) // XUAT CHUOI "MA SO KHONG DUNG";
{
lcd_putchar(don3[i]);
PIND.0=0; // DONG CO DUNG
} ;
} ;
}
else {
lcd_gotoxy(0,3); // CHUYEN CON TRO LCD XUONG DONG 3;
for (i=0;i< strlen(don4);i++) //" HAY KET NOI DS1990A ";
{
lcd_putchar(don4[i]);
};
};
};}
Comment
-
Cảm ơn anh nhưng em sửa lại rùi mà không được .Nó báo lổi thế này ạ!
THU.C(8): error C141: syntax error near '.'
THU.C(8): error C129: missing ';' before '__lcd_port'
thu.c(9): warning C315: unknown #directive 'endasm'
thu.c(24): warning C315: unknown #directive 'asm'
thu.c(27): warning C315: unknown #directive 'endasm'
Target not created
Comment
-
các cao thủ test giúp mình chương trình cho ATMEGA8 này có chạy được không ?
mega8 spwm program
/ / ICC-AVR application builder:2011-1-7 11:30:51
/ / Target: M8
/ / Crystal: 8.0000Mhz
# Include <iom8v.h>
# Include <macros.h>
# Define INT0 6
//===================== Period is 20ms, spwm frequency of 20k =================== ========//
short list [] = {1,4,7,10,13,16,19,22,25,28,31,34,37,39,42,45,48,5 1,54,57,60,62,
65,68,71,74,76,79,82,84,87,90,92,95,97,100,103,105 ,108,110,112,115,117,119,
122,124,126,128,131,133,135,137,139,141,143,145,14 7,149,151,152,154,156,157,
159,161,162,164,165,167,168,169,171,172,173,174,17 6,177,178,179,180,181,182,
182,183,184,185,185,186,186,187,187,188,188,189,18 9,189,189,189,189,189,189,
189,189,189,189,189,189,188,188,187,187,186,186,18 5,185,184,183,182,182,181,
180,179,178,177,176,174,173,172,171,169,168,167,16 5,164,162,161,159,157,156,
154,152,151,149,147,145,143,141,139,137,135,133,13 1,128,126,124,122,119,117,
115,112,110,108,105,103,100,97,95,92,90,87,84,82,7 9,76,74,71,68,65,62,60,57,
54,51,48,45,42,39,37,34,31,28,25,22,19,16,13,10,7, 4,1};
//===================== Period is 20ms, spwm frequency of 20k =================== ========//
int count, zf = 0;
void port_init (void)
{
PORTB = 0x00;
DDRB = 0xFF; / / 06; b port output
PORTC = 0x00;
DDRC = 0xFF; / / c port output
PORTD = 0x00;
DDRD = 0x00; / / d input ports
}
/ / TIMER1 initialize - prescale: 1
/ / WGM13: 0 = 10) PWM phz correct, TOP = ICR1
/ / Desired value: 10KHz
/ / Actual value: 10.000KHz (0.0%)
void timer1_init (void)
{
TCCR1B = 0x00; / / stop
TCNT1H = 0xFF; / / setup
TCNT1L = 0x38;
OCR1AH ??= 0x00;
OCR1AL = 0xC8;
OCR1BH = 0x00;
OCR1BL = 0xC8;
ICR1H = 0x00;
ICR1L = 200; / / 50us cycle carrier
TCCR1A = 0xA2; / / 10100010 top to update OCR1A OCR1B, compare match count is cleared up, otherwise set
TCCR1B = 0x11; / / start Timer 00010001 clk irrespective of frequency, phase correct PWM
TIMSK | = 0x20; / / timer interrupt sources that can capture interrupt
}
# Pragma interrupt_handler timer1_capt_isr: 6
void timer1_capt_isr (void)
{
OCR1A = 500;
OCR1B = 500;
/ / PORTB ^ = 0x10;
/ / 2 1. Spwm
/ /
/ / 43180
/ /
/ /
if (zf)
{
if (count <200)
{
if (count == 1) / / 2 # at this time was off the tube
{
/ / PORTB & = ~ BIT (3); / / 3 # has been off the tube
PORTB | = BIT (4); / / open the tube 4 #
}
OCR1A = list [count + +]; / / open the tube # 1
}
else if ((count> = 200) & & (count <400))
{
if (count == 200)
{
PORTB & = ~ BIT (4); / / turn off the tube 4 #
}
if (count == 201) / / At this point the tube was shut down # 1
{
PORTB | = BIT (3); / / pipe open 3 #
}
OCR1B = list [count + + -200]; / / 2 # tube opening
}
else
{
count = 0; / / 2 # tube has been turned off
PORTB & = ~ BIT (3); / / turn off the tube # 3
/ / PORTB | = BIT (4); / / open the tube 4 #
OCR1A = list [count + +]; / / open the tube # 1
}
}
else;
}
/ / Call this routine to initialize all peripherals
void init_devices (void)
{
/ / Stop errant interrupts until set up
CLI (); / / disable all interrupts
port_init ();
timer1_init ();
SEI (); / / re-enable interrupts
/ / All peripherals are now initialized
}
/ /
void main (void)
{
init_devices ();
/ / Insert your functional code here ...
zf = 1;
OCR1A = 500;
OCR1B = 500;
PORTB = 0;
while (1);
}
Comment
-
Bạn chắc là Codevision của bạn có lỗi không..Tại vì mình thử copy code của bạn sau đó mình sữa lại như trên không thấy có lỗi j hết..bạn có 2 lỗi và 3 cái warning, mấy cái warning k quan tâm, cái lỗi C141 C135 là lỗi cú pháp thôi bạn quên dấu ";" đằng sau đó.Nguyên văn bởi lenguyen225 Xem bài viếtCảm ơn anh nhưng em sửa lại rùi mà không được .Nó báo lổi thế này ạ!
THU.C(8): error C141: syntax error near '.'
THU.C(8): error C129: missing ';' before '__lcd_port'
thu.c(9): warning C315: unknown #directive 'endasm'
thu.c(24): warning C315: unknown #directive 'asm'
thu.c(27): warning C315: unknown #directive 'endasm'
Target not created
Mình đã kiểm tra và không thấy lỗi nữa mà, Bạn xem lại xem.
This program was produced by the
CodeWizardAVR V1.24.8d Professional
Automatic Program Generator
© Copyright 1998-2006 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project :
Version :
Date : 4/4/2011
Author : F4CG
Company : F4CG
Comments:
Chip type : ATmega32
Program type : Application
Clock frequency : 4.000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 512
************************************************** ***/
#include <mega32.h>
#include <1wire.h>
#include <delay.h>
#include <lcd.h>
#include <string.h>
#include <stdlib.h>
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
#define DS1990_FAMILY_CODE 1 // khai bao ma family_code la 01
#define SEARCH_ROM 0xF0 // lenh search rom la 0X0F
#define MAX_DEVICES 8
unsigned char rom_code[MAX_DEVICES][9]; //khai bao kieu mang
unsigned char devices,i;
unsigned char don []=" ---ABCD---" ;
unsigned char don1[]=" GIAO TIEP DS1990A" ;
unsigned char don5[]=" ATMEGA32 " ;
unsigned char don2[]="TRUY XUAT THANH CONG";
unsigned char don3[]=" MA SO KHONG DUNG ";
unsigned char don4[]=" HAY KET NOI DS1990A ";
unsigned char string [10] ;
// 1 Wire Bus functions
#asm
.equ __w1_port=0x1B ;PORTA
.equ __w1_bit=0
#endasm
void main(void){
PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x7F;
PORTC=0x00; // khai bao PORTC xuat du lieu
DDRC=0xFF;
PORTD=0x00;
DDRD=0xFF;
ACSR=0x80;
SFIOR=0x00;
lcd_init(20); //KHOI TAO LCD 20 DONG
lcd_clear(); // XOA LCD
_lcd_ready(); // CHO LCD READY
for (i=0;i< strlen(don);i++) // XUAT CHUOI " ---ABCD--" RA lcd;
{
lcd_putchar(don[i]);
};
lcd_gotoxy(0,1); // CHUYEN CON TRO LCD XUONG DONG 2;
for (i=0;i< strlen(don1);i++) // XUAT CHUOI " GIAO TIEP DS1990A" ;
{
lcd_putchar(don1[i]);
};
lcd_gotoxy(0,2); // CHUYEN CON TRO LCD XUONG DONG 3;
for (i=0;i< strlen(don5);i++) // XUAT CHUOI "ATMEGA32 " ;
{
lcd_putchar(don5[i]);
};
while (1)
{ w1_init(); // KHOI TAO W1
devices=w1_search(SEARCH_ROM,&rom_code[0][0]);//TIM THIET BI KET NOI VOI BUS
string[1]= rom_code[0][1]; // DOC MA SERIAL NUMBER
string[2]= rom_code[0][2];
string[3]= rom_code[0][3];
if (devices)
{ // SO SANH NEU DUNG MA LA "123456" THI CHO PHEP
if (string[1]== 0x56 &&string[2]== 0x34 && string[3]== 0x12)
{
lcd_gotoxy(0,3); // CHUYEN CON TRO LCD XUONG DONG 3;
for (i=0;i< strlen(don2);i++) // XUAT CHUOI "TRUY XUAT THANH CONG";
{
lcd_putchar(don2[i]);
PIND.0=1; // CHO PHEP DONG CO CHAY
};
}
else {
lcd_gotoxy(0,3); // CHUYEN CON TRO LCD XUONG DONG 3;
for (i=0;i< strlen(don3);i++) // XUAT CHUOI "MA SO KHONG DUNG";
{
lcd_putchar(don3[i]);
PIND.0=0; // DONG CO DUNG
} ;
} ;
}
else {
lcd_gotoxy(0,3); // CHUYEN CON TRO LCD XUONG DONG 3;
for (i=0;i< strlen(don4);i++) //" HAY KET NOI DS1990A ";
{
lcd_putchar(don4[i]);
};
};
};}Last edited by electrics; 06-04-2011, 16:38.Sống trong đời sống cần có một tấm lòng..
Comment
-
các sư huynh đệ! có tài liệu về mega 32 bằng tv ko? up lên cho m xem với. m đang làm đồ án về chip này kết hợp với bàn phím máy tính để chạy chữ.mà cho m hỏi luôn sao: if { }; , while { };.. sao lại có dấu ";" ở cuối vây. nếu bỏ nó đi thi nhiu khi sẽ báo lỗi.thank!
Comment
-
Cám ơn bạn , tui biết lỗi của chương trình của mình rồiNguyên văn bởi anhxtanh3087 Xem bài viếtBây giờ thì lập trình trên AVR k khác j lập trình cho máy tính.Lưu ý là để định nghĩa 1 chân là đầu vào bạn định nghĩa như sau: VD
định nghĩa 1 chân là đầu ra:web:
tel : 0903728070
Bán cáp lập trình S7-200 : 250.000 đ/sợi ( cổng com )
Bán cáp lập trình Mishu : 200.000 đ/sợi
Bảo hành 01 năm.
Comment
-
Mình thấy trên forum các cao thủ hay khuyên lập bảng rồi tra giá trị trong CAVR, nhưng mình chưa hình dung ra các lập trình đó. có bạn nào biết rõ về cách lập trình trên xin hướng dẫn mình với. thông cảm nhé vì trình độ mình tự học là chính
thân|
Comment
-
Cái này dùng 1 con AVR(mega/tiny)Nguyên văn bởi thang9x_hp Xem bài viếtMình mới vào nghề mong mọi người chỉ giáo bài này ! mình muốn xin code mong mọi người chỉ giùm !

- Cho ngắt ngoài cạnh lên, dùng 1 biến đếm để xác định lần xảy ra ngắt.
- Khi xảy ra ngắt này thì chạy 1 timer, cài lại: cho ngắt ngoài cạnh xuống
- Khi xảy ra ngắt lần nữa thì dừng timer (sẽ tính được độ rộng xung), cài lại: cho ngắt ngoài cạnh lên trở lại, chạy timer lại
- Khi xảy ra ngắt lần nữa thì dừng timer (sẽ cộng dồn để tính chu kì xung), xoá biến đếm
Nếu độ rộng xung và chu kì quá nhỏ thì phải cộng thêm thời gian thực hiện các lệnh trong hàm ngắt để giảm sai số
Trhợp dùng 8051 cũng được, khi đó trong hàm ngắt ngoài lần 1 sẽ phải dùng vòng lặp và biến đếm để kiểm tra chờ chân ngắt ngoài xuống thấp!e
Comment
-
cái này phải học C trước, nắm các câu lệnh cơ bản trước, khi đã nắm chắc rồi thì phần còn lại là phần cứng của vi điều khiển thôi, cách khởi tạo phần cứng của nó... phần này có trong DATA SHEET của nhà sản xuất rồi bạn nên download bản full về sẽ rất chi tiết. trong phần help của codevisionavr cũng có đấy. nếu mới bắt đầu thì nên học điều khiển LED trước, điều khiển sáng tắt 1 con led rồi đến điều khiển cả 8 con tương ứng với 1 thanh ghi( với vi điều khiển 8 bit)... sau đó đến các chuẩn giao tiếp của nó...Nguyên văn bởi bluetooth201 Xem bài viếtMình mới tập tành môn này nên đọc vào cung chưa hiểu được gì nhiều. Hi vong các cao thủ ra tay làm một cái tutorial cho đàn em newbie học hỏi ạ. Chân thành cảm ơn!Never forget who you are!
Comment
Bài viết mới nhất
Collapse
-
Trả lời cho Yêu thơ mê nhạc, mời các bác vào đây!bởi dinhthuong92Bài hát mới, nhạc Phật: Về Giữa Chiêm Bao, sáng tác: Hoàng Đình Thường.
[Verse 1] Nhân gian bao thay đổi
ĐỜI là giấc CHIÊM BAO
Người mê lầm tranh đấu
KHỔ ĐAU mãi LUÂN HỒI.
VÔ THƯỜNG nào ai thấu
...-
Channel: Tâm tình dân kỹ thuật
Hôm qua, 19:01 -
-
Trả lời cho Giúp mình vẽ sơ đồ và phân tích nguyên lý làm việc của khảo sát các mạch nguồn ổn áp vớibởi davidcopyBạn muốn hỏi nguyên lý làm việc của mạch nào...
-
Channel: Hỗ trợ học tập
24-03-2026, 22:50 -
-
Trả lời cho Giúp mình vẽ sơ đồ và phân tích nguyên lý làm việc của khảo sát các mạch nguồn ổn áp vớibởi N_Tu_Hoc_HoiBạn cần sơ đồ mạch ổn áp bao nhiêu Volt, Nếu giống anh bạn guiwr có khả năng ổn áp dùng iC họ 78XX, 79XX. Những mạch này bạn tim kiếm trên google sẽ thấy!!
-
Channel: Hỗ trợ học tập
23-03-2026, 02:32 -
-
bởi chinhnguyen9
Điến âp vào 24V;Điên áp ra 30V;Dòng điện ra 10A
Trên nền tảng mạch Boost thay đổi như sau: cự âm tụ lọc C không nối mas mà nối vào Vc +24V
Mach phản hồi tao điê áp trên tụ lọc này ổn đinh ở 6V
Kết quả:
· Điện áp ra =24V+ 6V=30V
· Công...-
Channel: Hướng dẫn sử dụng diễn đàn
21-03-2026, 19:33 -
-
bởi chinhnguyen92. Các yếu tố để dòng điện đầu ra không bị "thiếu"
Dòng điện đầu ra bị "thiếu" có thể hiểu là không đủ 10A theo yêu cầu hoặc bị sụt áp khi tải thay đổi. Để đảm bảo điều này, bạn cần xem xét các yếu tố sau:
a. Khả năng chịu dòng của cuộn cảm- Dòng bão hòa (I_sat): Như
-
Channel: Hướng dẫn sử dụng diễn đàn
21-03-2026, 19:06 -
bởi chinhnguyen9
1. Tính toán cuộn cảm (Inductor)
Để tính giá trị cuộn cảm, chúng ta cần thực hiện các bước sau:
a. Xác định chu kỳ nhiệm vụ (Duty Cycle - D)
Với mạch tăng áp lý tưởng, chu kỳ nhiệm vụ được tính theo công thức :
D=1-VinVout=1-24V30V=0.2
Vậy D = 0.2 (20%)
b....-
Channel: Hướng dẫn sử dụng diễn đàn
21-03-2026, 19:03 -
-
bởi chinhnguyen9Công thức
Gain (dB) = 20 × log₁₀(A)
Thí dụ 1; 60dB
log₁₀(A)=60/20=3
⇒ A=V_out / V_in = 10³ = 1.000
Thí dụ 2; 100dB
log₁₀(A)=100/20=5
⇒ A=V_out / V_in = 105 = 100.000
Tí dụ 3; LM 358
Large Signal Open Loop Voltage Gain AVOL V/mV RL = 2.0...-
Channel: Hướng dẫn sử dụng diễn đàn
19-03-2026, 08:44 -
-
Trả lời cho Mạch 3s bị giảm điện áp đầu rabởi minhtri0405chả biết bạn xử lý được chưa , kích sạc hoặc điện áp > điện áp khối pin vào 2 chân P - P+ , nhiều mạch phải yêu cầu có kích lần đầu sau đó mới chạy...
-
Channel: Điện tử dành cho người mới bắt đầu
18-03-2026, 10:01 -
-
bởi minhtri0405đây có phải là 1 cách để test mosfet xịn hay dỏm khi mua đồ tàu không nhỉ , vì ko thể đập ra để coi lõi rồi trả hàng được....
-
Channel: Tâm tình dân kỹ thuật
18-03-2026, 09:57 -
xem lại nhè
Comment