PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Các ngôn ngữ lập trình khác (CCS C, HT PIC,...) (http://www.picvietnam.com/forum/forumdisplay.php?f=12)
-   -   CCS C for PIC16F877A (http://www.picvietnam.com/forum/showthread.php?t=357)

ngoctuan 26-10-2007 10:09 PM

hỏi về counter
 
chào các Bác, Em là thành viên mới , rất mong được chào đón. mong các bác chỉ cho Em về cuonter (Em đang làm đề tài mạch đếm sản phẩm ma chưa hiểu gì về cuonter) mong các bác chỉ dùm em .cám ơn các bác nhiều!

toanck86 03-11-2007 05:14 PM

em cũng muốn hỏi về counter, và cho hỏi đếm xung encoder bằng counter có được không nhỉ, bác nào làm về phần này cho em xin code & đề tài với

tungtot_vl 19-11-2007 03:25 PM

bác nào rành về timer cho em hỏi tí
em thấy các bài timer khi chương trình đã nhảy vào làm việc trong timer thì nó thực hiện lập đi lập lại trong timer mà không thoát ra ngoài. thế nếu em muốn thoát ra khỏi timer để thực hiện các lệnh khác ở ngoài vòng lập while thì làm thế nào hả các bác.
ý em muốn dùng timer như ngắt ngoài vậy các bác ạ. sau khi thực hiện ngắt xong thì thoát ra để thực hiện lệnh kế tiếp.

LeDuc 20-11-2007 03:45 AM

Chế độ ghi dịch cho cổng nối tiếp USART
 
Giúp em với ... em cần tiết kiệm chân của con Pic 887 , nên em muốn dùng cổng nối tiếp để truyền dữ liệu cho con 74LS164 qua 2 chân C6 va C7 của cổng nối tiếp quét 4 con led 7 đoạn , em viết mãi mà không được , mong các anh giúp đỡ .
đây là đoạn code em viết để quét 4 led 7 đoạn qua port D cua con pic ...Mong các anh sửa lại để có thể truyền dữ liệu qua 2 chân C6 va C7 giúp em ..
CODE :
Code:

/
#include <16f887.h>
#include <luutinh.h>

int8 i,a,b,k=0;
int8 so[4],led[]={0,1,2,3,4,5,6,7,8,9},quet[]={128,64,32,16};

#int_rtcc
void quetled()
{
  set_timer0(99);b=a;
  so[0]=a%10;a/=10;
  so[1]=a%10;a/=10;
  so[2]=a%10;a/=10;
  so[3]=a;  a=b;
  portD=(led[so[k]]+quet[k]);
  k++;
  if(k==4)k=0;
}
void xet_nhiet_do()
/*..................*/
void main()
{
  setup_timer_0(rtcc_internal|rtcc_div_128)
  set_timer0(99);
  setup_adc(adc_clock_internal);
  setup_adc_ports(all_analog);
  enable_interrupts(int_rctt);
  enable_interrupts(global):
  trisa=255;
  trisb=trisc=trisd=0;
  while(true)
  {
        if(xet_nhiet_do>31) che_do(1);
//................................
    }

nếu sử dụng cách quét led qua 1 con giai mã 7447 thi phải tốn đến 8 chân pic ở port D , em muốn sử dụng thanh ghi dịch 74ls164 để quét led qua 2 cổng nối tiếp .Nhưng kô biết trong CCS qui đinh code như thế nào cả . Rất mong các anh giúp đỡ ...

tungtot_vl 21-11-2007 10:06 AM

dùng ngắt trên các chân từ rc4 -> rc7 khi chạy thì báo lỗi invalid pri_processor diẻctive.
em thấy trong các ngắt có loại ngắt này nhưng khi khai báo sao nó không hiểu nhỉ.
Code:

#include<16f877a.h>
#fuses NOLVP,NOWDT,PUT,hs,NOPROTECT
#device 16F877*=16 ADC=8
#use delay(clock=20000000)
#use fast_io(a)
#byte porta=0x05
#use fast_io(b)
#byte portb=0x06
#use fast_io(c)
#byte portc=0x07
#use fast_io(d)
#byte portd=0x08
#use fast_io(e)
#byte porte=0x09
#bit ra0 = porta.0
#bit ra1 = porta.1
#bit ra2 = porta.2
#bit rc3 = portc.3
//======================================================
int u,t;
int16 count;
#INT_RC
void interrupt_RC()
{  int8 i,l,x,y;
  portb =0;
  for(i=0;i<24;i++)
      {
        portb = 0xff;       
        delay_ms(1000);
        portb = 0;
        delay_ms(1000);
      }
}



//=====================================================
 void main()
  {

      set_tris_b(0);
      set_tris_a(0);
      set_tris_c(0xff);
      set_tris_e(0);
      set_tris_d(0);
      enable_interrupts(global);
    enable_interrupts(int_RC);
    ext_int_edge(h_TO_l);
    // rc3 = 0;
      while(true)
        {

        }
 }
  //=============================================


namqn 21-11-2007 05:49 PM

Trích:

Nguyên văn bởi tungtot_vl (Post 12964)
dùng ngắt trên các chân từ rc4 -> rc7 khi chạy thì báo lỗi invalid pri_processor diẻctive.
em thấy trong các ngắt có loại ngắt này nhưng khi khai báo sao nó không hiểu nhỉ.
...

Tôi không hề thấy có ngắt trên các chân RC4 đến RC7 trong datasheet của PIC16F877A, mà chỉ thấy có ngắt trên các chân RB4 đến RB7 (port change interrupt). Bạn thấy ngắt trên các chân RC4 đến RC7 ở đâu, có thể cho chúng tôi biết được không?

Thân,

toanck86 21-11-2007 09:13 PM

Bác nào làm về counter rồi cho em ví dụ với. Sao khi khai báo cho timer0 ở chế độ counter rồi cho xung vào chân RA4 thì không thấy gì xảy ra nhỉ:(

namqn 21-11-2007 10:03 PM

Trích:

Nguyên văn bởi toanck86 (Post 12985)
Bác nào làm về counter rồi cho em ví dụ với. Sao khi khai báo cho timer0 ở chế độ counter rồi cho xung vào chân RA4 thì không thấy gì xảy ra nhỉ:(

Bạn muốn chuyện gì sẽ xảy ra? Bạn đã viết code để xử lý nó chưa? Lý do gì khiến bạn cho rằng không có chuyện gì xảy ra?

Thân,

Mr.Bi 01-12-2007 12:57 AM

Code:

#include <16F877A.h>
#include <DEFINE_16F877A.h>
#include <DEFINE_16F87x.h>
#fuses  NOWDT,XT,NOPROTECT,NOLVP,PUT
#use    delay(clock=4000000)

#use standard_io (B)
#use standard_io (A)

#define E            PIN_D0
#define RS          PIN_D1
#define RW          PIN_D2
#define LCD_D4      PIN_D4
#define LCD_D5      PIN_D5
#define LCD_D6      PIN_D6
#define LCD_D7      PIN_D7

#bit CANCEL    =0x05.1 // CANCEL = RA1
#bit OK              =0x05.0 // OK    = RA0

unsigned int8 key[] ; // mang luu cac so da nhap tu ban phim
const unsigned int8 num[11] = {'0','1','2','3','4','5','6','7','8','9'} ;
const unsigned int8 num_ss[11] = {' ','3','9','5','2','6','1','0'} ; // cac so dung de so sanh
unsigned int8 a = 0 ; // bien dem cac so nhap tu ban phim
unsigned int8 b = 0 ; // bien dem so lan sai ma

void LCD_Init ( void );                    // ham khoi tao LCD
void LCD_SetPosition ( unsigned int data );//Thiet lap vi tri con tro
void LCD_PutChar ( unsigned int data );    // Ham viet1kitu/1chuoi len LCD
void LCD_PutCmd ( unsigned int data ) ;    // Ham gui lenh len LCD
void tao_xung_E();                        // Xung kich hoat
void send_to_LCD( unsigned int data);      // Dat du lieu len chan Data

void delay_ms_INT(unsigned long i)
{ unsigned long k , j ;
  for(k=0;k<=i;k++) { for(j=0;j<=i;j++){;} }
}

void LCD_Init ( void )
{
    delay_ms(200); // thoi gian de LCD khoi dong

    output_low(RW);        // RW = 0
    output_low(RS);        // che do gui lenh

    send_to_LCD( 0x00 );
    output_high ( E ); output_low ( E ); delay_ms ( 10 );


    send_to_LCD( 0x03 );  /* init with specific nibbles to start 4-bit mode */
    output_high ( E ); output_low ( E ); delay_ms ( 3 ); // tao xung tren chan E
    output_high ( E ); output_low ( E ); delay_ms ( 3 );
    output_high ( E ); output_low ( E ); delay_ms ( 3 );

    send_to_LCD( 0x02 );  /* set 4-bit interface */
    output_high ( E ); output_low ( E ); delay_ms ( 3 ); // tao xung tren chan E


    LCD_PutCmd ( 0x2C );    /* function set (all lines, 5x7 characters) */
    LCD_PutCmd ( 0x0C);    /* display ON, cursor off, no blink */
    LCD_PutCmd ( 0x06 );    /* entry mode set, increment & scroll left */
    LCD_PutCmd ( 0x01 );    /* clear display */
}

void LCD_SetPosition ( unsigned int data )
{

    send_to_LCD( swap ( data ) | 0x08 );
    output_high ( E ); output_low ( E ); delay_ms ( 3 ); // tao xung tren chan E

    send_to_LCD( swap ( data ) );
    output_high ( E ); output_low ( E ); delay_ms ( 3 ); // tao xung tren chan E

}

void LCD_PutChar ( unsigned int data )
{
    output_high( RS ); //RS = 1
    output_low ( RW ); //RW = 0

    send_to_LCD( swap ( data ) );                        // gui 4 bit cao
    output_high ( E ); output_low ( E ); delay_ms ( 3 ); // tao xung tren chan E

    send_to_LCD( swap ( data ) );                        //gui 4 bit thap
    output_high ( E ); output_low ( E ); delay_ms ( 3 ); // tao xung tren chan E

}

void LCD_PutCmd ( unsigned int data )
{
    output_low(RS); // RS = 0
    output_low(RW); // RW = 0

    send_to_LCD( swap(data) );    // gui 4 bit cao
    output_high (E); output_low (E); delay_ms (3);

    send_to_LCD( swap(data) );    // gui 4 bit thap
    output_high (E); output_low (E); delay_ms ( 3 );
}


void send_to_LCD( unsigned int data )
{
    output_bit ( LCD_D4, data & 0x01 );
    output_bit ( LCD_D5, data & 0x02 );
    output_bit ( LCD_D6, data & 0x04 );
    output_bit ( LCD_D7, data & 0x08 );
}

void quetphim_hienthi()
{ PORTB = 0b111111110 ; if (RB4==0) { delay_ms_INT(50);           
                                      while(RB4==0) continue ;
                                      delay_ms_INT(20);
                                      LCD_PutChar('0') ; key[a++] = num[0];
                                    } ;
                        if (RB5==0) { delay_ms_INT(50);           
                                      while(RB5==0) continue ;
                                      delay_ms_INT(20);
                                      LCD_PutChar('3') ; key[a++] = num[3];
                                    } ;
                        if (RB6==0) { delay_ms_INT(50);           
                                      while(RB6==0) continue ;
                                      delay_ms_INT(20);
                                      LCD_PutChar('6') ; key[a++] = num[6];
                                    } ;
                        if (RB7==0) { delay_ms_INT(50);           
                                      while(RB7==0) continue ;
                                      delay_ms_INT(20);
                                      LCD_PutChar('9') ; key[a++] = num[9];
                                    } ;

  PORTB = 0b111111101 ; if (RB4==0) { delay_ms_INT(50);           
                                      while(RB4==0) continue ;
                                      delay_ms_INT(20);
                                      LCD_PutChar('1') ; key[a++] = num[1];
                                    } ;
                        if (RB5==0) { delay_ms_INT(50);           
                                      while(RB5==0) continue ;
                                      delay_ms_INT(20);
                                      LCD_PutChar('4') ; key[a++] = num[4];
                                    } ;
                        if (RB6==0) { delay_ms_INT(50);           
                                      while(RB6==0) continue ;
                                      delay_ms_INT(20);
                                      LCD_PutChar('7') ; key[a++] = num[7];
                                    } ;
  PORTB = 0b111111011 ; if (RB4==0) { delay_ms_INT(50);           
                                      while(RB4==0) continue ;
                                      delay_ms_INT(20);
                                      LCD_PutChar('2') ; key[a++] = num[2];
                                    } ;
                        if (RB5==0) { delay_ms_INT(50);           
                                      while(RB5==0) continue ;
                                      delay_ms_INT(20);
                                      LCD_PutChar('5') ; key[a++] = num[5];
                                    } ;
                        if (RB6==0) { delay_ms_INT(50);           
                                      while(RB6==0) continue ;
                                      delay_ms_INT(20);
                                      LCD_PutChar('8') ; key[a++] = num[8];
                                    } ;

}

#int_RB
void ngat_RB(void)
{ LCD_PutCmd(0x83); // dong1 cot 5
  while (OK && CANCEL) quetphim_hienthi(); // nut OK chua dc nhan

  if(CANCEL==0) {delay_ms_INT(20);            // nhan OK
                while(CANCEL==0) continue ;
                delay_ms_INT(20);
                goto THOAT ; };

  if(OK==0 ) {delay_ms_INT(20);            // nhan OK
              while(OK==0) continue ;
              delay_ms_INT(20);
              if (a==7)
                    {
                        if(key[1]!=num_ss[1]) {goto HERE ;};
                        if(key[2]!=num_ss[2]) {goto HERE ;};
                        if(key[3]!=num_ss[3]) {goto HERE ;};
                        if(key[4]!=num_ss[4]) {goto HERE ;};
                        if(key[5]!=num_ss[5]) {goto HERE ;};
                        if(key[6]!=num_ss[6]) {goto HERE ;};
                        if(key[7]!=num_ss[7]) {goto HERE ;};
                        LCD_PutCmd(0x01);
                        LCD_PutCmd(0x84);
                        LCD_PutChar('Y') ;
                        LCD_PutChar('E') ;
                        LCD_PutChar('S') ;
                        delay_ms(2000) ;
                       
          HERE :
                        LCD_PutCmd(0x01);
                        LCD_PutCmd(0x84);
                        LCD_PutChar('W') ;
                        LCD_PutChar('r') ;
                        LCD_PutChar('o') ;
                        LCD_PutChar('n') ;
                        LCD_PutChar('g') ;
                        LCD_PutChar('!') ;
                        b++;  // dem so lan sai ma
                      } ;
              if (a!=7){ LCD_PutCmd(0x01);
                          LCD_PutCmd(0x84);
                          LCD_PutChar('W') ;
                          LCD_PutChar('r') ;
                          LCD_PutChar('o') ;
                          LCD_PutChar('n') ;
                          LCD_PutChar('g') ;
                          LCD_PutChar('!') ;
                          b++; // dem so lan sai ma
                          delay_ms(2000) ;
                        } ;

              } ;
  THOAT :
  LCD_PutCmd(0x01);
  LCD_PutCmd(0xC4);
  LCD_PutChar('R') ;
  LCD_PutChar('e') ;
  LCD_PutChar('a') ;
  LCD_PutChar('d') ;
  LCD_PutChar('y') ;
  LCD_PutChar('!') ;

  RBIF = 0 ;
}


void main()
{ set_tris_A(0xFF); PORTA = 0xFF ;
  set_tris_B(0xF0); PORTB = 0xF0 ;
  set_tris_C(0x00); PORTC = 0;
  set_tris_D(0x00);

  LCD_Init(); // khoi tao LCD

  enable_interrupts(global);
  enable_interrupts(int_RB);
  ext_int_edge(H_to_L);

  LCD_PutCmd(0xC4);
  LCD_PutChar('R') ;
  LCD_PutChar('e') ;
  LCD_PutChar('a') ;
  LCD_PutChar('d') ;
  LCD_PutChar('y') ;
  LCD_PutChar('!') ;

  while(1) ;
}

cho em hỏi chút xíu !
- em khai báo biến đếm a toàn cục , như trên code
- ý định của em : mỗi lần nhấn phím thì mảng key[] sẽ tự nạp số vào & nạp theo thứ tự , vì vậy , sau mỗi lần nhấn phím , em cho key[a++]
- nhưng ko hiểu sao , cứ mỗi lần nhấn đúng mã số "3952610", thì ct cứ nhảy tới label HERE .. em nghi ngờ ngay chỗ so sánh mảng key[] và num_ss[] ;
- chắc chắn key[] có giá trị ko đúng như các số mình đã nhấn !
các anh thấy em phân tích vậy có đúng ko ?
- thứ nữa : sau mỗi lần chạy hết ct ngắt thì ko bit ct có thoát khỏi ngắt hay ko ? nhưng em nhấn phím trở lại thì LCD ko chịu hiện số nữa , chỉ khi nhấn từ 3 lần trở lên thì số mới hiện trở lại . LCD lúc ấy đang bận ? nhưng nó có làm gì đâu . Đến nhãn THOAT , chỉ việc hiện " Ready!" lên thui mà . Có lẽ tới chỗ này ct bị treo !?

Mr.Bi 03-12-2007 12:09 AM

uhm ! rùi .. cuối cùng mình cũng tìm ra lỗi .
- Đúng là ngay chỗ so sánh key[] & num_ss[] ấy !
phải là :
Code:


          if (key[0] != num_ss[1]) { goto HERE1 ; ) ;
          if (key[1] != num_ss[2]) { goto HERE1 ; ) ;
        .....

vì sao vậy ? mình đã bit ..nhưng có lẽ để các bạn mắc phải lỗi ngớ ngẩn như mình & tìm ra lời giải thì sẽ nhớ lâu hơn !
Còn cái chỗ : sau khi hết ct ngắt ,ct vẫn ko chịu thoát ra ngoài main() & đứng đợi while(1) ; cụ thể là khi bấm nút .. LCD vẫn ko hiển thị.. sau 3 lần nhấn só mới bắt đầu hiển thị --> mình vẫn chưa tìm đc nguyên nhân .! sẽ cố gắng chữa lỗi tiếp

lyha 22-12-2007 11:06 PM

các bác chỉ em cách tính step size với.

thongtr 30-12-2007 10:02 AM

các pác chỉ cho mình với! mình đang làm với con lm335 nhưng sao nhiệt độ của nó không có ổn định tới chênh lệch nhau tới 4 độ. các bác có cách gì chỉ cho mình với! mình đang dùng con 16F877a

Sangcao 31-12-2007 12:55 PM

lm35 để đo nhiệt độ cho vui thôi.phụ thuộc vào nhiều vấn đề, ko chỉ là do con lm35, AD của PIC, thuât toán của bạn.Bọn TQ nó thường dùng thuật toán tra bảng. nếu cần chính xác, ổn định thì bạn nên lhệ bác Cường Quay , mình ko nhớ là con gì, giá khoảng 40$ thì phải. bảo đảm ok luôn!

bean984 02-01-2008 10:28 AM

các bác cho em hỏi: làm thế nào để biết con slave đã nhận xong chuỗi ký tự? e dùng rs232 để truyền nhận giữa 2 con pic.
em cũng thử dùng hàm itoa để chuyển số int sang chuỗi và dùng hàm printf để truyền.
bên nhận em dùng hàm atol để chuyển chuỗi về dạng int16 rồi hiể thị. nhưng kết quả hiển thị lại không chính xác. cụ thể là sau chuỗi số là các ký tự lạ.
bác nào đã làm vấn đề này rồi xin chỉ giáo giúp em.
nếu có code thì tốt quá

picthanh 08-01-2008 11:46 PM

cộng ký tự thành chuỗi
 
các bác cho em hỏi trong CCS mình muốn cộng các ký tự riêng lẻ thành một chuỗi ký tự thì dùng lệnh gì? bài toán của em cụ thể như sau:dùng ma trận phím 4x3 để nhập các ký tự từ 0-9 sau đó cộng các ký tự này lại thành một chuỗi.Sau đó hiển thị chuỗi này lên LCD nhưng em làm hoài mà nó cũng không chạy, khi dịch chương trình thì cũng không thấy báo lỗi gì cả.Em đã thử cho hiện từng ký tự thì chương trình chạy rất ok! nhưng khi cộng các ký tự lai bằng lệnh "key=key+k;" thi ko chạy được.
em dùng con 16F877A ,thạch anh 20MHz

Code:

#include "D:\PIC PROGRAM\dk.h"
#include <KBD.C>
#include <lcd.c>

char k,*key;
void main()
{

  port_b_pullups(TRUE);
  setup_adc_ports(NO_ANALOGS);
  setup_adc(ADC_OFF);
  setup_psp(PSP_DISABLED);
  setup_spi(FALSE);
  setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  setup_timer_1(T1_DISABLED);
  setup_timer_2(T2_DISABLED,0,1);
  setup_comparator(NC_NC_NC_NC);
  setup_vref(FALSE);
  kbd_init();
  lcd_init();

lcd_putc('\f');
key=0;
while(1)
  {
      k=0;
      k=kbd_getc();
      key=key+k;    //lenh nay hinh nhu sai
          if(k!=0)
            {
                lcd_gotoxy(1,1);
                lcd_putc(key);
            }
    }
}

mong các cao thủ ra tay giúp đỡ !


Múi giờ GMT. Hiện tại là 09:50 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam