Перейти к содержанию
    

Предельная частота тактирования Atmega16a-au от 3.3в

Народ помогите. На плате установлен камушек atmega16a-au запитанный от 3.3в. Фьюзами выставил 8Мгц, вочдог выключил. Делаю в цикле while постоянную дрыготню ногой, осциллограф показывает 1.2...1.3 мгц.

Когда запускаю timer1 настроенный на 44кгц, осциллограф выдает 13кгц.

В чем прикол? Неужели на 3.3в данный камень не способен выйти на 8Мгц? 

Если у кого-нибудь есть примеры кода под работу с ним в AVR Studio буду благодарен. 

Изменено пользователем Ostroukhov1991

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так, кажется есть подозренте на tp4056. В общем в схему временно не установлен АКБ и идет внешнее питание через порт заряда. Видимо ТР работает какимито пульсациями не видя встречного напряжения от АКБ

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подпаял АКБ, глобально ничего не изменилось. Осцилл показывает 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);
    }
}

Screenshot_11.png

Изменено пользователем haker_fox
Для оформления кода есть кнопка <>.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 (с ожиданием), потом что-то там делать, потом писать обратно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

До этого работал с PIC, в MPLAB прямое обращение к пинам. Как в AVR Studio это сделать более быстро по тактам? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет там никаких сдвигов и никаких задержек на готовность!
Посмотрите листинг, посчитайте такты и всё станет понятно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 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.

Изменено пользователем mantech

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 12/19/2022 at 11:07 PM, mantech said:

RC там хоть и калиброванный, но калибруют его с расчетом на питание 5В, а не 3.3.

Более того. Калибруют его только для 1 МГц генератора, поэтому у других генераторов частоты могут быть +/- лапоть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 12/20/2022 at 8:57 AM, dimka76 said:

А ножкой в AVR дергать можно еще проще.

Только не для Мега16.) Для неё можно PORTB ^= 1<<PB5;
А по поводу сдвигов и листинга я ТС уже сказал. Только, похоже, не в коня корм.(

Изменено пользователем v05

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 hours ago, dimka76 said:

конструкции компиляторы для AVR давно уже умеют

Коллега специально не хочет оптимизацию включать... -O1 у него предел.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 12/20/2022 at 8:57 AM, dimka76 said:

Вычисляемая на этапе компиляции

Такие конструкции компиляторы для AVR давно уже умеют превращать в ассемблерные команды sbi, cbi.

Т.е. никаких операций чтение-модификация-запись. А сразу запись в нужный бит порта.

А вообще, надо дизассемблер смотреть.

А ножкой в AVR дергать можно еще проще. Смотрите раздел I/O-Ports -> Toggling the Pin.

воу-аоу полегче, я же реальные ассемблерные листинги не аидел,  но если бы с си и с оптимизацией типа -O1, то оно бы так и было

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 12/20/2022 at 10:11 AM, v05 said:

Только не для Мега16.) Для неё можно PORTB ^= 1<<PB5;

Это выглядит элегантнее на Си, а вот код будет раздут (считывается весь порт, потом в отдельный регистр пишется единичный бит, потом эта маска накладывается по XOR на содержимое порта и пр.) Старые Меги тогглить выводами не умеют. :))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...