Вт окт 29, 2013 08:54:53
Black_Wolf писал(а):На мой взгляд разницы быть не должно.
Вт окт 29, 2013 21:14:26
/*
* ATMega8_Test_Asynchronous.asm
*
* Created: 27.10.2013 13:10:41
* Author: Alex
*/
;.include "m8def.inc"
.def Seconds=R16
.def SetOnVD1=R17
.def SetOnVD2=R20
.def Temp=R18
.CSEG
.ORG 0
rjmp RESET ; Reset Handler
rjmp EXT_INT0 ; IRQ0 Handler
rjmp EXT_INT1 ; IRQ1 Handler
rjmp TIM2_COMP ; Timer2 Compare Handler
rjmp TIM2_OVF ; Timer2 Overflow Handler
rjmp TIM1_CAPT ; Timer1 Capture Handler
rjmp TIM1_COMPA ; Timer1 CompareA Handler
rjmp TIM1_COMPB ; Timer1 CompareB Handler
rjmp TIM1_OVF ; Timer1 Overflow Handler
rjmp TIM0_OVF ; Timer0 Overflow Handler
rjmp SPI_STC ; SPI Transfer Complete Handler
rjmp USART_RXC ; USART RX Complete Handler
rjmp USART_UDRE ; UDR Empty Handler
rjmp USART_TXC ; USART TX Complete Handler
rjmp ADC_IRQ ; ADC Conversion Complete Handler
rjmp EE_RDY ; EEPROM Ready Handler
rjmp ANA_COMP ; Analog Comparator Handler
rjmp TWSI ; Two-wire Serial Interface Handler
rjmp SPM_RDY ; Store Program Memory Ready Handler
EXT_INT0: ret ; IRQ0 Handler
EXT_INT1: ret ; IRQ1 Handler
TIM2_COMP: ret ; Timer2 Compare Handler
;TIM2_OVF: ret ; Timer2 Overflow Handler
TIM1_CAPT: ret ; Timer1 Capture Handler
TIM1_COMPA: ret ; Timer1 CompareA Handler
TIM1_COMPB: ret ; Timer1 CompareB Handler
TIM1_OVF: ret ; Timer1 Overflow Handler
TIM0_OVF: ret ; Timer0 Overflow Handler
SPI_STC: ret ; SPI Transfer Complete Handler
USART_RXC: ret ; USART RX Complete Handler
USART_UDRE: ret ; UDR Empty Handler
USART_TXC: ret ; USART TX Complete Handler
ADC_IRQ: ret ; ADC Conversion Complete Handler
EE_RDY: ret ; EEPROM Ready Handler
ANA_COMP: ret ; Analog Comparator Handler
TWSI: ret ; Two-wire Serial Interface Handler
SPM_RDY: ret ; Store Program Memory Ready Handler
TIM2_OVF:
;Timer2 Overflow Handler
;nop
;nop
;nop
cpi Seconds,0
brbs 1, TurnON_VD2 ;BRBS - Branch if Bit in SREG is Set
TurnON_VD1:
out PortD, SetOnVD1
inc Seconds
rjmp TIM2_OVF_Exit
TurnON_VD2:
out PortD, SetOnVD2
dec Seconds
TIM2_OVF_Exit:
reti
RESET:
cli ; Clear the interrupt bit in the status register, disable interrupt execution
;Инициализация стека
ldi r16,high(RAMEND); Main program start. RAMEND is the highest 16-bit address in SRAM
out SPH,r16 ; Set Stack Pointer to top of RAM
ldi r16,low(RAMEND)
out SPL,r16
;НАСТРОЙКА TIMER/COUNTER2 В АСИНХРОННЫЙ РЕЖИМ
;1. Disable the Timer/Counter2 interrupts by clearing OCIE2 and TOIE2.
;Запрепить прерывания, сбросив биты OCIE2 and TOIE2 в регистре TIMSK, биты 7 и 6
clr Temp
cbr Temp, (1<<OCIE2)|(1<<TOIE2)
out TIMSK, Temp
;2. Select clock source by setting AS2 as appropriate
;Установить бит AS2 = 1 в регистре ASSR, бит 3
clr Temp
sbr Temp, (1<<AS2)
out ASSR, Temp
;3. Write new values to TCNT2, OCR2, and TCCR2.
;Записать новые значения в TCNT2 (хранит значение),
;OCR2 (вых. рег-р сравнения), and TCCR2 (рег-р управл-я, вкл. предделителями)
clr Temp
out TCNT2, Temp
out OCR2, Temp ;В программе не используется
;Устанавливаем предделитель = 128
;32,768 кГц / 128 / 256 => переполнение раз в 1 сек.
clr Temp
sbr Temp, (1<<CS22)|(0<<CS21)|(1<<CS20)
out TCCR2, Temp
;4. To switch to asynchronous operation:
;Wait for TCN2UB, OCR2UB, and TCR2UB - биты 2, 1, 0 в ASSR
;В ASSR д.б. значение 0b00001000, проверяем его.
Wait_For_Switch_ASSR:
in Temp, ASSR
andi Temp, (0<<AS2)|(1<<TCN2UB)|(1<<OCR2UB)|(1<<TCR2UB)
brbc SREG_Z, Wait_For_Switch_ASSR ;BRBC - Branch if Bit in SREG is Cleared
;<END Wait_For_Switch_ASSR>
;5. Clear the Timer/Counter2 Interrupt Flags.
;Сбросить флаги прерываний OCF2 и TOV2 (биты 7 и 6 в TIFR), записав в них "1", т.к.:
;Alternatively, OCF2 is cleared by writing a logic one to the flag
;Alternatively, TOV2 is cleared by writing a logic one to the flag.
clr Temp
sbr Temp, (1<<OCF2)|(1<<TOV2)
out TIFR, Temp
;6. Enable interrupts, if needed.
;Разрешаем прерывания по переполнению в Timer/Counter2
;Записать TOIE2 = 1 (бит 6 в TIMSK)
clr Temp
sbr Temp, (1<<TOIE2)
out TIMSK, Temp
;<END НАСТРОЙКА TIMER/COUNTER2 В АСИНХРОННЫЙ РЕЖИМ>
;Вспомогательные переменные
ldi Seconds, 0
ldi SetOnVD1, 0b00011110
ldi SetOnVD2, 0b11100000
;Настройка порта C и D на вывод.
ldi Temp,0b11111111
out ddrc,Temp
out ddrb,Temp
clr Temp
out PortC, Temp
sei ; Enable interrupts
;<END RESET>
Main:
Ldi Temp, 0b00000001
out PortD, Temp
rjmp Main
Ср окт 30, 2013 01:44:22
brbc SREG_Z, Wait_For_Switch_ASSR ;BRBC - Branch if Bit in SREG is Cleared
Чт окт 31, 2013 06:16:24
akl писал(а):Правда, не понятно что Вы хотите увидеть от этой проги. Вроде, в прерывании идет вывод на порт D, но оный на вывод не настроен. Или настроенный на вывод порт B это ошибка?
;Настройка порта C и D на вывод.
ldi Temp,0b11111111
out ddrc,Temp
out ddrb,Temp
akl писал(а):Также в ступор меня ввела командаКод: brbc SREG_Z, Wait_For_Switch_ASSR ;BRBC - Branch if Bit in SREG is Cleared и, хотя, студия даже не пискнула я её не понимаю.
; SREG - Status Register
.equ SREG_C = 0 ; Carry Flag
.equ SREG_Z = 1 ; Zero Flag
.equ SREG_N = 2 ; Negative Flag
.equ SREG_V = 3 ; Two's Complement Overflow Flag
.equ SREG_S = 4 ; Sign Bit
.equ SREG_H = 5 ; Half Carry Flag
.equ SREG_T = 6 ; Bit Copy Storage
.equ SREG_I = 7 ; Global Interrupt Enable
;4. To switch to asynchronous operation:
;Wait for TCN2UB, OCR2UB, and TCR2UB - биты 2, 1, 0 в ASSR
;В ASSR д.б. значение 0b00001000, проверяем его.
Wait_For_Switch_ASSR:
in Temp, ASSR
andi Temp, (0<<AS2)|(1<<TCN2UB)|(1<<OCR2UB)|(1<<TCR2UB)
brbc SREG_Z, Wait_For_Switch_ASSR ;BRBC - Branch if Bit in SREG is Cleared
;<END Wait_For_Switch_ASSR>
Чт окт 31, 2013 07:41:30
Black_Wolf писал(а):Испытал в ISIS файлы...
Покажите, где порт D настраивается на выводBlack_Wolf писал(а):Оба порта C и D настроены на вывод:
Код:
;Настройка порта C и D на вывод.
ldi Temp,0b11111111
out ddrc,Temp
out ddrb,Temp
К порту С подключены катоды индикаторов, а к порту D - аноды сегментов индикатора
Понятно.Black_Wolf писал(а):SREG_Z - это флаг Z в статусном регистре SREG. Из файла "m8def.inc"
Чт окт 31, 2013 11:45:00
akl писал(а):Покажите, где порт D настраивается на вывод
akl писал(а):Правда, не понятно что Вы хотите увидеть от этой проги. Вроде, в прерывании идет вывод на порт D, но оный на вывод не настроен. Или настроенный на вывод порт B это ошибка?
.def Seconds=R16
.def Temp=R18
.CSEG
.ORG 0
rjmp RESET ; Reset Handler
rjmp EXT_INT0 ; IRQ0 Handler
rjmp EXT_INT1 ; IRQ1 Handler
rjmp TIM2_COMP ; Timer2 Compare Handler
rjmp TIM2_OVF ; Timer2 Overflow Handler
rjmp TIM1_CAPT ; Timer1 Capture Handler
rjmp TIM1_COMPA ; Timer1 CompareA Handler
rjmp TIM1_COMPB ; Timer1 CompareB Handler
rjmp TIM1_OVF ; Timer1 Overflow Handler
rjmp TIM0_OVF ; Timer0 Overflow Handler
rjmp SPI_STC ; SPI Transfer Complete Handler
rjmp USART_RXC ; USART RX Complete Handler
rjmp USART_UDRE ; UDR Empty Handler
rjmp USART_TXC ; USART TX Complete Handler
rjmp ADC_IRQ ; ADC Conversion Complete Handler
rjmp EE_RDY ; EEPROM Ready Handler
rjmp ANA_COMP ; Analog Comparator Handler
rjmp TWSI ; Two-wire Serial Interface Handler
rjmp SPM_RDY ; Store Program Memory Ready Handler
EXT_INT0: ret ; IRQ0 Handler
EXT_INT1: ret ; IRQ1 Handler
TIM2_COMP: ret ; Timer2 Compare Handler
;TIM2_OVF: ret ; Timer2 Overflow Handler
TIM1_CAPT: ret ; Timer1 Capture Handler
TIM1_COMPA: ret ; Timer1 CompareA Handler
TIM1_COMPB: ret ; Timer1 CompareB Handler
TIM1_OVF: ret ; Timer1 Overflow Handler
TIM0_OVF: ret ; Timer0 Overflow Handler
SPI_STC: ret ; SPI Transfer Complete Handler
USART_RXC: ret ; USART RX Complete Handler
USART_UDRE: ret ; UDR Empty Handler
USART_TXC: ret ; USART TX Complete Handler
ADC_IRQ: ret ; ADC Conversion Complete Handler
EE_RDY: ret ; EEPROM Ready Handler
ANA_COMP: ret ; Analog Comparator Handler
TWSI: ret ; Two-wire Serial Interface Handler
SPM_RDY: ret ; Store Program Memory Ready Handler
TIM2_OVF:
;Timer2 Overflow Handler
push Temp
in Temp, SREG
push Temp
inc Seconds
pop Temp
out SREG, Temp
pop Temp
reti
RESET:
cli ; Clear the interrupt bit in the status register, disable interrupt execution
;Инициализация стека
ldi r16,high(RAMEND); Main program start. RAMEND is the highest 16-bit address in SRAM
out SPH,r16 ; Set Stack Pointer to top of RAM
ldi r16,low(RAMEND)
out SPL,r16
;НАСТРОЙКА TIMER/COUNTER2 В АСИНХРОННЫЙ РЕЖИМ
;1. Disable the Timer/Counter2 interrupts by clearing OCIE2 and TOIE2.
;Запрепить прерывания, сбросив биты OCIE2 and TOIE2 в регистре TIMSK, биты 7 и 6
clr Temp
cbr Temp, (1<<OCIE2)|(1<<TOIE2)
out TIMSK, Temp
;2. Select clock source by setting AS2 as appropriate
;Установить бит AS2 = 1 в регистре ASSR, бит 3
clr Temp
sbr Temp, (1<<AS2)
out ASSR, Temp
;3. Write new values to TCNT2, OCR2, and TCCR2.
;Записать новые значения в TCNT2 (хранит значение),
;OCR2 (вых. рег-р сравнения), and TCCR2 (рег-р управл-я, вкл. предделителями)
clr Temp
out TCNT2, Temp
out OCR2, Temp ;В программе не используется
;Устанавливаем предделитель = 128
;32,768 кГц / 128 / 256 => переполнение раз в 1 сек.
clr Temp
sbr Temp, (1<<CS22)|(0<<CS21)|(1<<CS20)
out TCCR2, Temp
;4. To switch to asynchronous operation:
;Wait for TCN2UB, OCR2UB, and TCR2UB - биты 2, 1, 0 в ASSR
;В ASSR д.б. значение 0b00001000, проверяем его.
Wait_For_Switch_ASSR:
in Temp, ASSR
andi Temp, (0<<AS2)|(1<<TCN2UB)|(1<<OCR2UB)|(1<<TCR2UB)
brbc SREG_Z, Wait_For_Switch_ASSR ;BRBC - Branch if Bit in SREG is Cleared
;<END Wait_For_Switch_ASSR>
;5. Clear the Timer/Counter2 Interrupt Flags.
;Сбросить флаги прерываний OCF2 и TOV2 (биты 7 и 6 в TIFR), записав в них "1", т.к.:
;Alternatively, OCF2 is cleared by writing a logic one to the flag
;Alternatively, TOV2 is cleared by writing a logic one to the flag.
clr Temp
sbr Temp, (1<<OCF2)|(1<<TOV2)
out TIFR, Temp
;6. Enable interrupts, if needed.
;Разрешаем прерывания по переполнению в Timer/Counter2
;Записать TOIE2 = 1 (бит 6 в TIMSK)
clr Temp
sbr Temp, (1<<TOIE2)
out TIMSK, Temp
;<END НАСТРОЙКА TIMER/COUNTER2 В АСИНХРОННЫЙ РЕЖИМ>
;Вспомогательные переменные
ldi Seconds, 0
;Настройка порта C и D на вывод
ldi Temp,0b11111111
out ddrc,Temp
out ddrd,Temp
clr Temp
out PortC, Temp
;Включить один сегмент на индикаторе
Ldi Temp, 0b00000001
out PortD, Temp
sei ; Enable interrupts
;<END RESET>
Main:
ldi Temp, 0b11100000
sbrc Seconds, 0 ;SBRC - Skip if Bit in Register is Cleared
ldi Temp, 0b00011110
ori Temp, 0b00000001
out PortD, Temp
rjmp Main
akl писал(а):Black_Wolf Извините, но мне не ведома прога ISIS, с помощью которой Вы проверяете коды, сгенерированные студией.
Пт ноя 01, 2013 10:22:11
Ничего для этого не надо делать. Разве что снять предделитель /128 на время отладки. Желательно также назначить тактовую (3.276800МГц), чтобы увидеть правильность формирования интервала.Black_Wolf писал(а): При прогоне программы регистр TCNT2 не меняет своего значения (ниже прикрепил скрин). Как в Atmel Studio запускать прерывания в режиме отладки?
Пт ноя 01, 2013 22:16:14
Вс ноя 24, 2013 13:16:05
Вс ноя 24, 2013 14:07:05
Ср дек 11, 2013 12:46:30
Ср дек 11, 2013 13:09:14
Ср дек 11, 2013 13:19:05
coredumped писал(а):Очень просто:
uint16_t a = 12345;
TCNT1 = a;
a = TCNT1;
Ср дек 11, 2013 14:41:54
*BoyKot* писал(а):Т.е. можно просто отбросить буквы L и H в названии регистров и оперировать сразу одним 16-разрядным TCNT1?
Ср дек 11, 2013 15:27:52
coredumped писал(а):*BoyKot* писал(а):Т.е. можно просто отбросить буквы L и H в названии регистров и оперировать сразу одним 16-разрядным TCNT1?
Да
Пт янв 03, 2014 22:58:48
#define F_CPU 16384000UL
#include <avr/io.h>
#include <avr/interrupt.h>
//***************//
ISR (TIMER0_COMP_vect) // обработчик прерывания таймера Т0
{
asm("nop");
}
ISR (TIMER0_OVF_vect) // Обработчик прерывания таймера по переполнению
{
asm("nop");
}
int main(void)
{
TCCR0 |=(1<<0); // выбираем коэффициэнт деления
TCCR0 &=~(1<<WGM00); // выбираем режим работы таймера
TCCR0 &=~(1<<WGM01); // выбираем режим работы таймера
TIMSK |=(1<<0); // задаём вектор прерывания при переполнении
//OCR0 = 50;
asm("sei"); // разрешаем глобальные прерывания
while(1)
{
asm("nop");
}
}
Сб янв 04, 2014 12:11:15
main ()
{
...
unsigned char counter=0;
while()
{
[b]counter++[/b]
}
...
}
TIMSK0 = TIMSK0|(1<<TOIE0); //разрешение таймера как счетчика?
TCCR0A = TCCR0A|(1<<WGM00)|(0<<WGM01); //управление модулем таймера/счетчика? режим PWM Phase correct
int ShowInPortB(unsigned Char AnyWarible)
{
PORTB=AnyVarible;
}
int main()
{
...
while(1)
{
ShowInPortB(TCNT0);
}
...
}
Сб янв 04, 2014 12:16:09
Сб янв 04, 2014 12:19:46
TIMSK0 = TIMSK0|(1<<TOIE0); //разрешение таймера как счетчика?
TCCR0A = TCCR0A|(1<<WGM00)|(0<<WGM01); //управление модулем таймера/счетчика? режим PWM Phase correct
Сб янв 04, 2014 15:58:16