【问题标题】:What am I doing wrong with this code for PIC16F54?我对 PIC16F54 的这段代码做错了什么?
【发布时间】:2019-01-29 14:17:56
【问题描述】:

我是新来的,我希望我做得很好并张贴在正确的部分 x)

我开始对 PIC 微控制器进行编程,但有时会卡住。 我对这段代码有疑问,这是一个二进制计数器,当位为 1 时打开 LED 并在每次计数时打开一个开关(RB7)。 当它开始时,它会一直运行到 add1() 然后停止,因为没有遵循 while 条件(它会一直运行到 add1() 语句的 click() ,然后不会继续重复 while 循环)。

这是C语言的代码

#pragma config OSC = HS
#pragma config WDT = OFF
#define _XTAL_FREQ 4000000               // Fosc  frequency for _delay()  library
#include <xc.h>

bit a = 0;                 //variabili per il conteggio binario (10 bit)
bit b = 0;
bit c = 0;
bit d = 0;
bit e = 0;
bit f = 0;
bit g = 0;
bit h = 0;
bit i = 0;
bit j = 0;



void click() {

    if (a==1) {PORTAbits.RA2 = 1;}
    if (a==0) {PORTAbits.RA2 = 0;}

    if (b==1) {PORTAbits.RA3 = 1;}
    if (b==0) {PORTAbits.RA3 = 0;}

    if (c==1) {PORTBbits.RB1 = 1;}
    if (c==0) {PORTBbits.RB1 = 0;}

    if (d==1) {PORTBbits.RB2 = 1;}
    if (d==0) {PORTBbits.RB2 = 0;}

    if (e==1) {PORTBbits.RB3 = 1;}
    if (e==0) {PORTBbits.RB3 = 0;}

    if (f==1) {PORTAbits.RA1 = 1;}
    if (f==0) {PORTAbits.RA1 = 0;}

    if (g==1) {PORTAbits.RA0 = 1;}
    if (g==0) {PORTAbits.RA0 = 0;}

    if (h==1) {PORTBbits.RB6 = 1;}
    if (h==0) {PORTBbits.RB6 = 0;}

    if (i==1) {PORTBbits.RB5 = 1;}
    if (i==0) {PORTBbits.RB5 = 0;}

    if (j==1) {PORTBbits.RB4 = 1;}
    if (j==0) {PORTBbits.RB4 = 0;}

    PORTBbits.RB7 = 1;

    __delay_ms(500);

    PORTBbits.RB7 = 0;

    __delay_ms(5);

}


void add9() {
    if (a==0) {
        a=1; b=0; c=0; d=0; e=0; f =0; g=0; h=0; i=0; j=0; 
        click();
    }
    if (a==1,b==1,c==1,d==1,e==1,f==1,g==1,h==1,i==1,j==1) {
        //interrompe il contatore se sono tutti 1 e li azzera
        a=0;b=0;c=0;d=0;e=0;f=0;g=0;h=0;i=0;j=0; click();
    }
}


void add8() {
    if (b==0) {
        b=1; c=0; d=0; e=0; f =0; g=0; h=0; i=0; j=0; click();
    }
    else { 
        add9();
    }
}

void add7() {
    if (c==0) {
        c=1; d=0; e=0; f =0; g=0; h=0; i=0; j=0; click();
    }
    else { 
        add8();
    }
}

void add6() {
    if (d==0) {
        d=1; e=0; f =0; g=0; h=0; i=0; j=0; click();
        }
    else { 
        add7();
    }
}

void add5() {
    if (e==0) {
        e=1; f =0; g=0; h=0; i=0; j=0; click();
    }
    else { 
        add6();
    }
}

void add4() {
    if (f==0) {
        f =1; g=0; h=0; i=0; j=0; click();
    }
    else { 
        add5();
    }
}

void add3() {
    if (g==0) {
        g=1; h=0; i=0; j=0; click();
    }
    else { 
        add4();
    }
}

void add2() {
    if (h==0) {
        h=1; i=0; j=0; click();
    }
    else { 
        add3();
    }
}

void add1() { 
    if (i==0) {
        i=1; j=0; click(); 
    }
    else { 
        add2();        
    }
}    

void add() {               
    if (j==0) { 
        j=1; click();
    }
    else { 
        add1();
    }        
}                                                                

void main(void) {

    TRISA=0x00;
    TRISB=0x00;        

    while(1) {            
       add();           
    }       

    return;
}

我错过了什么? 对不起,有些 cmets 是意大利语,但我来自意大利 x)

【问题讨论】:

标签: c pic microchip


【解决方案1】:

表达式

a==1,b==1,c==1,d==1,e==1,f==1,g==1,h==1,i==1,j==1

进行所有比较,但由于comma operator 的工作方式仅返回最后一个 的结果,在本例中为j == 1。所有其他结果都被丢弃并忽略。

所以你的情况实际上是

if (j == 1)

如果要链接多个条件,则需要使用逻辑运算符 AND &amp;&amp; 或 OR ||。如

if (a==1 && b==1 && c==1 && d==1 && e==1 && f==1 && g==1 && h==1 && i==1 && j==1)

现在,只有当所有部分都为真时,条件才会为真。

这应该出现在几乎所有书籍、教程或课程中。如果您错过了,请回到他们那里了解更多信息。


另一方面,当你这样做时

if (a==1) {PORTAbits.RA2 = 1;}
if (a==0) {PORTAbits.RA2 = 0;}

真的等于

PORTAbits.RA2 = a;

【讨论】:

  • 非常感谢这些建议 :)
【解决方案2】:

您对 PIC16F54 代码的错误之处在于不知道 Microchip 基线控制器的架构是如何在芯片中实现的。

您使用的编码方法看起来像是某种 python 或 Java 脚本。

这不是为 PIC16F54 等资源严重受限的控制器创建代码的方法。

阅读 PIC16F54 数据表!!! 了解架构!!!

以你目前的经验水平,你不会理解这个解释:

您的代码失败的原因是您的嵌套函数调用超出了调用堆栈的深度。

【讨论】:

  • 我认为这可能是一些问题,但不确定。
  • 无论如何我解决了,使程序与另一种方法不同,现在它运行良好✌?
猜你喜欢
  • 1970-01-01
  • 2015-04-23
  • 2022-06-28
  • 2013-01-11
  • 2015-02-25
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
  • 2018-08-09
相关资源
最近更新 更多