Ostroukhov1991 0 16 декабря, 2022 Опубликовано 16 декабря, 2022 (изменено) · Жалоба Народ помогите. На плате установлен камушек atmega16a-au запитанный от 3.3в. Фьюзами выставил 8Мгц, вочдог выключил. Делаю в цикле while постоянную дрыготню ногой, осциллограф показывает 1.2...1.3 мгц. Когда запускаю timer1 настроенный на 44кгц, осциллограф выдает 13кгц. В чем прикол? Неужели на 3.3в данный камень не способен выйти на 8Мгц? Если у кого-нибудь есть примеры кода под работу с ним в AVR Studio буду благодарен. Изменено 16 декабря, 2022 пользователем Ostroukhov1991 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
v05 1 17 декабря, 2022 Опубликовано 17 декабря, 2022 · Жалоба Где именно видим 1.2мгц? Ну и код желательно бы видеть, как вы там дрыгаете. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ostroukhov1991 0 17 декабря, 2022 Опубликовано 17 декабря, 2022 · Жалоба Так, кажется есть подозренте на tp4056. В общем в схему временно не установлен АКБ и идет внешнее питание через порт заряда. Видимо ТР работает какимито пульсациями не видя встречного напряжения от АКБ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ostroukhov1991 0 17 декабря, 2022 Опубликовано 17 декабря, 2022 (изменено) · Жалоба Подпаял АКБ, глобально ничего не изменилось. Осцилл показывает 1.25 Мгц на ноге МК Код пишу в AVR Studio 5, оптимизация по умолчанию -О1. Шью через PROGISP V1.72 через USBisp v2 #define F_CPU 8000000UL #include <avr/io.h> #include <avr/interrupt.h> int main(void){ asm("cli"); WDTCR = (1<<WDTOE)|(1<<WDE); WDTCR = 0x00; IO_Config(1); asm("sei"); DDRB |= (1<<PB5); while(1){ PORTB |= (1<<PB5); PORTB &= ~(1<<PB5); } } Изменено 18 декабря, 2022 пользователем haker_fox Для оформления кода есть кнопка <>. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
krux 8 17 декабря, 2022 Опубликовано 17 декабря, 2022 · Жалоба On 12/17/2022 at 9:59 AM, Ostroukhov1991 said: while(1){ PORTB |= (1<<PB5); PORTB &= ~(1<<PB5); } PB5 операция чтения константы (адреса IO) из флеша 1<<PB5 операция сдвига PORTB |= операция чтения + операция записи с чего бы ногодрыг работал на 8 МГц??? вы написали 4 операции (такта) в первой команде и 4 операции в второй. плюс операция безусловного перехода в начало, это еще 1 такт 8 делим на 5 получаем 1,6, Плюс к тому у IO есть собственное время срабатывания, и не всегда можно оперативно вычитать состояние при операции PORTB |= или PORTB &= там тоже есть задержка на готовность. Соответственно все схоится, такое описание ногодрыга полностью соответствует тому, что происходит. А вот с таймером надо разбираться, скорее всего где-то предварительный делитель стоит, либо константы неправильно посчитаны, либо там внутри опять какое-то чтение+сдвиг+запись вместо простого изменения состояния. А вообще запомните, всегда быстрее хранить состояние выходного порта в переменной, и просто записывать его в IO, чем читать из IO (с ожиданием), потом что-то там делать, потом писать обратно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ostroukhov1991 0 17 декабря, 2022 Опубликовано 17 декабря, 2022 · Жалоба До этого работал с PIC, в MPLAB прямое обращение к пинам. Как в AVR Studio это сделать более быстро по тактам? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
v05 1 17 декабря, 2022 Опубликовано 17 декабря, 2022 · Жалоба Нет там никаких сдвигов и никаких задержек на готовность! Посмотрите листинг, посчитайте такты и всё станет понятно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 48 19 декабря, 2022 Опубликовано 19 декабря, 2022 (изменено) · Жалоба В 17.12.2022 в 01:45, Ostroukhov1991 сказал: В чем прикол? Прикол в том, что такие вещи нужно писать на асме, тогда видно и сколько тактов требуется и сколько лишних команд вы понаписали... А вообще выдавать частоту лучше таймером... В 17.12.2022 в 10:36, Ostroukhov1991 сказал: в MPLAB прямое обращение к пинам Э то что еще за "прямое обращение к пинам" такое?? В 17.12.2022 в 01:45, Ostroukhov1991 сказал: Неужели на 3.3в данный камень не способен выйти на 8Мгц? Способен. Только по правилам, чтобы получить корректную частоту ставят кварц, RC там хоть и калиброванный, но калибруют его с расчетом на питание 5В, а не 3.3. Изменено 19 декабря, 2022 пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
v05 1 20 декабря, 2022 Опубликовано 20 декабря, 2022 · Жалоба On 12/19/2022 at 11:07 PM, mantech said: RC там хоть и калиброванный, но калибруют его с расчетом на питание 5В, а не 3.3. Более того. Калибруют его только для 1 МГц генератора, поэтому у других генераторов частоты могут быть +/- лапоть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 59 20 декабря, 2022 Опубликовано 20 декабря, 2022 · Жалоба On 12/17/2022 at 10:29 AM, krux said: 1<<PB5 операция сдвига Вычисляемая на этапе компиляции On 12/17/2022 at 10:29 AM, krux said: PORTB |= операция чтения + операция записи Такие конструкции компиляторы для AVR давно уже умеют превращать в ассемблерные команды sbi, cbi. Т.е. никаких операций чтение-модификация-запись. А сразу запись в нужный бит порта. А вообще, надо дизассемблер смотреть. А ножкой в AVR дергать можно еще проще. Смотрите раздел I/O-Ports -> Toggling the Pin. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
v05 1 20 декабря, 2022 Опубликовано 20 декабря, 2022 (изменено) · Жалоба On 12/20/2022 at 8:57 AM, dimka76 said: А ножкой в AVR дергать можно еще проще. Только не для Мега16.) Для неё можно PORTB ^= 1<<PB5; А по поводу сдвигов и листинга я ТС уже сказал. Только, похоже, не в коня корм.( Изменено 20 декабря, 2022 пользователем v05 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 20 декабря, 2022 Опубликовано 20 декабря, 2022 · Жалоба 9 hours ago, dimka76 said: конструкции компиляторы для AVR давно уже умеют Коллега специально не хочет оптимизацию включать... -O1 у него предел. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
krux 8 20 декабря, 2022 Опубликовано 20 декабря, 2022 · Жалоба On 12/20/2022 at 8:57 AM, dimka76 said: Вычисляемая на этапе компиляции Такие конструкции компиляторы для AVR давно уже умеют превращать в ассемблерные команды sbi, cbi. Т.е. никаких операций чтение-модификация-запись. А сразу запись в нужный бит порта. А вообще, надо дизассемблер смотреть. А ножкой в AVR дергать можно еще проще. Смотрите раздел I/O-Ports -> Toggling the Pin. воу-аоу полегче, я же реальные ассемблерные листинги не аидел, но если бы с си и с оптимизацией типа -O1, то оно бы так и было Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
v05 1 20 декабря, 2022 Опубликовано 20 декабря, 2022 · Жалоба On 12/20/2022 at 6:34 PM, GenaSPB said: Коллега специально не хочет оптимизацию включать... -O1 у него предел. Ну так и этого достаточно. # Optimization level, can be [0, 1, 2, 3, s]. # 0 = turn off optimization. s = optimize for size. # (Note: 3 is not always the best optimization level. See avr-libc FAQ.) OPT = 1 PORTB |= 1<<6; c0: c6 9a sbi 0x18, 6 ; 24 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vvppvv 0 26 декабря, 2022 Опубликовано 26 декабря, 2022 · Жалоба On 12/20/2022 at 10:11 AM, v05 said: Только не для Мега16.) Для неё можно PORTB ^= 1<<PB5; Это выглядит элегантнее на Си, а вот код будет раздут (считывается весь порт, потом в отдельный регистр пишется единичный бит, потом эта маска накладывается по XOR на содержимое порта и пр.) Старые Меги тогглить выводами не умеют. :)) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться