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)

namqn 08-01-2008 11:51 PM

Bạn tự nêu cách giải quyết rồi đó. Dùng một biến chuỗi để lưu chuỗi kết quả, mỗi lần thêm vào chuỗi thì dùng hàm nối chuỗi để nối chuỗi đã có và ký tự cần thêm. Bạn xem tài liệu hướng dẫn của CCS C về các hàm này.

Thân,

picthanh 09-01-2008 01:59 PM

cộng ký tự thành chuỗi
 
với cách viết mà em post ở bài trước thì nó chỉ hiện được phím đầu tiên mà mình nhấn thôi,còn các phím sau đó thì LCD chỉ hiện lên các ký tự lạ thôi.

Còn hàm nối chuỗi mà Bác nói là hàm nào ,có phải là hàm "srcat(key,string1);"này ko?
em cũng thử rồi nhưng ko được nên phải cầu cứu các Bác nè.

Code:

#include "D:\PIC PROGRAM\dk.h"
#include <KBD.C>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <lcd.c>
char string1[10];
char i,t, keyscan;
char k,key[10];

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();
SET_TRIS_C( 0x00 );
output_bit(PIN_C4, 1);output_bit(PIN_C5, 1);
delay_ms(1000);
output_bit(PIN_C4, 0);output_bit(PIN_C5, 0);

i=0;
lcd_putc('\f');
while(1)
  {
      k = kbd_getc();
      if (k!=0)
        {
        strcpy(string1,k);
        strcat(key,string1);
      for(i=0;i<strlen(key);i++)
        lcd_putc(key[i]);
        }
    }
}

với chương trình này thì LCD hiện những ký tự lạ có cả tiếng Nhật nửa.nói chung là nó ko chạy đúng theo những gì mà em cần
có Bác nào đã làm cái này chưa chỉ em với.

namqn 09-01-2008 08:07 PM

Tôi không rõ CCS C sẽ xử lý thế nào khi bạn dùng lệnh k = kbd_getc();. Vì bạn đã khai báo k là một mảng ký tự (tối đa 10 ký tự), trong khi prototype của kbd_getc() lại cho thấy giá trị trả về là 1 ký tự. Bạn thử lại với lệnh sau xem sao:

Code:

        k[0] = kbd_getc();
Đúng là tôi đã đề cập đến hàm strcat(). Cần biết là tôi không sử dụng CCS C, chỉ đọc tài liệu hướng dẫn của phần mềm để giúp bạn. Do đó, bạn sẽ là người thử nghiệm các giải pháp mà tôi cho là sẽ giúp ích cho bạn.

Thân,

nod32 10-01-2008 12:37 AM

Tôi đang học CCS chưa biết sử dụng nhiều Huynh có thể post thêm bai hướng dẫn hay tài liệu được không?

picthanh 10-01-2008 01:04 AM

Bác "nampn" oi!em khai báo "k" là biến kiểu char bình thường mà, còn biến "key" mới là biến kiểu mảng "char k,key[10]". em sẽ thử cách này của Bác thử xem sao. Cảm ơn Bác rất nhiều.

namqn 10-01-2008 01:21 AM

Trích:

Nguyên văn bởi picthanh (Post 13794)
Bác "nampn" oi!em khai báo "k" là biến kiểu char bình thường mà, còn biến "key" mới là biến kiểu mảng "char k,key[10]". em sẽ thử cách này của Bác thử xem sao. Cảm ơn Bác rất nhiều.

Vâng, tôi nhầm, bạn đã khai báo k là char. Nhưng khi đó hàm strcpy() lại có khả năng chạy sai, vì nó cần 2 đối số kiểu string.

Thân,

bean984 14-01-2008 11:47 AM

giúp mình với!!!!!!
mình cũng đang gặp phải lỗi này. chương trình của mình sử dụng ngắt RB và timer0. hàm phục vụ ngắt RB của mình có gọi đến khá nhiều hàm con. khi mình bỏ hẳn hàm phục vụ ngắt RB ra khỏi ct thì hoạt động của timer0 là đúng. còn khi mình thêm vào hàm phục vụ ngắt RB,mặc dù ngắt RB không hề sảy ra nhưng timer0 của mình vẫn chạy không chính xác.
cho mình hỏi bạn khangcodt đã khắc phục được lỗi timer chạy sai khi trong hàm phục vụ ngắt gọi đến các hàm con khác chưa vậy?
mình cảm ơn nha.

