Ir ao conteúdo
  • Cadastre-se

Ajuda com programa em C para pic


neto_e_khelen

Posts recomendados

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

Nunca achei que veria alguém fazendo isso num microcontrolador O.o

Mas entendo o seu ponto Maurício... tudo que vejo pessoal perguntando sobre pics é "como piscar um led" e nada além HAUAHUAHUUAHHUAHU

Mas eu também quero entender o que que o NETO quer...

Link para o comentário
Compartilhar em outros sites

Deixa eu dar mais um pitaco, bom eu sei quando a gente ta começando queremos só ver um led piscando...Mas acho que programas simples como piscar um LED devem ser feitos por nós mesmos, e não pedir o negócio pronto...POr isso que PIC tem má fama de so servir pra acender LED :D

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

Isso doeu na alma, meio sem pé nem cabeça não acham?

E repito, amigo Neto seja mais claro!

abs.

Link para o comentário
Compartilhar em outros sites

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

kkkkkkkkkkkk

Pow! Então... Descobrí mais UMA aplicação para os maravilhosos PIC!!! kkkkkkk

Já são duas!

É nada! Brincadeiras à parte eu sei que a máquina funciona porque eu tenho um capacímetro aqui, feito com PIC, e o cara é extremamente eficiente! Óbvio que esse integrado de 20MHz (!!!) eu só achei na Farnell, né?!? Mas, isso é um mero detalhe. eheheheheeh

O problema dos PICs é que eles são bem complicados de programar, e minha mente não consegue conceber coisas que não sejam múltiplos de 8 bits, saca? Tempo da informática à carvão, tem essas coisas!

Mas eu também quero entender o que que o NETO quer...

Eu entendo o que ele quer, porque é exatamente desse jeito que eu programo meus controladores.

O caso é o seguinte: você tem uma tecla. Se essa tecla se manter pressionada por um X tempo (10 segundos no caso do nosso amigo Neto), você aciona uma coisa qualquer. Se a tecla for solta antes do tempo, nada acontece e o programa volta a funcionar normalmente.

No meu caso, eu uso esse método pro cara entrar no modo de programação do controlador. Se o cara pressionar a tecla por 5 segundos, o controlador entra no modo de programação. Se o cara soltar a tecla antes, o programa do controlador segue normalmente.

Como eu faço isso?

Simples! Quando o cara pressiona a tecla, eu aciono um flag que faz um contador contar, dentro do TIMER do meu controlador.

Se dentro do timer, atingiu o tempo, o timer me sinaliza um outro flag, de estouro do tempo. Com esse flag de estouro, eu dou sequencia no programa, ok?

O que precisa ser feito pra isso? Basta programar o timer pra gerar uma interrupção em um tempo determinado, e dentro dessa interrupção, fazer uma variável ser incrementada até atingir o tempo desejado. O problema é que eu não sei programar PICs, logo, não sei como se programa o timer do maldito pra contar esse tempo. É só isso que é preciso fazer! Programar o timer do PIC pra gerar interrupção em um tempo programado. Pode ser 1ms, 10ms, 50ms, 100ms, tanto faz, desde que ele gere uma interrupção nesse tempo, depois disso, aí é que entra a lógica. É extremamente simples, mas, pra quem sabe fazer, óbvio.

Então, a pergunta era: Como programar e configurar o timer do PIC pra gerar interrupção em um tempo pré-definido?

Só isso!

Se fosse pro 51, ou pro AVR, a solução tava na mão, mas... Já viu, né? :D:lol:

Se bem que o dono do tópico ainda não se manifestou, tb!

[]'s

ah! Pra quem não sabe o que é POG, POG quer dizer: PROGRAMAÇÃO ORIENTADA À GAMBIARRAS!

[]'s de novo!

Link para o comentário
Compartilhar em outros sites

Não, debounce tem uma filosofia diferente, que é evitar que o botão "repique", se me recordo do nome disso seria então um botão com retardo de ação.

