Нужно изменить несколько строк!

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

  1. vovkax13

    vovkax13 New Member

    Публикаций:
    0
    Регистрация:
    3 май 2008
    Сообщения:
    19
    У меня есть программа с миганием светодиода а я в место него хочу воткнуть например, телефонный капсюль! В проге светодиод мигает с частотой 4 Гц, если уменьшить время задержки в 1000 раз, то можно получить частоту сигнала на выходе, равную 4 кГц. Эта частота как раз входит в слышимый звуковой диапазон. А как уменьшить время задерки?

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

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    ldi loop2, 5
    и
    ldi loop3, 51
    должно быть чаще в 1000 раз