Например TDA7294

Форум РадиоКот • Просмотр темы - attiny13 таймер то работает, то нет
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Сб дек 13, 2025 14:06:51

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 102 ]  1, , , , ,  
Автор Сообщение
Не в сети
 Заголовок сообщения: attiny13 таймер то работает, то нет
СообщениеДобавлено: Пн окт 28, 2024 18:03:09 
Встал на лапы

Зарегистрирован: Чт сен 26, 2019 20:42:21
Сообщений: 141
Рейтинг сообщения: 0
Всем привет.

Странная проблема с таймером на attiny13. Хочу включать и выключать пин по таймеру. Вот такой код:

Код:
#include <arduino.h>
#include <avr/interrupt.h>

volatile uint16_t tmr_cnt = 0;
volatile uint8_t pwm_width = 0;

ISR(TIM0_COMPA_vect)
{
        tmr_cnt++;
        pin_toggle(PIN_D0);
}

void
main(void)
{
        DDRB |= 1;
        DDRB |= 2;
        DDRB |= 4;

        TCCR0B &= ~(1 << WGM02);
        TCCR0A &= ~((1 << WGM01) | (1 << WGM00));
        TCCR0A |= 2 << WGM00;
        TCCR0A &= ~((1 << COM0A1) | (1 << COM0A0));
        TCCR0A |= 0 << COM0A0;
        TCCR0B &= ~(3 << CS00);
        TCCR0B |= 2 << CS00;
        TIMSK0 &= ~(3 << TOIE0);
        TIMSK0 |= 2 << TOIE0;
        // ~100us
        OCR0A = 15;
        sei();
        while (1) {
                if (pwm_width > 11)
                        pin_write(PIN_D2, 1);
                else if (pwm_width < 8)
                        pin_write(PIN_D2, 0);
        }
}


Работает норм. На тело while не обращайте внимания. Смысла в нём нет - это кусок изначального проекта, в котором всплыло это странное поведение. Размер hex'а 760 байт.

Но как только я заменяю 11 и 8 на переменные:

Код:
#include <arduino.h>
#include <avr/interrupt.h>

volatile uint16_t tmr_cnt = 0;
volatile uint8_t pwm_width = 0;
uint8_t pwm_width_on = 11, pwm_width_off = 8;

ISR(TIM0_COMPA_vect)
{
        tmr_cnt++;
        pin_toggle(PIN_D0);
}

void
main(void)
{
        DDRB |= 1;
        DDRB |= 2;
        DDRB |= 4;

        TCCR0B &= ~(1 << WGM02);
        TCCR0A &= ~((1 << WGM01) | (1 << WGM00));
        TCCR0A |= 2 << WGM00;
        TCCR0A &= ~((1 << COM0A1) | (1 << COM0A0));
        TCCR0A |= 0 << COM0A0;
        TCCR0B &= ~(3 << CS00);
        TCCR0B |= 2 << CS00;
        TIMSK0 &= ~(3 << TOIE0);
        TIMSK0 |= 2 << TOIE0;
        // ~100us
        OCR0A = 15;
        sei();
        while (1) {
                if (pwm_width > pwm_width_on)
                        pin_write(PIN_D2, 1);
                else if (pwm_width < pwm_width_off)
                        pin_write(PIN_D2, 0);
        }
}


Всё перестаёт работать :-). Это странно, т.к. пины даже разные. Размер этого hex 770 байт.

Картинка сигнала для первого кода - Изображение
Картинка сигнала для второго кода - Изображение

Размер флеш-памяти не превышен. Размер данных тоже( 55 и 53 байт). Пины разные. Как одно влияет на другое не понятно. Может кто в курсе, что за фигня?

Добавлено after 6 minutes 12 seconds:
При этом, если во втором варианте заменить в while:

Код:
pin_write(PIN_D2, 1);


на

Код:
PORTB |= 4;


то тоже всё норм становится. Но это бред какой-то, т.к. тело if вообще не должно срабатывать, т.к. pwm_width в программе всегда 0 и не может стать больше 11.


Вложения:
while_wb.png [37.23 KiB]
Скачиваний: 438
while_wob.png [44.01 KiB]
Скачиваний: 430

_________________
Ардуинщик. Не шарю в электронике.
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: attiny13 таймер то работает, то нет
СообщениеДобавлено: Пн окт 28, 2024 19:11:21 
Это не хвост, это антенна

