Ir ao conteúdo
  • Cadastre-se

PIC programando no pic18f4550 - timer


Posts recomendados

Então pessoal, fiz uma postagem ontem sobre um exercício de um código de PIC18F4550, que necessitava utilizar botões e um tempo específico, criei um código e agora necessito encaixar um TMR0 no lugar dos delays, alguém sabe como fazer isso??

Valeu!!!
Código:

// PIC18F4550 Configuration Bit Settings

 

#define _XTAL_FREQ 20000000UL
#include <p18f4550.h>
#include <xc.h>

bit b_right, b_left, b_up, b_down, b_emerg = 0;
int x = 0;
void lcd_ini();
void lcd_cmd(char cmd);
void lcd_envia_byte(char nivel, char dado);

 

void main(void) {
    ADCON1 = 0x0f;
    lcd_ini();
    lcd_envia_byte(0, 0x84);
    lcd_envia_byte(1, 'E');
    lcd_envia_byte(1, 'Q');
    lcd_envia_byte(1, 'U');
    lcd_envia_byte(1, 'I');
    lcd_envia_byte(1, 'P');
    lcd_envia_byte(1, 'E');
    lcd_envia_byte(1, ' ');
    lcd_envia_byte(1, 'A');
    lcd_envia_byte(0, 0xC4);
    lcd_envia_byte(1, 'M');
    lcd_envia_byte(1, 'C');
    lcd_envia_byte(1, 'A');
    lcd_envia_byte(1, ' ');
    lcd_envia_byte(1, '3');
    __delay_ms(5000);
    while (1) {
        b_right = TRISBbits.RB0; // b0
        b_left = TRISBbits.RB1; //  b1
        b_up = TRISBbits.RB2; //   b2
        b_down = TRISBbits.RB3; //  b3
        b_emerg = TRISBbits.RB4; // b4
inicio:
        lcd_envia_byte(0, 0x80);
        lcd_envia_byte(1, 'M');
        lcd_envia_byte(1, 'O');
        lcd_envia_byte(1, 'T');
        lcd_envia_byte(1, 'O');
        lcd_envia_byte(1, 'R');
        lcd_envia_byte(1, 'E');
        lcd_envia_byte(1, 'S');
        lcd_envia_byte(1, ' ');
        lcd_envia_byte(1, 'D');
        lcd_envia_byte(1, 'E');
        lcd_envia_byte(1, 'S');
        lcd_envia_byte(1, 'L');
        lcd_envia_byte(1, 'I');
        lcd_envia_byte(1, 'G');
        lcd_envia_byte(1, ' ');
        lcd_envia_byte(1, ':');
        lcd_envia_byte(0, 0xC0);
        lcd_envia_byte(1, 'A');
        lcd_envia_byte(1, 'G');
        lcd_envia_byte(1, 'U');
        lcd_envia_byte(1, 'A');
        lcd_envia_byte(1, 'R');
        lcd_envia_byte(1, 'D');
        lcd_envia_byte(1, 'A');
        lcd_envia_byte(1, 'N');
        lcd_envia_byte(1, 'D');
        lcd_envia_byte(1, 'O');
        lcd_envia_byte(1, ' ');
        lcd_envia_byte(1, 'I');
        lcd_envia_byte(1, 'N');
        lcd_envia_byte(1, 'S');
        lcd_envia_byte(1, 'T');
        lcd_envia_byte(1, ':');

        if (b_right == 1 && b_emerg == 0) {
             PORTBbits.RB6 = 1;
            __delay_ms(8000);
            PORTBbits.RB6 = 0;
            lcd_envia_byte(0, 0x80);
            lcd_envia_byte(1, 'M');
            lcd_envia_byte(1, 'O');
            lcd_envia_byte(1, 'T');
            lcd_envia_byte(1, 'O');
            lcd_envia_byte(1, 'R');
            lcd_envia_byte(1, ' ');
            lcd_envia_byte(1, ' ');
            lcd_envia_byte(1, 'L');
            lcd_envia_byte(1, 'I');
            lcd_envia_byte(1, 'G');
            lcd_envia_byte(1, 'A');
            lcd_envia_byte(1, 'D');
            lcd_envia_byte(1, 'O');
            lcd_envia_byte(1, ' ');
            lcd_envia_byte(1, ':');
            lcd_envia_byte(1, ' ');
            lcd_envia_byte(0, 0xC0);
            lcd_envia_byte(1, 'D');
            lcd_envia_byte(1, 'I');
            lcd_envia_byte(1, 'R');
            lcd_envia_byte(1, 'E');
            lcd_envia_byte(1, 'C');
            lcd_envia_byte(1, 'A');
            lcd_envia_byte(1, 'O');
            lcd_envia_byte(1, ' ');
            lcd_envia_byte(1, ' ');
            lcd_envia_byte(1, 'D');
            lcd_envia_byte(1, 'I');
            lcd_envia_byte(1, 'R');
            lcd_envia_byte(1, 'E');
            lcd_envia_byte(1, 'I');
            lcd_envia_byte(1, 'T');
            lcd_envia_byte(1, 'A');
           
        }
        if (b_left == 1 && b_emerg == 0) {
            PORTBbits.RB6 = 1;
            __delay_ms(8000);
            PORTBbits.RB6 = 0;
            lcd_envia_byte(0, 0x80);
            lcd_envia_byte(1, 'M');
            lcd_envia_byte(1, 'O');
            lcd_envia_byte(1, 'T');
            lcd_envia_byte(1, 'O');
            lcd_envia_byte(1, 'R');
            lcd_envia_byte(1, ' ');
            lcd_envia_byte(1, ' ');
            lcd_envia_byte(1, 'L');
            lcd_envia_byte(1, 'I');
            lcd_envia_byte(1, 'G');
            lcd_envia_byte(1, 'A');
            lcd_envia_byte(1, 'D');
            lcd_envia_byte(1, 'O');
            lcd_envia_byte(1, ' ');
            lcd_envia_byte(1, ':');
            lcd_envia_byte(1, ' ');
            lcd_envia_byte(0, 0xC0);
            lcd_envia_byte(1, 'D');
            lcd_envia_byte(1, 'I');
            lcd_envia_byte(1, 'R');
            lcd_envia_byte(1, 'E');
            lcd_envia_byte(1, 'C');
            lcd_envia_byte(1, 'A');
            lcd_envia_byte(1, 'O');
            lcd_envia_byte(1, ' ');
            lcd_envia_byte(1, 'E');
            lcd_envia_byte(1, 'S');
            lcd_envia_byte(1, 'Q');
            lcd_envia_byte(1, 'U');
            lcd_envia_byte(1, 'E');
            lcd_envia_byte(1, 'R');
            lcd_envia_byte(1, 'D');
            lcd_envia_byte(1, 'A');
            
        }
        if (b_up == 1 && b_emerg == 0) {
            PORTBbits.RB6 = 1;
            __delay_ms(8000);
            PORTBbits.RB6 = 0;
            lcd_envia_byte(0, 0x80);
            lcd_envia_byte(1, 'M');
            lcd_envia_byte(1, 'O');
            lcd_envia_byte(1, 'T');
            lcd_envia_byte(1, 'O');
            lcd_envia_byte(1, 'R');
            lcd_envia_byte(1, ' ');
            lcd_envia_byte(1, ' ');
            lcd_envia_byte(1, 'L');
            lcd_envia_byte(1, 'I');
            lcd_envia_byte(1, 'G');
            lcd_envia_byte(1, 'A');
            lcd_envia_byte(1, 'D');
            lcd_envia_byte(1, 'O');
            lcd_envia_byte(1, ' ');
            lcd_envia_byte(1, ':');
            lcd_envia_byte(1, ' ');
            lcd_envia_byte(0, 0xC0);
            lcd_envia_byte(1, 'D');
            lcd_envia_byte(1, 'I');
            lcd_envia_byte(1, 'R');
            lcd_envia_byte(1, 'E');
            lcd_envia_byte(1, 'C');
            lcd_envia_byte(1, 'A');
            lcd_envia_byte(1, 'O');
            lcd_envia_byte(1, ' ');
            lcd_envia_byte(1, ' ');
            lcd_envia_byte(1, ' ');
            lcd_envia_byte(1, ' ');
            lcd_envia_byte(1, ' ');
            lcd_envia_byte(1, 'C');
            lcd_envia_byte(1, 'I');
            lcd_envia_byte(1, 'M');
            lcd_envia_byte(1, 'A');
            
        }
        if (b_down == 1 && b_emerg == 0) {
            PORTBbits.RB6 = 1;
            __delay_ms(8000);
            PORTBbits.RB6 = 0;
            lcd_envia_byte(0, 0x80);
            lcd_envia_byte(1, 'M');
            lcd_envia_byte(1, 'O');
            lcd_envia_byte(1, 'T');
            lcd_envia_byte(1, 'O');
            lcd_envia_byte(1, 'R');
            lcd_envia_byte(1, ' ');
            lcd_envia_byte(1, ' ');
            lcd_envia_byte(1, 'L');
            lcd_envia_byte(1, 'I');
            lcd_envia_byte(1, 'G');
            lcd_envia_byte(1, 'A');
            lcd_envia_byte(1, 'D');
            lcd_envia_byte(1, 'O');
            lcd_envia_byte(1, ' ');
            lcd_envia_byte(1, ':');
            lcd_envia_byte(1, ' ');
            lcd_envia_byte(0, 0xC0);
            lcd_envia_byte(1, 'D');
            lcd_envia_byte(1, 'I');
            lcd_envia_byte(1, 'R');
            lcd_envia_byte(1, 'E');
            lcd_envia_byte(1, 'C');
            lcd_envia_byte(1, 'A');
            lcd_envia_byte(1, 'O');
            lcd_envia_byte(1, ' ');
            lcd_envia_byte(1, ' ');
            lcd_envia_byte(1, ' ');
            lcd_envia_byte(1, ' ');
            lcd_envia_byte(1, 'B');
            lcd_envia_byte(1, 'A');
            lcd_envia_byte(1, 'I');
            lcd_envia_byte(1, 'X');
            lcd_envia_byte(1, 'O');
          
        }
        if (b_emerg == 1) {
            PORTBbits.RB5 = 1;
            __delay_ms(4000);
            PORTBbits.RB5 = 0;
            lcd_envia_byte(0, 0x80);
            lcd_envia_byte(1, 'M');
            lcd_envia_byte(1, 'O');
            lcd_envia_byte(1, 'T');
            lcd_envia_byte(1, 'O');
            lcd_envia_byte(1, 'R');
            lcd_envia_byte(1, ' ');
            lcd_envia_byte(1, ' ');
            lcd_envia_byte(1, 'P');
            lcd_envia_byte(1, 'A');
            lcd_envia_byte(1, 'R');
            lcd_envia_byte(1, 'A');
            lcd_envia_byte(1, 'D');
            lcd_envia_byte(1, 'O');
            lcd_envia_byte(1, ' ');
            lcd_envia_byte(1, ':');
            lcd_envia_byte(1, ' ');
            lcd_envia_byte(0, 0xC0);
            lcd_envia_byte(1, '!');
            lcd_envia_byte(1, '!');
            lcd_envia_byte(1, '!');
            lcd_envia_byte(1, 'E');
            lcd_envia_byte(1, 'M');
            lcd_envia_byte(1, 'E');
            lcd_envia_byte(1, 'R');
            lcd_envia_byte(1, 'G');
            lcd_envia_byte(1, 'E');
            lcd_envia_byte(1, 'N');
            lcd_envia_byte(1, 'C');
            lcd_envia_byte(1, 'I');
            lcd_envia_byte(1, 'A');
            lcd_envia_byte(1, '!');
            lcd_envia_byte(1, '!');
            lcd_envia_byte(1, '!');
            __delay_ms(5000);
            goto inicio;
            }
    }
}

