Проблема с программированием платы digispark ATtiny85 с помощью Arduino IDE

Я купил плату Digispark ATtiny85, чтобы узнать об этом микроконтроллере. Поэтому я попытался использовать внутренние имена регистров в коде, а не использовать Arduino во встроенных функциях. Я могу заставить плату работать, когда приходят только операции ввода и вывода. Например, приведенный ниже код работает, и я могу заставить светодиод на плате включаться и выключаться

#include<avr/io.h>
void setup()
{
  DDRB |=(1 << PB1);  // устанавливаем PB1 в качестве выхода
}
void loop() {
 PORTB |= (1 << PB1);    // Включение светодиода, подключенного к PB1
 delay(1000);            // Использование встроенной функции задержки Arduino IDE для генерации задержки в 1 секунду
 PORTB &= ~(1 << PB1);   //Выключение светодиода
 delay(1000);

Я попытался использовать Timer0 модуля ATtiny85 для создания временной задержки в одну секунду. Но, к сожалению, мне не удалось заставить его работать.

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

Я использовал флаг переполнения для определения состояния регистра TCNT0. Я загрузил приведенный выше код, но светодиод не работает должным образом.

При поиске в Интернете у меня есть несколько предположений, что это может быть связано с тем, что Arduino IDE использует регистры таймера для функции задержки. Когда пользователь пытается получить доступ к регистрам таймера, это может не сработать должным образом.

Но я не уверен в справедливости вышеизложенного мнения. Может ли кто-нибудь помочь мне с этим? Поскольку я изучаю этот контроллер, практика программирования ядра очень важна. Если я не могу запрограммировать ATtiny85 с помощью Arduino IDE таким образом, может ли кто-нибудь предложить способ или альтернативную настройку оборудования для программирования ATtiny85 и доступа к его регистрам без проблем.

, 👍1

Обсуждение

Поскольку экосистема Arduino имеет открытый исходный код, вы можете заглянуть в их источники, чтобы узнать об использовании таймера. -- Однако, поскольку Arduino IDE поставляется с полным GCC для AVR, вы можете использовать любой редактор или IDE, который вам нравится, и писать программное обеспечение без использования Arduino IDE/библиотеки., @the busybee

Ваш код (второй) не использует никаких функций Arduino, поэтому IDE не имеет значения. Было бы полезно сделать отступ в вашем коде обычным способом, чтобы сделать его более читабельным., @Nick Gammon

Не просматривая ваш код построчно, я бы сказал, что ваша проблема заключается в регистрах, которые вы использовали. IDE не имеет отношения к вашей проблеме. Или, возможно, вы используете i=i++, как я упоминал в своем ответе., @Nick Gammon


1 ответ


Лучший ответ:

6
 i=i++;                          //увеличиваем на единицу

Результат приведенного выше оператора не определен. То есть это не обязательно "i + 1".

См.:

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

Вместо этого используйте:

i++;

Или:

i = i + 1;

Примечание о "неопределенном поведении":

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

Когда возникает экземпляр неопределенного поведения, с точки зрения спецификации языка может произойти что угодно, а может и вообще ничего.

,

i = ++i; тогда? д-;, @Gerben

Очень забавно. Нет., @Nick Gammon