Задание определенной частоты

Тема в разделе "WASM.BEGINNERS", создана пользователем vovkax13, 22 май 2008.

  1. vovkax13

    vovkax13 New Member

    Публикаций:
    0
    Регистрация:
    3 май 2008
    Сообщения:
    19
    Помогите как нужно написать подпрограмму задержки чтобы на порт PB подаваласся сигнал с определеннной часстотой? И если здесь чтото лишьнее скажите?
    Код (Text):
    1. ;------------------------- Псевдокоманды управления
    2.  
    3. .include "tn2313def.inc"            ; Присоединение файла описаний
    4. .list                   ; Включение листинга
    5.  
    6. ;------------------------- Начало программного кода
    7.  
    8. .cseg                       ; Выбор сегмента программного кода
    9. .org    0               ; Установка текущего адреса на ноль
    10.  
    11. .def    temp = r16  ; Определение главного рабочего регистра
    12. .def    loop1 = r17 ; Определение первого регистра цикла
    13. .def    loop2 = r18 ; Определение второго регистра цикла
    14. .def    loop3 = r19 ; Определение второго регистра цикла
    15.  
    16.  
    17. ;-------------------------- Инициализация стека
    18.    
    19.         ldi     temp, 0x7F  ; Выбор адреса вершины стека
    20.         out     SPL, temp   ; Запись его в регистр стека
    21.  
    22. ;-------------------------- Инициализация Главного предделителя
    23.  
    24.         ldi     temp, 0x80      ; Записываем число $80 в регистр temp
    25.         out     CLKPR, temp ; Записываем в регистр CLKPR
    26.         ldi     temp, 0     ; Записываем 0 в регистр temp
    27.         out     CLKPR, temp ; Записываем этот ноль в CLKPR
    28.  
    29. ;-------------------------- Инициализация портов ВВ
    30.    
    31.         out     DDRD, temp  ; Записываем этот ноль в DDRD (порт PD на ввод)
    32.  
    33.         ldi     temp, 0xFF  ; Записываем число $FF в регистр temp
    34.         out     DDRB, temp  ; Записываем это число в DDRB (порт PB на вывод)
    35.         out     PORTB, temp ; Записываем то же число в PORTB (выключить динамик)
    36.         out     PORTD, temp ; Записываем его же в PORTD (включаем внутр. резисторы)
    37.  
    38. ;--------------------------- Инициализация компаратора
    39.  
    40.         ldi     temp, 0x80          ; Выключение компаратора
    41.         out     ACSR, temp
    42.  
    43. ;-------------------------- Начало основного цикла
    44. main:
    45.         sbi     PORTB, 0    ; Устанавливаем PB0 в единицу выключамем динамик(тушим светодиод)
    46.         in      temp, PORTD ; Читаем содержимое порта PD
    47.         sbrc    temp, 0             ; Проверка младшего разряда
    48.         rjmp    main                ; Если не ноль, переходим в начало
    49.  
    50. ;--------------------------------
    51.  
    52.         sbi     PORTB, 0    ; Устанавливаем PB0 в нооль
    53.         rcall   wait1               ; Вызов подпрограммы задержки
    54.  
    55.         sbi     PORTB, 1    ; Сброс PB0 в единица
    56.         rcall   wait1               ; Вызов подпрограммы задержки
    57.  
    58.         rjmp    main                ; К началу цикла
    59.  
    60.  
    61. ;--------------------------------- Подпрограмма задержки ВОТ ЭТУ ЗАДЕРЖУ НАДО ИЗМЕНИТЬ НО КАК НЕ ЗНАЮ ВООБЩЕ ВПЕРВЫЕ СТАЛКИВАЮСЬ С АССЕМБЛЕРЕМ
    62.  
    63.  
    64.         ldi     loop1, 15   ; Помещаем в loop1 константу задержки
    65. wt1:    dec     loop1              ; Уменьшаем значение регистра loop
    66.         breq    wt4
    67.         ldi     loop2, 100  ; Помещаем в loop2 константу задержки
    68. wt2:    dec     loop2               ; Уменьшаем значение регистра loop2
    69.         breq    wt1
    70.         ldi     loop3, 255  ; Помещаем в loop3 константу задержки
    71. wt3:    dec     loop3               ; Уменьшаем значение регистра loop3
    72.         brne    wt3         ; Если не ноль, продолжаем цикл
    73.         rjmp    wt2
    74.  
    75.         ret                 ; Выход из подпрограммы
     
  2. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    В псевдокоде это примерно так выглядит:

    loop1=15
    wt1:
    loop1=loop-1
    if loop1 = 0 goto wt4
    loop2=100
    wt2:
    loop2=loop2-1
    if loop2 = 0 goto wt1
    loop3=255
    wt3:
    loop3=loop3-1
    if loop3 <> 0 goto wt3
    goto wt2
    wt4:
    return

    Т.е. это цикл, длительностью 255*100*15, чему равна одна итерация цикла(секунд или наносекунд или ешё что), этого точно не могу сказать.
     
  3. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Код (Text):
    1.         ldi     loop1, 15
    2. wt1:    ldi     loop2, 100
    3. wt2:    ldi     loop3, 255
    4. wt3:    dec     loop3
    5.         brne    wt3
    6.         dec     loop2
    7.         brne    wt2
    8.         dec     loop1
    9.         brne    wt1
    10.         ret
    не следует клонировать топики
     
  4. vovkax13

    vovkax13 New Member

    Публикаций:
    0
    Регистрация:
    3 май 2008
    Сообщения:
    19
    А если сделать
    ldi loop1, 10000
    w1: dec loop1
    brne wt1
    ret

    Это сколько по времени задержка будет?
     
  5. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    vovkax13
    Это по времени будет равно выполнению 10000 раз команды декремента loop 1 и команды условного перехода.
     
  6. vovkax13

    vovkax13 New Member

    Публикаций:
    0
    Регистрация:
    3 май 2008
    Сообщения:
    19
    ldi loop1, 15
    wt1: ldi loop2, 100
    wt2: ldi loop3, 255
    wt3: dec loop3
    brne wt3
    dec loop2
    brne wt2
    dec loop1
    brne wt1
    ret
    Ну запускаю и он не выходит из этой задержки?
     
  7. vovkax13

    vovkax13 New Member

    Публикаций:
    0
    Регистрация:
    3 май 2008
    Сообщения:
    19
    Или не замечаю как он выходит...
     
  8. vovkax13

    vovkax13 New Member

    Публикаций:
    0
    Регистрация:
    3 май 2008
    Сообщения:
    19
    Ну как же мне сделать задержку чтобы частота была такая чтобы попадала в слышимый диапазон?
     
  9. nds

    nds Member

    Публикаций:
    0
    Регистрация:
    16 июл 2007
    Сообщения:
    157
    как я понял это программа для attiny2313
    время итерации зависит от частоты на которой работает контроллер
    а частота от настроек в контроллере и внешнего кварца(ели он используется конечно :) )
    так что, для точного ответа программы недостаточно :)
    В этом ftp://ftp.efo.ru/pub/atmel/articles/AVR_cmd.doc документе расписано сколько тактов занимает выполнение каждой команды.
    Соответственно время задержки в секундах можно посчитать по формуле
    t=n/f где t- время, n- количество тактов в задержке, f- частота на которой работает контроллер в герцах.
    На примере конкретной программы это будет выглядеть так:

    Код (Text):
    1. call wait ;Вызов задержки 4 такта
    2. ...
    3. wait:
    4. ldi     loop1, 15 ;Загрузка числа для внешнего цикла 1 такт
    5. wt1:    ldi     loop2, 100 ;загрузка числа для "среднего" цикла 1 такт
    6. wt2:    ldi     loop3, 255 ;загрузка числа для внутреннего цикла 1 такт
    7. wt3:    dec     loop3 ; уменьшение на 1 значения внутреннего цикла 1 такт
    8.         brne    wt3;если результат не 0 переход на wt3 1 такт если 0 на след. строчку 2 такта
    9.         dec     loop2;уменьшение на 1 значения "среднего" цикла 1 такт
    10.         brne    wt2;если результат не 0 переход на wt2 1 такт если 0 на след. строчку 2 такта
    11.         dec     loop1;уменьшение на 1 значения внешнего цикла 1 такт
    12.         brne    wt1;если результат не 0 переход на wt1 1 такт если 0 на след. строчку 2 такта
    13. ret ; Возврат из задержки 4 такта
    Соответственно общее число тактов будет составлять 8 (ret и call) + 15*100*255(количество итераций в циклах)*2(dec+brne) + 100+15(дополнительные при переходе во внешние циклы «на след. строчку 2 такта» )
    Итого 765123 тактов . при частоте работы микроконтроллера 4 мгц время задержки будет
    765123/4000000=0,19128075 секунд или если считать частоту на выходе 1/0,19128075=5,2279176027906624163696555978581 герц .
    Слышимый диапазон примерно 16-16000 герц дальше считайте сами :)
     
  10. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    nds
    интересно. маст хэв.
     
  11. vovkax13

    vovkax13 New Member

    Публикаций:
    0
    Регистрация:
    3 май 2008
    Сообщения:
    19
    Спасибо за такую хорошую информацию! Завтра попробую сдать курсач!
     
  12. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    А встроенный таймер использовать не пробовали?