void lcd_ini() {
    char i;
    TRISD = 0b00000000;
    TRISEbits.TRISE0 = 0;
    TRISEbits.TRISE1 = 0;
    PORTD = 0b00000000;
    PORTEbits.RE0 = 0;
    PORTEbits.RE1 = 0;
    __delay_ms(15);
    for (i = 0; i < 3; i++) {
        lcd_cmd(0x30);
        __delay_ms(5);
    }
    lcd_cmd(0x38);
    __delay_us(40);
    lcd_cmd(0x01);
    __delay_ms(2);
    lcd_cmd(0x0C);
    __delay_us(40);
    lcd_cmd(0x06);
    __delay_us(40);
}

void lcd_cmd(char cmd) {
    PORTD = cmd;
    PORTEbits.RE1 = 1;
    PORTEbits.RE1 = 0;
}

void lcd_envia_byte(char nivel, char dado) {
    PORTEbits.RE0 = nivel;
    __delay_us(100);
    PORTEbits.RE1 = 0;
    lcd_cmd(dado);
}

Link para o comentário
Compartilhar em outros sites

Dá pra fazer de vários jeitos, aqui vai um:

 

1) Configura o TIMER 0 como temporizador e que incremente uma variável global contador_estouros a cada 1ms

2) Crie eu próprio delay

