Problema com a programação da placa digispark ATtiny85 com Arduino IDE
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
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.