Alias, pics usam multiplos de 8 sim, o difícil de programar nele são as fuses e um ou outro registro mau explicado, porém de resto ele é jóinha, alias mauricio, lembrei de uma coisa que eu quero ajuda! Quero aprender a programar AVR!!!

Link para o comentário
Compartilhar em outros sites

Eu sei Lucas, mas veja o que ele pede é um procedimento identico a um debounce por software porém com um tempo mais prolongado....:D

nesse caso ele vai usar para realizar uma tarefa. também não acho que seja uma botão com retardo, pois se pensarmos em comandos eletricos um botão com retardo seria do tipo você aperta e ele vai dar um tempo antes de executar a ação idependente do tempo que ficou pressionado, nesse caso se você solta lo antes do tempo, ele cancela a ação!

não acho que PIC tenha segredo em se programar, pois são 35 instruções (se voce estiver no assembly) pouca coisa pra decorar, aqui vai depender da capacidade do porgramador em bolar uma lógica mais complexa com essas 35.

C eu não considero pois é uma linguagem de grande portabilidade ( funciona no PIC tambem funciona no AVR com as devidas modificações).

Usava meus fontes e C pra pic para realizar tarefas em um RS08 da freescale!

abs.

Link para o comentário
Compartilhar em outros sites

Vou postar um genérico aqui, pra vocês terem uma ideia.

Nesse programa, não tem nenhuma configuração da máquina. É preciso adaptar isso.



#define pino_entrada pinoX
#define pino_saida portY

bit flag_contar_10_segundos = 0;
bit flag_estouro_10_segundos = 0;
bit flag_varrer_teclado = 0;


/******************************************
/*** INTERRUPÇÕES DE TIMER A CADA 10ms
/*****************************************/
void trata_interrupt_de_timerX ( void ) interrupt
{
static unsigned int conta_tempo =0;
static unsigned char contador_teclado = 0;

if ( flag_contar_10_segundos )
{
if ( ++conta_tempo == 1000 )
{
conta_tempo = 0;
flag_estouro_10_segundos = 1;
}
}
else
{
conta_tempo = 0;
}

if ( ++contador_teclado == 10 ) // varredura de teclado a cada 100ms
{
contador_teclado = 0;
flag_varrer_teclado = 1;
}
}

void fazer_alguma_coisa ( void )
{
pino_saida = 1;
flag_estouro_10_segundos = 0;
}

void varrer_teclado ( void )
{
if ( pino_entrada == 1 ) // depende da configuração do hardware; 1 ou 0
{
flag_contar_10_segundos = 1;
while ( pino_entrada && !flag_estouro_10_segundos ); // fica aqui, enquanto não soltar a tecla OU não estourar o tempo
if ( flag_estouro_10_segundos )
{
fazer_alguma_coisa ( );
}

flag_contar_10_segundos = 0;
flag_varrer_teclado = 0;
}
}

void main ( void )
{
while ( 1 )
{
if ( flag_varrer_teclado ) varrer_teclado ( );
}
}
#include <seu_modelo_de_MCU.h>

...alias mauricio, lembrei de uma coisa que eu quero ajuda! Quero aprender a programar AVR!!!

Eu não conheço o AVR tão a fundo assim, mas, o que eu puder ajudar, pode contar.

soschip tb programa a linha, e deve ter mais gente que tb programa e pode dar uma força. Precisando, tamos aí! Vais aprender a programar a máquina RISC mais besta que você já viu! eheheheheheeh

AVRs são FANTÁSTICOS!!!

[]'s

Link para o comentário
Compartilhar em outros sites

Ae kros colegas.so porque programam outros tipos de microcontroladores nao tem q ficarem debochando do pic.to aprendendo pic e nao achei a atitude muito bacana nao,deveriam encentivar a programaçao seja la o micro,pois com pic ou com outro se faz muitas coisas ,nao e so acender um simples led ou leds para arvore de natal.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Vamos tentar ajudar em BASICo (Basic brasileiro) kkkkk

Se não quer programar timer para interrupção:

inicio: contador = 0

delay: delay 100 milissegundos

se tecla solta, volta para inicio

se tecla pressionada, contador=contador+1

se contador = 200 então vai para acionar saída

volta para delay

aciona saída:

isso em basic (bascom avr) ficaria:

tecla alias pinx.x 'define pino x.x como tecla

inicio:

contador=0

reset saida ' (ou saida=0)

delay_100:

waitms 100

if tecla = 1 then goto inicio 'considerando que tecla em ON ao GND e com pull-up

incr contador ' se tecla pressionada, incrementa (o mesmo que contador=contador+1)

if contador = 200 then goto aciona_saida ' 200 x 100mS = 20S

goto delay_100

aciona_saida:

saída=1 ' (ou set saída)

'

Daí pra passar para C acho que não é difícil....

Link para o comentário
Compartilhar em outros sites

Vamos tentar ajudar em BASICo (Basic brasileiro) kkkkk

Se não quer programar timer para interrupção:

inicio: contador = 0

delay: delay 100 milissegundos

se tecla solta, volta para inicio

se tecla pressionada, contador=contador+1

se contador = 200 então vai para acionar saída

volta para delay

aciona saída:

isso em basic (bascom avr) ficaria:

tecla alias pinx.x 'define pino x.x como tecla

inicio:

contador=0

reset saida ' (ou saida=0)

delay_100:

waitms 100

if tecla = 1 then goto inicio 'considerando que tecla em ON ao GND e com pull-up

incr contador ' se tecla pressionada, incrementa (o mesmo que contador=contador+1)

if contador = 200 then goto aciona_saida ' 200 x 100mS = 20S

goto delay_100

aciona_saida:

saída=1 ' (ou set saída)

'

Daí pra passar para C acho que não é difícil....

Basic brasileiro essa é otima hein kkkkk!

mas brincadeiras a parte o problema do nosso amigo Neto, é que ele quer o código em C pronto e não nos especificou o que ele sabe, ja foram passada a logica pra ele fazer umas duas vezes no mesmo tópico! Assim fica difícil de ajudar!

alem do mais ele não se manifesstou até agora!

vamos aguardar então o comentario do colega...

abraço a todos!

Link para o comentário
Compartilhar em outros sites

Use o ldmicro muito bom depois compare em c .

http://eletricistabelohorizonte.com....TROLADORES.htm

Vamos com calma, eu conheço ldmicro, ele serve pra você programar o PIC como se fosse um CLP ou seja em linguagem ladder.

apesar de ser muito mais fácil que programar em C, o tamanho do código fica muito grande, além de ser limitado e não suportar muitos modelos da familia PIC, ele é vantajoso onde o PIC funcione como o bloco lógico de controle de um CLP, caso contrario não compensa.

vamos ver se é isso que voce quer:


#include 16f268a.h
#fuses NOMCLR, NOWDT, INTRC_IO
#use delay(clock = 4000000)

Void main ()
{

while (true)
{
if (pin_a0 == 1)
{
delay_ms(100);
if (pin_a0 == 1)
{
output_high(pin_b0);
}
else
{
output_high (pin_b1);
}
}
}
}

não sei se é isso!

abs.

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

Ae galera, estava sem net mas consegui postar aqui o código que escrevi mas não funciona:

#include<16f628A.h>   // modelo do microcontrolador
#fuses HS,NOLVP,NOWDT,NOBROWNOUT,NOPUT,NOPROTECT,NOCPD //configura fusiveis da MCU
#bit t0if=0x0b.2
#use delay (clock=4000000)

void main()
{
signed long tempo=0;

// configura portas analogicas CAD
setup_comparator(nc_nc_nc_nc);
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)
{
output_low(pin_b5);
while(input(pin_b4))
{
tempo=0;
if(tempo<=1999)
{
tempo++;
}
if(tempo>=2000)
{
tempo=0;
output_high(pin_b5);
delay_ms(2000);
}
}
}
}

Não sei o porque, por favor me ajudem!!!

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!