Ir ao conteúdo
  • Cadastre-se

Comando CCP


Ir à solução Resolvido por Bruno R Ruinho,

Posts recomendados

Bom Dia a todos!
 
Estou com uma duvida em um programa, ele esta funcionando assim:
 
 - Toda vez que pressiono RC2/CCP1 do meu PIC (16F877A) ele acende um led RB7 e fica 5s aceso depois apaga. 
 
 - Se eu pressionar outro botão RC1/CCP2 ele vai acender e permanecer aceso ate que eu termine a configuração aguada 5s e apaga. 
 
 
o que eu estou tentando mudar:
 
 - Toda vez que pressionar RC2/CCP1 do meu PIC (16F877A) o led RB7 fica aceso ate que eu "desligue" meu RC2.
 
 - RC1/CCP2 continue igual.
 
O Programa:

 

#int_timer1

void trata_tempo()
{
   tempo++;
   
   if (tempo == 10)
   {
      output_toggle (PIN_B7);
      tempo=0;
      disable_interrupts( INT_TIMER1);               //Habilita interrupção timer1
   }
   set_timer1 (3036);
}
 
#int_ccp1
void trata_ccp_1()
{
   if ((modo == 0) && (tempo ==0))
   {
      output_toggle (PIN_B7);
      enable_interrupts( INT_TIMER1);               //Habilita interrupção timer1
      set_timer1 (3036);
   }
}
 
#int_ccp2
void trata_ccp_2()
{
   modo++;
   if (modo == 1)
   {
      disable_interrupts(INT_TIMER1);               //Habilita interrupção timer1
      output_high (PIN_b7);
   }   
   
   if (modo > 7 )
   {      
      modo = 0;
   }
   
   if (modo == 0 )
   {
      enable_interrupts( INT_TIMER1);               //Habilita interrupção timer1      
   }
}

 

 

 

circuito.BMP

Link para o comentário
Compartilhar em outros sites

Se fosse em BASIC poderia ajudar, Mas a linguagem C ainda estou aprendendo e pra min nada mais serve doque para complicar

 

Tudo que se faz em C se faz em BASIC

 

Ate sei como fazer o que você precisa, mas como estou iniciando em C não quero arriscar algo errado.

 

Logo a Isadora te responde ela sabe tudo!

 

Abraço.

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

  • Membro VIP

Pow.. assim você me obriga a dar chutes

Acho que o google ajuda mais

http://www.mikroe.com/chapters/view/6/chapter-5-ccp-modules/

Se não tiver afinidade com o inglês, tente o google tradutor

 

Infelizmente não uso o ccs. Mas percebo que habilitas as interrupts dentro da interrupts(!). Creio que deve fazê-lo no inicio do main() não?.

Mas acho que pra isso

" - Se eu pressionar outro botão RC1/CCP2 ele vai acender e permanecer aceso ate que eu termine a configuração aguada 5s e apaga."

e isso

" - Toda vez que pressionar RC2/CCP1 do meu PIC (16F877A) o led RB7 fica aceso ate que eu "desligue" meu RC2."

nem precisa interrupção. A não ser que seja exigência de teu professor...

Link para o comentário
Compartilhar em outros sites

É. O problema do CCS é que para lidar com os registradores é meio chatinho. 

A única maneira QUE SEI é usando o #locate

 

Mas hoje, com tempo darei uma brincada a mais com o módulo CCP.

 

Quero contar frequências com ele (eu sei que tem outras maneiras, mas para aprender eu quero usar esse)

 

Valeu pelo material @Isadora Ferraz

 

Abraço!

Link para o comentário
Compartilhar em outros sites

  • Solução

Depois de muito tempo consegui passar meu código para o MikroC, a parte do relógio esta funcionando OK mas a parte do termômetro não, 

 

na hora de fazer o calculo para medir a temp exata ele da "demo limit" coloquei a linha em vermelho.

 

ex se colocar valorAD1 = valorAD1 * 4 ele vai e se colocar valorAD1 = valorAD1 * 4.8875 ele da demo limit

 

 

// Conexões do LCD

