Что я делаю не так с этим кодом для PIC16F54? - PullRequest
0 голосов
/ 29 января 2019

Я новичок здесь, и я надеюсь, что я все сделал правильно и выложил в нужном разделе x)

Я начал программировать микроконтроллеры PIC и иногда застревал.У меня проблема с этим кодом, то есть двоичным счетчиком, который включает светодиоды, когда биты на 1, и открывает переключатель при каждом счете (RB7).Когда он запускается, он продолжается до add1 () и затем останавливается, так как условие while не соблюдается (оно продолжается до click () операторов add1 () и затем не повторяет цикл 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;
}

Что мне не хватает?Извините за некоторые комментарии на итальянском, но я из Италии x)

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Что вы делаете неправильно с этим кодом для PIC16F54, так это то, что вы не знаете, как реализована архитектура базовых контроллеров Microchip в кремнии.

Используемый вами подход к кодированию выглядит как некий Python или Javaскрипт.

Это не способ создать код для контроллера с ограниченными ресурсами, такого как PIC16F54.

ПРОЧИТАТЬ ЛИСТ PIC16F54 !!!ПОНИМАТЬ АРХИТЕКТУРУ !!!

На вашем нынешнем уровне опыта вы не поймете это объяснение:

Причина, по которой ваш код не работает, заключается в том, что ваши вызовы вложенных функций превышают глубину стека вызовов.

0 голосов
/ 29 января 2019

Выражение

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

выполняет все сравнения, но из-за того, как работает оператор запятая , возвращает только результат last , который вэтот случай j == 1.Все остальные результаты отбрасываются и игнорируются.

Таким образом, ваше условие практически

if (j == 1)

Если вы хотите связать несколько условий, вам нужно использовать логические операторы AND && или OR||.Как и в

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

Теперь условие будет истинным, только если all части верны.

Это должно быть почти во всех книгах, учебных пособиях или классах.Если вы пропустили это, пожалуйста, вернитесь к ним, чтобы узнать больше.


На другой ноте, когда вы делаете

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

, это действительно равно

PORTAbits.RA2 = a;
...