Ir ao conteúdo
  • Cadastre-se

Ajuda com programa em C para pic.


neto_e_khelen

Posts recomendados

Boa tarde pessoal. Estou aqui novamente para pedir ajuda com uma dúvida que tenho a qual já perguntei aqui no forum antes mas não obtive ajuda o suficiente mas acho que foi devido a minha dúvida não ter ficado muito clara. Ai vai:

Quero fazer um circuito utilizando o Pic 16f68A para fazer testes em cabos(fios) que estejam com mau-contato. O funcionamento dele seria mais ou menos assim: No Pic seria ligado um Led e um botão. O fio a ser testado seria ligado uma ponta no pic e a outra ponta em 5v, fazendo o papel do botão. Caso ele deixe passar os 5v durante 10 segundos sem nenhuma pausa, o led acenderia, mas caso dentro desses 10 segundos ele interromper a corrente, os 10 segundos seja resetado e começado a contar de novo. Basicamente é isso. O circuito é o:

testadordecabos.th.gif

Estou tentando programar em C , já aprendi muita coisa nesse linguagem. Por favor me ajudem!!!!

O algoritmo seria +ou- assim:

Loop Infinito

Ler port_a0 - se nivel 0 votar no inicio

Ler port_a0 - se nivel 1 comecar a contar 10segundos

Terminou os 10 segundos com o port_a0 em nivel 1 o tempo todo -> liga led

O port_a0 ficou em nivel 0 antes de terminar os 10 segundos, volta ao incio.

por favor, me ajudem a escrever isso em C.

Link para o comentário
Compartilhar em outros sites

fiz este codigo para q se o nivel no porta.0 ficar dez segundos em 1 ative um led por 1 segundo e apague ,talvez sirva pra você

program teste

dim cont as byte

main:

cmcon=7 'desativa comparadores

trisa=1 ' define como entrada

trisb=0 ' define como saida

porta.0=0

portb=0 ' limpa portb

cont=0

volta:

if porta.0=1 then

goto testa

else

goto volta

testa:

if cont=10 then

portb.0=1

delay_ms (1000)

portb.0=0

cont=0

else

cont=cont+1

delay_ms(1000)

goto volta

end if

end if

goto volta

end.

Link para o comentário
Compartilhar em outros sites

Muito obrigado pela ajuda jorgeletronico, tentei escrever o programa, mas da erro de compilação. O que pode ser??

#include<16f628A.h> // modelo do microcontrolador

#fuses XT,NOLVP,NOWDT,NOBROWNOUT,NOPUT,NOPROTECT,NOCPD //configura fusiveis da MCU

#use delay (clock=4000000)

#use fast_io(a)

#use fast_io(B)

#use delay (clock=4000000)

signed long tempo=0;

void volta();

void testa();

void main()

{

set_tris_a ( 1 );

set_tris_b ( 0 );

// configura portas analogicas CAD

setup_vref(false);

//configuração dos timers

setup_timer_1(T1_internal|t1_div_by_1);

setup_timer_0(rtcc_internal|rtcc_div_256);

setup_timer_2(T2_DISABLED,0,1);

enable_interrupts(global);

Setup_comparator(NC_NC_NC_NC);

Setup_vref(FALSE); //desabilita timer 2

set_timer0(0);

while(1)

{

volta();

}

void testa()

{

if (tempo==10)

{

output_high(PIN_B0);

delay_ms( 2000 );

output_low(PIN_B0);

tempo==0;

}else{

tempo=tempo+1;

delay_ms(1000);

volta();

}

}

void volta()

{

if(input(PIN_A0))

{

testa();

}else{

volta();

}

}

}

Link para o comentário
Compartilhar em outros sites

Deixa eu pensar um pouco...


void main()
{
while(1)
{
if (porta.ra0 == 1)
{
portb.rb0 = 1;

int i = 0;
while (i <= 10)
{
if (porta.ra0 == 0)
{
portb.rb0 = 0;
break;
}
i++;
delay_ms(60); //espera 1 segundo
}
}
}
}