sbit LCD_RS at RB2_bit;
sbit LCD_EN at RB3_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;
 
sbit LCD_RS_Direction at TRISB2_bit;
sbit LCD_EN_Direction at TRISB3_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;
// Fim das conexões do LCD
 
unsigned short ler_ds1307(unsigned short address)
{
  unsigned short r_data;
  I2C1_Start();  //Inicia sinal de I2C
  I2C1_Wr(0b11010000); 
  I2C1_Wr(address);
  I2C1_Repeated_Start();
  I2C1_Wr(0b11010001); //0x68 followed by 1 --> 0xD1
  r_data=I2C1_Rd(0);
  I2C1_Stop();
  return(r_data);
}
 
 
void escreve_ds1307(unsigned short address,unsigned short w_data)
{
  I2C1_Start(); // Inicia o sinal de I2C
  I2C1_Wr(0b11010000); 
  I2C1_Wr(address); 
  I2C1_Wr(w_data); 
  I2C1_Stop();
}
 
 
unsigned char BCD2UpperCh(unsigned char bcd)
{
  return ((bcd >> 4) + '0');
}
 
 
unsigned char BCD2LowerCh(unsigned char bcd)
{
  return ((bcd & 0x0F) + '0');
}
 
 
int Binary2BCD(int a)
{
   int t1, t2;
   t1 = a%10;
   t1 = t1 & 0x0F;
   a = a/10;
   t2 = a%10;
   t2 = 0x0F & t2;
   t2 = t2 << 4;
   t2 = 0xF0 & t2;
   t1 = t1 | t2;
   return t1;
}
 
 
int BCD2Binary(int a)
{
   int r,t;
   t = a & 0x0F;
   r = t;
   a = 0xF0 & a;
   t = a >> 4;
   t = 0x0F & t;
   r = t*10 + r;
   return r;
}
 
 
 
int segundo;
int minuto;
int hora;
int hr;
int dia;
int ddia;
int mes;
int ano;
 
 
unsigned short set_count = 0;
short set;
char time[] = "00:00:00";
char date[] = "00/00/00";
 
 
 
unsigned int valorAD1;
char txt[6];
 
