佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 2819|回复: 33

求助求助:PIC16F876问题

[复制链接]
发表于 18-1-2008 11:51 AM | 显示全部楼层 |阅读模式
各位大大好,小弟是新手,有个问题困扰很久了无法解决..我是用C来写PIC16F876的程序,然后用CCS 的 PCM C Compiler来转换去HEX 格式再烧入IC里.我想用8个pin来output 0-255,既是用RB0到RB7来给binary output.我暂时使用8个LED接在这8个pin上,用来检查output.试了很多方法,可是就是不行。那8个LED完全不亮。除了这8个外,我有用4个PORT A 和3个PORT C,那些的都可以,因为我是用output_high或output_low来控制,至于那8个pin,如果要用output_high/low 来决定output的话,整个program会很大,不能compile.以下是我所写的程序,麻烦各位大大替小弟检查检查和指点。小弟无限感激。程序如下:

#include<16F876.H>

// Define the serial port system and clock oscillation
#use delay(clock=20000000)
#use RS232(baud=115200,xmit=PIN_C6,rcv=PIN_C7)
#fuses hs, nowdt, nolvp, noprotect

// Define the ports that's being been used
#byte PORTC=7
#byte PORTB=8
#byte PORTA=5


// Define parameter used
char a;                                // ID
char b;                                // Function Selection
char mode;                        // Mode Set
char drive;                        // Driver Mode
char rot;                        // Rotation Mode
char sys;                        // System Mode
char chg;                        // Encoder Changes
char cntplr;                // Counter Polarity Set
char rst;                        // Counter Reset
unsigned int i1;        // Motor Rotation Output Angle
unsigned int i2;
unsigned int i3;


