Ir ao conteúdo
  • Cadastre-se

[DUVIDA] Gerar interrupcao no propeller clock!!?


linikersoares

Posts recomendados

Olá a todos programadores,

tenho realizado um projeto de tcc, estou tendo algumas dificuldades .

Preciso criar um temporizador por timer a executar determinada funcao.

exemplo:

está executando hora();

depois de um tempo

chama funcao

data();

segue o codico

#include <16f627A.h>

#fuses intrc_io, nowdt, noprotect, put, nobrownout, mclr, nolvp, nocpd
#use delay(clock=4000000)
#use fast_io(

#define BOTAO1 PIN_a0 //Boto de escolha de ajuste das funes.
#define BOTAO_INCREMENTO PIN_a1 //Boto incremento de variveis.
#define BOTAO_DECREMENTO PIN_a2
int conta_pulsos=0;
#byte porta = 0x05
#byte portb = 0x06

//Boto de decremento das variveis.
int apagado = 0; //apagado
int a;
int n,i=0,valor;
int h=12;
int m=5;
int s=14;
int dezena, unidade, digito;
int seg=0,q;
int contador=0;
int dia=29; //Variável dos dias do mês. 0 a 31.
int mes=6;
int ano=12;
//Tabela com os digitos
const unsigned char table[11][5] = {
0b01111110,0b01000010,0b01000010,0b01000010,0b01111110,//0
0b00000010,0b00100010,0b01111110,0b00000010,0b00000010,//1
0b01011110,0b01010010,0b01010010,0b01010010,0b01110010,//2
0b01010010,0b01010010,0b01010010,0b01010010,0b01111110,//3
0b01110000,0b00010000,0b00010000,0b00010000,0b01111110,//4
0b01110010,0b01010010,0b01010010,0b01010010,0b01011110,//5
0b01111110,0b01010010,0b01010010,0b01010010,0b01011110,//6
0b01100000,0b01000000,0b01000000,0b01000000,0b01111110,//7
0b01111110,0b01001010,0b01001010,0b01001010,0b01111110,//8
0b01110010,0b01010010,0b01010010,0b01010010,0b01111110,//9
0x00, 0x36, 0x36, 0x00, 0x00, // :

#int_TIMER1
void temp1s(void)
{
q++;
seg++;
if(seg==4){
seg=0;
i++;
}
if(i==4){
i=0;
}
set_timer1 (3036); //Preload do Timer1
}


void caracter(digito) { //chr contem 2 digitos (hh,mm o ss)
dezena = (digito/10); // dezenas
unidade = (digito-(dezena*10)); //e as unidades

for (n=0;n<5;n++) { //preparar a tabela para primeiro digito
output_b(table[dezena][n]);
output_high(pin_b0);
output_high(pin_b7);

delay_us(900) ;//160useg cada pixel horizontal
}
delay_us(700); //pausa entre digitost
output_high(pin_b0);
output_high(pin_b7);
output_b(0x00);
output_high(pin_b0);
output_high(pin_b7);
delay_us(700); //pausa entre digitos*/

for (n=0;n<5;n++) {
output_b(table[unidade][n]);
output_high(pin_b0);
output_high(pin_b7); //unidades
delay_us(700);
output_high(pin_b0);
output_high(pin_b7);
}
delay_us(700); //pausa entre digitos
output_b(0x00);
delay_us(700); //pausa entre digitos*/
output_high(pin_b0);
output_high(pin_b7);
}

void doispontos()

{
for (n=0;n<5;n++) { //preparar tabela para primeiro digito
output_b(table[10][n]);
output_high(pin_b0);
output_high(pin_b7);
delay_us(400); //160useg cada pixel horizontal
}
delay_us(400); //pausa entre digitost
output_b(0x00);
output_high(pin_b0);
output_high(pin_b7);
delay_us(400); //pausa entre digitos*/
}

void barra()

{
for (n=0;n<5;n++) { //preparar tabela para primeiro digito
output_b(table[32][n]);
delay_us(100); //160useg cada pixel horizontal
}
delay_us(600); //pausa entre digitost
output_b(0x00);
delay_us(600); //pausa entre digitos
}




void hora()
{
caracter(h);
doispontos();
caracter(m);
doispontos();
caracter(s);
}

void data()
{
caracter(dia);
barra();
caracter(mes);
barra();
caracter(ano);
}
void main() { //bucle principal
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8); //Configurao do Timer1 para clock interno = 1E6 dividido por 8
set_timer1 (3036);
enable_interrupts(INT_TIMER1); //Habilita interrupo timer1
enable_interrupts(global); //habilita interrupco global
set_tris_b(0);

a=0;

while (1) {

output_high(pin_b0);
output_high(pin_b7);
if (!input(BOTAO1)) //Teste do boton.
{
delay_ms (300); //Para evitar retorno.
if (contador>2) //Se maior q 11, zera o contador.
{
contador=0;
}

contador++; //Incremento da varivel contador.
}

switch (contador) //Depois de incrementada, a varivel CONTADOR
{ //assume um dos casos a seguir:
case 1: //Menu de ajuste da HORA.
{
output_low(pin_b7);

if (!input (BOTAO_INCREMENTO)) //Incrementa a varivel H(hora).
{
delay_ms (300);
h++;

if (h>23) //Se a hora for maior que 23, reset.
{
h=0;
}
}

if (!input (BOTAO_DECREMENTO)) //Decrementa a varivel H(hora).
{
delay_ms (300);
h--;

if (h==255) //H uma varivel inteira de 8 bits.
{ //Quando decrementada para um valor
h=23; //menor que zero, se torna 255. Ou seja,
} //deve voltar para 23.
}

q=0; //Quando se est em algum menu, Q resetada. //Mantenha na tela.

break;
}

case 2: //Menu de ajuste do MINUTO. Idem ao anterior.
{
output_high(pin_b7);
output_low(pin_b7);
output_high(pin_b7);

if (!input (BOTAO_INCREMENTO))
{
delay_ms (300);
m++;

if (m>59) //Diferente aqui.
{
m=0;
}
}

if (!input (BOTAO_DECREMENTO))
{
delay_ms (300);
m--;

if (m==255) //Igual aqui.
{
m=59;
}
}

q=0;

break;
}

default: //Menu principal. Mostra todas as informações.
{
s=q/2; //A variável Q incrementa a 2Hz, então os segundos
//devem ser a metade.
if (s==60) //Se for igual a 60, reset em Q e S. M incrementa.
{
q=0;
s=0;
m++;

}


if (m>59)
{
m=0;
h++;
}

if (h>23) //Se H(horas) for maior q 23, reset. DIA DA SEMANA
{ //e DIA DO MÊS incrementam.


h=0;
}






while(input(pin_a3)) { //so rodoa se pinoa3 =1
delay_ms(10);
output_high(pin_b0);
output_high(pin_b7);
hora();




}
}

}
}
}