bean984 14-01-2008 01:55 PM

cho mình hỏi thêm câu nữa nhé.
mình dùng hàm printf(); để truyền dl qua máy tính.
1) làm thế nào để biết pic đã truyền xong mảng ký tự
2) để truyền một số nguyên mình đã thực hiện như sau:
itoa(trunggian2,10,s);//chuyển số nguyên thành mảng ký tự
printf(s);
trong đó biến trunggian2 là int16, s là mảng char. nhưng khi mình thử test với hyper terminal thì kết quả nhận được lại không đúng. cụ thể là sau những số nhận được lại có thêm các ký tự lạ.
bạn nào đã làm về vấn đề này rồi xin chỉ giúp mình với
mình cảm ơn nhiều.

bean984 15-01-2008 02:02 PM

cho mình hỏi :
khi truyền một mảng char từ pic lên máy tính thì ngắt RDA sảy ra sau khi truyền xong cả mảng hay cứ mỗi lần truyền xong một phần tử thì xảy ra ngắt RDA?
mình cảm ơn!

namqn 15-01-2008 08:17 PM

Trích:

Nguyên văn bởi bean984 (Post 13905)
cho mình hỏi :
khi truyền một mảng char từ pic lên máy tính thì ngắt RDA sảy ra sau khi truyền xong cả mảng hay cứ mỗi lần truyền xong một phần tử thì xảy ra ngắt RDA?
mình cảm ơn!

Ngắt INT_RDA xảy ra khi PIC nhận được dữ liệu tại cổng USART của nó (ví dụ do máy tính truyền đến), còn ngắt INT_TBE xảy ra khi PIC truyền dữ liệu qua cổng USART của nó (ví dụ truyền đến máy tính). Câu hỏi của bạn thuộc loại 'râu ông nọ cắm cằm bà kia'.

Ngắt INT_RDA xảy ra mỗi khi PIC16F877A nhận được 1 ký tự ở bộ đệm nhận, người dùng nên nhanh chóng đọc dữ liệu từ bộ đệm để PIC có thể ghi ký tự kế tiếp ngay khi thanh ghi dịch đã có đủ dữ liệu.

Thân,

bean984 16-01-2008 08:56 AM

em cảm ơn anh namqn nhiều.
cho em hỏi thêm câu này nữa nhé
em dùng con 16f877a để nhận mảng ký tự truyền từ môt con 16f877a khác. mảng ký tự kết thúc bằng ký tự @.
bên phát:
itoa(x,10,s);// s khai báo là char s[5]
s[4]='@';// vì e k biết s kết thúc bằng ký tự gì
printf(s);
bên thu em thực hiện truyền vài lần(thay đổi giá trị của x bằng cách ấn nút) thì e chỉ nhận được lần đầu tiên. truyền các lần tiếp theo thì nó bị đơ luôn, không chạy nữa. e chạy mô phỏng bằng proteus.
đây là code bên phía nhận
Code:

#INT_RDA
RECEIVER()
{
  char kt;
  int i;
  char s1[4];
  i=0;
  kt=fgetc(pc);

  while(kt!='@')
      {
        s1[i]=kt;
        i++;
        kt=fgetc(pc);
      }
       
        lcd_clear();
        delay_ms(1);
        lcd_display_str(0, 0, s1);
}


bean984 16-01-2008 03:17 PM

cho mình hỏi một câu nữa
khi ngắt RDA xảy ra thì cờ nào được set lên 1, và khi kết thúc ngăt nó có tự động xóa bít đó không?

bien_van_khat 16-01-2008 06:04 PM

Trích:

Nguyên văn bởi bean984 (Post 13921)
cho mình hỏi một câu nữa
khi ngắt RDA xảy ra thì cờ nào được set lên 1, và khi kết thúc ngăt nó có tự động xóa bít đó không?

Ngắt RDA xảy ra khi cờ RCIF trong thanh ghi PIR1 được set, bạn có thể coi giản đồ thời gian trong datasheet trang 120.

