Проблема с программированием платы 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 и доступа к его регистрам без проблем.
@Frank Donald, 👍1
Обсуждение1 ответ
Лучший ответ:
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
- Связь последовательного порта Digispark
- Digispark ATtiny 85 стирает флэш после отключения питания
- Разблокировка Digispark ATTiny85 после прошивки на HID
- Возникли проблемы с определением CTC на таймере 1 с помощью ATTiny85.
- Нужна библиотека Digistump для QWERTY-клавиатуры и исправления проблем!
- Библиотеки I2C для ATTiny85?
- Поскольку double и float представляют один и тот же тип данных (обычно), что предпочтительнее?
- Программирование микроконтроллера Attiny85 без arduino
Поскольку экосистема Arduino имеет открытый исходный код, вы можете заглянуть в их источники, чтобы узнать об использовании таймера. -- Однако, поскольку Arduino IDE поставляется с полным GCC для AVR, вы можете использовать любой редактор или IDE, который вам нравится, и писать программное обеспечение без использования Arduino IDE/библиотеки., @the busybee
Ваш код (второй) не использует никаких функций Arduino, поэтому IDE не имеет значения. Было бы полезно сделать отступ в вашем коде обычным способом, чтобы сделать его более читабельным., @Nick Gammon
Не просматривая ваш код построчно, я бы сказал, что ваша проблема заключается в регистрах, которые вы использовали. IDE не имеет отношения к вашей проблеме. Или, возможно, вы используете
i=i++
, как я упоминал в своем ответе., @Nick Gammon