|
Таймеры atmega32a |
|
|
|
Dec 19 2014, 09:57
|
Группа: Новичок
Сообщений: 6
Регистрация: 19-12-14
Пользователь №: 84 192

|
Здравствуйте Проблема возникла такая, есть у меня atmega32a китайский. постигаю таймеры. использую таймер0 (8 бит). Логика моих мыслей такова:
если там частота 16МГц а таймер считает до 256 то каждое переполнение таймера будет происходить (1 / 16 000 000) * 256 = 16 микросекунд (0,000016). Соответственно, что бы получить 1 секунду надо таких отрезков 62 500 (0,000016 * 62 500 = 1 сек.) Что бы особо не мучиться с 16 битными числами я разбил на две 8 битные, т.е. 250 и 250. Значит в прерывании по переполнению мы считаем первый счетчик, када он доходит до 250 мы увеличиваем второй и обнуляем первый. Сразу что скажу что cksel биты не менял, они все отключены, значит частота должна быть нормальной. В коде не устанавливаю предделитель для таймера. Внешнего кварца, как и осциллографа, не имею. замерить частоту не выходит. пробовал всю партию контроллеров (10 штук) результат один и тот же, либо у них у всех не 16 МГц, либо логика моих действий не верна.
|
|
|
|
|
 |
Ответов
|
Dec 21 2014, 13:54
|
Группа: Новичок
Сообщений: 6
Регистрация: 19-12-14
Пользователь №: 84 192

|
отвечу всем по порядку) Цитата(zombi @ Dec 19 2014, 15:11)  Не плохо было бы узнать полученный результат значит при счете до 62 500 мигает он раз в 15 секунд %) наблюдал просто, ни каких особых измерений, это если бы там миллисекунды погрешности было, другое дело) вот биты из программки  Цитата(Dust112 @ Dec 19 2014, 15:16)  Вы раздел 8-bit Timer/Counter0 with PWM документации читали? я исключительно по книжкам. не думал что там особая разница есть. Цитата(stells @ Dec 19 2014, 15:26)  не 8? пробовал клепать расчеты под 8, все равно заметные глазу отличия есть) мигание ~ раз в 7 секунд что за таблица 9? Цитата(demiurg1978 @ Dec 19 2014, 16:10)  У меня такой способ получить 1 мс при 8 и 16 мгц: с Си не дружу) после того как gcc танцы с бубном устраивать заставлял))))) Цитата(akl @ Dec 20 2014, 10:56)  С точностью до такта можно временной интервал формировать так. Писано для tiny13, но и для mega32 будет примерно также. вашу магию тоже не совсем понял... вот моя магия CODE device atmega32a .include "D:\asm\include\m32def.inc" .def temp = r16 ; темповая переменная .def countTimer = r17 ; счетчик задержки .def countTimer2 = r27 .def posR = r25
.equ timerSleep = 250 .equ timerSleep2 = 125
; начало программы .org 0 rjmp RESET
.org $16 ; перывание таймера 0 rjmp TIMER0
TIMER0: ;начало таймер0 inc countTimer cpi countTimer, timerSleep ldi temp, 0 out TCNT0, temp breq showsInt reti showsInt: clr countTimer inc countTimer2 cpi countTimer2, timerSleep2 breq IncsSeconds reti IncsSeconds: clr countTimer2 inc posR cpi posR,1 breq showReg1 cpi posR,2 breq showReg2 showReg1: ldi temp, 0b11111111 rjmp continueTimers showReg2: ldi temp, 0b00000000 ldi posR,0 continueTimers: out PORTA, temp reti ;конец таймер 0
RESET:
ldi temp,low(RAMEND) ;загружаем указатель на стек out SPL,temp
ldi temp,high(RAMEND) ; указатель стека, старший байт out SPH,temp
ldi temp,0b11111111 ; контакт 0-7 порта A на выход out DDRA,temp ;
ldi temp, 0b00000001 ; контакт 0-1 порта В на выход out DDRB, temp out PORTB,temp
clr countTimer clr countTimer2
ldi temp,0b00000001 out TIMSK,temp
ldi temp,0b00000001 out TCCR0,temp
clr posR
sei ;разрешить прерывания
END: rjmp END ;бесконечный цикл
там у меня просто циферблат стоит, пока им моргаю...)
|
|
|
|
|
Dec 22 2014, 21:53
|
Местный
  
