Dúvidas com pic 16f876a


#1

Bom dia pessoal! Meu nome é Jônatas M. Campos, sou novo no fórum e no universo de microcontroladores e gostaria de contar com a ajuda de vocês. Estou desenvolvendo um projeto com o PIC16F876A. O projeto consiste no seguinte: ligar 16 leds mais uma lampada de 5V.

já construi o hardware e agora estou criando o programa e simulando no protheus. Acontece que a simulacão no Protheus não esta coincidindo com programa que estou elaborando no programa C Compiller.

Acontece que os leds D5 e D6 que estao ligados aos pinos 17 e 18 (RC6 e RC7 respectivamente) já estão iniciando em nível alto, antes deu pressionar o botão INICIO e não apagam nunca, mesmo na programacão eu os declarando para iniciar em nivel baixo.

Outro problema é que o meu led D16 ( pino 6 - Ra4) não esta acendendo.
Dei uma olhada no datasheet, mas como sou iniciante, algumas configuracões não entendo muito bem.

Se alguem souber o que se passa e puder fazer a gentileza em me orientar ficarei grato. estou colocando em anexo o diagrama eletronico e o programa que desenvolvi para o procedimento que desejo.

PROCEDIMENTO DESEJADO:

“SE” eu pressionar o botão ÍNICIO então:

LEDS D1 ao D7 ligam e desligam sequencialmente,
depois lampada L1 liga por 2 segundos e desliga,
depois LEDS D8 ao D14 ligam e desligam sequencialmente,
depois LED 15 e 16 ligam e desligam

Muito obrigado a todos, boa tarde!

DIAGRAMA:

PROGRAMA CRIADO NO C COMPILLER:

#include “C:\JONATAS CAMPOS\MECATRÔNICA\MICROCONTROLADORES\PICS\MALETA COM PICS\TESTE 2\LEDS TOPO COM PIC 16F876A\PROGRAMA EM C\LEDS TOPO COM PIC 16F876A.h”

void main()

{

setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_CLOCK_DIV_2);
setup_spi(SPI_SS_DISABLED);
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);

// INÍCIO DE PROGRAMA

// 14 LEDS TOPO, 1 LÂMPADA TOPO E 2 LEDS BASE

output_A(0);// define se que de inicio as portas A estaram em nível Baixo
output_B(0);// define se que de inicio as portas B estaram em nível Baixo
output_C(0);// define se que de inicio as portas C estaram em nível Baixo

INT X;

WHILE(TRUE)

{

x=0;

if(input(pin_a0)==1)

{

while(x<5)

{

output_high(pin_c2);
delay_ms(100);
output_low(pin_c2);

output_high(pin_c3);
delay_ms(100);
output_low(pin_c3);

output_high(pin_c4);
delay_ms(100);
output_low(pin_c4);

output_high(pin_c5);
delay_ms(100);
output_low(pin_c5);

output_high(pin_c6);
delay_ms(100);
output_low(pin_c6);

output_high(pin_c7);
delay_ms(100);
output_low(pin_c7);

output_high(pin_b0);
delay_ms(100);
output_low(pin_b0);

output_high(pin_c1);// LÂMPADA
delay_ms(2000);
output_low(pin_c1);

output_high(pin_b1);
delay_ms(100);
output_low(pin_b1);

output_high(pin_b2);
delay_ms(100);
output_low(pin_b2);

output_high(pin_b3);
delay_ms(100);
output_low(pin_b3);

output_high(pin_b4);
delay_ms(100);
output_low(pin_b4);

output_high(pin_b5);
delay_ms(100);
output_low(pin_b5);

output_high(pin_b6);
delay_ms(100);
output_low(pin_b6);

output_high(pin_b7);
delay_ms(100);
output_low(pin_b7);

output_high(pin_a4);// LEDS BASE AZUIS
output_high(pin_a5);
delay_ms(2000);
output_low(pin_a4);
output_low(pin_a5);

x=x+1;

}

}
}
}


#2

@JONATASMC, qual o compilador para PIC que está utilizando? CCS, MikroC?