Trích:

em cảm ơn anh namqn nhiều.
cho em hỏi thêm câu này nữa nhé
em dùng con 16f877a để nhận mảng ký tự truyền từ môt con 16f877a khác. mảng ký tự kết thúc bằng ký tự @.
bên phát:
itoa(x,10,s);// s khai báo là char s[5]
s[4]='@';// vì e k biết s kết thúc bằng ký tự gì
printf(s);
Bạn xem lại mẫu hàm của hàm printf, muốn gửi 1 chuỗi bạn phải gọi như sau
Code:

printf("%s", s);

bean984 18-01-2008 02:22 PM

cho mình hỏi cái này nhé
nếu dùng lệnh printf("%s", s); thì ký tự kết thúc của chuỗi s là gì?
mình định dùng ký tự này để xử lý việc nhận chuỗi s. có phải ký null không nhỉ?

nguyendinhtuan 18-01-2008 11:47 PM

1 Attachment(s)
các chương trình ví dụ

bien_van_khat 18-01-2008 11:55 PM

Trích:

Nguyên văn bởi bean984 (Post 13951)
cho mình hỏi cái này nhé
nếu dùng lệnh printf("%s", s); thì ký tự kết thúc của chuỗi s là gì?
mình định dùng ký tự này để xử lý việc nhận chuỗi s. có phải ký null không nhỉ?

Với C, một chuỗi luôn phải kết thúc với ký tự NULL.

bean984 21-01-2008 09:40 AM

giúp mình cái hàm nhận xâu ký tự
bên phát mình thực hiện như sau:
Code:

itoa(x,10,s);//chuyển số nguyên x thành xâu ký tự
printf("%s", s);

còn bên nhận mình thực hiện kiểm tra kt null như sau:
Code:

#INT_RDA
RECEIVER()
{
  char kt;
  int i;
  char s1[4];
  i=0;
  kt=fgetc(pc);

  while(kt!=null)
      {
        s1[i]=kt;
        i++;
        kt=fgetc(pc);
      }
       
        lcd_clear();
        delay_ms(1);
        lcd_display_str(0, 0, s1);//hiển thị xâu
}

nhưng không thu dc gì. mình k biết lỗi ở đâu nữa
mình cảm ơn.

bien_van_khat 21-01-2008 10:24 AM

Theo như đoạn code trên, hàm lcd_display_str nhận đối số là một chuỗi do đó chắc chắn nó yêu cầu chuỗi của bạn phải kết thúc = ký tự NULL, chuỗi s1 như trên chưa có ký tự kết thúc.

Bạn nên post cả code của phần phát

bean984 21-01-2008 02:30 PM

bên phát mình chỉ có hai dòng lệnh vậy thôi vì mình ghép nó vào một chương trình con khác.
Code:

void tonghop_so()
{
  char s[5];
  t1=nghin*10+tram;
  t2=chuc*10+donvi;
  trunggian2=t1*100+t2;
  if((hor==0)&(trunggian2<=5000))
      {
      rnominal0=trunggian2;
      itoa(trunggian2,10,s);//chuyển số nguyên trunggian2 thành xâu ký tự
      printf("%s", s);
      }
}

khi gọi đến hàm tonghop_so(); thì đồng thời gửi chuỗi.
hàm lcd_display_str(); là hàm hiển thị một mảng ký tự.
Code:

void lcd_display_str(int line, int8 posc, char str[])
{
  int8 i,j;
  j=strlen(str);// Cho xau la co dinh
  for (i = posc; i < j+posc ; i++)
      {
      lcd_display_char(line, i, str[i-posc]);
      delay_ms(1);
      }
}


tinhgiac_vp 23-02-2008 07:12 PM

Trích:

Nguyên văn bởi nhh (Post 2233)
INTERRUPT

Các lệnh dùng cho ngắt:
Code:

enable_interrupts(level);        //cho phép ngắt kiểu level 
disable_interrupts(level);                      //cấm ngắt kiểu level
ext_int_edge(edge);                              // chọn cách lấy xung loại  edge

level bao gồm:

