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
Проблемы с таймером
-
genadijs2009
- Родился
- Сообщения: 8
- Зарегистрирован: Ср май 09, 2012 11:56:11
- Реклама
-
luxin
- Нашел транзистор. Понюхал.
- Сообщения: 161
- Зарегистрирован: Сб янв 29, 2011 15:00:44
- Откуда: Polesye
Re: проблемы с таймером
А может сначала нужно было бы описать, что Вы хотите получить? А то получается, что по коду, который не работает нужно догадаться, что же Вы хотите (трудно найти черную кошку в темной комнате, особенно, если ее там нет)
-
genadijs2009
- Родился
- Сообщения: 8
- Зарегистрирован: Ср май 09, 2012 11:56:11
Re: проблемы с таймером
должны загаратса диоды по очереди
я использую регистр сдвига, и счечик импульсов переключает следуший диод.
(чтобы сравнение происходило в момент времени, отстоящий от запуска таймера на 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 ;выход из обработчика
я использую регистр сдвига, и счечик импульсов переключает следуший диод.
(чтобы сравнение происходило в момент времени, отстоящий от запуска таймера на 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: проблемы с таймером
со обучалки взял эту програму, и тож нечего. по принцэпу делает тоже что программа написан ранее.
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
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: проблемы с таймером
Для начала - таблица векторов прерываний не соответствует таковой для меги8.
Просимулировали бы в той же студии, и понятно бы стало, куда программа перескакивает по прерыванию...
Ну да, и запись в TIMSK тоже не верная, в меге8 бит OCIE1A 4-й, а не 6-й. Писали бы через имена битов, сразу или бы ошибку выдало или заработало как надо.
И еще по-секрету, LPM можно делать сразу в любой регистр, не обязательно в R0, и можно сразу этот регистр выводить в порт. Зачем лишнее копирование регистров?
Просимулировали бы в той же студии, и понятно бы стало, куда программа перескакивает по прерыванию...
Ну да, и запись в TIMSK тоже не верная, в меге8 бит OCIE1A 4-й, а не 6-й. Писали бы через имена битов, сразу или бы ошибку выдало или заработало как надо.
Код: Выделить всё
ldi Temp,(1<<OCIE1A) ;разрешить прерывание компаратора
out TIMSK,Temp
- Реклама