Карма: 12
Рейтинг сообщений: 136
Зарегистрирован: Вт июн 07, 2011 08:03:18
Сообщений: 1306
Рейтинг сообщения: 0
То вы работаете напрямую с регистрами, то через Ардуино функции... Причём не говорите какое ядро используете. Не странно ли?
Так и работайте с пинами напрямую. И уберите всё лишнее. А то тут смотрите, тут не смотрите, а тут мы рыбу заворачивали.
И зачем вы дрочите DDR и TCCR0? Одним присвоением не можете настроить каждый? Или что бы другим было приятно в вашей галиматне разбираться?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: attiny13 таймер то работает, то нет
СообщениеДобавлено: Пн окт 28, 2024 20:35:38 
Встал на лапы

Зарегистрирован: Чт сен 26, 2019 20:42:21
Сообщений: 141
Рейтинг сообщения: -4
И зачем вы дрочите DDR и TCCR0? Одним присвоением не можете настроить каждый? Или что бы другим было приятно в вашей галиматне разбираться?


Вот же ж, сука, выбесил...

Добавлено after 54 minutes 43 seconds:
Сейчас такой прикол. Меняю:

Код:
ISR(TIM0_COMPA_vect)
{
        tmr_cnt++;
        pin_toggle(PIN_D0);
}


на это:

Код:
ISR(TIM0_COMPA_vect)
{
        tmr_cnt++;
        *pins[PIN_D0].out_reg ^= pins[PIN_D0].mask;
}


И работает как надо. При этом:

Код:
void
pin_toggle(uint8_t pin)
{
        *pins[pin].out_reg ^= pins[pin].mask;
}


Добавлено after 14 minutes 48 seconds:
Да. Забыл сказать. Тот же самый код с небольшими правками (замена TIM0_COMPA_vect на TIMER0_COMPA_vect, DDRB на DDRD) работает на atmega328p как ожидается.

_________________
Ардуинщик. Не шарю в электронике.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: attiny13 таймер то работает, то нет
СообщениеДобавлено: Пн окт 28, 2024 21:38:05 
Это не хвост, это антенна

Карма: 12
Рейтинг сообщений: 136
Зарегистрирован: Вт июн 07, 2011 08:03:18
Сообщений: 1306
Рейтинг сообщения: 4
Удачи!


Вернуться наверх
 
Эиком - электронные компоненты и радиодетали
Не в сети
 Заголовок сообщения: Re: attiny13 таймер то работает, то нет
СообщениеДобавлено: Вт окт 29, 2024 10:06:06 
Встал на лапы

Зарегистрирован: Чт сен 26, 2019 20:42:21
Сообщений: 141
Рейтинг сообщения: 0
Удачи!


Пока-пока. Первый раз вижу хама, который обижается на грубость.

_________________
Ардуинщик. Не шарю в электронике.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: attiny13 таймер то работает, то нет
СообщениеДобавлено: Вт окт 29, 2024 10:36:04 
Мудрый кот

Карма: 25
Рейтинг сообщений: 486
Зарегистрирован: Сб май 05, 2012 20:24:52
Сообщений: 1786
Откуда: KN34PC, Болгария
Рейтинг сообщения: 0
oleg_4rk, какой компилятор? Если включить оптимизацию, неиспользуемые фрагменты не компилируются, кето в данном случае в while. С Arduino IDE + MicroCore (для ATitiny13A) две версии кода работает.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: attiny13 таймер то работает, то нет
СообщениеДобавлено: Вт окт 29, 2024 10:38:38 
Встал на лапы

Зарегистрирован: Чт сен 26, 2019 20:42:21
Сообщений: 141
Рейтинг сообщения: 0
oleg_4rk, какой компилятор? Если включить оптимизацию, неиспользуемые фрагменты не компилируются.


avr-gcc 8.2.0

Компилирую так:

Код:
avr-gcc -DERRMSG_ERR_EXIT_JUST_EXIT -Wall -Wno-main -Os -ggdb -DF_CPU=1200000 -mmcu=attiny13 -I/home/lego/toolchain/arduino/include -I/home/lego/toolchain/arduino/attiny13/include -Wa,-adln=test.c.s -c test.c -o test.o
avr-gcc -Os -mmcu=attiny13 -L/home/lego/toolchain/arduino/attiny13/lib -o test.elf test.o  -larduino


-larduino - это моя либа, где pin_toggle и pin_write.