void main() 
{
 
   ADCON0 = 0b01100001;
   ADCON1 = 0b11000000;
 
   I2C1_Init(100000); //Frequencia do DS1307 I2C a 100KHz
 
   TRISA5_bit = 1;
 
   TRISD = 0x8f;
   PORTD = 0x00;
 
   Lcd_Init();                        // Inicia o LCD
   Lcd_Cmd(_LCD_CLEAR);               // Limpa display
   Lcd_Cmd(_LCD_CURSOR_OFF);          // Desliga Cursor
   
   do
   {
 
     set = 0;
     if(Button(&PORTD, 0, 50, 0))
     {
             set_count++;
             if(set_count >= 7)
             {
                set_count = 0;
             }
     }
     if(set_count)
     {
        if(Button(&PORTD, 1, 50, 0))
           set = 1;
 
        if(Button(&PORTD, 2, 50, 0))
           set = -1;
 
        if(set_count && set)
        {
          switch(set_count)
          {
            case 1:
                    hora = BCD2Binary(hora);
                    hora = hora + set;
                    hora = Binary2BCD(hora);
                    if((hora & 0b00011111) >= 0b00010011)
                    {
                      hora = hora & 0b11100001;
                      hora = hora ^ 0x20;
                    }
                    else if((hora & 0x1F) <= 0x00)
                    {
                      hora = hora | 0b00010010;
                      hora = hora ^ 0x20;
                    }
                    escreve_ds1307(2, hora); //escreve hora
 
                    break;
            case 2:
                     minuto = BCD2Binary(minuto);
                     minuto = minuto + set;
                     if(minuto >= 60)
                        minuto = 0;
                     if(minuto < 0)
                        minuto = 59;
                     minuto = Binary2BCD(minuto);
                     escreve_ds1307(1, minuto); //escreve minuto
                     break;
            case 3:
                    if(abs(set))
                      escreve_ds1307(0,0x00); //Reset dos seguntos (para 0) e inicia o oscilador
                    break;
            case 4:
                     dia = BCD2Binary(dia);
                     dia = dia + set;
                     dia = Binary2BCD(dia);
                     if(dia >= 0x32)
                        dia = 1;
                     if(dia <= 0)
                        dia = 0x31;
                     escreve_ds1307(4, dia); // ecvreve data
                     break;
            case 5:
                    mes = BCD2Binary(mes);
                    mes = mes + set;
                    mes = Binary2BCD(mes);
                    if(mes > 0x12)
                      mes = 1;
                    if(mes <= 0)
                      mes = 0x12;
                    escreve_ds1307(5,mes); // escreve mes
                    break;
            case 6:
                    ano = BCD2Binary(ano);
                    ano = ano + set;
                    ano = Binary2BCD(ano);
                    if(ano <= -1)
                       ano = 0x99;
                    if(ano >= 0x50)
                       ano = 0;
                    escreve_ds1307(6, ano); // escreve ano
                    break;
          }
        }
     }
 
      segundo = ler_ds1307(0);
      minuto = ler_ds1307(1);
      hora = ler_ds1307(2);
      hr = hora & 0b00011111;
      ddia = ler_ds1307(3);
      dia = ler_ds1307(4);
      mes = ler_ds1307(5);
      ano = ler_ds1307(6);
 
 
      time[0] = BCD2UpperCh(hr);
      time[1] = BCD2LowerCh(hr);
      time[3] = BCD2UpperCh(minuto);
      time[4] = BCD2LowerCh(minuto);
      time[6] = BCD2UpperCh(segundo);
      time[7] = BCD2LowerCh(segundo);
 
      date[0] = BCD2UpperCh(dia);
      date[1] = BCD2LowerCh(dia);
      date[3] = BCD2UpperCh(mes);
      date[4] = BCD2LowerCh(mes);
      date[6] = BCD2UpperCh(ano);
      date[7] = BCD2LowerCh(ano);
 
 
      Lcd_out(1, 1, time);
      Lcd_out(2, 1, date);
      
      valorAD1 = ADC_Get_Sample(4);
      valorAD1 = valorAD1 * 4.8875;
      WordToStr(valorAD1,txt);
      Lcd_out(1,10,txt);
      
       if (Button(&PORTD, 3, 50, 0))
          RD4_bit = 1;
      else
          RD4_bit = 0;
 
 
 Delay_ms(200);
 
 
   }while(1);
}
 

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Isso é um aviso pra você não pecar mais! Até o capeta tá com saco cheio!! (acho que isso num teve muita graça)

 

É que o compilador subentende que você vai trabalhar com números fracionários (float) e isso ocupa muita epprom e processamento do mc.

 

valorAD1 = valorAD1 * 4.8875;

 

você pode tentar assim

 

valorAD1*= 49; //aproximação

valorAD1/= 10;

 

O problema é que não vai aparecer vírgula no display. Mas você pode montar a string com ela manualmente.

abç

Link para o comentário
Compartilhar em outros sites

kkk... de longe não.. :lol:

 

Funcionou:

 

 

valorAD1 =  ADC_Get_Sample(4);

       valorAD1*= 49; //aproximação
       valorAD1/= 10;
       printLCDtemp(1,11,valorAD1);

 

Agora para mostrar no LCD acho que vai me bater:

 

 

 
    void printLCDtemp(char linha,char coluna, unsigned int valortemp)
    {
    char txt_temp[6];
    txt_temp[0] = (valortemp/1000)+48;
    txt_temp[1] = (valortemp/100)%10+48;
    txt_temp[2] = (valortemp/10)%10+48;
    txt_temp[3] = (valortemp%10)+48;
    
    //Lcd_Chr(linha,coluna,txt_temp[0]); nao vou mostrar o dig  pois nao vou medir temp maior que 99
    Lcd_Chr(linha,coluna+1,txt_temp[1]);
    Lcd_Chr(linha,coluna+2,txt_temp[2]);
    CustomChar(linha,coluna+3);
    Lcd_chr_CP('C');
 
Obrigado!!
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...