Ir ao conteúdo

Ajuda com programa em C para pic


neto_e_khelen

Posts recomendados

Postado

Ae galera, sou iniciante ainda no mundo dos pics e estou tentando fazer um programa que leia um port e caso ele esteja em estado 1 por 10 segundos setar outro por para 1. Entenderam? O que quero montar é um testador de mal contatos para cabos.

Ae galera, sou iniciante ainda no mundo dos pics e estou tentando fazer um programa que leia um port e caso ele esteja em estado 1 por 10 segundos setar outro por para 1. Entenderam? O que quero montar é um testador de mal contatos para cabos.

Ninguem??? eu coisa rápida

Postado

Ok, mas acho que você nao entendeu (ou eu nao soube explicar bem....) eu quere que caso sete 1 em porta.0 por 10 segundos seguidos ai sim setar 1 em portb.0 .

Se o cara setar 1 em porta.0 apenas 8 segundos e não ira setar 1 em portb.0 , entendeu?

Postado

Primeiro você tem que saber o que você quer fazer e descobrir o que é que você precisa

O seu sistema vai usar teclado numerico? será ligado no pc para fazer essa setagem toda? quanto tempo deve ficar ligado o pino? etc etc etc...

Eu mesmo não to entendendo praticamente NADA do que você está querendo.

Postado

Eu não conheço PICs, então, vou te dar a lógica.

O negócio é você fazer seu programa monitorar a entrada. Se uma tecla for pressionada, seu programa deve disparar um timer. O tempo desse timer, obviamente, é você quem programa.

Duas variáveis controlam o laço. O apertar do botão, e o estouro do timer.

ENQUANTO a tecla estiver pressionada, e ENQUANTO o timer não estourar, fica.

Se a tecla for solta antes do estouro, paralisa e zera o timer e volta a varrer a tecla novamente.

Se o timer estourar enquanto a tecla estiver apertada, então, segue o processamento.

O código é este:

while (TECLA_PRESSIONADA & !FLAG_TIMER_ESTOURO);
if ( FLAG_TIMER_ESTOURO )
{
fazer_algo ( ); // se o timer estourou, faça alguma coisa
}
else
{
fazer_outro_algo ( ); // se a tecla foi solta antes do timer estourar, faça outro alguma coisa
}

Simples desse jeito.

Espero que ajude.

[]'s

Postado
mas só o delay_ns(10000); não funciona? (desculpe a ignorância é que eu tenho que aprender o máximo de pics, porque to pretendendo programar neles)
Até funciona , mas ele necessita de uma interrupção que só pode ser usado com o Timer interno!

abs.

Postado

se analisar ,poderá fazer sem timer mesmo ou seja um exemplo

TRISA = 0

TRISB = 1

PORTA = 0

PORTB = 1

repete:

If PORTB.0 = 1 Then

WaitMs 10000

If PORTB.0 = 1 Then

PORTA.0 = 1

Else

PORTA.0 = 0

Endif

Endif

Goto repete

End

obs: testei e funcionou

Postado

Pra funcionar direito, tem que ser feito com o uso de Timer.

Timer, e interrupção de timer. Programada no tempo que você precisa.

Delay não funciona! A máquina fica amarrada no delay, por isso que precisa ser por timer.

Quem pode ajudar o colega a programar o timer do PIC em C, pra gerar uma interrupção a cada 10ms depois que ele foi disparado?

Eu não conheço o PIC. Se fosse pro AVR...

A lógica é fazer um timer gerar uma interrupção a cada 10ms.

Dentro da interrupção, você tem um flag que faz o contador contar uma variável que será incrementada mil vezes (10 segundos).

Quando atingir esse valor, sinaliza o flag de 10 segundos.

Dentro da interrupção, pode usar esse código:


bit CONTAR_10S = 0;
bit FLAG_10S = 0;

