roboforum.ru

Технический форум по робототехнике.

МикроКонтроллер AVR начинающим - общие вопросы

Re: МикроКонтроллеры начинающим - общие вопросы

Pavel.d.a » 10 июл 2008, 18:30

Помогите разобраться. В книге написано что большинство операции (инструкции) в avr выполняются за один машинный цикл который равен одному такту. У меня atmega128, ради интереса написал вот такой код:
Код: Выделить всёРазвернуть
void main(void)
{
DDRB=0x20;
     while(1)
      {
        PORTB.5 = 1;           
        PORTB.5 = 0;           
      }
}

установил частоту тактирования мк 16МГц. В proteusе подключил oscilloskope посмотрел период 400 пикосекунд. получилась частота 2.5 МГц. Почему так мало?

Re: МикроКонтроллеры начинающим - общие вопросы

blindman » 10 июл 2008, 18:48

1. Большинство, но не все
2. Строка на C в общем транслируется не в одну инструкцию ассемблера
3. На организацию цикла тоже нужно время

PS. 400пс период это 2.5 ГГц

Re: МикроКонтроллеры начинающим - общие вопросы

Pavel.d.a » 10 июл 2008, 19:51

Да, я ошибся нс, а пс. Спасибо за исправление. Замерил поточнее 375 нс что соответствует 2666666.667 герц. Если 16000000/2666666.667 то получается 6, соответственно по 2 такта на каждую операцию(лог.1 лог.0 и цикл). Наверное так.

Re: МикроКонтроллеры начинающим - общие вопросы

hudbrog » 10 июл 2008, 20:00

На самом деле:
1) На большинство операций. Операции условного ветвления (оные участвуют в цикле) занимают, если память не изменяет 2 или 3 цикла, в зависимости от условия
2) Проверяется просто - любой компилятор Cшный умеет генерить листинг ассемблерного кода, который он будет дальше компилировать. Вы берте этот листинг, открываете хелп к авр-студии, смотрите хелп по каждой из комманд, там указано сколько тактов на ее выполнение. Если не нравица - оптимизируете рукми )

Re: МикроКонтроллеры начинающим - общие вопросы

Pavel.d.a » 10 июл 2008, 23:26

пример программного шим с дискретностью шим 10% и частоты 1 герц , только одна проблема, максимальная частото для atmega при частоте тактирования 16МГц около 10КГц... моей затеи на таком медленном камне не реализовать. Выложить не получается. (Если кому интересно могу прислать по почте, так как я начинающий была бы интересна критика)

Добавлено спустя 1 минуту 31 секунду:
Я хотел сказать что написал пример, а выложить не получилось :(

Re: МикроКонтроллеры начинающим - общие вопросы

alegz » 11 июл 2008, 07:24

а может ктонить доступно объяснить в чем прелесть использовать кварц скажем на 14.7456 МГц ? для чего это) а то чтото не понимаю... вот скажем надо выдержать 1.5мс для сервы ) както нацело неделится....

Re: МикроКонтроллеры начинающим - общие вопросы

Master » 11 июл 2008, 12:37

Есть такие специальные кварцы для протоколоа RX232 именно при таких не целых частотах наименьшее число ошибок при любой скорости передачи данных.

Re: МикроКонтроллеры начинающим - общие вопросы

alegz » 11 июл 2008, 13:57

и это единственное оправдание в их пользу?)

Re: МикроКонтроллеры начинающим - общие вопросы

blindman » 11 июл 2008, 14:03

Какое еще оправдание? Это их назначение

Re: МикроКонтроллеры начинающим - общие вопросы

Ринатик » 22 июл 2008, 15:29

Вопросы к 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--. Визуально счет идет горящими светодиодами, но верно ли я сделал?

Re: МикроКонтроллеры начинающим - общие вопросы

avr123.nm.ru » 22 июл 2008, 16:29

1 и 3 ДА. а 2 не понял откуда ?

Re: МикроКонтроллеры начинающим - общие вопросы

Ринатик » 23 июл 2008, 09:11

1)Что означает выражение 1<<n ?

2)В VMLAB в STEP03 после инициализации код такой:

Код: Выделить всёРазвернуть
   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>

Re: МикроКонтроллеры начинающим - общие вопросы

avr123.nm.ru » 23 июл 2008, 10:43

Ринатик писал(а): 1) Что означает выражение 1<<n ?


Сдвиг на n позиций влево - "Си для МК" http://avr123.nm.ru/05.htm

Изображение

Ринатик писал(а): 2) В VMLAB в STEP03 после инициализации код такой:

Эти примеры в VMLAB для микроконтроллера ST6210 от http://www.ST.com

Re: МикроКонтроллеры начинающим - общие вопросы

Ринатик » 23 июл 2008, 14:49

avr123.nm.ru писал(а):
Ринатик писал(а): 1) Что означает выражение 1<<n ?


Сдвиг на n позиций влево

Это я понял. Но это используется для переменной или регистра (или нет?) Получается 1<<n это сдвиг единицы на сколько-то битов (позиций). Я запутался, что означает выражение PINB&(1<<n)? :cry:

avr123.nm.ru писал(а):
Ринатик писал(а): 2) В VMLAB в STEP03 после инициализации код такой:

Эти примеры в VMLAB для микроконтроллера ST6210 от http://www.ST.com

Я знаю откуда это взято. Я их прохожу. Ткните пальцем, кто знает, каким макаром происходит переход на NMI_SERV???

Re: МикроКонтроллеры начинающим - общие вопросы

Myp » 23 июл 2008, 16:25

сдвиг единицы на n позиций влево

например: есть единица "1"
тоесть 00000001
сдвигаем её влево на 5 позиций
получаем 00010000
тоесть 10000
и уже это число можно писать в порт и включать выключать нужную ногу)


Rambler\'s Top100 Mail.ru counter