Ir ao conteúdo
  • Cadastre-se

Como rotacionar leds no CCS


Posts recomendados

Boa noite galera , estou querendo acender leds atraves do rotacionamento de bits, porém não sei como fazer.

 

A ideia é a seguinte: a cada 1 segundo tenho o estouro do timer0, e gostaria que esse estouro rotacionasse  a minha saida . No primeiro estouro a saida RB0 vai a nivel 1 e as demais em nivel 0, no proximo estouro a saida RB1 vai a nível 1 e as demais em nível zero e assim por diante, até chegar na saida RB7.  Já fiz utilizando a função i++, e a função case e funcionou, porém gostaria de aprender essa nova função.

 

Segue o programa que fica piscando o led a cada 1 segundo utilizando o TMR0.

//****************************************************************************////   Configurar o TMR0 (8 bits) para que gere interrupções a cada 1 segundo.  ////****************************************************************************////****************************************************************************////  Vamos considerar que o CLK da CPU = 4 MHz.//  O clock interno será (4MHz/4) = 1 MHz //  Frequencia(F) = 1 / Periodo ----------->  Periodo(T) = 1/Frequencia//  Logo T = 1/1MHz = 1us. Logo a cada 1us TMR0 avança uma unidade.////  Como queremos gerar interrupções a cada 1 segundo, a freqüência de geração //  dessas interrupções deverá ser de 1 Hz.////  Entretanto o clock interno funciona em uma freqüência 1.000.000 maior que 1Hz.//  Usar o TMR0 sem o recurso do PRESCALER, necessitaria contar //  1.000.000 / 256 = 3906,25 interrupções.Isto se torna inviavel.//// Para resolver esse problema configuraremos o divisor de frequencia (PRESCALER)// Vamos considerar que o CLK da CPU = 4 MHz. Logo o CLK interno é de 1 MHz.// Se o PRESCALER estiver programado em 1:64, a freqüência de entrada no TMR0 // será de 1 MHz : 64 = 15625 Hz.//// setup_timer0 (RTCC_INTERNAL | RTCC_DIV_64); configuração do PRESCALER//// Se programarmos o TMR0 para dividir esse sinal 15625 por 125,// teremos um sinal de saída de 125 Hz, para isso, basta carregá-lo// a cada estouro de contagem com o valor:// 256– 125 = 131.// set_timer0 (131);  Inicialização do TMR0////Dessa forma após 125 interrupções,1s terá passado.//****************************************************************************//#include <16F876A.h>        //inclusão das configurações do pic utilizado #use delay(clock=4000000)   //clock interno#fuses HS,NOWDT,PUT,NOLVP   //configurações dos fusiveis#define led pin_b0          //definição da saida LEDint contador;#int_TIMER0                            //Interrupção do TMR0void  TIMER0_isr(void) {   set_timer0(131 + get_timer0());  //Inicializa o TMR0 com o valor 131   contador++;                     //Incrementa a variavel contador a cada estouro de TMR0                                        if(contador == 125)              /*Após imcrementrar 125 vezes o TMR0, reseta                                    a variavel contador e inverte a saida                                    através da função output_toggle*/   {            contador = 0;      output_toggle(led);         }}void main(){         setup_timer_0 (RTCC_INTERNAL | RTCC_DIV_64); // configura o TMR0 para clock interno e prescaler dividindo por 64   set_timer0 (131);                           // inicia o timer 0 em 131   enable_interrupts (global | int_timer0);   // habilita interrupções   while (true);                             // espera pela interrupção   } 

Tem a função << que serve para rotacionar os bits, porém não sei como utilizar . Alguem poderia me ajudar ???

Link para o comentário
Compartilhar em outros sites

@diego.maga

O que você precisa sao as funções rotate_right e rotate_left....

Dê uma olhada no manual do CCS.

x = 0x86; //0b 1000 0110

rotate_left (&x, 1);

//x agora é 0x0d //0b 0000 1101

Uma coisa a se lembrar é que acho que esse funcao espera um ponteiro no primeiro argumento.

Falou

Link para o comentário
Compartilhar em outros sites

@diego.maga

O que você precisa sao as funções rotate_right e rotate_left....

Dê uma olhada no manual do CCS.

x = 0x86; //0b 1000 0110

rotate_left (&x, 1);

//x agora é 0x0d //0b 0000 1101

Uma coisa a se lembrar é que acho que esse funcao espera um ponteiro no primeiro argumento.

Falou

 Saberia me dizer como realizar esse ponteiro ?

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber 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...