Ir ao conteúdo
  • Cadastre-se

Recommended Posts

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

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Também estou tentando aprender o módulo CCP mas o material disponível é pouco.

 

Não sei diferenciar o modo compare do capture mas espero que a salvadora Isadora responda

 

hahaha

 

abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
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!

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

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ç

Compartilhar este post


Link para o post
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!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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

×