Помогите разобраться. В книге написано что большинство операции (инструкции) в avr выполняются за один машинный цикл который равен одному такту. У меня atmega128, ради интереса написал вот такой код:
установил частоту тактирования мк 16МГц. В proteusе подключил oscilloskope посмотрел период 400 пикосекунд. получилась частота 2.5 МГц. Почему так мало?
Да, я ошибся нс, а пс. Спасибо за исправление. Замерил поточнее 375 нс что соответствует 2666666.667 герц. Если 16000000/2666666.667 то получается 6, соответственно по 2 такта на каждую операцию(лог.1 лог.0 и цикл). Наверное так.
На самом деле: 1) На большинство операций. Операции условного ветвления (оные участвуют в цикле) занимают, если память не изменяет 2 или 3 цикла, в зависимости от условия 2) Проверяется просто - любой компилятор Cшный умеет генерить листинг ассемблерного кода, который он будет дальше компилировать. Вы берте этот листинг, открываете хелп к авр-студии, смотрите хелп по каждой из комманд, там указано сколько тактов на ее выполнение. Если не нравица - оптимизируете рукми )
пример программного шим с дискретностью шим 10% и частоты 1 герц , только одна проблема, максимальная частото для atmega при частоте тактирования 16МГц около 10КГц... моей затеи на таком медленном камне не реализовать. Выложить не получается. (Если кому интересно могу прислать по почте, так как я начинающий была бы интересна критика)
Добавлено спустя 1 минуту 31 секунду: Я хотел сказать что написал пример, а выложить не получилось
а может ктонить доступно объяснить в чем прелесть использовать кварц скажем на 14.7456 МГц ? для чего это) а то чтото не понимаю... вот скажем надо выдержать 1.5мс для сервы ) както нацело неделится....
Вопросы к AVR123. 1) Можете подробней описать строку из урока 05а: WHILE (PINB &(1<<n)). Вроде как выражение типа <<n или >>n на Си означает сдвиг чего-то на N позиций?
2) При изучении STEP03 в VMLAB не понял при каком событии происходит вызов процедуры NMI_SERV? Судя по окну "Registers/flags"прерывания отключены. Что означает "TO DO" в комментариях STEP0x VMLAB?
3)К задаче z02 есть задание - сделать индикацию числа горящими светодиодами. Я вместо PORTA++ сделал декремент, т.е. PORTA--. Визуально счет идет горящими светодиодами, но верно ли я сделал?
MAIN LDI WDT, 0FFH ; Watchdog refresh CALL SUB_1 ; INC VAR_1 DEC VAR_2 ; Some doing-nothing stuff LD A, VAR_1 LD PA, A ; Just transfer the VAR_1 to port JP MAIN
SUB_1 CALL SUB_2 RET
SUB_2 NOP RET
; NMI service routine: produce 4 pulses in PB0 ; -------------------------------------------- ;
NMI_SERV LD A_SAVE, A ; Save accumulator LDI X, 4 ; Load nr. of pulses LOOP RES 0, PB_COPY LD A, PB_COPY ; Loop to generate the pulses LD PB, A ; Use the SET/RES on copy register SET 0, PB_COPY ; and transfer later LD A, PB_COPY LD PB, A DEC X JRNZ LOOP LD A, A_SAVE ; Restore accumulator RETI
программа гоняет в основном в MAIN, а в какой-то момент перескакивает на NMI_SERV. Я не пойму по какому событию возникает этот переход.
3) про TO DO - это вроде то что надо сделать.
Для листингов программ и прочих текстов есть тег [ code ]! <Digit>
Ринатик писал(а): 1) Что означает выражение 1<<n ?
Сдвиг на n позиций влево
Это я понял. Но это используется для переменной или регистра (или нет?) Получается 1<<n это сдвиг единицы на сколько-то битов (позиций). Я запутался, что означает выражение PINB&(1<<n)?
avr123.nm.ru писал(а):
Ринатик писал(а): 2) В VMLAB в STEP03 после инициализации код такой:
Эти примеры в VMLAB для микроконтроллера ST6210 от http://www.ST.com
Я знаю откуда это взято. Я их прохожу. Ткните пальцем, кто знает, каким макаром происходит переход на NMI_SERV???
например: есть единица "1" тоесть 00000001 сдвигаем её влево на 5 позиций получаем 00010000 тоесть 10000 и уже это число можно писать в порт и включать выключать нужную ногу)