реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> ATtiny 2313
indi_88
сообщение May 12 2010, 12:42
Сообщение #16


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 6-05-10
Пользователь №: 57 112



Собрал кусок схемы на новом мк и транзисторах, с новой разводкой. проблема ушла сама собой, так что уже и нипонятно, где она была)))

Возник другой вопрос:
Как мне сделать генерацию пачки импульсов (например, штук 25), изменяя состояние ноги мк PD0. Мне надо добиться частоты 40 кГц, мой внутренний тактовый генератор настроен ан 4 Мгц. Код должен выглядеть следующим образом:

Код
PORTD |= 0b00000001;
// какая-то задержка
PORTD &= 0b11111110;
// задержка, которая дает частоту 40 кГц


Загвоздка в том, что я не очень понимаю одну вещь:
Если частота тактового 4 Мгц, то выполнение одной итерации мцу занимает 0,25*10^-6 c.
40 кГц дает период длительностью 25*10^-6 c.

Тогда импульсы должны появляться каждую 100ую итерацию мцу.
Если делать это с помощью цикла, то непонятно, сколько времени идет на проверку условий и т.д.
Вообщем как-то так))
Go to the top of the page
 
+Quote Post
-SANYCH-
сообщение May 12 2010, 13:14
Сообщение #17


Местный
***

Группа: Свой
Сообщений: 289
Регистрация: 6-12-05
Пользователь №: 11 864



Такие вещи лучше делать таймером.
Если хотите узнать сколько тактов уходит на весь цикл запустите симулятор и в нем посмотрите (в симуляторе есть счетчик времени)
Go to the top of the page
 
+Quote Post
indi_88
сообщение May 12 2010, 21:29
Сообщение #18


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 6-05-10
Пользователь №: 57 112



А если использовать такой код:

Код
    for(unsigned char i = 25; i > 0; i--)
    {
        PORTD |= 0b00000001;
        //WAITING();
        _delay_us(12.5);
        PORTD &= 0b11111110;
        _delay_us(12.5);
        //WAITING();
    }


читаю док на функцию:
Код
void _delay_ms      (double        __ms)


В симмуляторе аврстудио не хочет делать паузу в 12,5 мкс, вместо этого получаю 12 мкс.

ЗЫ Еще возник вопрос по функции дилей:
Пытался по очереди выводить что-то на знакоместа, код:
Код
    PORTB = 0x01;
    PORTD = 0x10;
    _delay_ms(1000);    
    PORTD = 0x00;
        
    PORTB = 0x02;
    PORTD = 0x20;
    _delay_ms(1000);
    PORTD = 0x00;
        
    PORTB = 0x03;
    PORTD = 0x40;
    _delay_ms(1000);
    PORTD = 0x00;


Смотрю док:
Код
The maximal possible delay is 262.14 ms / F_CPU in MHz.

When the user request delay which exceed the maximum possible one, _delay_ms() provides a decreased resolution functionality. In this mode _delay_ms() will work with a resolution of 1/10 ms, providing delays up to 6.5535 seconds (independent from CPU frequency). The user will not be informed about decreased resolution.

Я так понял, 1 секунду оно мне все-таки выдаст...
Идем дальше... В мейкфайле ставлю частоту 4000000, задержка составляет 4 сек, а не 1 сек.
Ставлю 1000000 и, о чудо, задержка равна 1 сек. Кто может объяснить почему? Да-да, я думал, что понял в чем суть, но ошибался.

ЗЫ Забыл добавить, оптимизация -Os

Сообщение отредактировал indi_88 - May 12 2010, 21:51
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 13 2010, 06:50
Сообщение #19


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(indi_88 @ May 13 2010, 00:29) *
А если использовать такой код:
То вы не сможете в это время выводить что-то на индикатор. А если выводить на индикатор в прерываниях (что, в общем-то, грамотоно), то прерывания будут вносить искажения в ваши задержки. Изучите таймер - он может формировать такие импульсы железно на выводах OCx
Цитата(indi_88 @ May 13 2010, 00:29) *
Идем дальше... В мейкфайле ставлю частоту 4000000, задержка составляет 4 сек, а не 1 сек.
Ставлю 1000000 и, о чудо, задержка равна 1 сек. Кто может объяснить почему?
Потому что процессор с завода поставляется с фузами, прошитыми на тактирование от внутреннего RC генератора 8МГц и включенным делителем (CVDIV) на 8. Отсюда получается 1 МГц тактовой частоты.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
-SANYCH-
сообщение May 13 2010, 07:58
Сообщение #20


Местный
***

Группа: Свой
Сообщений: 289
Регистрация: 6-12-05
Пользователь №: 11 864



Цитата
В симмуляторе аврстудио не хочет делать паузу в 12,5 мкс, вместо этого получаю 12 мкс.


У Вас тактовая процессора 1МГц вот и получается ровно 12мкс

Сообщение отредактировал rezident - May 14 2010, 17:43
Причина редактирования: Излишнее цитирование.
Go to the top of the page
 
+Quote Post
indi_88
сообщение May 13 2010, 09:23
Сообщение #21


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 6-05-10
Пользователь №: 57 112