Bom, to com sono, não sei se vaí funcionar, amanhã do uma revisada no código ok.

PS: Você vaí ter que adaptar para usar no CCS ok.

Link para o comentário
Compartilhar em outros sites

Ainda deu erro de compilação, será que digitei algo errado:

while(1)

{

if (input(pin_a0))

{

output_high(pin_b0);

int i = 0

while (i <= 10)

{

if (pin_a0 == 0)

{

pin_b0 = 0;

break;

}

i++;

delay_ms(60); //espera 1 segundo

}

}

}

}

Só uma pergunta, eu posso chamar a rotina Main dentro de outra rotina??? Como escrevi aqui:

void testa()

{

if (tempo==10)

{

output_high(PIN_B0);

delay_ms( 2000 );

output_low(PIN_B0);

tempo==0;

}else{

tempo=tempo+1;

delay_ms(1000);

main();

}

}

Link para o comentário
Compartilhar em outros sites

Só uma pergunta, eu posso chamar a rotina Main dentro de outra rotina??? Como escrevi aqui:

void testa()

{

if (tempo==10)

{

output_high(PIN_B0);

delay_ms( 2000 );

output_low(PIN_B0);

tempo==0;

}else{

tempo=tempo+1;

delay_ms(1000);

main();

}

}

Olá Neto!

Respondendo sua pergunta a função main() não pode ser chamada dentro de outra rotina! A sintaxe de programas em C é +/- assim:

bibliotecas(arquivos e arquivos header)

variáveis globais

funções

função principal (main)

É dentro do main que você faz a chamada de função!

Vou deixar aqui uma outra sugestão de código em C, feito pra rodar no MikroC. Detalhe ainda não testei.

Considerando o LED ligado no PORTB1



int counter, flag;

void interrupt(){
counter++; // Incrementa valor de cnt a cada Interrupção.
if(PORTA.f0 == 0){
flag = 1;
}

TMR0 = 12; // Valor Inicial de TMR0 (256 - 244 = 12).
INTCON = 0b00100000; // Seta T0IE (bit 5) e Limpa T0IF (bit 2).
}// fim interrupt

void Espera(){
counter = 0; //inicia a contagem
while(counter <= 4880){ //10sec
PORTB.f1 = 1; //acende o LED
if(flag == 1){
counter = 4880; //sai do while
}
}
PORTB.f1 = 0; //apaga o LED
flag = 0;
}

void main(){


OPTION_REG = 0b10000010; // Atribui Prescaler de 1:8 ao TMR0.
TMR0 = 12; // Valor Inicial de TMR0 (256 - 244 = 12).
INTCON = 0b10100000; // Habilita Interrupção do TMR0, e seta os
// registros GIE e T0IE.

CMCON = 0x07;
TRISA = 0b10000000; //[0-7] portas como entradas ou saídas 0 saída 1 entrada
TRISB = 0b00000000;

while(1){
if(PORTA.f0 == 1){ //se nivel 1
Espera(); //comecar a contar 10sec
}
else if(PORTA.f0 == 0){ //se nivel 0 volta inicio
PORTB.f1 = 0; //apaga o LED
}

}//fim while

}//fim main

Link para o comentário
Compartilhar em outros sites

Muito obrigado galera, com o código do jorgeletronico mesmo sendo em assembly, consegui captar a lógica e passar para C e funcionou!!!! Aleluiu!!!! ai está o código:

void main()

{

output_low(PIN_B0);

while(input(PIN_A0))

{

if(input(PIN_A0))

if (tempo==5)

{

output_high(PIN_B0);

delay_ms( 2000 );

output_low(PIN_B0);

tempo==0;

}else{

tempo=tempo+1;

delay_ms(1000);

}

}

}

Podem trancar o tópico. Agradeço a todos que me ajudaram!

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!