Группа: Участник
Сообщений: 333
Регистрация: 19-12-13
Из: Новосибирск
Пользователь №: 79 709

|
Цитата(ishpanec @ Dec 21 2014, 19:54)  с Си не дружу) после того как gcc танцы с бубном устраивать заставлял))))) Значит попробуйте поработать в IAR. Я с ним сразу подружился. Пример на асме: CODE //======================================================================== .equ ST_TCNT = TCNT0 .equ ST_TIMSK = TIMSK .equ ST_OCIE = OCIE0 .equ ST_OCR = OCR0 .equ ST_TCCR = TCCR0 .equ CS0 = CS00 .equ CS1 = CS01 .equ CS2 = CS02 //========================================================================
.cseg
//======================================================================== .macro Init_System_Timer clr r16 out ST_TCNT, r16 in r16, ST_TIMSK sbr r16, 1<<ST_OCIE out ST_TIMSK, r16 outi ST_OCR, (XTAL/64/1000) in r16, ST_TCCR sbr r16, 1<<CS0 | 1<<CS1 out ST_TCCR, r16 .endmacro
.macro ReRun_Sys_Timer in r16,ST_OCR subi r16,-(XTAL/64/1000) out ST_OCR,r16 .endmacro //========================================================================
//======================================================================== Sys_Timer_Comp: push r16 in r16,SREG push r16
ReRun_Sys_Timer
sbr FLAGS,1<<SYS_TICK_FLG
pop r16 out SREG,r16 pop r16 reti //========================================================================
|
|
|
|
Сообщений в этой теме
ishpanec Таймеры atmega32a Dec 19 2014, 09:57 zombi Цитата(ishpanec @ Dec 19 2014, 13:57) рез... Dec 19 2014, 14:11 Dust112 ishpanec, Вы раздел 8-bit Timer/Counter0 with PWM... Dec 19 2014, 14:16 stells Цитата(ishpanec @ Dec 19 2014, 12:57) есл... Dec 19 2014, 14:26 demiurg1978 У меня такой способ получить 1 мс при 8 и 16 мгц:
... Dec 19 2014, 15:10 akl С точностью до такта можно временной интервал форм... Dec 20 2014, 09:56 ishpanec Цитата(ishpanec @ Dec 21 2014, 14:54) не ... Dec 21 2014, 15:17 stells Цитата(ishpanec @ Dec 21 2014, 16:54) что... Dec 21 2014, 16:29 zombi получается Internal Calibrated RC Oscillator 1 MHz... Dec 21 2014, 16:06 ishpanec да, уже разобрался, всем спасибо за помощь!)
п... Dec 21 2014, 18:19 akl Ваш код дает интервал 1 секунды, за счёт сравнений... Dec 22 2014, 04:18 alexeyv Зачем для этой цели использовать 8-ми разрядный сч... Dec 22 2014, 04:39 akl Цитата(alexeyv @ Dec 22 2014, 09:39) Не п... Dec 22 2014, 05:57  RabidRabbit Цитата(akl @ Dec 22 2014, 08:57) Проще, к... Dec 22 2014, 07:35   akl Цитата(RabidRabbit @ Dec 22 2014, 12:35) ... Dec 22 2014, 09:43    RabidRabbit Цитата(akl @ Dec 22 2014, 12:43) По мне, ... Dec 23 2014, 08:47 ishpanec Цитата(alexeyv @ Dec 22 2014, 05:39) Не п... Dec 22 2014, 12:43 akl Каждое прерывание Т0, в котором дополнительно чист... Dec 22 2014, 14:03 ishpanec Цитата(akl @ Dec 22 2014, 15:03) в которо... Dec 22 2014, 14:47 akl Да, действительно, период будет 256*30821=7890176/... Dec 24 2014, 03:17 RabidRabbit Я одного не понимаю, после первого переполнения в ... Dec 24 2014, 11:17
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|