void interrupt_timerX ( void )
{
static unsigned int conta_10segundos = 0;

TIMERX = n; // recarga do timer; n = valor de carga do timer

if ( CONTAR_10S == 1 ) // conta se o temporizador for habilitado a contar; acionamento externo
{
if ( conta_10segundos++ == 1000 )
{
conta_10segundos = 0;
FLAG_10S = 1;
}
}
else
{
conta_segundos = 0; // zera a variável de contagem dos 10 segundos
}
}
// bit global

É só um exemplo. Espero que ajude.

[]'s

Postado

Martins_eng, eu acho que nesse seu código o que vou conseguir e fazer ficar "piscando" o led, e não é isso que eu quero. Quero que caso o botao fique pressionado por 10 segundo o led se acenda. Se ele for pressionado por 8 segundos e interrompido ele não irá acender, entendeu??

jorgeletronico se me enviar o hex eu agradeço pois já posso simular o circuito no Proteus, mas precisava mesmo é do código em C para que possa estuda-lo e entender para criar os meus próprios depois.. alguem consegue??

Postado

Cara desculpe esta errado o codigo acima veja este eu simulei no proteus e o led so acende se o B0 for a nivel zero por mais tempo que o programada e quando o B0 voltar a 1 o led apaga

#include<16f876.h>	// modelo do microcontrolador
#use delay(clock=4000000) //configura clock para 4Mhz
#fuses HS,NOLVP,NOWDT,NOBROWNOUT,NOPUT,NODEBUG,NOPROTECT,NOWRT,NOCPD //configura fusiveis da MCU

void main()
{
set_tris_b(0b00000001);
port_b_pullups(1); // habilita pullups interno do portB
set_tris_c(0b00000000); //habilita todos os pinos como saida
// configura portas analogicas CAD
setup_adc_ports(no_analogs);
//configuração dos timers
setup_timer_1(T1_disabled); //desabilita timer 1
disable_interrupts(int_timer0); //desablita interrupção do timer 0
disable_interrupts(int_rtcc);
disable_interrupts(global); //desablita todas as interrupção
disable_interrupts(int_timer1); //desabilita timer 1
disable_interrupts(int_timer2); //desabilita timer 2
while(1)
{
while(!input(pin_b0))
{
delay_ms(900);
delay_ms(900);
output_high(pin_b1);
}
output_low(pin_b1);
}
}

o codigo hex e este basta copilar e colar em bloco de notas com a extensão .hex e rodar no proteus.

:1000000000308A0019280000223084008313000881
:10001000031918280130F800F701F70B0D28F80B29
:100020000C284A30F700F70B13281628800B0A28F3
:100030000034840183131F30830583161F149F141B
:100040001F159F11FF308312A00001308316860018
:100050008113003087008312A00083161F149F14A1
:100060001F159F11831290018B128B120B138B1390
:100070008B1B372883160C108C100614831206185D
:1000800056280430A100E130A2000420A10B43282F
:100090000430A100E130A2000420A10B4A288316FD
:1000A00086108312861483163D28831283168610C9
:0A00B0008312861083163D286300BA
:02400E003A3F37
:00000001FF
;PIC16F876

Postado

Rapaz! estou de cara com esse tópico!!!

A programação eficiente dos timers, é a segunda coisa que se deve aprender pra programar MCUs de forma correta!

Tudo na vida é tempo! E em máquinas, são no mínimo, o mínimo!

Se eu fosse o autor, mudaria o título do tópico para: POG. Como estragar um programa da forma mais eficiente possível!

I-M-P-R-E-S-S-I-O-N-A-N-T-E!!!

Em um outro fórum, um cara falou que PICs só servem mesmo pra piscar LEDs. Pra variar, todo mundo caiu de pau em cima do cara... E pra falar a verdade, eu acho que o cara não tava errado!

[]'s

Postado

Salve amigo Mauricio :D

poxa PICs não servem so pra piscar leds, ele também serve para fazer pisca pisca de arvore de natal :D

mas brincadeiras a parte, desculpe me a ignorância mas ainda nao entendi o que o nosso amigo neto quer...

abs.

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!