GLOBAL : ngắt toàn cục
INT_RTCC : tràn TMR0
INT_RB : có thay đổi trạng thái một trong các chân RB4 đến RB7
INT_EXT : ngắt ngoài
INT_AD : chuyển đổi AD đã hoàn tất
INT_TBE : bộ đệm chuyển RS232 trống
INT_RDA : data nhận từ RS232 sẵn sàng
INT_TIMER1 : tràn TMR1
INT_TIMER2 : tràn TMR2
INT_CCP1 : có capture hay compare trên CCP1
INT_CCP2 : có capture hay compare trên CCP2
INT_SSP : có hoạt động SPI hay I2C
INT_PSP : có data vào cổng parallel slave
INT_BUSCOL : xung đột bus
INT_EEPROM : ghi vào eeprom hoàn tất
INT_TIMER0 : tràn TMR0
INT_COMP : kiểm tra bằng nhau comparator

edge bao gồm:

L_TO_H : cạnh lên
H_TO_L : cạnh xuống

Sau khai báo trên để vào đoạn chương trình ngắt, khai báo:

#INT_.........

Ví dụ vào thực thi ngắt ngoài, ta có đoạn code:
Code:

#INT_EXT
void ngat_ngoai()
{
//Chương trình ngắt tại đây
}


các cao thủ vui lòng viết 1 ví dụ cụ thể về ngắt ngoài được không??????? Em đã thử viết nhưng không chạy được. Chương trình của em dùng ngắt ngoài RB_0 và hiển thị lên port_C
#include <16F877A.h>
#byte portb = 0x06
#byte portc = 0x07
#use delay (clock = 20000000)
int count=1;
#INT_EXT
void EXT_LED()
{
portc=count;
count=count+1;
delay_us(100);
bit_clear(portb,0);
}
void main() {
ext_int_edge(L_TO_H);
enable_interrupts(INT_EXT);
enable_interrupts(global);
set_tris_b(0xff);
set_tris_c(0x00);
portc=0;
bit_set(portb,0);
while(1)
{
}

}

tinhgiac_vp 23-02-2008 07:21 PM

Bác F co CCS 4.038 không post lên cho mọi người nữa. Không biết nó có gì mới+tốt hơn không?

anhvietqx 26-02-2008 11:59 AM

cám ơn các bạn rất nhiều

bean984 03-03-2008 02:10 PM

giúp mình về cái timer với!!
trong chương trình của mình có sử dụng cả timer và ngắt. Đây là hàm phục vụ ngắt của mình:
Code:

