Problema com a programação da placa digispark ATtiny85 com Arduino IDE

Sep 18 2020

Comprei uma placa Digispark ATtiny85 para aprender sobre esse microcontrolador. Portanto, tentei usar nomes de registro internos no código em vez de usar o Arduino nas funções integradas. Posso fazer a placa funcionar quando se trata apenas de operações de entrada e saída. Por exemplo, o código abaixo funciona e posso fazer com que o LED integrado ligue e desligue

#include<avr/io.h>
void setup()
{
  DDRB |=(1 << PB1);  //set PB1 as output
}
void loop() {
 PORTB |= (1 << PB1);    // Turning ON LED connected to PB1
 delay(1000);            //Using Arduino IDE inbuilt delay function to generate delay of 1 second
 PORTB &= ~(1 << PB1);   //Turning the LED off
 delay(1000);

}

Eu tentei usar o módulo Timer0 do ATtiny85 para gerar um atraso de tempo de um segundo. Mas, infelizmente, não consegui fazer funcionar.

#include<avr/io.h>
#define F_CPU 16500000UL
#include<util/delay.h>


void timer_config()
{
 DDRB =0b00000010; // set PB1 as output
 GTCCR|= (1<<TSM);      ///Halt the timer for configuration
 TCCR0A=0x00;             //Normal mode
 TCCR0B=0x00;
 TCCR0B |= (1<<CS00)|(1<<CS02);   //prescaling with 1024
 TCNT0=0;
 GTCCR&=~(1<<TSM); //Start the timer
}

void tmdel()
{
 int i=0;
 while(i<=6)
 {
  while((TIFR & (1 << TOV0) )==0);        //Waiting for 0-255 and flag to raise
  TIFR|=(1<<TOV0);      //Clear the flag
  i=i++;                          //increment by one
 }
}

int main()
{
 timer_config();
 while(1)
 {
  PORTB|=(1<<PB1);     //PortB1 high
  tmdel();                         //Delay of 1 second
  PORTB&=~(1<<PB1);     //PORTB1 low
  tmdel();
 }
}

Usei o sinalizador de estouro para identificar o status do registro TCNT0. Eu carreguei o código acima, mas o LED não está respondendo como esperado.

Ao pesquisar na Internet, tenho algumas sugestões de que isso pode ser porque o Arduino IDE usa registros de temporizador para função de atraso. Quando o usuário tenta acessar os registros do cronômetro, ele pode não funcionar conforme o esperado.

Mas não tenho certeza sobre a validade da opinião acima. Alguém pode me ajudar com isso? Já que estou aprendendo este controlador, praticar a programação básica é muito importante. Se eu não consigo programar ATtiny85 usando Arduino IDE dessa forma, alguém pode sugerir uma maneira ou configuração de hardware alternativa para programar ATtiny85 e acessar seus registros sem problemas.

Respostas

6 NickGammon Sep 18 2020 at 13:41
 i=i++;                          //increment by one

O resultado da declaração acima não está definido . Ou seja, não é necessariamente "i + 1".

Ver:

  • http://en.wikipedia.org/wiki/Sequence_point
  • http://c-faq.com/expr/seqpoints.html

Em vez disso, use:

i++;

Ou:

i = i + 1;

Uma nota sobre "comportamento indefinido":

http://en.wikipedia.org/wiki/Undefined_behavior

Quando ocorre uma instância de comportamento indefinido, no que diz respeito à especificação da linguagem, tudo pode acontecer, talvez nada.