// Main program
void main()
{

  set_tris_c(0x80);
  set_tris_b(0x00);
  set_tris_a(0x00);

// Pin testing
output_low(PIN_C0);
output_low(PIN_C1);
output_low(PIN_C2);

output_low(PIN_B0);
output_low(PIN_B1);
output_low(PIN_B2);
output_low(PIN_B3);
output_low(PIN_B4);
output_low(PIN_B5);
output_low(PIN_B6);
output_low(PIN_B7);

output_low(PIN_A0);
output_low(PIN_A1);
output_low(PIN_A2);
output_low(PIN_A3);

// Only test with rotation angle as it is easy to notice with the LED on microcontroller board
output_high(PIN_B7);
delay_ms(500);
output_high(PIN_B6);
delay_ms(500);
output_high(PIN_B5);
delay_ms(500);
output_high(PIN_B4);
delay_ms(500);
output_high(PIN_B3);
delay_ms(500);
output_high(PIN_B2);
delay_ms(500);
output_high(PIN_B1);
delay_ms(500);
output_high(PIN_B0);
delay_ms(500);

output_low(PIN_B0);
output_low(PIN_B1);
output_low(PIN_B2);
output_low(PIN_B3);
output_low(PIN_B4);
output_low(PIN_B5);
output_low(PIN_B6);
output_low(PIN_B7);



   do
   {
    a=0;
        b=0;
    a=getc();        // Get ID
        b=getc();        // Get the symbol for which function to run
        portb=0;        // Set all pins low for no output

        while( a == '1' )
        {
                if( b == 'A'){
                        mode = getc(); // Get mode set
                        if( mode == 'C' ){
                                output_high(PIN_A0);
                                delay_ms(500);
                                output_low(PIN_A0);
                                delay_ms(500);
                                output_high(PIN_A0);
                                }
                        else if( mode == 'T' ){
                                output_high(PIN_A0);
                                }
                        else if( mode == 'F' ){
                                output_low(PIN_A0);
                                }
                        }

                else if( b == 'B'){
                        drive = getc(); // Get driving mode HOM or SERVO
                        if( drive == 'H'){
                                output_high(PIN_A1);
                                }
                        else if( drive == 'S'){
                                output_low(PIN_A1);
                                }
                        }

                else if( b == 'C'){
                        rot = getc(); // Get rotation mode CW or CCW
                        if( rot == 'R'){
                                output_high(PIN_A2);
                                }
                        else if( rot == 'C'){
                                output_low(PIN_A2);
                                }
                        }

                else if( b == 'D'){
                        sys = getc(); // Get system set mode
                        if( sys == 'T'){
                                output_high(PIN_A3);
                                }
                        else if( sys == 'F'){
                                output_low(PIN_A3);
                                }
                        }

                else if( b == 'E'){
                        i1 = getc(); // Get motor positioning rotation angle
                        i2 = getc();
                        i3 = getc();
                        if( i1 == '0' && i2 == '0' && i3 == '0' ){
                                PORTB=0;
                                break;}
                        else if( i1 == '0' && i2 == '0' && i3 == '1'){
                                PORTB=1;
                                break;}
                        else if( i1 == '0' && i2 == '0' && i3 == '2'){
                                PORTB=2;
                                break;}
                        else if( i1 == '0' && i2 == '0' && i3 == '3'){
                                PORTB=3;
                                break;}
                        else if( i1 == '0' && i2 == '0' && i3 == '4'){
                                PORTB=4;
                                break;}
                        else if( i1 == '0' && i2 == '0' && i3 == '5'){
                                PORTB=5;
                                break;}
                        else if( i1 == '0' && i2 == '0' && i3 == '6'){
                                PORTB=6;
                                break;}
                        else if( i1 == '0' && i2 == '0' && i3 == '7'){
                                PORTB=7;
                                break;}
                        else if( i1 == '0' && i2 == '0' && i3 == '8'){
                                PORTB=8;
                                break;}
                        else if( i1 == '0' && i2 == '0' && i3 == '9'){
                                PORTB=9;
                                break;}
                        else if( i1 == '0' && i2 == '1' && i3 == '0'){
                                PORTB=10;
                                break;}
                        else if( i1 == '0' && i2 == '1' && i3 == '1'){
                                PORTB=11;
                                break;}
                        else if( i1 == '0' && i2 == '1' && i3 == '2'){
                                PORTB=12;
                                break;}
                        else if( i1 == '0' && i2 == '1' && i3 == '3'){
                                PORTB=13;
                                break;}
                        else if( i1 == '0' && i2 == '1' && i3 == '4'){
                                PORTB=14;
                                break;}
                        else if( i1 == '0' && i2 == '1' && i3 == '5'){
                                PORTB=15;
                                break;}
                        else if( i1 == '0' && i2 == '1' && i3 == '6'){
                                PORTB=16;
                                break;}
                        else if( i1 == '0' && i2 == '1' && i3 == '7'){
                                PORTB=17;
                                break;}
                        else if( i1 == '0' && i2 == '1' && i3 == '8'){
                                PORTB=18;
                                break;}
                        else if( i1 == '0' && i2 == '1' && i3 == '9'){
                                PORTB=19;
                                break;}
                        else if( i1 == '0' && i2 == '2' && i3 == '0'){
                                PORTB=20;
                                break;}
                        else if( i1 == '2' && i2 == '5' && i3 == '5'){
                                PORTB=255;
                                break;}
                       
                        break;
                        }

                else if( b == 'F'){
                        chg = getc(); // Get encoder change set
                        if( chg == 'T'){
                                output_high(PIN_C0);
                                }
                        else if( chg == 'F'){
                                output_low(PIN_C0);
                                }
                        }

                else if( b == 'G'){
                        cntplr = getc(); // Get counter polarity set
                        if( cntplr == 'T'){
                                output_high(PIN_C1);
                                }
                        else if( cntplr == 'F'){
                                output_low(PIN_C1);
                                }
                        else if( mode == 'C' ){
                                output_high(PIN_C1);
                                delay_ms(500);
                                output_low(PIN_C1);
                                delay_ms(500);
                                output_high(PIN_C1);
                                }
                        }

                else if( b == 'H'){
                        rst = getc(); // Get counter reset
                        if( rst == 'T'){
                                output_high(PIN_C2);
                                }
                        else if( rst == 'F'){
                                output_low(PIN_C2);
                                }
                        }
                break;

        }
       
         
          while( a != '1') // All output to low if different ID
        {output_low(PIN_C0);
                output_low(PIN_C1);
                output_low(PIN_C2);
                output_low(PIN_B0);
                output_low(PIN_B1);
                output_low(PIN_B2);
                output_low(PIN_B3);
                output_low(PIN_B4);
                output_low(PIN_B5);
                output_low(PIN_B6);
                output_low(PIN_B7);
                output_low(PIN_A0);
                output_low(PIN_A1);
                output_low(PIN_A2);
                output_low(PIN_A3);
                break;}


    delay_ms(100);
  }while(1);


}


那个部分我只写到20,只用来testing,因为实在懒惰写到255,太长了... 谢谢大家!!
回复

使用道具 举报


ADVERTISEMENT

发表于 18-1-2008 03:17 PM | 显示全部楼层
原帖由 jths21 于 18-1-2008 11:51 AM 发表
各位大大好,小弟是新手,有个问题困扰很久了无法解决..我是用C来写PIC16F876的程序,然后用CCS 的 PCM C Compiler来转换去HEX 格式再烧入IC里.我想用8个pin来output 0-255,既是用RB0到RB7来给binary output.我暂时使用8个LED接在这8个pin上,用来检查output.试了很多方法,可是就是不行。那8个LED完全不亮。除了这8个外,我有用4个PORT A 和3个PORT C,那些的都可以,因为我是用output_high或output_low来控制,至于那8个pin,如果要用output_high/low 来决定output的话,整个program会很大,不能compile.以下是我所写的程序,麻烦各位大大替小弟检查检查和指点。小弟无限感激。程序如下:

如果你是用其他的C, 我就帮不了你。
其实, 用CCS C很容易实现你要的东西。
下面的code已测试, ok的。
你用什么版本, 请注明。


  1. // By Pic@cARi
  2. // 18 Jan 2008
  3. // Accept input from RS232, and put in PortB.
  4. #include <16F877A.H>
  5. #use delay(clock=20000000)
  6. #use RS232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)
  7. #fuses hs, nowdt, nolvp, noprotect

  8. #byte PORTB=0x06
  9. #Use fast_IO(b)

  10. #include <STDLIB.h>
  11. #include <input.c>

  12. int value;

  13. void main()
  14. {
  15.    portb=0;
  16.   set_tris_b(0b00000000);
  17.    while(true)
  18.    {
  19.       value = get_int();
  20.       PortB=value;
  21.    }
  22. }
复制代码
回复

使用道具 举报

 楼主| 发表于 18-1-2008 03:22 PM | 显示全部楼层
现在我有MPLAB IDE 8.0和 HITEC PICC v8.05PL2...
我再尽力试试看,非常谢谢你的资料..
回复

使用道具 举报

发表于 18-1-2008 06:25 PM | 显示全部楼层
原帖由 jths21 于 18-1-2008 03:22 PM 发表
现在我有MPLAB IDE 8.0和 HITEC PICC v8.05PL2...
我再尽力试试看,非常谢谢你的资料..

上面的程序是100%操作, 但一定要CCS C, Hitech C不可以用。
回复

使用道具 举报

 楼主| 发表于 19-1-2008 08:37 AM | 显示全部楼层
那么CCSC v2.734 的 PCM C Compiler 可以用吗?
回复

使用道具 举报

发表于 19-1-2008 08:50 AM | 显示全部楼层
原帖由 jths21 于 19-1-2008 08:37 AM 发表
那么CCSC v2.734 的 PCM C Compiler 可以用吗?

可以。 那个是DOS based的, 是哪里拿到的?
你可以下载CCS C的 4.x Demo 版, 必要时Driver我给你。
回复

使用道具 举报

Follow Us
 楼主| 发表于 19-1-2008 08:55 AM | 显示全部楼层
那个是我从朋友那里拿的...我刚试过了,那个有个header file 里面的 input.c 里的 digit = getch(); 过不了...那里写 Error file not found.<34>...那个demo版不支援PIC16F876...
然后我试着不放 input.c下去,只放 stdio.h,ctype.h,和 16f876.h,可以compile,不过我现在不在学校,不能测试...我是用那个dos 版的来弄...

