Проблемы с таймером

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
genadijs2009
Родился
Сообщения: 8
Зарегистрирован: Ср май 09, 2012 11:56:11

Проблемы с таймером

Сообщение genadijs2009 »

avr studio не ругаетса.
но не получетса добитса жэлаемого результата.
не чего не происходит


.include "m8def.inc"

.def Temp=R16
.def Temp1=R17
.def Temp2=R18
.def Temp3=R19
.def Temp4=R20
.cseg
.org 0



rjmp Reset
rjmp INT_0
rjmp INT_1
rjmp Timer1_capt1
rjmp Timer1_comp1
rjmp Timer1_OVF1
rjmp Timer0_OVF0
rjmp UART_RX
rjmp UART_UDRE
rjmp UART_TX
rjmp ANA_COMP




;Reset:
INT_0:
INT_1:
Timer1_capt1:
;Timer1_comp1:
Timer1_OVF1:
Timer0_OVF0:
UART_RX:
UART_UDRE:
UART_TX:
ANA_COMP:
reti
;****************************************

Reset: ldi Temp,0b11111111
out DDRB,Temp

ldi Temp,0b01000000
out TIMSK,Temp

ldi Temp,0b00000001
out TCCR1B,Temp

ldi Temp,0x4b
out OCR1AH,Temp
ldi Temp,0x4a
out OCR1AL,Temp

ldi Temp, HIGH(RAMEND)
Out sph, temp
ldi Temp, LOW(RAMEND)
Out spl, temp


ldi Temp1,0b00000001

ldi Temp,0
out TCNT1H,Temp
out TCNT1L,Temp

sei

;****************************************************
Inf: rjmp Inf


;****************************************************

Timer1_comp1:
ldi Temp,0
out TCNT1H,Temp
out TCNT1L,Temp


Shift: cpi Temp1,0b10000000
breq Init

lsl Temp1
rjmp Output

Init: ldi Temp1,0b00000001
Output: out PortB,Temp1

reti
Реклама
luxin
Нашел транзистор. Понюхал.
Сообщения: 161
Зарегистрирован: Сб янв 29, 2011 15:00:44
Откуда: Polesye

Re: проблемы с таймером

Сообщение luxin »

А может сначала нужно было бы описать, что Вы хотите получить? А то получается, что по коду, который не работает нужно догадаться, что же Вы хотите (трудно найти черную кошку в темной комнате, особенно, если ее там нет)
Реклама
genadijs2009
Родился
Сообщения: 8
Зарегистрирован: Ср май 09, 2012 11:56:11

Re: проблемы с таймером

Сообщение genadijs2009 »

должны загаратса диоды по очереди
я использую регистр сдвига, и счечик импульсов переключает следуший диод.
(чтобы сравнение происходило в момент времени, отстоящий от запуска таймера на 125 мс.
Считаем количество тактовых импульсов, которое пройдет за это время:
125мс / 6,4 мкс = 19531 имп.
OCR1AH = 0x4c
OCR1AL = 0x4B)



.include "m8def.inc"


.def Temp=R16
.def Temp1=R17
.def Temp2=R18
.def Temp3=R19
.def Temp4=R20

.cseg
.org 0

rjmp Reset ;вектора прерываний
rjmp INT_0
rjmp INT_1
rjmp Timer1_capt1
rjmp Timer1_comp1
rjmp Timer1_OVF1
rjmp Timer0_OVF0
rjmp UART_RX
rjmp UART_UDRE
rjmp UART_TX
rjmp ANA_COMP




;Reset:
INT_0:
INT_1:
Timer1_capt1:
;Timer1_comp1:
Timer1_OVF1:
Timer0_OVF0:
UART_RX:
UART_UDRE:
UART_TX:
ANA_COMP:
reti
;****************************************************
; ИНИЦИАЛИЗАЦИЯ
;****************************************************
Reset: ldi Temp,0b11111111 ;настройка портов
out DDRB,Temp

ldi Temp,0b01000000 ;разрешить прерывание компаратора
out TIMSK,Temp

ldi Temp,0b00000011 ;тактовый сигнал = CK/64
out TCCR1B,Temp

ldi Temp,0x4C ;инициализация компаратора
out OCR1AH,Temp
ldi Temp,0x4B
out OCR1AL,Temp

ldi Temp, HIGH(RAMEND) ;установка указателя стека
Out sph, temp
ldi Temp, LOW(RAMEND)
Out spl, temp


ldi Temp1,0b00000001 ;инициализация индикатора

ldi Temp,0 ;обнуление таймера
out TCNT1H,Temp
out TCNT1L,Temp

sei ;разрешить прерывания


;****************************************************
; ОСНОВНОЙ ЦИКЛ
;****************************************************
Inf: rjmp Inf ;бесконечный цикл


;****************************************************
; ОБРАБОТЧИК ПРЕРЫВАНИЯ КОМПАРАТОРА
;****************************************************

Timer1_comp1:
ldi Temp,0 ;обнуление таймера
out TCNT1H,Temp
out TCNT1L,Temp


Shift: cpi Temp1,0b10000000 ;сравнить с крайним знач.
breq Init ;если равно - загрузка нач. знач.

lsl Temp1 ;иначе - сдвиг влево
rjmp Output ;перейти на вывод в порт

Init: ldi Temp1,0b00000001 ;загрузить нач. значение
Output: out PortB,Temp1 ;вывод в порт

reti ;выход из обработчика
genadijs2009
Родился
Сообщения: 8
Зарегистрирован: Ср май 09, 2012 11:56:11

Re: проблемы с таймером

Сообщение genadijs2009 »

со обучалки взял эту програму, и тож нечего. по принцэпу делает тоже что программа написан ранее.
avr studio не ругаетса.
не чего не происходит


.include "m8def.inc"


.def Temp=R16
.def Temp1=R17
.def Temp2=R18
.def Temp3=R19
.def Temp4=R20

.cseg
.org 0

rjmp Reset ;вектора прерываний
rjmp INT_0
rjmp INT_1
rjmp Timer1_capt1
rjmp Timer1_comp1
rjmp Timer1_OVF1
rjmp Timer0_OVF0
rjmp UART_RX
rjmp UART_UDRE
rjmp UART_TX
rjmp ANA_COMP




;Reset:
INT_0:
INT_1:
Timer1_capt1:
;Timer1_comp1:
Timer1_OVF1:
Timer0_OVF0:
UART_RX:
UART_UDRE:
UART_TX:
ANA_COMP:
reti
;****************************************************
; ИНИЦИАЛИЗАЦИЯ
;****************************************************
Reset: ldi Temp,0b11111111 ;настройка портов
out DDRB,Temp

ldi Temp,0b01000000 ;разрешить прерывание компаратора
out TIMSK,Temp

ldi Temp,0b00000011 ;тактовый сигнал = CK/64
out TCCR1B,Temp

ldi Temp,0x4C ;инициализация компаратора
out OCR1AH,Temp
ldi Temp,0x4B
out OCR1AL,Temp

ldi Temp, HIGH(RAMEND) ;установка указателя стека
Out sph, temp
ldi Temp, LOW(RAMEND)
Out spl, temp


ldi Temp1,0b00000001 ;инициализация индикатора

ldi Temp,0 ;обнуление таймера
out TCNT1H,Temp
out TCNT1L,Temp

sei ;разрешить прерывания


;****************************************************
; ОСНОВНОЙ ЦИКЛ
;****************************************************
Inf: rjmp Inf ;бесконечный цикл


;****************************************************
; ОБРАБОТЧИК ПРЕРЫВАНИЯ КОМПАРАТОРА
;****************************************************


Timer1_comp1:


ldi Temp,0 ;обнуление таймера
out TCNT1H,Temp
out TCNT1L,Temp


cpi Temp1,30 ;сравнить с крайним знач.
breq Init ;если равно - загрузка нач. знач.


ReadArray:
ldi ZH,High(Array*2) ;загрузка начального адреса массива
ldi ZL,Low(Array*2)

ldi Temp,0 ;прибавление внутр. адреса
add ZL,Temp1
adc ZH,Temp

lpm ;загрузка из ПЗУ

mov Temp,R0 ;копирование в РОН
inc Temp1 ;увеличение внутр. адреса

rjmp Output ;перейти на вывод в порт

Init: ldi Temp1,0 ;загрузить нач. значение
rjmp ReadArray

Output: out PortB,Temp ;вывод в порт

reti ;выход из обработчика


Array:

.db 0b10000001,0b01000010
.db 0b00100100,0b00011000
.db 0b00011000,0b00111100
.db 0b01111110,0b11111111
.db 0b11100111,0b11000011
.db 0b10000001,0b11000001
.db 0b11100001,0b11110001
.db 0b11111001,0b11111101
.db 0b11111111,0b01111111
.db 0b00111111,0b00011111
.db 0b00001111,0b00000111
.db 0b00000011,0b00000001
.db 0b00000011,0b00000101
.db 0b00001001,0b00010001
.db 0b00100001,0b01000001
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: проблемы с таймером

Сообщение Engineer_Keen »

Для начала - таблица векторов прерываний не соответствует таковой для меги8.
Просимулировали бы в той же студии, и понятно бы стало, куда программа перескакивает по прерыванию...
Ну да, и запись в TIMSK тоже не верная, в меге8 бит OCIE1A 4-й, а не 6-й. Писали бы через имена битов, сразу или бы ошибку выдало или заработало как надо.

Код: Выделить всё

ldi Temp,(1<<OCIE1A) ;разрешить прерывание компаратора
out TIMSK,Temp
И еще по-секрету, LPM можно делать сразу в любой регистр, не обязательно в R0, и можно сразу этот регистр выводить в порт. Зачем лишнее копирование регистров?
Реклама
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»