_________________
Ардуинщик. Не шарю в электронике.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: attiny13 таймер то работает, то нет
СообщениеДобавлено: Вт окт 29, 2024 10:45:09 
Мудрый кот

Карма: 25
Рейтинг сообщений: 486
Зарегистрирован: Сб май 05, 2012 20:24:52
Сообщений: 1786
Откуда: KN34PC, Болгария
Рейтинг сообщения: 0
(Зачем усложнять жизнь программными строками? Мышкой нельзя? :) ).
Первое, что приходит на ум - почистить код от неиспользуемых строк. Но в Ардуино IDE у меня все равно работает. И это дает чуть более высокую частоту (4,5 kHz / 1,2 MHz clock). Т.е. он выполняется быстрее.


Последний раз редактировалось veso74 Вт окт 29, 2024 10:46:40, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: attiny13 таймер то работает, то нет
СообщениеДобавлено: Вт окт 29, 2024 10:50:26 
Друг Кота

Карма: 67
Рейтинг сообщений: 1964
Зарегистрирован: Сб дек 18, 2021 19:25:32
Сообщений: 12867
Рейтинг сообщения: 0
oleg_4rk писал(а):
это моя либа
:facepalm: ты бы хоть говорить научился, прежде, чем программировать.

Добавлено after 4 minutes 12 seconds:
(Зачем усложнять жизнь программными строками? Мышкой нельзя? :)
он же пишет:
Код:
DDRB |= 1;
DDRB |= 2;
DDRB |= 4;

Указывает размер файла прошивки, вместо того, чтобы сравнить листинг ассемблера в отладчике, но использует жаргон, как заправский хакер, какие, нафиг, мыши? :)))
Это просто недалёкий человек, и помогать бессмысленно - он уже испорчен.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: attiny13 таймер то работает, то нет
СообщениеДобавлено: Вт окт 29, 2024 10:55:55 
Друг Кота
Аватар пользователя

Карма: 96
Рейтинг сообщений: 1493
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 15285
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Если работа идёт в среде ардуино IDE под какой -либо "платформой" для 13х тинек следует помнить, что само ядро использует регистры таймера для встроенного функционала.
Почему работать с регистрами Т0 можно только очень внимательно изучив функционирование ядра...
Иначе конфликты в программе неизбежны.
Другое дело Т1или Т2 в "жирных" мерах - те как "системный таймер" ограниченно используются.
Даже в мегах (платформы нано и про-мини) Т0 можно лишь ограниченно использовать под генератор на OCR0A.
Другое дело был бы проект полностью под "чистым" Си и/или ассемблером - там автор вправе всё что угодно делать.
8)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: attiny13 таймер то работает, то нет
СообщениеДобавлено: Вт окт 29, 2024 11:09:26 
Мудрый кот

Карма: 25
Рейтинг сообщений: 486
Зарегистрирован: Сб май 05, 2012 20:24:52
Сообщений: 1786
Откуда: KN34PC, Болгария
Рейтинг сообщения: 0
Аппаратный плагин MicroCore к Arduino IDE для ATtiny13A является прозрачным и общедоступным. Действия внутри понятны. Если он по каким-либо причинам функции там не нужены, то можно заменить на своих. Напр. заметил несколько нестыковок, но в целом очень нравится.

https://github.com/MCUdude/MicroCore

С другими апп. дополнениями Arduino IDE работает практически со всей линейкой ATtiny и ATmega, бесплатно, без установки на компа и с общим "языком" Arduino для записи. Программный код если не 100%, то с небольшими изменениями переносится с МК на МК. Для напр. простых и средних проектов это отличный выбор.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: attiny13 таймер то работает, то нет
СообщениеДобавлено: Вт окт 29, 2024 11:34:09 
Друг Кота
Аватар пользователя

Карма: 96
Рейтинг сообщений: 1493
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 15285
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Для 13й минимум две (и/или более) "платформы" применяется (плюс разные версии платформ) - что у вопрошающего нам таки неизвестно...
Да и чего он там в полной программе намутил - также неведомо.
Так что вполне вероятно "накладки" по использованию железа таймера "имеют место бысть".
Относительно самой тиньки... Там и под ассемблером то "тесновато", чего говорить о начинающем с ардуино СИшнике...
8)
Кстати...
На Т0 системный таймер - а это как минимум delay() millis() micros() delayMicroseconds() референса
Другое дело, если не Micro Core, а DIY ATtiny - там хоть чего то в настройках покрутить можно... и то не факт, что таймер будет "абсолютно свободен".
Это ежли еще каких ошибок в программе не наделано.
:tea: :wink:

Классическая ошибка "начинающего ардуинщика "с претензиями"":
...
Да. Забыл сказать. Тот же самый код с небольшими правками (замена TIM0_COMPA_vect на TIMER0_COMPA_vect, DDRB на DDRD) работает на atmega328p как ожидается.

Нужно хотя бы иногда в документацию МК заглядывать, чтоб понять разницу в ресурсах МК, используемых ядром ардуино IDE!
(один таймер против минимум двух - а функционал референса практически одинаков)
8)

Вобщем еще одно подтверждение правила - не став профессионалом не стоит лезть раньше времени "в дебри", отклоняясь от рамок и правил, определенных в "референсе"...
:(
С другой стороны - профи, хорошо изучившие и GCC СИ/С++, GNUассемблер, "устройство" самой IDE и техдокументацию МК вполне могут с любыми задачами справиться. Но такое - штука очень редкая. Разве что статус "продвинутого пользователя" пока доступен.
8)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: attiny13 таймер то работает, то нет
СообщениеДобавлено: Вт окт 29, 2024 14:26:14 
Встал на лапы

Зарегистрирован: Чт сен 26, 2019 20:42:21
Сообщений: 141
Рейтинг сообщения: -3
(Зачем усложнять жизнь программными строками? Мышкой нельзя? :) ).
Первое, что приходит на ум - почистить код от неиспользуемых строк.


А нет IDE :-). Только vim и xterm. Я почистил. Если чищу дальше, то пропадает глюк :-). Например, если закомментить тело while, то всё норм. Вроде бы ошибка в pin_write(), но там негде ошибиться.

Код:
void
pin_write(uint8_t pin, uint8_t val)
{
        if (!(*pins[pin].type_reg & pins[pin].mask))
                return;
        if (val)
                *pins[pin].out_reg |= pins[pin].mask;
        else
                *pins[pin].out_reg &= ~pins[pin].mask;
}

struct __attribute__((packed)) pin_t {
        volatile uint8_t *type_reg;
        volatile uint8_t *out_reg;
        volatile uint8_t *in_reg;
        uint8_t mask;
};

struct pin_t pins[] = {
        {0, 0, 0, 0},
        {&DDRB, &PORTB, &PINB, 1},
        {&DDRB, &PORTB, &PINB, 2},
        {&DDRB, &PORTB, &PINB, 4},
        {&DDRB, &PORTB, &PINB, 8},
        {&DDRB, &PORTB, &PINB, 16},
        {&DDRB, &PORTB, &PINB, 32}
};

#define PIN_NONE 0
// PB0
#define PIN_D0 1
// PB1
#define PIN_D1 2
// PB2
#define PIN_D2 3
// PB3
#define PIN_D3 4
// PB4
#define PIN_D4 5
// PB5
#define PIN_D5 6
#define PIN_A0 6
#define PIN_A1 3
#define PIN_A2 5
#define PIN_A3 4



Цитата:
Но в Ардуино IDE у меня все равно работает. И это дает чуть более высокую частоту (4,5 kHz / 1,2 MHz clock). Т.е. он выполняется быстрее.


Т.е. один и тот же код, но в arduino IDE быстрее?

Добавлено after 7 minutes 48 seconds:
oleg_4rk писал(а):
это моя либа


:facepalm: ты бы хоть говорить научился, прежде, чем программировать.


Ну вот ты меня ещё будешь учить как говорить. За 20 с хреном лет проф.деятельности как-то без твоих сопливых советов справлялся.

Цитата:
Добавлено after 4 minutes 12 seconds:
(Зачем усложнять жизнь программными строками? Мышкой нельзя? :)
он же пишет:
Код:
DDRB |= 1;
DDRB |= 2;
DDRB |= 4;

Указывает размер файла прошивки, вместо того, чтобы сравнить листинг ассемблера в отладчике, но использует жаргон, как заправский хакер, какие, нафиг, мыши? :)))
Это просто недалёкий человек, и помогать бессмысленно - он уже испорчен.


Ну так и иди мимо. Хули тут забыл?