[ 本帖最后由 jths21 于 19-1-2008 01:27 PM 编辑 ]
回复

使用道具 举报

发表于 19-1-2008 03:44 PM | 显示全部楼层
原帖由 jths21 于 19-1-2008 08:55 AM 发表
那个是我从朋友那里拿的...我刚试过了,那个有个header file 里面的 input.c 里的 digit = getch(); 过不了...那里写 Error file not found....那个demo版不支援PIC16F876...
然后我试着不放 input.c下去,只放 std ...



input.c 是CCS C的Driver, 在PICC/Drivers 里。
Demo 可以Compile 16F877A, 可以在16F876A里跑。

下面的code, 我已经把Input.c 的code include进来了。
你可能看不懂, 但不要去改它,
重点你会用 get_int() 这个function就好了。
get_int() 会return 你从RS232里打进去的。
x=get_int() ;
如你输入 '3' ,'5' <Enter>
那 x 会得到35 (integer)。
  1. // By Pic@cARi
  2. // 19 Jan 2008
  3. // Accept input from RS232, and put in PortB.

  4. #include <16F877A.H> // can be use for 16F876A
  5. #use delay(clock=20000000)
  6. #use RS232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)
  7. #fuses hs, nowdt, nolvp, noprotect
  8. #byte PORTB=0x06
  9. #Use fast_IO(b)

  10. //=========================
  11. // Modified from CCS C Driver
  12. // partial content of Input.c

  13. signed int atoi(char *s)
  14. {
  15.    signed int result;
  16.    unsigned int  index;
  17.    char c;
  18.    index = 0;
  19.    result = 0;
  20.    if (!s) return 0;
  21.    // Omit all preceeding alpha characters
  22.    c = s[index++];

  23.    if (c >= '0' && c <= '9')
  24.    {
  25.       // The number is a decimal number
  26.          while (c >= '0' && c <= '9')
  27.          {
  28.             result = 10*result + (c - '0');
  29.             c = s[index++];
  30.          }
  31.    }
  32.    return(result);
  33. }

  34. void get_string(char* s, unsigned int8 max)
  35. {
  36.    unsigned int8 len;
  37.    char c;
  38.    --max;
  39.    len=0;
  40.    do {
  41.      c=getc();
  42.      if(c==8) {  // Backspace
  43.         if(len>0) {
  44.           len--;
  45.           putc(c);
  46.           putc(' ');
  47.           putc(c);
  48.         }
  49.      } else if ((c>=' ')&&(c<='~'))
  50.        if(len<=max)
  51.        }
  52.          s[len++]=c;
  53.          putc(c);
  54.        }
  55.    } while(c!=13);
  56.    s[len]=0;
  57. }

  58. signed int8 get_int()
  59. {
  60.   char s[5];
  61.   signed int8 i;
  62.   get_string(s, 5);
  63.   i=atoi(s);
  64.   return(i);
  65. }

  66. // End of Driver
  67. //==========================================
  68. int value;

  69. // Your Main Code goes here
  70. void main()
  71. {
  72.    portb=0;
  73.   set_tris_b(0b00000000);
  74.    while(true)
  75.    {
  76.       value = get_int();
  77.       PortB=value;
  78.    }
  79. }
复制代码
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 19-1-2008 04:18 PM | 显示全部楼层
就是说我直接把你写的driver code 放进我的main program就好了?
是放在要用的那part上面还是整个program之前呢?
我尽力试试...非常感谢你的帮忙...
回复

使用道具 举报

 楼主| 发表于 19-1-2008 11:16 PM | 显示全部楼层