Цитата
Потому что процессор с завода поставляется с фузами, прошитыми на тактирование от внутреннего RC генератора 8МГц и включенным делителем (CVDIV) на 8. Отсюда получается 1 МГц тактовой частоты.


Ну я понимаю, что включен пределитель, но я думал, что если я в мейкфайле для винавр пишу, что я хочу частоту 4000000, то компилятор при прошивке изменит нужные фбюзы, чтобы получить именно 4000000. Строго не судите, тк я вот только начал этим всем заниматься.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 13 2010, 09:44
Сообщение #22


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(indi_88 @ May 13 2010, 12:23) *
но я думал, что если я в мейкфайле для винавр пишу, что я хочу частоту 4000000, то компилятор при прошивке изменит нужные фбюзы, чтобы получить именно 4000000.
Вы хотите от него слишком многого. А если вы напишете 1234567, у процессора ведь нет компбинации фузов для такой частоты smile.gif. Опять же, вы можете затактировать процессор от кварца или внешнего генератора на 4МГц, а как компилятор отличит такую ситуацию от внутреннего RC?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
indi_88
сообщение May 13 2010, 09:57
Сообщение #23


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 6-05-10
Пользователь №: 57 112



Хм, я начинаю понимать, то есть если я в мейкфайле пишу частоты, то они автоматически делятся на 8?
Но возникает другой вопрос:
пишу:
1) 1000000 - задержка 1сек
2) 2000000 - задержка 2сек
3) 4000000 - задержка 4сек
4) 8000000 - задержка 8сек

Если я частоту увеличиваю, то период уменьшается, и, следовательно, задержка должна наоборот уменьшаться, а она увеличивается.
Вообщем, я запутался. Мне необходимо настроит ьвнутренний тактовый на 4МГц или 10МГц, и чтобы когда я пишу _delay_ms(1000), оно ждало именно 1сек.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 13 2010, 10:10
Сообщение #24


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(indi_88 @ May 13 2010, 12:57) *
Хм, я начинаю понимать, то есть если я в мейкфайле пишу частоты, то они автоматически делятся на 8?
Нет. Вы указываете компилятору частоту, а он рассчитывает - сколько циклов надо сделать задержку для этой частоты. Допустим, вы указали частоту 1000000 и компилятор посчитал, что надо сделать (допустим) 100 циклов для указанного вами времени задержки 7 мкс.
Теперь вы указываете ему вдвое бОльшую частоту - 2000000. Естественно, чтобы получить то же время задержки 7 мкс при удвоенной скорости процессора, процессору надо сделать вдвое больше пустых циклов. А если вы реальную частоту в железе оставили ту же, то вдвое больше пустых циклов будут исполняться в 2 раза дольше, что вы и наблюдаете.
Цитата(indi_88 @ May 13 2010, 12:57) *
Мне необходимо настроит ьвнутренний тактовый на 4МГц или 10МГц, и чтобы когда я пишу _delay_ms(1000), оно ждало именно 1сек.
Отключите CKDIV. Внимательно прочитайте, какое состояние фузов CKSEL включает внутренний RC-генератор на 4 МГц и есть ли вообще возможность включить его на 4 МГц. Если нету - включайте его на 8 МГц. Главное - в makefile надо указать именно ту частоту, которой тактируется ядро. Тогда и только тогда _delay_ms(1000) даст вам задержку ровно 1 сек (при отсутствии прерываний).


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
indi_88
сообщение May 13 2010, 10:28
Сообщение #25


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 6-05-10
Пользователь №: 57 112



Через понипрог убрал галочку с CKDIV и все заработало как надо!
СПАСИБО БОЛЬШОЕ!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 13 2010, 10:53
Сообщение #26


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(indi_88 @ May 13 2010, 13:28) *
Через понипрог
Раз уж вы начинающий - позвольте дать еще один совет. Если вы пользуетесь программатором на LPT - используйте в качестве софта для программирования AVReal. Один раз напишете .bat - файл для запуска и будете избавлены от возможности случайно зашить не ту компинацию фузов. Да и прошивка будет заключаться в одно двойном щелчке по иконке этого .bat вместо лазания по менюшкам лошади. вот пример .bat для прошивки через STK200/STK500 или "5 проводов":
Код
@echo off
SET FIRMWARE=release\FS-led-display

SET AVREAL=avreal32 +MEGA8 -as -p1 -o0.5MHz
SET FUSES=BODEN=0,BLEV=1,BLB0=3,BLB1=0,RSTDSBL=1,WDTON=1,BSIZ=0,BRST=1,CKSEL=F,CKOPT
=0
%AVREAL% -e -w -v -f%FUSES% -c %FIRMWARE%.hex -d %FIRMWARE%.eep


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
indi_88
сообщение May 13 2010, 11:02
Сообщение #27


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 6-05-10
Пользователь №: 57 112



Спасибо, но я шью через винавр и использую com-программатор

Сообщение отредактировал indi_88 - May 13 2010, 11:17
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 01:11
Рейтинг@Mail.ru


Страница сгенерированна за 0.02497 секунд с 7
ELECTRONIX ©2004-2016