Bom, pelo que pude verificar falta você informar ao controlador a forma o qual o pino de IO deve atuar (como entrada ou como saída).

No seu caso e pelo pouco que sei, falta utilizar a função que altera a forma como o pino deve-se comportar.

No CCS creio que a função “set_tris_x(value)” pode fazer isso para o restante dos pinos que está utilizando.

No caso específico dos pinos RC6 e RC7 esses pinos são utilizados como os sinais TX e RX da USART e nesse caso além de setar a direção do pino pela função “set_tris_c” você terá que setar também o bit SPEN do registrador RCSTA para que esses pinos sejam configurados como IO digital.

No outro caso que é o pino 6 (RA4) esse pino em específico é “OPEN DRAIN”, ou seja, ele funciona drenando uma corrente para dentro do controlador e para o LED acender você terá que ligar o mesmo de outra forma. Ligue o resitor desse LED na fonte e ligue o catodo do LED nesse pino (pelo seu diagrama vai ter que inverter o desenho).

Diagrama simplificado da porta do PIC

Forma de ligação do seu LED para essa porta.

Abraços.


#3

Boa tarde Wagner. Primeiramente, muito obrigado pela atenção e ajuda!

Então, eu uso o compilador CCS C COMPILLER (PCWHD) .

Quanto a informar ao controlador sobre como o pino I/O deve atuar, achei que seria com o seguinte código:

“output_c(0);”

…então coloquei o código que vc me informou:

“set_tris_c(0);”

…mesmo com este código continuou a acender os dois leds referidos mesmo sem pressionar o botão início.

Quando vou criar um novo projeto wizard no CCS C COMPILLER , no momento que vou selecionar o microcontrolador a ser usado, uma janela se abre e me permite selecionar pino por pino e defini los respectivamente como entradas ou saídas. este procedimento foi realizado e neste momento defini os pinos que estao sendo discutidos como saídas.

Você me informou também que no caso específico dos pinos RC6 e RC7 são utilizados como os sinais TX e RX da USART e além do procedimento anterior devo setar o bit SPEN do registrador RCSTA.

Acontece que estou comecando a estudar por conta própria agora e não sei o que significa esta definicoes nem como realizar estes procedimentos… teria como me orientar um pouco mais detalhadamente e como seria o código?

No outro caso do pino 6 (RA4) eu prefiro realoca lo em uma outra saída do que configura lo desta forma, pois se não será o unico que ficará nesta disposicão.

Com a ajuda de um amigo eu realoquei os leds para outros pinos e agora deu certo o procedimento que queria realizar, porém o problema não deixa de existir caso eu queira usar a configuração conforme o diagrama que enviei anteriormente. Sendo assim gostaria de persistir neste problema até aprender e solucionar, e assim galgar passo a passo rumo ao conhecimento.

Desculpe a ignorância quanto ao entendimento destes termos e neste universo tão vasto que é a eletrônica e os microcontroladores. Não a subestimo e sei da real complexidade que é o seu entendimento, e pretendo continuar estudando para que a compreenda cada vez mais.
Mais uma vez vez muito obrigado pela gentileza, aguardo, abraço.


#4

@JONATASMC, legal o auto-aprendizado.

Aconselho, como um primeiro passo, a consultar, mesmo que por curiosidade o manual do controlador que você escolheu em http://ww1.microchip.com/downloads/en/DeviceDoc/39582C.pdf

Apenas para você ir se familiarizando com os pinos, registradores, linguagem, etc.

Bom o registrador RCSTA é o registrador da USART que define o comportamento que a interface serial terá. Um dos bits deste registrador é o famigerado SPEN (Serial Port Enable) que é aquele que você teria que desabilitar para usar os pinos de TX e RX como portas IO digital.

Bom o comando poderia ser qualquer um que atue sobre bits.

  • Figura retirada da pagina 112 do datasheet do controlador

Creio que um dos comandos do CCS que possa ser usado para limpar o bit SPEN é o “bit_clear()”

Fica como dever de casa para você.

Abraços