Добавлено after 1 minute 17 seconds:
Если работа идёт в среде ардуино IDE под какой -либо "платформой" для 13х тинек следует помнить, что само ядро использует регистры таймера для встроенного функционала.
Почему работать с регистрами Т0 можно только очень внимательно изучив функционирование ядра...
Иначе конфликты в программе неизбежны.
Другое дело Т1или Т2 в "жирных" мерах - те как "системный таймер" ограниченно используются.
Даже в мегах (платформы нано и про-мини) Т0 можно лишь ограниченно использовать под генератор на OCR0A.
Другое дело был бы проект полностью под "чистым" Си и/или ассемблером - там автор вправе всё что угодно делать.
8)


arduino ide не используется. Используется avr toolchain (binutils, gcc, avr-libc).

_________________
Ардуинщик. Не шарю в электронике.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: attiny13 таймер то работает, то нет
СообщениеДобавлено: Вт окт 29, 2024 14:38:32 
Мудрый кот

Карма: 25
Рейтинг сообщений: 486
Зарегистрирован: Сб май 05, 2012 20:24:52
Сообщений: 1786
Откуда: KN34PC, Болгария
Рейтинг сообщения: 0
Т.е. один и тот же код, но в arduino IDE быстрее?

Нет :). Опримизатор вкл. на макс.
А в текстовой строке не знаю, что включено, что нет. Это как вернуться на напр. 20 лет назад :). Но если нравится, используйте.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: attiny13 таймер то работает, то нет
СообщениеДобавлено: Вт окт 29, 2024 15:01:41 
Встал на лапы

Зарегистрирован: Чт сен 26, 2019 20:42:21
Сообщений: 141
Рейтинг сообщения: 0
Для 13й минимум две (и/или более) "платформы" применяется (плюс разные версии платформ) - что у вопрошающего нам таки неизвестно...


На это выше ответил - avr toolchain: gcc + avr-libc.

Цитата:
Да и чего он там в полной программе намутил - также неведомо.


А какая разница, если в этом куске, где выкинуто всё, ну разве что кроме pin_toggle() и pin_write(), уже есть странное поведение.
Может быть дело как раз в pin_write() и есть. Но не понятно, почему при подстановке вместо pin_toggle() его тела, глюк пропадает.
Я где-то что-то делаю не так. Но хз где.

Цитата:
Относительно самой тиньки... Там и под ассемблером то "тесновато"


Да. Но и задача там не весь какая. По размеру вписываюсь. Если, конечно, 1KB это реально доступный мне размер, а не 1KB-СЕРВИСНЫЙ_КОД какой-то.

Цитата:
Классическая ошибка "начинающего ардуинщика "с претензиями"":


Где здесь претензии :-)?

Цитата:
...
Да. Забыл сказать. Тот же самый код с небольшими правками (замена TIM0_COMPA_vect на TIMER0_COMPA_vect, DDRB на DDRD) работает на atmega328p как ожидается.

Нужно хотя бы иногда в документацию МК заглядывать, чтоб понять разницу в ресурсах МК, используемых ядром ардуино IDE!
(один таймер против минимум двух - а функционал референса практически одинаков)
8)


Блин, BOB, я понимаю, что пиздеть не мешки ворочать, но ты что по делу-то сказать хотел? При чём здесь это? Разница есть и много в чём, но таймеры нулевые и там и там одинаковые, размера мне хватает, пины я использую одинаковые. ЧТо ещё?

Цитата:
Вобщем еще одно подтверждение правила - не став профессионалом не стоит лезть раньше времени "в дебри", отклоняясь от рамок и правил, определенных в "референсе"...
:(


BOB, филосов из тебя так себе, если честно. Профессионалами и становятся, собирая грабли в дебрях там-сям. А если сидеть в понятном newbie-мелководье, то никогда профессионалом не стать. Но это к делу не относится.

Добавлено after 4 minutes 45 seconds:
Т.е. один и тот же код, но в arduino IDE быстрее?

Нет :). Опримизатор вкл. на макс.
А в текстовой строке не знаю, что включено, что нет.


У меня только на размер оптимизация, которую, вроде бы, рекомендует автор avr-libc - -Os.

Цитата:
Это как вернуться на напр. 20 лет назад :). Но если нравится, используйте.


Я просто использую то, к чему привык и что удобно. Makefile - удобно.

Добавлено after 14 minutes 33 seconds:
Попробовал закинуть код pin_toggle() и pin_write() в программу и собирал без libarduino своей. И всё работает норм. КОд такой вышел:

Код:
//#include <arduino.h>
#include <avr/io.h>
#include <avr/interrupt.h>


#if 1
#define PIN_NONE 0
// PB0
#define PIN_D0 1
// PB1
#define PIN_D1 2
// PB2
#define PIN_D2 3
// PB3
#define PIN_D3 4
// PB4
#define PIN_D4 5
// PB5
#define PIN_D5 6
#define PIN_A0 6
#define PIN_A1 3
#define PIN_A2 5
#define PIN_A3 4


struct __attribute__((packed)) pin_t {
        volatile uint8_t *type_reg;
        volatile uint8_t *out_reg;
        volatile uint8_t *in_reg;
        uint8_t mask;
};

struct pin_t pins[] = {
        {0, 0, 0, 0},
        {&DDRB, &PORTB, &PINB, 1},
        {&DDRB, &PORTB, &PINB, 2},
        {&DDRB, &PORTB, &PINB, 4},
        {&DDRB, &PORTB, &PINB, 8},
        {&DDRB, &PORTB, &PINB, 16},
        {&DDRB, &PORTB, &PINB, 32}
};


void
pin_write(uint8_t pin, uint8_t val)
{
        if (!(*pins[pin].type_reg & pins[pin].mask))
                return;
        if (val)
                *pins[pin].out_reg |= pins[pin].mask;
        else
                *pins[pin].out_reg &= ~pins[pin].mask;
}

void
pin_toggle(uint8_t pin)
{
        *pins[pin].out_reg ^= pins[pin].mask;
}
#endif

volatile uint16_t tmr_cnt = 0;
volatile uint8_t pwm_width = 0;
uint8_t pwm_width_on = 11, pwm_width_off = 8;


ISR(TIM0_COMPA_vect)
{
        tmr_cnt++;
        pin_toggle(PIN_D0);
}

void
main(void)
{
        DDRB |= 1;
        DDRB |= 2;
        DDRB |= 4;

        TCCR0B &= ~(1 << WGM02);
        TCCR0A &= ~((1 << WGM01) | (1 << WGM00));
        TCCR0A |= 2 << WGM00;
        TCCR0A &= ~((1 << COM0A1) | (1 << COM0A0));
        TCCR0A |= 0 << COM0A0;
        TCCR0B &= ~(3 << CS00);
        TCCR0B |= 2 << CS00;
        TIMSK0 &= ~(3 << TOIE0);
        TIMSK0 |= 2 << TOIE0;
        // ~100us
        OCR0A = 15;
        sei();
        while (1) {
                if (pwm_width > pwm_width_on)
                        pin_write(PIN_D2, 1);
                else if (pwm_width < pwm_width_off)
                        pin_write(PIN_D2, 0);
        }
}


_________________
Ардуинщик. Не шарю в электронике.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: attiny13 таймер то работает, то нет
СообщениеДобавлено: Вт окт 29, 2024 15:05:55 
Друг Кота
Аватар пользователя

Карма: 96
Рейтинг сообщений: 1493
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 15285
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Оригинальный садомазохизм однако...
Работать с АВР GCC не непосредственно, а "через ардуино"...
Это из категории " Создадим трудности, чтоб потом их героически преодолевать"
:facepalm:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: attiny13 таймер то работает, то нет
СообщениеДобавлено: Вт окт 29, 2024 15:19:09 
Встал на лапы

Зарегистрирован: Чт сен 26, 2019 20:42:21
Сообщений: 141
Рейтинг сообщения: 0
Оригинальный садомазохизм однако...
Работать с АВР GCC не непосредственно, а "через ардуино"...
Это из категории " Создадим трудности, чтоб потом их героически преодолевать"
:facepalm:


BOB, бля. Да хватит нюхать канифоль! Где ты здесь arduino увидел? Это моя либа. Я её так назвал, потому что хотелось. Ты хоть бы внимательно смотрел. Нет в arduino pin_write(), там digitalWrite(). Знаток, ты херов, блин.

У меня какая-то хрень творится с линковкой библиотеки. КОгда с ней линкуется, то глючит. Есть что по делу сказать? Идеи?

Добавлено after 7 minutes 3 seconds:
Выбросил из libarduino всё лишее, оставил только pin_*():
Код:
$ nm   ~/toolchain/arduino/attiny13/lib/libarduino.a

pin.o:
0000003d a __SP_L__
0000003f a __SREG__
         U __mulhi3
