Codigo so funcina no simulador TINKERCAD ajuda?

#include <util/delay.h> 
#include <avr/interrupt.h>
#include <avr/io.h>

#define SetBit(valor,bit) (valor |= (1<<bit))     //1
#define ClrBit(valor,bit) (valor &= ~(1<<bit))  //0
#define toogleBit(valor,bit) (valor ^= (1<<bit))
#define testBit(valor,bit)    (valor & (1<<bit))
#define L PORTD
#define M PD6

unsigned char tempo = 0;
int ad_conv();                    
void set(float valueD);
int duty;
int contador = 0;
int cont_pld = 1;
int contador2 = 1;



ISR (TIMER0_OVF_vect) 
{
 contador = contador + 1;
 
    if(contador <= 4)
      {
        if(contador == 1){SetBit(L,M);}
        if(contador == 2){ClrBit(L,M);}  
        if(contador == 3){SetBit(L,M);}
        if(contador == 4){ClrBit(L,M);} 
      }
        if(contador >= 5 && contador <= 108)
        {
          if(cont_pld == 1){SetBit(L,M);} 
          if(cont_pld > 1 && cont_pld <= 3){ClrBit(L,M);}
          cont_pld = cont_pld + 1;
          if(cont_pld > 3){cont_pld = 1;}
        }
        if(contador >= 109)
        {
          contador = 0; 
          contador2 = contador2 + 1;
          if(contador2 > 2){contador2 = 1;}
          cont_pld = 1;
        }
}

int ad_conv()
{
   static int analogH, analogL, analog;    //variáveis locais para valores ADC
   ADCSRA |= (1<<ADSC);                    //inicia conversão ad
   while(!(ADCSRA&=~(1<<ADIF)));           //aguarda conversão ad completar
   ADCSRA |= (1<<ADIF);                    //limpa ADIF com transição LOW para HIGH
   analogL = ADCL;                         //armazena o byte menos significativo sao 8 bits
   analogH = ADCH;                         //armazena o byte mais  significativo sao 8 bits
   analog  = (analogH<<8) | analogL;       //calcula para valor de 10 bit
   return analog;                          //retorna resultado da conversão 
} 
void set(float valueD)
{
  
   valueD = valueD/100;
   duty = valueD * 255;
   OCR0A = duty;
} 

int main(void) 
{
  //SetBit(DDRB,PB1);
  SetBit(DDRD,M);
  PORTD &=  ~(1<<M);
  sei();
  TCCR0A=0b00000010;                      
  TCCR0B=0x00;
  TCCR0B |= (1<<CS00)|(1<<CS02);   
  TCNT0=0;                         
  TIMSK0 |= (1<<TOIE0);            
  Serial.begin(9600);
  ADCSRA = 0x93;                  
  ADMUX  = 0x43; 
  //cli();
 
  while (1)
  {
    set(ad_conv()/10.23);
     Serial.println(duty);  
      
  }                                                
  return (0);                           
}
 

Gostaria de saber onde esta o erro se alguem poder ajudar?

Qual IDE está usando?
O que deveria fazer?
O que faz?
Qual o erro?

oi usava o tinkercad online mas quando fui passar no proteus ou no arduino nao funcionou

Como assim não funciona? O que é que não faz? Que erro é que dá?

oi ele carrega td normal so nao sai o sinal no pino 6 mas se vc ver o serial e monitora o duty da p ver q o potencimetro ta funcionado convertendo td certo so a questao da interrupcao mas no tinkercad simulador funciona testa ai p vc ver me ajuda ai

Isto parece-me não estar a fazer muito... mas não é daqui que vem o problema.

Uma coisa que eu não estou a entender é como estás a pegar em 10 bits, divides por 100, multiplicas por 255 e esperas que caiba em 8??

   valueD = valueD/100;
   duty = valueD * 255;

Que valores vês aparecerem na variável duty? E que valores vias a sair do AD no tinkercad em comparação ao que tens agora?

Isto é uma coisa que pode estar a dar problemas.

No entanto, olhando ao teu código, o que estás a pretender fazer com o temporizador e o pino de saída do mesmo? Já viste como configuraste o timer? Explica exactamente o que pretendes aqui porque esse modo escreve no pino 6.

