v1t2m3
23-04-2010, 08:01 AM
em đang viết 1 đoạn chương trình cho pic6f877a, em dựa trên tài liệu và hướng dẫn của mọi người trong diễn đàn để viết,trong đó có bài viết của anh linhnc, ban đầu em viết đo điện áp thì chạy được và mô phỏng được,nhưng sau em làm theo cách anh linhnc để lấy giá trị trung bình cuả điện áp hiển thị lên LCD thì ko được mong các anh,các bạn giúp mình,khi chạy xong báo lỗi nhưng mình tìm hoài ko ra.
Xin lỗi mọi ngươi vì mình chưa biết viết code trong khung:
code:
#include <16F877A.h>
#include <DEFS_16F877A.h>
#device *=16 ADC=10
#include <math.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#define RS RB3
#define RW RB4
#define E RB5
#byte lcd_data = PORTD
#define INTS_PER_SECOND0 4 // (20000000/(4*256*256))
#define INTS_PER_SECOND2 64 // (20000000/(4*16*256))
int16 nghin,tram,chuc,donvi,du1,du2;
int16 a[15],v[15],a1,v1;
byte int_count0,int_count2;
void do_dien_ap();
void do_dong_dien();
void xuat_ra_lcd();
void temp_1_buff();
void temp_2_buff();
void lcd_init();
void lcd_gotoxy();
void lcd_putc();
void lcd_send_byte();
//==================================
//============Ngat Timer 0 2=============
#int_rtcc // This function is called every time
void clock0_isr() { // the RTCC (timer0) overflows (255->0).
// For this program this is apx 76 times
if(--int_count0==0) { // per second.
temp_2_buff();
temp_1_buff();
int_count0=INTS_PER_SECOND0;
}
}
#INT_TIMER2 // This function is called every time
void clock1_isr() { // timer 1 overflows (65535->0), which is
// approximately 19 times per second for
if(--int_count2==0) { // this program.
xuat_ra_lcd();
int_count2 = INTS_PER_SECOND2;
}
}
//==================================
void main()
{
set_tris_B(0);
set_tris_D(0);
set_tris_A(0xFF);
lcd_init();
delay_ms(100);
lcd_gotoxy(1,1);
lcd_putc("HE THONG KICH TU");
lcd_gotoxy(3,2);
lcd_putc("MAY PHAT");
delay_ms(100);
lcd_send_byte(0,1);//xoa LCD
lcd_send_byte(0,6);
setup_adc_ports(AN0_AN1_AN3);
setup_adc(ADC_CLOCK_INTERNAL);
delay_us(10);
//---------------------------
int_count0=INTS_PER_SECOND0;
int_count2=INTS_PER_SECOND2;
while(true)
{
do_dien_ap();
do_dong_dien();
}
}
//------------lay gia tri read_adc 15 lan-------------------
void temp_1_buff() {
set_adc_channel(0);
delay_us(10);
v[15]=v[14];
v[14]=v[13];
v[13]=v[12];
v[12]=v[11];
v[11]=v[10];
v[10]=v[9];
v[9]=v[8];
v[8]=v[7];
v[7]=v[6];
v[6]=v[5];
v[5]=v[4];
v[4]=v[3];
v[3]=v[2];
v[2]=v[1];
v[1]=v[0];
v[0]=read_adc();
}
void temp_2_buff() {
set_adc_channel(1);
delay_us(10);
a[15]=a[14];
a[14]=a[13];
a[13]=a[12];
a[12]=a[11];
a[11]=a[10];
a[10]=a[9];
a[9]=a[8];
a[8]=a[7];
a[7]=a[6];
a[6]=a[5];
a[5]=a[4];
a[4]=a[3];
a[3]=a[2];
a[2]=a[1];
a[1]=a[0];
a[0]=read_adc();
}
//-----------------------------------
void convert_bcd(int16 x)
{
nghin = x / 1000 + 0x30;
du1 = x % 1000;
tram = du1 / 100 + 0x30;
du2 = du1 % 100;
chuc = du2 / 10 + 0x30;
donvi = du2 % 10 + 0x30;
}
//------------lenh cho LCD-----------
byte lcd_read_byte()
{
byte read_byte;
set_tris_D(0xFF); // PORTD = input
RW = 1;
delay_cycles(1);
E = 1;
delay_cycles(1);
read_byte = lcd_data;
E = 0;
set_tris_D(0x00); // PORTD = output
return(read_byte);
}
/* Goi 1byte den LCD */
void lcd_send_byte( byte address, byte n )
{
RS = 0;
while ( bit_test(lcd_read_byte(),7) ) ;
RS = address;
delay_cycles(1);
RW = 0;
delay_cycles(1);
E = 0;
lcd_data = n;
delay_cycles(1);
E = 1;
delay_us(2);
E = 0;
}
/* Khoi tao ban dau cho LCD */
void lcd_init()
{
byte const lcd_init_string[4] = {0x38, 0x0C, 1 , 6};
byte i;
set_tris_D(0x00);
RS = 0;
RW = 0;
E = 0;
delay_ms(15);
for(i=1;i<=3;++i)
{
lcd_data = 3;
delay_cycles(1);
E = 1;
delay_us(2);
E = 0;
delay_ms(5);
}
lcd_data = 2;
delay_cycles(1);
E = 1;
delay_us(2);
E = 0;
delay_ms(5);
for(i=0;i<=3;++i)
{
lcd_send_byte(0,lcd_init_string[i]);
}
}
void lcd_gotoxy( BYTE x, BYTE y) {
BYTE address;
if(y!=1)
address=0x40;
else
address=0;
address+=x-1;
lcd_send_byte(0,0x80|address);
}
void lcd_putc( char c) {
switch (c) {
case '\f' : lcd_send_byte(0,1);
delay_ms(2);
break;
case '\n' : lcd_gotoxy(1,2); break;
case '\b' : lcd_send_byte(0,0x10); break;
default : lcd_send_byte(1,c); break;
}
}
//===================================tinh trung binh read_adc
int16 cal_a() {
return((a[0]+a[1]+a[2]+a[3]+a[4]+a[5]+a[6]+a[7]+a[8]+a[9])+a[11]+a[12]+a[13]+a[14]+a[15]/15);
}
int16 cal_v() {
return((v[0]+v[1]+v[2]+v[3]+v[4]+v[5]+v[6]+v[7]+v[8]+v[9]+v[10]+v[11]+v[12]+v[13]+v[14]+v[15])/15);
}
void do_dien_ap()
{
set_timer0(0);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256); // Tran = 13.1ms
set_timer1(0);
setup_timer_2(T2_DIV_BY_16,255,2);
enable_interrupts(INT_RTCC);
enable_interrupts(INT_TIMER2);
set_adc_channel(0);
}
void do_dong_dien()
{
set_timer0(0);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256); // Tran = 13.1ms
set_timer2(0);
setup_timer_2(T2_DIV_BY_16,255,2);
enable_interrupts(INT_RTCC);
enable_interrupts(INT_TIMER2);
set_adc_channel(1);
}
void xuat_ra_lcd() {
int16 a1,v1;
a1 = cal_a();
a1=a1*10/1023;
convert_bcd(a1);
lcd_gotoxy(1,1);
lcd_putc("I=");
lcd_putc(nghin);
lcd_putc(".");
lcd_putc(tram);
lcd_putc(chuc);
lcd_putc("A");
v1= cal_v();
v1=v1*5000/1023;
convert_bcd(v1);
lcd_gotoxy(10,1);
lcd_putc("U=");
lcd_putc(nghin);
lcd_putc(tram);
lcd_putc(chuc);
lcd_putc("V");
}
Xin lỗi mọi ngươi vì mình chưa biết viết code trong khung:
code:
#include <16F877A.h>
#include <DEFS_16F877A.h>
#device *=16 ADC=10
#include <math.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#define RS RB3
#define RW RB4
#define E RB5
#byte lcd_data = PORTD
#define INTS_PER_SECOND0 4 // (20000000/(4*256*256))
#define INTS_PER_SECOND2 64 // (20000000/(4*16*256))
int16 nghin,tram,chuc,donvi,du1,du2;
int16 a[15],v[15],a1,v1;
byte int_count0,int_count2;
void do_dien_ap();
void do_dong_dien();
void xuat_ra_lcd();
void temp_1_buff();
void temp_2_buff();
void lcd_init();
void lcd_gotoxy();
void lcd_putc();
void lcd_send_byte();
//==================================
//============Ngat Timer 0 2=============
#int_rtcc // This function is called every time
void clock0_isr() { // the RTCC (timer0) overflows (255->0).
// For this program this is apx 76 times
if(--int_count0==0) { // per second.
temp_2_buff();
temp_1_buff();
int_count0=INTS_PER_SECOND0;
}
}
#INT_TIMER2 // This function is called every time
void clock1_isr() { // timer 1 overflows (65535->0), which is
// approximately 19 times per second for
if(--int_count2==0) { // this program.
xuat_ra_lcd();
int_count2 = INTS_PER_SECOND2;
}
}
//==================================
void main()
{
set_tris_B(0);
set_tris_D(0);
set_tris_A(0xFF);
lcd_init();
delay_ms(100);
lcd_gotoxy(1,1);
lcd_putc("HE THONG KICH TU");
lcd_gotoxy(3,2);
lcd_putc("MAY PHAT");
delay_ms(100);
lcd_send_byte(0,1);//xoa LCD
lcd_send_byte(0,6);
setup_adc_ports(AN0_AN1_AN3);
setup_adc(ADC_CLOCK_INTERNAL);
delay_us(10);
//---------------------------
int_count0=INTS_PER_SECOND0;
int_count2=INTS_PER_SECOND2;
while(true)
{
do_dien_ap();
do_dong_dien();
}
}
//------------lay gia tri read_adc 15 lan-------------------
void temp_1_buff() {
set_adc_channel(0);
delay_us(10);
v[15]=v[14];
v[14]=v[13];
v[13]=v[12];
v[12]=v[11];
v[11]=v[10];
v[10]=v[9];
v[9]=v[8];
v[8]=v[7];
v[7]=v[6];
v[6]=v[5];
v[5]=v[4];
v[4]=v[3];
v[3]=v[2];
v[2]=v[1];
v[1]=v[0];
v[0]=read_adc();
}
void temp_2_buff() {
set_adc_channel(1);
delay_us(10);
a[15]=a[14];
a[14]=a[13];
a[13]=a[12];
a[12]=a[11];
a[11]=a[10];
a[10]=a[9];
a[9]=a[8];
a[8]=a[7];
a[7]=a[6];
a[6]=a[5];
a[5]=a[4];
a[4]=a[3];
a[3]=a[2];
a[2]=a[1];
a[1]=a[0];
a[0]=read_adc();
}
//-----------------------------------
void convert_bcd(int16 x)
{
nghin = x / 1000 + 0x30;
du1 = x % 1000;
tram = du1 / 100 + 0x30;
du2 = du1 % 100;
chuc = du2 / 10 + 0x30;
donvi = du2 % 10 + 0x30;
}
//------------lenh cho LCD-----------
byte lcd_read_byte()
{
byte read_byte;
set_tris_D(0xFF); // PORTD = input
RW = 1;
delay_cycles(1);
E = 1;
delay_cycles(1);
read_byte = lcd_data;
E = 0;
set_tris_D(0x00); // PORTD = output
return(read_byte);
}
/* Goi 1byte den LCD */
void lcd_send_byte( byte address, byte n )
{
RS = 0;
while ( bit_test(lcd_read_byte(),7) ) ;
RS = address;
delay_cycles(1);
RW = 0;
delay_cycles(1);
E = 0;
lcd_data = n;
delay_cycles(1);
E = 1;
delay_us(2);
E = 0;
}
/* Khoi tao ban dau cho LCD */
void lcd_init()
{
byte const lcd_init_string[4] = {0x38, 0x0C, 1 , 6};
byte i;
set_tris_D(0x00);
RS = 0;
RW = 0;
E = 0;
delay_ms(15);
for(i=1;i<=3;++i)
{
lcd_data = 3;
delay_cycles(1);
E = 1;
delay_us(2);
E = 0;
delay_ms(5);
}
lcd_data = 2;
delay_cycles(1);
E = 1;
delay_us(2);
E = 0;
delay_ms(5);
for(i=0;i<=3;++i)
{
lcd_send_byte(0,lcd_init_string[i]);
}
}
void lcd_gotoxy( BYTE x, BYTE y) {
BYTE address;
if(y!=1)
address=0x40;
else
address=0;
address+=x-1;
lcd_send_byte(0,0x80|address);
}
void lcd_putc( char c) {
switch (c) {
case '\f' : lcd_send_byte(0,1);
delay_ms(2);
break;
case '\n' : lcd_gotoxy(1,2); break;
case '\b' : lcd_send_byte(0,0x10); break;
default : lcd_send_byte(1,c); break;
}
}
//===================================tinh trung binh read_adc
int16 cal_a() {
return((a[0]+a[1]+a[2]+a[3]+a[4]+a[5]+a[6]+a[7]+a[8]+a[9])+a[11]+a[12]+a[13]+a[14]+a[15]/15);
}
int16 cal_v() {
return((v[0]+v[1]+v[2]+v[3]+v[4]+v[5]+v[6]+v[7]+v[8]+v[9]+v[10]+v[11]+v[12]+v[13]+v[14]+v[15])/15);
}
void do_dien_ap()
{
set_timer0(0);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256); // Tran = 13.1ms
set_timer1(0);
setup_timer_2(T2_DIV_BY_16,255,2);
enable_interrupts(INT_RTCC);
enable_interrupts(INT_TIMER2);
set_adc_channel(0);
}
void do_dong_dien()
{
set_timer0(0);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256); // Tran = 13.1ms
set_timer2(0);
setup_timer_2(T2_DIV_BY_16,255,2);
enable_interrupts(INT_RTCC);
enable_interrupts(INT_TIMER2);
set_adc_channel(1);
}
void xuat_ra_lcd() {
int16 a1,v1;
a1 = cal_a();
a1=a1*10/1023;
convert_bcd(a1);
lcd_gotoxy(1,1);
lcd_putc("I=");
lcd_putc(nghin);
lcd_putc(".");
lcd_putc(tram);
lcd_putc(chuc);
lcd_putc("A");
v1= cal_v();
v1=v1*5000/1023;
convert_bcd(v1);
lcd_gotoxy(10,1);
lcd_putc("U=");
lcd_putc(nghin);
lcd_putc(tram);
lcd_putc(chuc);
lcd_putc("V");
}