00000000 a __tmp_reg__
00000001 a __zero_reg__
0000010e T pin_get_spec
0000008c T pin_mode
0000006c T pin_read
00000046 T pin_toggle
00000000 T pin_write
         U pins

pins.o:
0000003d a __SP_L__
0000003f a __SREG__
         U __do_copy_data
00000000 a __tmp_reg__
00000001 a __zero_reg__
00000000 D pins


И не пашет :-).

_________________
Ардуинщик. Не шарю в электронике.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: attiny13 таймер то работает, то нет
СообщениеДобавлено: Вт окт 29, 2024 15:27:59 
Друг Кота
Аватар пользователя

Карма: 96
Рейтинг сообщений: 1493
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 15285
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Славно протроллено...
Сразу бы так и сказал -
библиотеки самодельные, ничего общего кроме использования названия не имеют.
Тогда и соответствующие спецы может ответят.
Ежли сочтут возможным.
:sleep:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: attiny13 таймер то работает, то нет
СообщениеДобавлено: Вт окт 29, 2024 15:34:25 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1432
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4593
Откуда: Планета Земля
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Эт, конечно, жесть :facepalm:
Но, за темой последим, повеселимся ... :hunger:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: attiny13 таймер то работает, то нет
СообщениеДобавлено: Вт окт 29, 2024 16:18:03 
Встал на лапы

Зарегистрирован: Чт сен 26, 2019 20:42:21
Сообщений: 141
Рейтинг сообщения: 0
Славно протроллено...


Я тебя умоляю. Никто никого не троллил. Вы чего-то понапридумывали того, чего нет. Смотрите по диагонали, зато выёбываетесь основательно и не к месту.

Ранее, я обманул всех, похоже. Когда всё закидываю в исходник, то нифига не нормально выходит. А получается вот такая картина интересная - Изображение

Если из pin_write() выкидываю первый if и получается вот так:

Код:
void
pin_write(uint8_t pin, uint8_t val)
{
//        if (!(*pins[pin].type_reg & pins[pin].mask))
//                return;
        if (val)
                *pins[pin].out_reg |= pins[pin].mask;
        else
                *pins[pin].out_reg &= ~pins[pin].mask;
}


То работают нормально все варианты. Теперь вопрос, разве доступ к DDR* на чтение что-то меняет?

Добавлено after 15 minutes 59 seconds:
В спеке на attiny13 в разделе I/O Ports не нашёл ничего особенного про чтение из DDRB. Чё-т с ассемблерным кодом возможно в компиляторе.

Добавлено after 7 minutes 29 seconds:
Вот так выглядит в ассемблере этот if внутри pin_write():

Код:
6:pin.c         ****         if (!(*pins[pin].type_reg & pins[pin].mask))
  29                            .loc 1 6 2 is_stmt 1 view .LVU2
  30                            .loc 1 6 18 is_stmt 0 view .LVU3
  31 0006 E82F                  mov r30,r24
  32 0008 F0E0                  ldi r31,0
  33 000a CF01                  movw r24,r30
  34                    .LVL1:
  35                            .loc 1 6 18 view .LVU4
  36 000c 67E0                  ldi r22,lo8(7)
  37 000e 70E0                  ldi r23,0
  38                    .LVL2:
  39                            .loc 1 6 18 view .LVU5
  40 0010 00D0                  rcall __mulhi3
  41 0012 DC01                  movw r26,r24
  42 0014 A050                  subi r26,lo8(-(pins))
  43 0016 B040                  sbci r27,hi8(-(pins))
  44 0018 CD91                  ld r28,X+
  45 001a DC91                  ld r29,X
  46 001c 1197                  sbiw r26,1
  47                            .loc 1 6 8 view .LVU6
  48 001e 9881                  ld r25,Y
  49                            .loc 1 6 39 view .LVU7
  50 0020 1696                  adiw r26,6
  51 0022 2C91                  ld r18,X
  52 0024 1697                  sbiw r26,6
  53                            .loc 1 6 6 view .LVU8
  54 0026 9223                  and r25,r18
  55                            .loc 1 6 5 view .LVU9
  56 0028 01F0                  breq .L1
   7:pin.c         ****                 return;


Вложения:
screenshot.png [12.47 KiB]
Скачиваний: 231

_________________
Ардуинщик. Не шарю в электронике.
Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 102 ]  1, , , , ,  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 26


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y