Ir ao conteúdo
  • Cadastre-se

Botoes com 16F628A


CIS

Posts recomendados

CIS, tente o código abaixo para o timer 1.

Observo que efetuei os testes no proteus e funcionou perfeitamente.

Caso seja na prática, use um cristal de 4mhz, não esqueça o mclr.


// Sem MCLR
// PIC16F628A

void interrupt()
{

// Timer1 ... Frequencia = 2.00 Hz
if (PIR1.TMR1IF == 1) // testa a flag do timer 1.
{
PORTB.F1 = ~PORTB.F1; // Muda o estado do bit 1 no portb (RB1)
PIR1.TMR1IF = 0; // limpa a flag da interrupção pelo timer1
PIE1.TMR1IE = 1; // reabilita a interrupção pelo timer1
TMR1H = 11; // preload para o MSB do timer1
TMR1L = 71; // preload para o LSB do timer1
}

}

void main()
{

TRISB = 0x00; // PORTB = Saidas
PORTB = 0; // Desliga todos os bits do portB

// Configuração do Timer1
T1CON.T1CKPS1 = 1; // Veja no datasheet para que serve cada bit
T1CON.T1CKPS0 = 1;
T1CON.T1OSCEN = 1;
T1CON.TMR1CS = 0;
T1CON.TMR1ON = 1;
TMR1H = 11;
TMR1L = 71;


// Registradores das Interrupções:
INTCON = 0; // Limpa o Intcon
INTCON.TMR0IE = 0; // Deslifa o Timer0
PIR1.TMR1IF = 0; // Limpa a flag do timer1
PIE1.TMR1IE = 1; // Habilita a interrupção pelo timer1
INTCON.TMR0IF = 0; // Limpa a flag do timer0
INTCON.GIE = 1; // Habilita as interrupções globais
INTCON.PEIE = 1; // Habilita as interrupções perifericas


while(1) // Laço infinito
{
// Seu código aqui.
// A cada 1 segundo o led inverte o estado 2x.
// ou seja um estouro do timer1 a cada 500ms.
}

}
// Cristal 4Mhz

... como criar um interrupção de timer0 no mickroC pro PIC16F628A???

Segue o exemplo do código para o timer0 (apenas simulado).

Na prática use cristal de 4Mhz e não esqueça o mclr.


// Sem MCLR
// PIC16F628A

unsigned short aux = 0; // variavel auxiliar.

void interrupt()
{
// Interrupção ... Timer0 ... Freq = 21Hz
if (INTCON.T0IF ==1) // Flag sinalizadora do timer0
{
aux++; // Cada 21 estouros temos aproximadamente 1hz no pino RB0.
if (aux == 21){
PORTB.F0 = ~PORTB.F0; // Altera o estado do bit 0 no portB (RB0)
aux = 0;
}
INTCON.T0IF = 0; // Limpa a flag do timer0
INTCON.T0IE = 1; // reabilita a interrupção
TMR0 = 72; // preload do timer0
}

}

void main()
{

TRISB = 0x00; // PORTB = Saidas.
PORTB = 0; // Saídas desligadas inicialmente.

// Registradores do Timer0:
OPTION_REG.T0CS = 0;
OPTION_REG.T0SE = 0;
OPTION_REG.PSA = 0;
OPTION_REG.PS2 = 1;
OPTION_REG.PS1 = 1;
OPTION_REG.PS0 = 1;
TMR0 = 72;


// Registradores das Interrupções.
INTCON = 0; // Limpa o Intcon.
INTCON.T0IE = 1; // Habilita o timer0.
INTCON.T0IF = 0; // Limpa a flag do timer0.
INTCON.GIE = 1; // Habilita as interrupções globais.


while(1) // Loop Infinito.
{
// seu código vai aqui.
}

}
// Cristal 4Mhz

Link para o comentário
Compartilhar em outros sites

pronto.O TIMER1 ta resolvido!!!!

shunt, eu so não entendi porque os bits 6 e 7 do port b não estão funcionando como deveria, mas deve ser problema de hardware, porque tudo mais funcionou beleza...

depois vou ver o hardware "ACE PIC 18" com mais calma e observar bem...

valeu as dicas... proximo passo :"COMPARADORES".... tambem vou precisar de ajuda kkkkk

Link para o comentário
Compartilhar em outros sites