刚才用demo版本试了,可以过,但是现在没得测试,所以不懂还可以不可以。但是我用的是876罢了,不是876A,是可以的吗?
我是用877A来compile它...我放上来给你看看...
  1. #include <16F877A.H>

  2. #use delay(clock=20000000)
  3. #use RS232(baud=115200,xmit=PIN_C6,rcv=PIN_C7)
  4. #fuses hs, nowdt, nolvp, noprotect

  5. // Define the ports that's being been used
  6. #byte PORTC=7
  7. #byte PORTB=8
  8. #byte PORTA=5

  9. #Use fast_IO(b)

  10. // Define parameter used
  11. char a;            // ID
  12. char b;            // Function Selection
  13. char mode;         // Mode Set
  14. int angle;   // Motor Rotation Output Angle

  15. signed int atoi(char *s)
  16. {
  17.    signed int result;
  18.    unsigned int  index;
  19.    char c;
  20.    index = 0;
  21.    result = 0;
  22.    if (!s) return 0;
  23.    // Omit all preceeding alpha characters
  24.    c = s[index++];

  25.    if (c >= '0' && c <= '9')
  26.    {
  27.       // The number is a decimal number
  28.          while (c >= '0' && c <= '9')
  29.          {
  30.             result = 10*result + (c - '0');
  31.             c = s[index++];
  32.          }
  33.    }
  34.    return(result);
  35. }

  36. void get_string(char* s, unsigned int8 max)
  37. {
  38.    unsigned int8 len;
  39.    char c;
  40.    --max;
  41.    len=0;
  42.    do {
  43.      c=getc();
  44.      if(c==8) {  // Backspace
  45.         if(len>0) {
  46.           len--;
  47.           putc(c);
  48.           putc(' ');
  49.           putc(c);
  50.         }
  51.      } else if ((c>=' ')&&(c<='~'))
  52.        if(len<=max)
  53.        {
  54.          s[len++]=c;
  55.          putc(c);
  56.        }
  57.    } while(c!=13);
  58.    s[len]=0;
  59. }

  60. signed int8 get_int()
  61. {
  62.   char s[5];
  63.   signed int8 i;
  64.   get_string(s, 5);
  65.   i=atoi(s);
  66.   return(i);
  67. }



  68. // Main program
  69. void main()
  70. {

  71.   set_tris_c(0x80);
  72.   set_tris_b(0x00);
  73.   set_tris_a(0x00);

  74.    do
  75.    {
  76.     a=0;
  77.    b=0;
  78.     a=getc();   // Get ID
  79.    b=getc();   // Get the symbol for which function to run
  80.    portb=0;   // Set all pins low for no output

  81.    while( a == '1' )
  82.    {
  83.       if( b == 'A'){
  84.          mode = getc(); // Get mode set
  85.          if( mode == 'C' ){
  86.             output_high(PIN_A0);
  87.             delay_ms(500);
  88.             output_low(PIN_A0);
  89.             delay_ms(500);
  90.             output_high(PIN_A0);
  91.             }
  92.          else if( mode == 'T' ){
  93.             output_high(PIN_A0);
  94.             }
  95.          else if( mode == 'F' ){
  96.             output_low(PIN_A0);
  97.             }
  98.          }
  99.       else if( b == 'E'){
  100.          angle = get_int(); // Get motor positioning rotation angle
  101.          PortB=angle;
  102.          
  103.          break;
  104.          }
  105.    }
  106.       
  107.      while( a != '1') // All output to low if different ID
  108.         {output_low(PIN_C0);
  109.       output_low(PIN_C1);
  110.       output_low(PIN_C2);
  111.       output_low(PIN_B0);
  112.       output_low(PIN_B1);
  113.       output_low(PIN_B2);
  114.       output_low(PIN_B3);
  115.       output_low(PIN_B4);
  116.       output_low(PIN_B5);
  117.       output_low(PIN_B6);
  118.       output_low(PIN_B7);
  119.       output_low(PIN_A0);
  120.       output_low(PIN_A1);
  121.       output_low(PIN_A2);
  122.       output_low(PIN_A3);
  123.       break;}


  124.     delay_ms(100);
  125.   }while(1);
  126. }
复制代码
希望可以过,这问题困扰有2个星期多了...唉...
回复

使用道具 举报

发表于 20-1-2008 02:28 AM | 显示全部楼层
其实楼主要的是从serial port拿到data,然后再perform task base on data是吗?
回复

使用道具 举报

 楼主| 发表于 20-1-2008 08:10 AM | 显示全部楼层
原帖由 fritlizt 于 20-1-2008 02:28 AM 发表
其实楼主要的是从serial port拿到data,然后再perform task base on data是吗?



