Ir ao conteúdo
  • Cadastre-se

Programa com leds em C


MClane

Posts recomendados

Boa noite pessoal preciso de uma mão.

Alguns dias atrás pedi ajuda de um programa em assembly para microcontroladores.

Agora preciso fazer o mesmo programa, só que em C.

Abaixo segue o enunciado e logo após minha tentativa.

Estou usando o HIGH TECH COMPILER.


Considerando o microcontrolador PIC16F690 e três botões do tipo “push button”, faça um fluxograma e o respectivo programa em Assembly, de modo que ao pressionar-se o botão 1 conectado no pino RA0 pela primeira vez liga o led 1 conectado no pino RB4 como pisca-pisca a uma frequência de 1Hz durante 8s. Se durante este tempo houver novo pressionamento do botão 1 desliga o led 1 e o processo finaliza. O botão 2, conectado no pino RA2, ao ser pressionado liga o led 2 conectado no pino RB5. Um novo pressionamento neste botão desligará o led 2. O botão 3 resseta o sistema em caso de travamento deste.

Obs.: 1) A frequência do oscilador é de 4MHz, obtida a partir do oscilador interno do microcontrolador;

2) A detecção do pressionamento dos botões deverá ser executada através de interrupção por mudança de nível no botão 1 e interrupção externa no botão 2.

Estando ambos leds desligados, ao pressionar-se o botão 1 muda o estado do led, o mesmio devendo ocorrer com o botão 2 em relação ao led 2
F OSC= 4 MHZ(ocsilador interno).

Tentativa



#include <htc.h>

__CONFIG (WDTE_OFF & PWRTE_ON & MCLRE_ON & FOSC_INTRCIO);

#ifndef _XTAL_FREQ
#define _XTAL_FREQ (4000000)
#endif

unsigned char FLAGS=0;

#define BOTAO1 RA0
#define BOTAO2 RA2
#define LED1 RB4
#define LED2 RB5
#define nop asm("nop")
#define FLAGPISCA FLAGS,0 //DECLARA FLAG_PISCA COMO BTI ZERO DO REGISTRADOR FLAGS

unsigned char CONT=0;
//bit flag_pisca=0; //declara flag_pisca com comprimento de 1 bit

void setaflagpisca(void); //e inicializa-a com valor 0
void piscapisca(void);
void zeraled1(void);

void interrupcoes(void)

{
if(RABIF && RABIE==1) //bits sinalizador e habilitador da interrupcao de mudança de nível.
{
IOCA0=0;
PORTA=PORTA;
RABIF=0;
if(FLAGPISCA==0) //PRESTE ATENÇÃO!!! INVERTE O ESTADO DO LED
{
setaflagpisca();
}

return;
}
if(INTF==1 && INTE==1)
{

INTE=0;
INTF=0;
if(LED2==1)
{
LED2=0;

}
else if(LED2==0)
{
LED2=1;

}
}

}

void main(void)
{
ANSEL=0;
ANSELH=0;
TRISA=0B00001101;
TRISB=0;
TRISC=0;
PORTB=0;
INTCON=0B10011000;
IOCA0=1;
nRABPU=0; //HABILITA PULL-UPS INTERNOS
//OPTION_REG=0B00111111;
CONT=0;
/*DORMIR:
SLEEP();
nop;

__delay_ms(100);
IOCA0=1;
INTF=0;
INTE=1;
goto DORMIR;
*/

piscapisca();

}

void piscapisca()
{
if(FLAGPISCA==1)
{
if(LED1==1)
{
for(CONT=0;CONT<=7;CONT++)
LED1=0;
__delay_ms(500);
LED1=1;
__delay_ms(500);

}


if(LED1==0)
{
for(CONT=0;CONT<7;CONT++)
LED1=1;
__delay_ms(500);
LED1=0;
__delay_ms(500);
}

zeraled1();
}

//LEMBRAR DE LIMPAR A FLAG de pisca
return;

}

void setaflagpisca()
{

FLAGPISCA=1;


}

void zeraled1()
{
LED1=0;
return;
}

Compilo o código mas aparece um erro não sei por que.

Link para o comentário
Compartilhar em outros sites

#define FLAGPISCA FLAGS,0 /

Cara, desconheço essa sintaxe, creio que um erro possa estar ai. E também a função de interrupções deve seguir a sintaxe:

void interrupt nome(void)

{

}

Não verifiquei a lógica, mas vi no main que estás usando delays para fazer o timing dos LEDs, com isso quando um led piscar o outro certamente vai ficar travado. O ideal seria utilizares timers para essa função, mas não sei até onde teu professor exige no código. Também não vi nenhum tratamento de debounce nas interrupções, para fazer isso também seria necessário timers ou delays, ou algum filtro no hardware, novamente não sei até que ponto teu professor exige.

Espero ter ajudado apesar do pouco tempo, quando puder vou dar uma nova olhada aqui. E não esqueça de postar o erro do compilador, fica mais fácil de analisar o problema.

Link para o comentário
Compartilhar em outros sites

Hoje começamos a ter interrupção de TIMER O. Obrigado pela ajuda Edu, percebi que citou a palavra DEBOUNCE. O que seria isso?

Muito obrigado mesmo Edu. Faz tempo que postei o código ainda não havia recebido ajuda, muito também por que o High Tech não é muito divulgado, acredito. O meu professor deu outro exercício agora com Timer 0 tentarei faze-lo.

Caso não consiga abrirei outro tópico.

Mias uma vez obrigado.

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!