... eu so não entendi porque os bits 6 e 7 do port b não estão funcionando como deveria ...

Seria necessário analisar o código que você desenvolveu partindo da rotina que postei anteriormente, pois esta atua somente no bit 1 do portB (RB1).

Na rotina da interrupção, onde estiver:

"portB.f1", troque por "portb";

Inicie o portb com valor 255 logo após a linha trisB;

Recompile e veja como fica.

Abç.

Link para o comentário
Compartilhar em outros sites

Seria necessário analisar o código que você desenvolveu partindo da rotina que postei anteriormente, pois esta atua somente no bit 1 do portB (RB1).

Na rotina da interrupção, onde estiver:

"portB.f1", troque por "portb";

Inicie o portb com valor 255 logo após a linha trisB;

Recompile e veja como fica.

Abç.

usei basicamente o mesmo codigo...na rotina de interrupção eu usei, ao invés de "portb.f1 = 1" eu coloquei "portb = ~portb".

mas ta beleza, vou analisando e aprendendo mais a cada dia...

to querendo começar os comparadores, se tiver alguma dica boa ai...

valeu

abraços

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

pessoal, queria uma ideia do que o comparador faz ou um exemplo de onde ele pode ser usado... ele deve ser levado ao "pe da letra" mesmo, tipo ele apenas compara duas tensoes ?? em um programa ficaria mais ou menos assim, se a tensão em 1 for maios que em 2, faz isso.... senão faz aquilo.... e assim que funciona???

e em questão de hardware, como fazer pra ter uma tensão que não ira queimar o PIC ??

sera que usando apenas resistores??

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

achados da net que estão me ajudando a entender os comparadores...

caso algum iniciante esteja precisando...

http://www.newtoncbraga.com.br/index.php/artigos/49-curiosidades/890-conheca-os-comparadores-de-janela-art125.html

http://www2.eletronica.org/apostilas-e-ebooks/componentes/AOP.pdf

alguem com tempo pra me explicar a conversão de temperatura , usando como sensor um NTC, ligado ao LM741 e como colocar tudo no LCD16x2, com o PIC16F628A...

programo no mickroC

#define comparador1 porta.f1

#define comparador2 porta.f2

#define led portb.f0

void main() {

trisa = 0b00000110;

trisb = 0b00000000;

porta = 0b00000000;

led = 0b00000000;

CMCON = 0b00000100;

while(1) {

if(comparador1 > comparador2 ) {

led = ~led ;

}

}

}

alguem me da uma dica, por favor... tentei isso aqui com os comparadores, mas não deu nada.

Link para o comentário
Compartilhar em outros sites

Pessoal, estou precisando da ajuda de vocês mais uma vez, seguinte, to tentando elaborar um temporizador, que inicie ligado por 5 segundos,em seguia desliga, fica por dua horas desligado, em seguida liga por 5 segundos de novo, e desliga, fazendo infinitamente este ciclo, to usando o PIC 12F675 , e tentei um teste com esse codigo aqui, pra ver se funcionaria o timer1, mas não executa como deveria...alguem pra me dar uma ajuda por favor...

#define led GPIO.F0

int contador = 0;

void interrupt() {

if(PIR1.TMR1IF == 1) {

contador = contador + 1;

if (contador == 2) {

led = !led ;

contador = 0;

}

PIR1.TMR1IF = 0;

PIE1.TMR1IE = 1;

TMR1H = 30;

TMR1L = 36;

}

}

void main() {

TRISIO = 0x00;

GPIO = 0;

T1CON.TMR1GE = 0;

T1CON.T1CKPS1 = 1;

T1CON.T1CKPS0 = 1;

T1CON.T1OSCEN = 1;

T1CON.TMR1CS = 0;

T1CON.TMR1ON = 1;

TMR1L = 30;

TMR1H = 36;

INTCON = 0;

INTCON.TMR0IE = 0;

PIR1.TMR1IF = 0;

PIE1.TMR1IE = 1 ;

INTCON.TMR0IF = 0;

INTCON.GIE = 1;

INTCON.PEIE = 1;

while(1) {

}

}

To usando o cristal interno (4MHz) e toda a configuração esta correta... neste codigo, ele esta apenas aguardando o incremento da variavel (1 segundo ), acende o led a não apaga mais...

Preciso de ajuda!!!

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