#int_RB
void ngat_RB()
{
if((RBIF)&&(RBIE))
  {
      //if(khoidong0==1)
      //  goto Thoat;
      output_low(pin_A3);
      output_low(pin_A4);
      output_low(pin_A5);
      if(!RB4)
      {
          if(ver==0)
            {
              ver=1;
              hienthicot1();
              goto Thoat;
            }
          if(ver==1)
            {
              ver=2;
              CPHT=1;
              goto Thoat;
            }
          if(ver==2)
            {
              ver=3;
              doctrunggian2();
              hienthicot3();
              goto Thoat;
            }
          if(ver==3)
            {
              ver=4;
              phantich_so(trunggian2);
              trunggian=nghin;
              lcd_display_blink(0,13);
              goto thoat;
            }
          if(ver==4)
            {
              ver=5;
              trunggian=tram;
              if(hor==6)
                  lcd_display_char(0,13,pw[0]);
              lcd_display_blink(0,14);
              goto thoat;
            }
          if(ver==5)
            {
              trunggian=chuc;
              if(hor==6)
                  lcd_display_char(0,14,pw[0]);
              ver=6;
              lcd_display_blink(0,15);
              goto thoat;
            }
          if(ver==6)
            {
              trunggian=donvi;
              if(hor==6)
                  lcd_display_char(0,15,pw[0]);
              ver=7;
              lcd_display_blink(0,16);
              goto thoat;
            }
          if(ver==7)
            {
              ver=4;
              trunggian=nghin;
              if(hor==6)
                  lcd_display_char(0,16,pw[0]);
              lcd_display_blink(0,13);
              goto thoat;
            }
        }  // Xong RB4
      if(!RB5)
      {
          if((ver==0)||(ver==1))
            goto Thoat;
          if(ver==2)
          {
            ver=1;
            hienthicot1();
            CPHT=0;
            hor=0;
            goto Thoat;
          }// endif(ver==1)
          if(ver==3)
          {
            if((hor==1)||(hor==2)||(hor==3)||(hor==4)||(hor==5))
                    hor=1;
            if((hor==6)||(hor==7)||(hor==8)||(hor==9))
                    hor=6;
            hienthicot2();
            ver=2;
            goto Thoat;
          }// endif(ver==1)
          if((ver==4)||(ver==5)||(ver==6)||(ver==7))
            {
              //RBIF=0;
              tonghop_so();

            }
        }// Endif(RB5)
      if(!RB6) // Xu ly tang gia tri
      {
        if((ver==4)||(ver==5)||(ver==6)||(ver==7))
            tangcot();
      }// Endif(RB6)
      if(!RB7)
      {
          if(ver==2)
            {
              if(hor==0)
              {
                  hor=1;
                  goto hienthi42;
              }
              if(hor==1)
              {
                  hor=6;
                  goto hienthi42;
              }
              if(hor==6)
              {
                  hor=0;
                  goto hienthi42;
              }
            hienthi42:
              hienthicot2();
              goto thoat;
            }
            if(ver==3)
            {

              if(hor==1)
              {
                  hor=2;
                  goto chuyendich43;
              }
              if(hor==2)
              {
                  hor=3;
                  goto chuyendich43;
              }
              if(hor==3)
              {
                  hor=4;
                  goto chuyendich43;
              }
              if(hor==4)
              {
                  hor=5;
                  goto chuyendich43;
              }
              if(hor==5)
              {
                  hor=1;
                  goto chuyendich43;
              }
              if((hor==6)&(user==1))
              {
                  hor=7;
                  user=0;
                  goto chuyendich43;
              }
              if(hor==7)
              {
                  hor=8;
                  goto chuyendich43;
              }
              if(hor==8)
              {
                  hor=9;
                  goto chuyendich43;
              }
              if(hor==9)
              {
                  hor=7;
                  goto chuyendich43;
              }
            chuyendich43:
              {
              //doctrunggian2();

              hienthicot3();
              phantich_so(trunggian2);
              // doctrunggian2();
              }
            } //If (ver==3)
        }// Endif(RB7)
Thoat:
  RBIF=0; //Xoa co ngat RB
  } // Ket thuc if co ngat
}// Ket thuc ham void

trong hàm phục vụ ngắt mình gọi đến khá nhiều hàm con. Khi chương trình chính không làm gì, chỉ thiết lập timer hoặc mình bỏ hẳn hàm phục vụ ngắt khỏi chương trình và trong chương trình chính cho gọi đến các hàm con khác thì timer chạy đúng như mong muốn. nhưng khi để hàm phục vụ ngắt và trong chương trình chính có gọi đến chương trình con đã được gọi trong hàm phục vụ ngắt thì thời gian ngắt của timer lại không chính xác nữa.
mình đã thử độc lập riêng timer thì hoàn toàn đúng.
mong được mọi người giúp đỡ. mình cảm ơn nhiều.

bien_van_khat 04-03-2008 02:37 PM

CCS C không hỗ trợ reentrant, do đó khi 1 chuơng trình con được gọi đồng thời trong chương trình chính và trong trình phục vụ ngắt thì CCS sẽ sinh mã để tự động che ngắt khi vào chương trình con đó để tránh reentrant.

Với trường hợp của bạn có 2 hiệu ứng làm trễ ngắt timer:
Thứ 1: khi vào chương trình con được gọi chung, CCS sẽ che ngắt global, do đó ngắt timer ko đc xảy ra, làm ngắt timer đến trễ so với thực tế.
Thứ 2: Trình phục vụ ngắt thay đổi mức trên PORTB của bạn quá dài, vì trong thời gian đang thực thi trình này thì ngắt nói chung và ngắt timer nói riêng ko thể xảy ra, nên làm trễ ngắt timer.

Về khái niệm reentrant (vào lại).