ME AJUDEM! <3

Link para o comentário
Compartilhar em outros sites

bom amigo me ajudou um pouco

o ccp nao esta sendo aceito no meu programa

e quando uso nao esta dando certo o timer

olhe a logica que fiz e espero sua ajuda

ps: estou usando esta variavel no mesmo timer1 do programa

#int_timer1
tempo++

while(input(pin_a3)) { //so rodoa se pinoa3 =1


if(tempo>1)
{
hora ();
tempo=0;

}
if (tempo>3)
{
data();

tempo=0;
}
}

Link para o comentário
Compartilhar em outros sites

Ainda não entendi qual o problema que você está enfrentando. Você quer fazer um relógio com data? Isso não tem muito segredo. Basta configurar o timer1 para interromper o programa a cada 10ms e usar uma variável para contar até 100, então você terá 1 segundo. Agora implementar a data é algo mais complicado devido ao nosso calendário precisar de correções (ano bisexto), e é um pouco difícil obter precisão absoluta no software (deve-se contabilizar o tempo de execução da rotina de interrupção.

Eu recomendaria usar o DS1307, facilitaria muito o projeto, livraria o pic da contagem da data e pode ser usado com uma bateria auxiliar para manter a data durante falta de energia.

Link para o comentário
Compartilhar em outros sites

sim creio que seria a melhor opcao sim,porém...

minha pci ja esta pronta, mas no entando conseguir realizar a mudanca das interface

e agora estou querendo usar a instrucao sleep do pic para hibernar meu programa quando eu desligar a energia (colocarei uma bateria ) como seria a logica para isto?

pensei em ativar o Brown-Out quando sair a tensão da fonte entra a bateria e o PIC hiberna

mas nao sei como devo usar o comando sleep ():

me ajudem!!

Link para o comentário
Compartilhar em outros sites

obrigado, creio que ela ira me ajudar

mas pelo que vi esta habilitado a uma interrupcao externa no portB certo?

caso eu queira usar o portA (pic16f627A)

ou a mesma duvida,pelo Brown-Out teria um exemplo na questao de hibernar atraves do (BOR)?

segue o video de como esta ficando meu projeto

disposto a receber criticas e ideias

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