attiny13 таймер то работает, то нет

Обсуждаем контроллеры компании Atmel.
oleg_4rk
Встал на лапы
Сообщения: 141
Зарегистрирован: Чт сен 26, 2019 20:42:21

attiny13 таймер то работает, то нет

Сообщение oleg_4rk »

Всем привет.

Странная проблема с таймером на 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 КБ) 479 скачиваний
while_wob.png
(44.01 КБ) 471 скачивание
Ардуинщик. Не шарю в электронике.
Реклама
OKF
Это не хвост, это антенна
Сообщения: 1393
Зарегистрирован: Вт июн 07, 2011 08:03:18

Re: attiny13 таймер то работает, то нет

Сообщение OKF »

То вы работаете напрямую с регистрами, то через Ардуино функции... Причём не говорите какое ядро используете. Не странно ли?
Так и работайте с пинами напрямую. И уберите всё лишнее. А то тут смотрите, тут не смотрите, а тут мы рыбу заворачивали.
И зачем вы дрочите DDR и TCCR0? Одним присвоением не можете настроить каждый? Или что бы другим было приятно в вашей галиматне разбираться?
Реклама
oleg_4rk
Встал на лапы
Сообщения: 141
Зарегистрирован: Чт сен 26, 2019 20:42:21

Re: attiny13 таймер то работает, то нет

Сообщение oleg_4rk »

[uquote="OKF",url="/forum/viewtopic.php?p=4641984#p4641984"]И зачем вы дрочите DDR и TCCR0? Одним присвоением не можете настроить каждый? Или что бы другим было приятно в вашей галиматне разбираться?[/uquote]

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

Добавлено 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 как ожидается.
Ардуинщик. Не шарю в электронике.
OKF
Это не хвост, это антенна
Сообщения: 1393
Зарегистрирован: Вт июн 07, 2011 08:03:18

Re: attiny13 таймер то работает, то нет

Сообщение OKF »

Удачи!
Реклама
Эиком - электронные компоненты и радиодетали
oleg_4rk
Встал на лапы
Сообщения: 141
Зарегистрирован: Чт сен 26, 2019 20:42:21

Re: attiny13 таймер то работает, то нет

Сообщение oleg_4rk »

[uquote="OKF",url="/forum/viewtopic.php?p=4642043#p4642043"]Удачи![/uquote]

Пока-пока. Первый раз вижу хама, который обижается на грубость.
Ардуинщик. Не шарю в электронике.
Реклама
veso74
Поставщик валерьянки для Кота
Сообщения: 1907
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

Re: attiny13 таймер то работает, то нет

Сообщение veso74 »

oleg_4rk, какой компилятор? Если включить оптимизацию, неиспользуемые фрагменты не компилируются, кето в данном случае в while. С Arduino IDE + MicroCore (для ATitiny13A) две версии кода работает.
Реклама
oleg_4rk
Встал на лапы
Сообщения: 141
Зарегистрирован: Чт сен 26, 2019 20:42:21

Re: attiny13 таймер то работает, то нет

Сообщение oleg_4rk »

[uquote="veso74",url="/forum/viewtopic.php?p=4642175#p4642175"]oleg_4rk, какой компилятор? Если включить оптимизацию, неиспользуемые фрагменты не компилируются.[/uquote]

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.
Ардуинщик. Не шарю в электронике.
veso74
Поставщик валерьянки для Кота
Сообщения: 1907
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

Re: attiny13 таймер то работает, то нет

Сообщение veso74 »

(Зачем усложнять жизнь программными строками? Мышкой нельзя? :) ).
Первое, что приходит на ум - почистить код от неиспользуемых строк. Но в Ардуино IDE у меня все равно работает. И это дает чуть более высокую частоту (4,5 kHz / 1,2 MHz clock). Т.е. он выполняется быстрее.
Последний раз редактировалось veso74 Вт окт 29, 2024 10:46:40, всего редактировалось 1 раз.
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

Re: attiny13 таймер то работает, то нет

Сообщение Martian »

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

Добавлено after 4 minutes 12 seconds:
[uquote="veso74",url="/forum/viewtopic.php?p=4642181#p4642181"](Зачем усложнять жизнь программными строками? Мышкой нельзя? :)[/uquote] он же пишет:

Код: Выделить всё

DDRB |= 1;
DDRB |= 2;
DDRB |= 4;
Указывает размер файла прошивки, вместо того, чтобы сравнить листинг ассемблера в отладчике, но использует жаргон, как заправский хакер, какие, нафиг, мыши? :)))
Это просто недалёкий человек, и помогать бессмысленно - он уже испорчен.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15570
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: attiny13 таймер то работает, то нет

Сообщение BOB51 »

Если работа идёт в среде ардуино IDE под какой -либо "платформой" для 13х тинек следует помнить, что само ядро использует регистры таймера для встроенного функционала.
Почему работать с регистрами Т0 можно только очень внимательно изучив функционирование ядра...
Иначе конфликты в программе неизбежны.
Другое дело Т1или Т2 в "жирных" мерах - те как "системный таймер" ограниченно используются.
Даже в мегах (платформы нано и про-мини) Т0 можно лишь ограниченно использовать под генератор на OCR0A.
Другое дело был бы проект полностью под "чистым" Си и/или ассемблером - там автор вправе всё что угодно делать.
8)
veso74
Поставщик валерьянки для Кота
Сообщения: 1907
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

Re: attiny13 таймер то работает, то нет

Сообщение veso74 »

Аппаратный плагин MicroCore к Arduino IDE для ATtiny13A является прозрачным и общедоступным. Действия внутри понятны. Если он по каким-либо причинам функции там не нужены, то можно заменить на своих. Напр. заметил несколько нестыковок, но в целом очень нравится.

https://github.com/MCUdude/MicroCore

С другими апп. дополнениями Arduino IDE работает практически со всей линейкой ATtiny и ATmega, бесплатно, без установки на компа и с общим "языком" Arduino для записи. Программный код если не 100%, то с небольшими изменениями переносится с МК на МК. Для напр. простых и средних проектов это отличный выбор.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15570
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: attiny13 таймер то работает, то нет

Сообщение BOB51 »

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

Классическая ошибка "начинающего ардуинщика "с претензиями"":
[uquote="oleg_4rk",url="/forum/viewtopic.php?p=4641995#p4641995"]...
Да. Забыл сказать. Тот же самый код с небольшими правками (замена TIM0_COMPA_vect на TIMER0_COMPA_vect, DDRB на DDRD) работает на atmega328p как ожидается.[/uquote]
Нужно хотя бы иногда в документацию МК заглядывать, чтоб понять разницу в ресурсах МК, используемых ядром ардуино IDE!
(один таймер против минимум двух - а функционал референса практически одинаков)
8)

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

Re: attiny13 таймер то работает, то нет

Сообщение oleg_4rk »

[uquote="veso74",url="/forum/viewtopic.php?p=4642181#p4642181"](Зачем усложнять жизнь программными строками? Мышкой нельзя? :) ).
Первое, что приходит на ум - почистить код от неиспользуемых строк.[/uquote]

А нет 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:
[uquote="Martian",url="/forum/viewtopic.php?p=4642182#p4642182"]
oleg_4rk писал(а):это моя либа
:facepalm: ты бы хоть говорить научился, прежде, чем программировать.[/uquote]

Ну вот ты меня ещё будешь учить как говорить. За 20 с хреном лет проф.деятельности как-то без твоих сопливых советов справлялся.
Добавлено after 4 minutes 12 seconds:
[uquote="veso74",url="/forum/viewtopic.php?p=4642181#p4642181"](Зачем усложнять жизнь программными строками? Мышкой нельзя? :)[/uquote] он же пишет:

Код: Выделить всё

DDRB |= 1;
DDRB |= 2;
DDRB |= 4;
Указывает размер файла прошивки, вместо того, чтобы сравнить листинг ассемблера в отладчике, но использует жаргон, как заправский хакер, какие, нафиг, мыши? :)))
Это просто недалёкий человек, и помогать бессмысленно - он уже испорчен.
Ну так и иди мимо. Хули тут забыл?

Добавлено after 1 minute 17 seconds:
[uquote="BOB51",url="/forum/viewtopic.php?p=4642187#p4642187"]Если работа идёт в среде ардуино IDE под какой -либо "платформой" для 13х тинек следует помнить, что само ядро использует регистры таймера для встроенного функционала.
Почему работать с регистрами Т0 можно только очень внимательно изучив функционирование ядра...
Иначе конфликты в программе неизбежны.
Другое дело Т1или Т2 в "жирных" мерах - те как "системный таймер" ограниченно используются.
Даже в мегах (платформы нано и про-мини) Т0 можно лишь ограниченно использовать под генератор на OCR0A.
Другое дело был бы проект полностью под "чистым" Си и/или ассемблером - там автор вправе всё что угодно делать.
8)[/uquote]

arduino ide не используется. Используется avr toolchain (binutils, gcc, avr-libc).
Ардуинщик. Не шарю в электронике.
veso74
Поставщик валерьянки для Кота
Сообщения: 1907
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

Re: attiny13 таймер то работает, то нет

Сообщение veso74 »

[uquote="oleg_4rk",url="/forum/viewtopic.php?p=4642271#p4642271"]Т.е. один и тот же код, но в arduino IDE быстрее?[/uquote]
Нет :). Опримизатор вкл. на макс.
А в текстовой строке не знаю, что включено, что нет. Это как вернуться на напр. 20 лет назад :). Но если нравится, используйте.
oleg_4rk
Встал на лапы
Сообщения: 141
Зарегистрирован: Чт сен 26, 2019 20:42:21

Re: attiny13 таймер то работает, то нет

Сообщение oleg_4rk »

[uquote="BOB51",url="/forum/viewtopic.php?p=4642199#p4642199"]Для 13й минимум две (и/или более) "платформы" применяется (плюс разные версии платформ) - что у вопрошающего нам таки неизвестно...[/uquote]

На это выше ответил - avr toolchain: gcc + avr-libc.
Да и чего он там в полной программе намутил - также неведомо.
А какая разница, если в этом куске, где выкинуто всё, ну разве что кроме pin_toggle() и pin_write(), уже есть странное поведение.
Может быть дело как раз в pin_write() и есть. Но не понятно, почему при подстановке вместо pin_toggle() его тела, глюк пропадает.
Я где-то что-то делаю не так. Но хз где.
Относительно самой тиньки... Там и под ассемблером то "тесновато"
Да. Но и задача там не весь какая. По размеру вписываюсь. Если, конечно, 1KB это реально доступный мне размер, а не 1KB-СЕРВИСНЫЙ_КОД какой-то.
Классическая ошибка "начинающего ардуинщика "с претензиями"":
Где здесь претензии :-)?
[uquote="oleg_4rk",url="/forum/viewtopic.php?p=4641995#p4641995"]...
Да. Забыл сказать. Тот же самый код с небольшими правками (замена TIM0_COMPA_vect на TIMER0_COMPA_vect, DDRB на DDRD) работает на atmega328p как ожидается.[/uquote]
Нужно хотя бы иногда в документацию МК заглядывать, чтоб понять разницу в ресурсах МК, используемых ядром ардуино IDE!
(один таймер против минимум двух - а функционал референса практически одинаков)
8)
Блин, BOB, я понимаю, что пиздеть не мешки ворочать, но ты что по делу-то сказать хотел? При чём здесь это? Разница есть и много в чём, но таймеры нулевые и там и там одинаковые, размера мне хватает, пины я использую одинаковые. ЧТо ещё?
Вобщем еще одно подтверждение правила - не став профессионалом не стоит лезть раньше времени "в дебри", отклоняясь от рамок и правил, определенных в "референсе"...
:(
BOB, филосов из тебя так себе, если честно. Профессионалами и становятся, собирая грабли в дебрях там-сям. А если сидеть в понятном newbie-мелководье, то никогда профессионалом не стать. Но это к делу не относится.

Добавлено after 4 minutes 45 seconds:
[uquote="veso74",url="/forum/viewtopic.php?p=4642285#p4642285"][uquote="oleg_4rk",url="/forum/viewtopic.php?p=4642271#p4642271"]Т.е. один и тот же код, но в arduino IDE быстрее?[/uquote]
Нет :). Опримизатор вкл. на макс.
А в текстовой строке не знаю, что включено, что нет.[/uquote]

У меня только на размер оптимизация, которую, вроде бы, рекомендует автор 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);
        }
}

Ардуинщик. Не шарю в электронике.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15570
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: attiny13 таймер то работает, то нет

Сообщение BOB51 »

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

Re: attiny13 таймер то работает, то нет

Сообщение oleg_4rk »

[uquote="BOB51",url="/forum/viewtopic.php?p=4642294#p4642294"]Оригинальный садомазохизм однако...
Работать с АВР GCC не непосредственно, а "через ардуино"...
Это из категории " Создадим трудности, чтоб потом их героически преодолевать"
:facepalm:[/uquote]

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
И не пашет :-).
Ардуинщик. Не шарю в электронике.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15570
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: attiny13 таймер то работает, то нет

Сообщение BOB51 »

Славно протроллено...
Сразу бы так и сказал -
библиотеки самодельные, ничего общего кроме использования названия не имеют.
Тогда и соответствующие спецы может ответят.
Ежли сочтут возможным.
:sleep:
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: attiny13 таймер то работает, то нет

Сообщение Аlex »

Эт, конечно, жесть :facepalm:
Но, за темой последим, повеселимся ... :hunger:
oleg_4rk
Встал на лапы
Сообщения: 141
Зарегистрирован: Чт сен 26, 2019 20:42:21

Re: attiny13 таймер то работает, то нет

Сообщение oleg_4rk »

[uquote="BOB51",url="/forum/viewtopic.php?p=4642306#p4642306"]Славно протроллено...[/uquote]

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

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

Если из 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 КБ) 280 скачиваний
Ардуинщик. Не шарю в электронике.
Ответить

Вернуться в «AVR»