Bạn có thể tưởng tượng một chương trình con A đang được chạy trong chương trình chính, ngắt xảy ra và A lại đc gọi bởi trình phục vụ ngắt. Lúc này sẽ có một số vấn đề phát sinh:
1 - Không gian bộ nhớ cấp cho các biến của A: nếu linker cấp phát tĩnh các biến này thì coi như tiêu. Với pic16F, cấp phát động bộ nhớ (dùng stack) là điều phức tạp vì hardware ko hỗ trợ nhiều cho truy xuất bộ nhớ gián tiếp, mình ko có thời gian disassembly nhưng tin chắc là CCS ko làm điều này (CCS ko hỗ trợ đệ quy).
2 - Các tác vụ về IO hoặc về biến tốn nhiều chu kỳ máy khi bị ngắt giữa chừng cũng coi như tiêu.

anhvietqx 05-03-2008 12:57 AM

thanks!!! rat bo ich!

bean984 13-03-2008 09:31 AM

thanks anh nhiều!!
nhưng em vẫn chưa hiểu lắm về reentrant. anh có tài liệu j nói về vấn đề này không?
vấn đề nữa là trình phục vụ ngắt trên port B của em có lẽ là không rút ngắn được bao nhiêu.vậy có cách nào để tính thời gian ngắt của timer không?

bean984 17-03-2008 10:15 AM

cho em hỏi một vấn đề nữa nhé.
hiện tại chương trình của em cần thêm một số modul nữa, nhưng khi thêm vào và dịch thì nó thông báo là hết RAM mặc dù trước đó ctrinh mới dùng hết khoảng hơn 60% RAM.
có ai biết về vấn đề này xin giúp em với, làm sao để có thể dịch được nhiều hơn?

bien_van_khat 17-03-2008 04:42 PM

Trích:

Nguyên văn bởi bean984 (Post 14859)
thanks anh nhiều!!
nhưng em vẫn chưa hiểu lắm về reentrant. anh có tài liệu j nói về vấn đề này không?
vấn đề nữa là trình phục vụ ngắt trên port B của em có lẽ là không rút ngắn được bao nhiêu.vậy có cách nào để tính thời gian ngắt của timer không?

Bạn vào google tìm với từ khóa reentrant, có rất nhiều topic về vấn đề này.

Về timer, mình nghĩ bạn nên đưa phần quét phím ra chương trình chính, khi có ngắt INT_RB, bạn set cờ báo cho chuơng trình chính kiểm tra phím bấm, lúc này ngắt timer vẫn xảy ra được

Trích:

bean984 cho em hỏi một vấn đề nữa nhé.
hiện tại chương trình của em cần thêm một số modul nữa, nhưng khi thêm vào và dịch thì nó thông báo là hết RAM mặc dù trước đó ctrinh mới dùng hết khoảng hơn 60% RAM.
có ai biết về vấn đề này xin giúp em với, làm sao để có thể dịch được nhiều hơn?
Bạn định thêm vào module gì?

auto_control 22-03-2008 12:49 AM

mời tìm hiểu về pic cho mình hỏi có cách tạo ra cấu trúc truy nhập kiểu bảng (db ....)như đối với 8051 không .và tổ chức như thế nào/Mong trả lời của các bạn và các tiền bối

namqn 22-03-2008 12:55 AM

Trích:

Nguyên văn bởi auto_control (Post 15080)
mời tìm hiểu về pic cho mình hỏi có cách tạo ra cấu trúc truy nhập kiểu bảng (db ....)như đối với 8051 không .và tổ chức như thế nào,

Bạn đặt câu hỏi này trong luồng về CCS C cho PIC, xem ra không thích hợp. Các ngôn ngữ cấp cao, trong trường hợp này là ngôn ngữ C, đã xử lý các cấu trúc dữ liệu cho người lập trình rồi, cho nên không cần quan tâm xem tổ chức như thế nào.

Câu hỏi của bạn nên được post ở luồng cơ bản về PIC và vi điều khiển, và sử dụng hợp ngữ. Bạn có thể đọc tài liệu hướng dẫn của MPASM để thấy có thể dùng DT, DB, và DW để định nghĩa các bảng dữ liệu.

Thân,

auto_control 22-03-2008 01:16 AM

