Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > ФОРМИРОВАНИЕ ВРЕМЕННЫХ ИНТЕРВАЛОВ В АВР


Автор: pettimm 27.11.2013, 17:20
Подскажите пожалуйста, где ошибка
в подсчете временного интервала, используем прерывание по совпадению Т0  
фюзы выставлены так: 
Low:    0        1               1                0          1          0         
;          Spien;  EESAVE;  WDTON;  CKDIV8;  SUT1;  SUT0;   
0               1
CKSEL1; CKSEL1

;High:       1        1            1                         1              0
;           SPMEN;  DWEN;  BODLEVEL1;   BODLEVEL0;  RST

отсюда задающая частота проца= 4,8МГЦ/8=600 000Гц
При выборе тактовой частоты То выбран предделитель на 64  значит =600 000/64= 9375 Гц
значит период тактирования=1/9375=106,666666 мкс
при числе в регистре совпадения = 2  и если таймер тактируется от начала импульса, то и на единицу значение счетного регистра таймера увеличится в начале первого импульса , а значит за время 106 мкс
увеличение будет на 2
но осцилографом я вижу импульсы длиной 400 мкс, где я ощибаюсь в подсчете времени? Спасибо.

Код


PEREVIRKA_PAUS:
                     
                 CBI PORTB,5; PEREMKNETSJA V PERERUVANNI
                 RCALL pausa_kontrol
                 

                         SBI PORTB,5
         RCALL pausa_kontrol
                        RJMP PEREVIRKA_PAUS

pausa_kontrol:
                 LDI TEMP,0b00000011    out TCCR0B,TEMP  ; PUSK T0 \CK/64=600 000/64 =9375 
                  ;1/9375= 106,66 MKC
                 LDI temp,0b00000101 OUT ocr0a,temp ;REGISTR ;SOVPADENIJA A 
                 LDI temp,0b00000100 out TIMSK0,temp     ;PRERUVANIE T0_SOVP_A   
                                           SEI
PERERUVANNJA_T0A:          WDR
                                         IN TEMP,TIFR0
                     SBRS TEMP,OCF0A; FLAG
                        RJMP PERERUVANNJA_T0A
                                  
                                  LDI TEMP,0b0000000
                    out TCCR0B,TEMP
                    out TCNT0,TEMP
                    
                       RET


Автор: kolobok0 4.12.2013, 23:23
Цитата(pettimm @ 27.11.2013,  17:20)
... где ошибка...частота проца= 4,8МГЦ/8=600 000Гц..То выбран предделитель на 64  значит =600 000/64= 9375 Гц
значит период тактирования=1/9375=106,666666 мкс
при числе в регистре совпадения = 2...я вижу импульсы длиной 400 мкс, где я ощибаюсь..?..
Код

...
                 LDI TEMP,0b00000011    out TCCR0B,TEMP  ; PUSK T0 \CK/64=600 000/64 =9375 
                  ;1/9375= 106,66 MKC
                 LDI temp,0b00000101 OUT ocr0a,temp ;REGISTR ;SOVPADENIJA A 
                 LDI temp,0b00000100 out TIMSK0,temp     ;PRERUVANIE T0_SOVP_A   
                                           SEI
...

Сразу скажу - регистры так не надо писать, в ввиде нулей и единиц.
Лучше использовать готовые преддефайны поставляемого вместе с компилятором на данный МК.
Тогда запись будет вида(как пример)

Код

  ldi   temp,(1 << CKSEL1) | (1 << CKSEL0)


так наглядней. и не ошибётесь.


Регистр TCCR0A выставлено всё по умолчанию т.е. усе нули.
Смотрим расшифровку режимов работы таймера
Регистры
WGM02(TCCR0B) = 0
WGM01(TCCR0A) = 0
WGM00(TCCR0A) = 0
Что соответствует режиму 0 (Normal). Обратите внимание в таблице на колонку "TOP" (вершина счёта). В строке данного режима стоит фиксированное значение 0xFF 

оно?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)