Работает норм. На тело while не обращайте внимания. Смысла в нём нет - это кусок изначального проекта, в котором всплыло это странное поведение. Размер hex'а 760 байт.
Всё перестаёт работать . Это странно, т.к. пины даже разные. Размер этого hex 770 байт.
Картинка сигнала для первого кода - Картинка сигнала для второго кода -
Размер флеш-памяти не превышен. Размер данных тоже( 55 и 53 байт). Пины разные. Как одно влияет на другое не понятно. Может кто в курсе, что за фигня?
Добавлено after 6 minutes 12 seconds: При этом, если во втором варианте заменить в while:
Код:
pin_write(PIN_D2, 1);
на
Код:
PORTB |= 4;
то тоже всё норм становится. Но это бред какой-то, т.к. тело if вообще не должно срабатывать, т.к. pwm_width в программе всегда 0 и не может стать больше 11.
То вы работаете напрямую с регистрами, то через Ардуино функции... Причём не говорите какое ядро используете. Не странно ли? Так и работайте с пинами напрямую. И уберите всё лишнее. А то тут смотрите, тут не смотрите, а тут мы рыбу заворачивали. И зачем вы дрочите DDR и TCCR0? Одним присвоением не можете настроить каждый? Или что бы другим было приятно в вашей галиматне разбираться?
Добавлено after 14 minutes 48 seconds: Да. Забыл сказать. Тот же самый код с небольшими правками (замена TIM0_COMPA_vect на TIMER0_COMPA_vect, DDRB на DDRD) работает на atmega328p как ожидается.
_________________ Ардуинщик. Не шарю в электронике.
oleg_4rk, какой компилятор? Если включить оптимизацию, неиспользуемые фрагменты не компилируются, кето в данном случае в while. С Arduino IDE + MicroCore (для ATitiny13A) две версии кода работает.
(Зачем усложнять жизнь программными строками? Мышкой нельзя? ). Первое, что приходит на ум - почистить код от неиспользуемых строк. Но в Ардуино IDE у меня все равно работает. И это дает чуть более высокую частоту (4,5 kHz / 1,2 MHz clock). Т.е. он выполняется быстрее.
Последний раз редактировалось veso74 Вт окт 29, 2024 10:46:40, всего редактировалось 1 раз.
(Зачем усложнять жизнь программными строками? Мышкой нельзя?
он же пишет:
Код:
DDRB |= 1; DDRB |= 2; DDRB |= 4;
Указывает размер файла прошивки, вместо того, чтобы сравнить листинг ассемблера в отладчике, но использует жаргон, как заправский хакер, какие, нафиг, мыши? Это просто недалёкий человек, и помогать бессмысленно - он уже испорчен.
Если работа идёт в среде ардуино IDE под какой -либо "платформой" для 13х тинек следует помнить, что само ядро использует регистры таймера для встроенного функционала. Почему работать с регистрами Т0 можно только очень внимательно изучив функционирование ядра... Иначе конфликты в программе неизбежны. Другое дело Т1или Т2 в "жирных" мерах - те как "системный таймер" ограниченно используются. Даже в мегах (платформы нано и про-мини) Т0 можно лишь ограниченно использовать под генератор на OCR0A. Другое дело был бы проект полностью под "чистым" Си и/или ассемблером - там автор вправе всё что угодно делать.
Аппаратный плагин MicroCore к Arduino IDE для ATtiny13A является прозрачным и общедоступным. Действия внутри понятны. Если он по каким-либо причинам функции там не нужены, то можно заменить на своих. Напр. заметил несколько нестыковок, но в целом очень нравится.
С другими апп. дополнениями Arduino IDE работает практически со всей линейкой ATtiny и ATmega, бесплатно, без установки на компа и с общим "языком" Arduino для записи. Программный код если не 100%, то с небольшими изменениями переносится с МК на МК. Для напр. простых и средних проектов это отличный выбор.
Для 13й минимум две (и/или более) "платформы" применяется (плюс разные версии платформ) - что у вопрошающего нам таки неизвестно... Да и чего он там в полной программе намутил - также неведомо. Так что вполне вероятно "накладки" по использованию железа таймера "имеют место бысть". Относительно самой тиньки... Там и под ассемблером то "тесновато", чего говорить о начинающем с ардуино СИшнике... Кстати... На Т0 системный таймер - а это как минимум delay() millis() micros() delayMicroseconds() референса Другое дело, если не Micro Core, а DIY ATtiny - там хоть чего то в настройках покрутить можно... и то не факт, что таймер будет "абсолютно свободен". Это ежли еще каких ошибок в программе не наделано.
... Да. Забыл сказать. Тот же самый код с небольшими правками (замена TIM0_COMPA_vect на TIMER0_COMPA_vect, DDRB на DDRD) работает на atmega328p как ожидается.
Нужно хотя бы иногда в документацию МК заглядывать, чтоб понять разницу в ресурсах МК, используемых ядром ардуино IDE! (один таймер против минимум двух - а функционал референса практически одинаков)
Вобщем еще одно подтверждение правила - не став профессионалом не стоит лезть раньше времени "в дебри", отклоняясь от рамок и правил, определенных в "референсе"... С другой стороны - профи, хорошо изучившие и GCC СИ/С++, GNUассемблер, "устройство" самой IDE и техдокументацию МК вполне могут с любыми задачами справиться. Но такое - штука очень редкая. Разве что статус "продвинутого пользователя" пока доступен.
(Зачем усложнять жизнь программными строками? Мышкой нельзя? ). Первое, что приходит на ум - почистить код от неиспользуемых строк.
А нет IDE . Только vim и xterm. Я почистил. Если чищу дальше, то пропадает глюк . Например, если закомментить тело while, то всё норм. Вроде бы ошибка в pin_write(), но там негде ошибиться.
(Зачем усложнять жизнь программными строками? Мышкой нельзя?
он же пишет:
Код:
DDRB |= 1; DDRB |= 2; DDRB |= 4;
Указывает размер файла прошивки, вместо того, чтобы сравнить листинг ассемблера в отладчике, но использует жаргон, как заправский хакер, какие, нафиг, мыши? Это просто недалёкий человек, и помогать бессмысленно - он уже испорчен.
Если работа идёт в среде ардуино IDE под какой -либо "платформой" для 13х тинек следует помнить, что само ядро использует регистры таймера для встроенного функционала. Почему работать с регистрами Т0 можно только очень внимательно изучив функционирование ядра... Иначе конфликты в программе неизбежны. Другое дело Т1или Т2 в "жирных" мерах - те как "системный таймер" ограниченно используются. Даже в мегах (платформы нано и про-мини) Т0 можно лишь ограниченно использовать под генератор на OCR0A. Другое дело был бы проект полностью под "чистым" Си и/или ассемблером - там автор вправе всё что угодно делать.
arduino ide не используется. Используется avr toolchain (binutils, gcc, avr-libc).
_________________ Ардуинщик. Не шарю в электронике.
Нет . Опримизатор вкл. на макс. А в текстовой строке не знаю, что включено, что нет. Это как вернуться на напр. 20 лет назад . Но если нравится, используйте.
Для 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! (один таймер против минимум двух - а функционал референса практически одинаков)
Блин, BOB, я понимаю, что пиздеть не мешки ворочать, но ты что по делу-то сказать хотел? При чём здесь это? Разница есть и много в чём, но таймеры нулевые и там и там одинаковые, размера мне хватает, пины я использую одинаковые. ЧТо ещё?
Цитата:
Вобщем еще одно подтверждение правила - не став профессионалом не стоит лезть раньше времени "в дебри", отклоняясь от рамок и правил, определенных в "референсе"...
BOB, филосов из тебя так себе, если честно. Профессионалами и становятся, собирая грабли в дебрях там-сям. А если сидеть в понятном newbie-мелководье, то никогда профессионалом не стать. Но это к делу не относится.
Нет . Опримизатор вкл. на макс. А в текстовой строке не знаю, что включено, что нет.
У меня только на размер оптимизация, которую, вроде бы, рекомендует автор avr-libc - -Os.
Цитата:
Это как вернуться на напр. 20 лет назад . Но если нравится, используйте.
Я просто использую то, к чему привык и что удобно. Makefile - удобно.
Добавлено after 14 minutes 33 seconds: Попробовал закинуть код pin_toggle() и pin_write() в программу и собирал без libarduino своей. И всё работает норм. КОд такой вышел:
Оригинальный садомазохизм однако... Работать с АВР GCC не непосредственно, а "через ардуино"... Это из категории " Создадим трудности, чтоб потом их героически преодолевать"
Оригинальный садомазохизм однако... Работать с АВР GCC не непосредственно, а "через ардуино"... Это из категории " Создадим трудности, чтоб потом их героически преодолевать"
BOB, бля. Да хватит нюхать канифоль! Где ты здесь arduino увидел? Это моя либа. Я её так назвал, потому что хотелось. Ты хоть бы внимательно смотрел. Нет в arduino pin_write(), там digitalWrite(). Знаток, ты херов, блин.
У меня какая-то хрень творится с линковкой библиотеки. КОгда с ней линкуется, то глючит. Есть что по делу сказать? Идеи?
Добавлено after 7 minutes 3 seconds: Выбросил из libarduino всё лишее, оставил только pin_*():
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
И не пашет .
_________________ Ардуинщик. Не шарю в электронике.
Славно протроллено... Сразу бы так и сказал - библиотеки самодельные, ничего общего кроме использования названия не имеют. Тогда и соответствующие спецы может ответят. Ежли сочтут возможным.
То работают нормально все варианты. Теперь вопрос, разве доступ к DDR* на чтение что-то меняет?
Добавлено after 15 minutes 59 seconds: В спеке на attiny13 в разделе I/O Ports не нашёл ничего особенного про чтение из DDRB. Чё-т с ассемблерным кодом возможно в компиляторе.
Добавлено after 7 minutes 29 seconds: Вот так выглядит в ассемблере этот if внутри pin_write():
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 26
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения