Страница 1 из 1
Таймер стоит на месте!
Добавлено: Пн янв 27, 2014 17:20:13
tourniquet
Код: Выделить всё
.include "tn2313adef.inc"
.list
.def temp = R16
.equ kdel = 780
; ***************
rjmp Init
; ***************
Init:
ser temp
out DDRB, temp
out DDRD, temp
out PortB, temp
out PortD, temp
; ***************
ldi temp, 0x05
out TCCR1B, temp
; ***************
main:
sbic PinB, 0
rjmp turnON
sbis PinB, 0
rjmp turnOFF
; ***************
turnON:
sbic PinB, 0
cbi PortB, 0
rjmp setVar
; ***************
turnOFF:
sbis PinB, 0
sbi PortB, 0
rjmp setVar
; ***************
setVar:
ldi temp, 0
out TCNT1H, temp
out TCNT1L, temp
wt1:
in temp, TCNT1L
cpi temp, low(kdel)
brlo wt1
in temp, TCNT1H
cpi temp, high(kdel)
brlo wt1
rjmp main
День добрый! Не могу понять где ошибся, и в Студии (6 версия) и на реальном контролере таймер не крутится. Где и что напортачил - понять не могу уже второй день!

Re: Таймер стоит на месте!
Добавлено: Пн янв 27, 2014 17:37:04
Dr. Alex
Так настройте таймер!!!! И прерывания нет от него!!!
Re: Таймер стоит на месте!
Добавлено: Пн янв 27, 2014 17:41:57
dem-vr
посмотри на такие команды (разрешить и запретить прерывания) SEI CLI
Re: Таймер стоит на месте!
Добавлено: Пн янв 27, 2014 19:44:26
Alkul
tourniquet писал(а):Где и что напортачил - понять не могу уже второй день!

Вот в
этой теме для начала посмотрите, как нужно оформлять таблицу векторов прерываний. Не поленитесь сделать так, как там написано.
Вот список Ваших ошибок:
1. Вы не инициализируете указатель вершины стека
2. В программе отсутствует таблица векторов прерываний и, как следствие, вектор прерывания по переполнению таймера
3. Вы не разрешаете глобально прерывания командой sei
4. Вы не устанавливаете в регистре TIMSK флаг разрешения прерывания по переполнению нужного таймера
5. Вы не запускаете таймер
Достаточно перечислено ошибок, "мешающих" работе таймера?

И ведь если бы Вы не поленились изучить даташит, то большинства (да почти всех, наверное) ошибок можно было бы избежать.
Дальше. Вы пишете:
Код: Выделить всё
ser temp
out DDRB, temp
out DDRD, temp
out PortB, temp
out PortD, temp
, тем самым, настраивая порт B на вывод, а затем пытаетесь читать из этого порта
Это некорректно. Вы уж определитесь, ввод Вам нужен, или вывод на линиях порта B.
Re: Таймер стоит на месте!
Добавлено: Вт янв 28, 2014 09:40:49
Engineer_Keen
И что вы до прерываний докопались? Ну не используются они тут по задумке автора, правда таймер как обычный программный счетчик странно использовать, но раз так задумано...
Да и стек тогда не обязателен, вы тут хоть один RCALL-RET-PUSH-POP видите? Хотя для порядка конечно не мешало бы его проинициализировать.
Alkul писал(а):
1. Вы не инициализируете указатель вершины стека
2. В программе отсутствует таблица векторов прерываний и, как следствие, вектор прерывания по переполнению таймера
3. Вы не разрешаете глобально прерывания командой sei
4. Вы не устанавливаете в регистре TIMSK флаг разрешения прерывания по переполнению нужного таймера
5. Вы не запускаете таймер
Достаточно перечислено ошибок, "мешающих" работе таймера?
А ведь ни одно из вышеперечисленного работе таймера не мешает... Ну разве что п.5, но он таки выполнен (ldi temp, 0x05; out TCCR1B, temp). И кстати, таймер работает, а вот с входами-выходами действительно надо разбираться...
Alkul писал(а):
Это некорректно. Вы уж определитесь, ввод Вам нужен, или вывод на линиях порта B.
Скорее бесполезно, если порт жив и нет никаких КЗ, то PINB=PORTB.
Автор бы сказал чего конкретно программа должна делать, тогда может и помощь более эффективная будет.
Re: Таймер стоит на месте!
Добавлено: Вт янв 28, 2014 12:17:31
tourniquet
Engineer_Keen писал(а):
Автор бы сказал чего конкретно программа должна делать
- мигать светодиодом от таймера, читаем книжки дальше, пока непонятно, сложно, но надеемся на чудо ))
Re: Таймер стоит на месте!
Добавлено: Вт янв 28, 2014 13:06:50
Engineer_Keen
Тогда я вас обрадую. Ваш код, хоть он весьма нестандартен и далек от того как такую задачу решить более грамотно, работает. На ноге PB0 присутствует меандр с частотой ~3Гц (при стандартных фьюзах контроллера - RC8МГц+CLKDIV8). По крайней мере такой результат выдает симулятор. На будущее подскажу, вашу задачу можно решить полностью железно, безо всяких прерываний и участия ядра контроллера вообще (кроме инициализации). Обратите внимание на режим CTC таймера и настройки выходов COMxx, все это биты в регистрах TCCR1A-B.
Re: Таймер стоит на месте!
Добавлено: Чт фев 06, 2014 00:16:41
tourniquet
Я решил прочитать заново книжку Белова, и снова дошёл до этого примера с таймерами. Добавил таймер в другую прогу, без каких либо изменении (таймера), и он работает. Читаю дальше, надо разобратся до конца! )