Ex:

 

 

void my_delay_ms(char estouros){

         start_timer0(); // você terá que criar a função que inicializa o timer0 com o valor de 0

         while(estouros > contador_estouros_timer0); // ficará aqui enquanto seu valor em ms for maior que o contador do TMR0

         stop_timer0(); // você terá que criar uma função que pare o timer0, para ele não ficar contando infinitamente

}

 

3) Substitua seus delays antigos por my_delay_ms();

 

Existem vários artigos de como configurar o timer 0 do PIC. Aqui tem um bem didático.

http://microcontrolandos.blogspot.com.br/2012/11/utilizando-o-timer0-do-pic.html

 

Abraço 

 

 

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Claro...

Programe o TMR0 pra entrada do clock interno. Vejamos com figuras...

timer0.png

melhor ver tudo aqui...

http://microchipdeveloper.com/8bit:timer0

Digamos que entre 1MHz (Fosc/4). Divida por 256 no prescaler e vair ter ~3.9Khz entrando no contador. você pode usar esta freq pra sua base de tempo. p.ex. a cada 39 contagens, se passaram 100mS.

Algo como:

if (TMR0>38) {led^⁼1;TMR0=0};

faz um led piscar a ~10Hz.

 

Crie sua função delay com este conhecimento recém adquirido

ou algo do gênero

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Paulão @aphawk

:oops:pior.... Mas .... foi.... de propósito :P

Ei ... que tal se deixarmos o garoto descobrir o porquê? Dica: vai ter que sujar as mãos nas entranhas do mc. Ou se preferir a 'moleza' do sw... faça sua escolha. O que me faz direcionar a filosofia de fundo de quintal...

Fazer escolhas é fácil. O difícil é conviver com as erradas ...(parcialmente original por isso sem aspas)

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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