làm phiền trưởng lão lần nữa.nếu dùng CCs thì việc xử lý kiểu bảng này ra sao,chẳng hạn đệ muốn cho led7 hiển thị đếm ,thì khi dùng truy nhập bảng có vẻ nhanh hơn(thiển ý)
thanks!

namqn 22-03-2008 06:40 PM

Trích:

Nguyên văn bởi auto_control (Post 15083)
làm phiền trưởng lão lần nữa.nếu dùng CCs thì việc xử lý kiểu bảng này ra sao,chẳng hạn đệ muốn cho led7 hiển thị đếm ,thì khi dùng truy nhập bảng có vẻ nhanh hơn(thiển ý)
thanks!

Mời bạn download tài liệu hướng dẫn của CCS C ở link sau:
http://www.ccsinfo.com/downloads/CReferenceManual.pdf

Ở trang 268 có ví dụ về bảng hằng số trong flash (ROM) của PIC, bạn có thể dựa vào đó để làm bảng giải mã hiển thị cho LED 7 đoạn chẳng hạn.

Thân,

bean984 24-03-2008 02:48 PM

cho em hoi câu này
ý nghĩa của khai báo #fuses PUT là gì ?
nó ảnh hưởng đến timer như thế nào?(kết quả timer hoạt động thay đổi như thế nào khi có và không có khai báo trên)
em cảm ơn nhìu!

bien_van_khat 24-03-2008 04:36 PM

Trích:

Nguyên văn bởi bean984 (Post 15131)
cho em hoi câu này
ý nghĩa của khai báo #fuses PUT là gì ?
nó ảnh hưởng đến timer như thế nào?(kết quả timer hoạt động thay đổi như thế nào khi có và không có khai báo trên)
em cảm ơn nhìu!

PUT = Power Up Timer (bạn xem trong view/valid fuses của PCW)

Nói đơn giản là khi PIC đc cấp nguồn, Power Up Timer sẽ chờ 1 khoảng thời gian mới cho PIC chạy (thực thi code), khoảng thời gian chờ này nhằm đảm bảo nguồn cấp cho PIC ổn định.

Power Up Timer ko liên quan gì đến các timer của PIC.

LeDuc 24-03-2008 06:19 PM

Trích:

Nguyên văn bởi bien_van_khat (Post 15134)
PUT = Power Up Timer (bạn xem trong view/valid fuses của PCW)

Nói đơn giản là khi PIC đc cấp nguồn, Power Up Timer sẽ chờ 1 khoảng thời gian mới cho PIC chạy (thực thi code), khoảng thời gian chờ này nhằm đảm bảo nguồn cấp cho PIC ổn định.

Power Up Timer ko liên quan gì đến các timer của PIC.

Cho em hỏi câu này hơi chuối ? làm sao để nạp vào eeprom của 16f887 ? nạp qua đường nào? qua chân nào của Pic ?
Em cần nạp một mảng giá trị vào eeprom trước.cũng khoản 210 byte . Và sau này chường trình chính chỉ việc sử dụng các giá trị trong các ô nhớ của eeprom để xử lý mà thôi ....
Mong các huynh giúp đỡ !!
Thanks for all !

namqn 24-03-2008 06:21 PM

Trích:

Nguyên văn bởi LeDuc (Post 15139)
Cho em hỏi câu này hơi chuối ? làm sao để nạp vào eeprom của 16f887 ? nạp qua đường nào? qua chân nào của Pic ?
Em cần nạp một mảng giá trị vào eeprom trước.cũng khoản 210 byte . Và sau này chường trình chính chỉ việc sử dụng các giá trị trong các ô nhớ của eeprom để xử lý mà thôi ....
Mong các huynh giúp đỡ !!
Thanks for all !

Bạn nạp thông tin cho EEPROM cùng lúc với nạp chương trình cho PIC, tất nhiên là thông qua ICSP. Chương trình của bạn cũng có thể tự ghi vào EEPROM, nếu bạn viết chương trình để cung cấp các chức năng đó.

Thân,

ha_vy_cson 26-03-2008 08:27 PM

các bác ơi! cho em hỏi một tý...
em đang lập trình giao tiếp giữa pc và pic 16f877a, em muon truyen một chuổi từ máy tính bằng vb6 đến pic thi nên viết code trên VB như thế nào và viết hàm nhận trong ccs như thế nào........

LeDuc 26-03-2008 09:12 PM

Trích:

Nguyên văn bởi namqn (Post 15140)
Bạn nạp thông tin cho EEPROM cùng lúc với nạp chương trình cho PIC, tất nhiên là thông qua ICSP. Chương trình của bạn cũng có thể tự ghi vào EEPROM, nếu bạn viết chương trình để cung cấp các chức năng đó.

Thân,

Vấn đề là em muốn nap độc lập , mà kô ảnh hường đến chương trình chính có được ko anh ?
Vì một yêu cầu đặt ra là kô thay đổi chương trình chính mà chỉ việc thay đổi giá trị trong các ô nhớ của eeprom . Chương trình chính làm việc khác nhau ứng với các giá trị khác nhau trong vùng nhớ eeprom....
Mong các huynh giúp đỡ .
Thanks for all !

namqn 26-03-2008 10:19 PM

Trích:

Nguyên văn bởi LeDuc (Post 15183)
Vấn đề là em muốn nap độc lập , mà kô ảnh hường đến chương trình chính có được ko anh ?
Vì một yêu cầu đặt ra là kô thay đổi chương trình chính mà chỉ việc thay đổi giá trị trong các ô nhớ của eeprom . Chương trình chính làm việc khác nhau ứng với các giá trị khác nhau trong vùng nhớ eeprom....
Mong các huynh giúp đỡ .
Thanks for all !

Đây chỉ là vấn đề bạn sử dụng phần mềm nạp chương trình ra sao. Đa số các phần mềm đều cho phép bạn chọn lựa vùng nhớ được cập nhật. Lấy ví dụ WinPic800, bạn vào menu Setting, chọn Software, sau đó nhấn nút ICSP Mode. Bạn sẽ thấy phía dưới có những check box cho các vùng nhớ khác nhau. Nếu bạn uncheck tất cả các vùng nhớ, chỉ để lại Data, thì WinPic800 sẽ chỉ cập nhật Data EEPROM khi bạn ra lệnh nạp cho PIC.

Một số phần mềm thì có lệnh ghi vào từng vùng nhớ riêng, và 1 lệnh để ghi tất cả các vùng nhớ. Nói chung, bạn tìm hiểu kỹ phần mềm đang dùng để nạp chip thì sẽ làm được điều bạn muốn.

Thân,

LeDuc 27-03-2008 02:07 AM

Trích:

Nguyên văn bởi namqn (Post 15186)
Đây chỉ là vấn đề bạn sử dụng phần mềm nạp chương trình ra sao. Đa số các phần mềm đều cho phép bạn chọn lựa vùng nhớ được cập nhật. Lấy ví dụ WinPic800, bạn vào menu Setting, chọn Software, sau đó nhấn nút ICSP Mode. Bạn sẽ thấy phía dưới có những check box cho các vùng nhớ khác nhau. Nếu bạn uncheck tất cả các vùng nhớ, chỉ để lại Data, thì WinPic800 sẽ chỉ cập nhật Data EEPROM khi bạn ra lệnh nạp cho PIC.

Một số phần mềm thì có lệnh ghi vào từng vùng nhớ riêng, và 1 lệnh để ghi tất cả các vùng nhớ. Nói chung, bạn tìm hiểu kỹ phần mềm đang dùng để nạp chip thì sẽ làm được điều bạn muốn.

Thân,

Dạ , em hiểu rồi .
Em đã nạp được rồi .rất cảm ơn anh .
Nhưng em vẫn còn một vướng mắc ,hiện giờ mình chỉ nạp data vào riêng vùng eeprom .
Giả sử em muốn nạp giá tri 1-->255, tương ứng với ô nhớ từ 1-->255, vậy giá trị nạp này mình phải viết làm sao để có được file hex nạp riêng vào vùng nhớ eeprom đây?( chương trình chính là mình ko đụng đến rồi ...
Mong các anh chỉ giúp ..
Thanks for all !!


Múi giờ GMT. Hiện tại là 06:23 AM.

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