isso e um sinal para simular modulo de caminhao mercedes 36 +1

Quando pergunto o que pretendes fazer não é o objectivo final do projecto. Isso não me importa minimamente. É sim, o que pretendes fazer com o timer porque pela configuração não me faz sentido.

Copiaste isto de algum lado??

ok tem como me da um exemplo de como fazer o timer com variacao no potenciometro a parte do conv adc peguei do wr kits o resto fiz to aprendendo

Já descobriste o erro que não dava no tinkercad?

Já procuraste online??

Ainda não consegui já procurei

Queria um exemplo de timer0 controlado por um potenciômetro

RESOLVIDO

#include <avr/io.h>
#include <avr/interrupt.h>


#define SetBit(RES, BIT)(RES |= (1 << BIT))   // Por BIT em nível alto
#define ClrBit(RES, BIT)(RES &= ~(1 << BIT)) // Por BIT em nível baixo
#define TstBit(RES, BIT)(RES &  (1 << BIT)) // testar BIT, retorna 0 ou 1
#define CplBit(RES, BIT)(RES ^= (1 << BIT)) // Inverter estado do BIT
#define L PORTD
#define M PD6
#define N DDRD

int ad_conv();                       //função para conversão AD
void setDuty_pin03(float valueD);    //Seleciona o duty cycle na saída digital  3
int contador = 0;
int cont_pld = 1;
int contador2 = 1;
int duty;




 ISR(TIMER0_COMPA_vect) 
 {
 contador = contador + 1;
 
    if(contador <= 4)
      {
        if(contador == 1){SetBit(L,M);}
        if(contador == 2){ClrBit(L,M);}  
        if(contador == 3){SetBit(L,M);}
        if(contador == 4){ClrBit(L,M);} 
      }
        if(contador >= 5 && contador <= 108)
        {
          if(cont_pld == 1){SetBit(L,M);} 
          if(cont_pld > 1 && cont_pld <= 3){ClrBit(L,M);}
          cont_pld = cont_pld + 1;
          if(cont_pld > 3){cont_pld = 1;}
        }
        if(contador >= 109)
        {
          contador = 0; 
          contador2 = contador2 + 1;
          if(contador2 > 2){contador2 = 1;}
          cont_pld = 1;
        }
}

int ad_conv()
{
   static int analogH, analogL, analog;    //variáveis locais para valores ADC
   ADCSRA |= (1<<ADSC);                    //inicia conversão ad
   while(!(ADCSRA&=~(1<<ADIF)));           //aguarda conversão ad completar
   ADCSRA |= (1<<ADIF);                    //limpa ADIF com transição LOW para HIGH
   analogL = ADCL;                         //armazena o byte menos significativo sao 8 bits
   analogH = ADCH;                         //armazena o byte mais  significativo sao 8 bits
   analog  = (analogH<<8) | analogL;       //calcula para valor de 10 bit
   return analog;
} 
void setDuty_pin03(float valueD)
{
  
   valueD = valueD/100;
   duty = valueD * 255;
   OCR0A = duty;
} 



 int main(){


   sei(); //interrupcao global
   N  |=   (1<<M) ;    // 1 = OUT NO PINO 
   L &=  ~(1<<M); //0 NO PINO 0  
   OCR0A = 250;
   //OCR0B = 0;
   TCCR0A  =0b00000010;                      
 // TCCR0B |= (1<<CS00)|(1<<CS02); 
   TCCR0B = 0b00000100;
   TIMSK0 = 0b00000010;
   ADCSRA = 0x93; //liga conversão AD, fator de divisão de 8     
   ADMUX  = 0b01000011;
  // ADCSRB |= (1<<MUX5);                //tensão de ref. de 5V, canal A3  0100 ADC03 ->0011  
   //cli();    // DESABILITA A INTERRUPCAO GLOBAL                                                  
   Serial.begin(9600); 
   
while(1){
  
    
  setDuty_pin03(ad_conv()/10.23);
 //Serial.println(ADCL,BIN);
// Serial.println(TCNT0);
 Serial.println(duty,BIN);



  
}
 

return 0; } 

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.