PDA

View Full Version : Xem giúp mình phần ngắt PorB và hiển thị LCD với


daothienbao
06-06-2008, 10:48 AM
Hi all, mình đang làm bài tập về PIC6f877. Mình muốn đo hiển thị và điều khiển tốc độ động cơ dùng 16f877, trong lúc thực hiện mình gặp khó khăn như sau:
Đầu tiên mình chỉ viết phần đo và hiển thị tốc độ động cơ thôi, nên chương trình chỉ có 1 chế độ, không cần phải chuyển chế độ nữa. Nhưng làm tiếp thì mình cần nó chuyển sang cả chế độ đợi nhập giá trị thay đổi, và điều khiển tốc độ động cơ dùng PWM. Mình dùng 3 button vào portB (ngắt RB) để thực hiện điều này, nút 1 là chuyển các chế độ, nút 2, 3 là để tăng giảm giá trị. Mình mới thử đến phần nút 1 là chuyển chế độ thôi thì gặp vấn đề sau:
- Đầu tiên mình chỉ muốn nó đo tốc độ,thì chạy khá ổn, LCD có hiển thị, nhưng khi đến phần chuyển chế độ thì PortD của Pic chỉ thấy mỗi DR4 là phát tín hiệu, còn lại thì không, tức là không hiển thị được ra LCD, mà mình chỉ thêm phần ngắt RB và hàm switch thôi, k hiểu sao nữa.
- Tiếp theo mình tạm cho phần hiển thị "tinhtoan_hienthi(so_vong)" này vào trong chương trình ngắt RB, coi như là nếu ấn nút button 1 thì bắt đầu hiển thị, tạm chưa chuyển sang cái khác thi thấy nó cứ lặp lại hàm này liên tục, minh thấy lạ vì chỉ có 1 lần ngắt (ngắt theo sườn) mà lại lặp lại liên tục.
Mình muốn dùng ngắt RB để tăng biến đếm a, sau đó switch a từ 0 đến 4 để thực hiện các chương trình khác nhau như đo và hiển thị, chuyển sang trạng thái chờ và đọc đầu vào thay đổi, điều khiển tốc độ bằng PWM, mong mọi giúp đỡ. Đây là code của mình

#include "C:\Documents and Settings\Hikaru\Desktop\pro2\lan2.h"
#include "def_877a.h"
#include<lcd_lib_4bit.c>
#use delay(clock=20000000)
int8 nghin,tram,chuc,donvi,a;
int16 count,so_vong,int_count1,x;
void tinhtoan_hienthi(int16 x);
void tinhtoan_hienthi(int16 x) // thuc hien tach so va dua ra hien thi luon
{nghin = x / 1000 + 0x30;
x = x % 1000;
tram = x / 100 + 0x30; // tách s? hàng tram
x = x % 100; // chia l?y ph?n d?
chuc = x / 10 + 0x30; // tách l?y ph?n ch?c
donvi = x % 10 + 0x30; // ph?n don v?
printf(lcd_putchar,"hien thi toc do");
lcd_putcmd(0xC0);
printf(lcd_putchar,"toc do=");
lcd_putchar(nghin);
lcd_putchar(tram);
lcd_putchar(chuc);
lcd_putchar(donvi);
}
#define INTS_PER_SECOND1 19
#int_rtcc // Ngat Timer 0
void Timer0_isr() // Dem so vong quay dong co
{
count++;
}

#INT_TIMER1 // Chuong trinh ngat Timer 1
void Timer11_isr() { // Ham duoc goi khi TImer1 tran (65535->0)
// Xap xi 19 lan / giay
if(--int_count1==0)
{
int_count1 = INTS_PER_SECOND1;
so_vong = (count*255 + get_timer0())/100;
count = 0;
set_timer0(0);
}
}
#int_RB // ham kiem tra dau vao
void RB_isr()
{
lcd_putcmd(0x01);
a++;
if(a==4) a=1;}
void program1();
void program2();
void program3();
void main()
{
setup_timer_0 (RTCC_DIV_1|RTCC_EXT_H_TO_L); // Timer0 is Counter
set_timer0(0);
set_timer1(0);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_4);
enable_interrupts(INT_RTCC);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
enable_interrupts(INT_RB);
count = 0;
int_count1 = INTS_PER_SECOND1;
so_vong = 0;
a = 0;
TRISA = 0xFF;
trisB = 0xFF;
portb = 0xff;
RD2 = 1;
trisD = 0;
lcd_init();
delay_ms(200);
printf(lcd_putchar,"hello");
//ext_int_edge(L_to_H);

while(1)
{
switch(a)
{
case 1: program1();break;
case 2: program2();break;
case 3: program3();break;
}
}
}
void program1()
{tinhtoan_hienthi(so_vong);
delay_ms(500);
}
void program2()
{
delay_ms(500);}
void program3()
{
delay_ms(500);


còn đây là mạch của mình

mhtd85
27-08-2008, 11:36 PM
bài của mày bị ế rồi Báo à. He he