对...可是就只有一个part弄不好...其他part都可以,就不知为什么要用8pins来output 255 binary data这么麻烦....
基本上我所知道的是可以用 portb=i; (i是0-255数字),可是不懂为什么就是不能...

[ 本帖最后由 jths21 于 20-1-2008 08:11 AM 编辑 ]
回复

使用道具 举报

 楼主| 发表于 21-1-2008 10:08 AM | 显示全部楼层
糟糕....compiler过期了...呵呵
回复

使用道具 举报

发表于 21-1-2008 11:13 AM | 显示全部楼层
原帖由 jths21 于 20-1-2008 08:10 AM 发表



对...可是就只有一个part弄不好...其他part都可以,就不知为什么要用8pins来output 255 binary data这么麻烦....
基本上我所知道的是可以用 portb=i; (i是0-255数字),可是不懂为什么就是不能...

其实, 你PC那个部分是用人手打进去的( 通过HyperTerminal), 还是写程序如VB呢?

上面我给你的程序是用Hyperteminal 输入, 然后处理, 看起来会复杂。。。

你可以直接send ASCII 0-255 (1byte),  


  1. =========================
  2. CCS C
  3. int x;
  4. x=getc();
  5. portb=x;

  6. =========================
  7. VB
  8. x=1
  9. MSCOMM1.output= chr(x)
  10. =========================
复制代码


compilier 过期, 把日期roll back就可以了。
回复

使用道具 举报

 楼主| 发表于 21-1-2008 11:36 AM | 显示全部楼层
暂时我是人手key in...迟些我会做个VB program来操作...
回复

使用道具 举报

发表于 21-1-2008 12:01 PM | 显示全部楼层
原帖由 jths21 于 21-1-2008 11:36 AM 发表
暂时我是人手key in...迟些我会做个VB program来操作...

你好像还抓不到我上一楼的重点。。。
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 21-1-2008 12:24 PM | 显示全部楼层
原帖由 pic 于 21-1-2008 12:01 PM 发表

你好像还抓不到我上一楼的重点。。。


你想说的是用vb会方便很多对吗?
可是我还没进入vb的那个方向...所以目前testing都是用手打的...
回复

使用道具 举报

发表于 21-1-2008 01:00 PM | 显示全部楼层
原帖由 jths21 于 21-1-2008 12:24 PM 发表
你想说的是用vb会方便很多对吗?
可是我还没进入vb的那个方向...所以目前testing都是用手打的...

不是啦, 你要0~255, 你可以直接send那个Byte, 那MCU的部分就很简单很简单了。。。。

或你用SIOW.exe , 和CCS C一起来的, 你可以send Hex。
或看什么Hyperterminal 可以输入 hex data的。。。

因为不知道你的应用, 也不懂适合你吗。。。
回复

使用道具 举报

 楼主| 发表于 21-1-2008 01:09 PM | 显示全部楼层
原帖由 pic 于 21-1-2008 01:00 PM 发表

不是啦, 你要0~255, 你可以直接send那个Byte, 那MCU的部分就很简单很简单了。。。。

或你用SIOW.exe , 和CCS C一起来的, 你可以send Hex。
或看什么Hyperterminal 可以输入 hex data的。。。

因为不知 ...


其实我懂真正只需要2,3行罢了,但是现在就不明白testing为何跑不了...可能需要真正vb program出来....
我试过了你给我的那个input.c的间接法,还是不行

[ 本帖最后由 jths21 于 21-1-2008 01:12 PM 编辑 ]
回复

使用道具 举报

发表于 21-1-2008 01:28 PM | 显示全部楼层
原帖由 jths21 于 21-1-2008 01:09 PM 发表


其实我懂真正只需要2,3行罢了,但是现在就不明白testing为何跑不了...可能需要真正vb program出来....
我试过了你给我的那个input.c的间接法,还是不行

baud rate 是9600, 不是115200.

你的RS232的部分对吗?

你可以test:
putc( getc()+1);

你打A, 它要return B。
你打1, 它要return 2。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 25-1-2025 10:01 AM , Processed in 0.143285 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表