Ir ao conteúdo

Posts recomendados

Postado

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);
}

Postado

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
  • Membro VIP
Postado

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

  • Membro VIP
Postado

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

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