temp, 0x05 - код конфигурации установлен. В микроконтроллере код работает.Engineer_Keen писал(а):Не знаю как в 4.18, но в 4.17 точно работает. Ошибка может быть в коде (например не установлен прескалер или установлен такой, что значение меняется очень медленно).Gron писал(а):работает ли в AVR Studio счетный регистр TCNTxL (TCNTxH) при запуске таймера?
AVR studio в вопросах и ответах
- Сообщения: 13
- Зарегистрирован: Ср сен 16, 2009 19:03:31
Последний раз редактировалось Gron Пт авг 26, 2011 06:47:29, всего редактировалось 1 раз.
- Реклама
- Сообщения: 13
- Зарегистрирован: Ср сен 16, 2009 19:03:31
Поставил я версию 4.17 - ничего не изменилось. Наверное я неправильно спросил. Меняется ли (увеличивается) значение счетного регистра при пошаговой отладки, как в реальном котроллере. Или такой возможности AVR Studia 4 не предоставляет. Ибо постоянно при проходе по циклу wt1 в temp заносится только 0, значит значения не меняются.
Есть такая полезная штука — know issues в хэлпе про симулятор, посмотрите там, нормально ли симулируется таймер для вашеё меги. Как вариант, попробуйте использовать симулятор2.Gron писал(а):Поставил я версию 4.17 - ничего не изменилось.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Сообщения: 13
- Зарегистрирован: Ср сен 16, 2009 19:03:31
В know issues для своей меги информации нету, только общая. Во втором симуляторе моя мега (atmega32a) недоступна.
Ну да, есть общие слова:Gron писал(а):В know issues для своей меги информации нету, только общая. Во втором симуляторе моя мега (atmega32a) недоступна.
Timer/Counters
16-bit Timer/Counters on all devices have several problems with PWM, prescaler and output compare. Output compare registers are not buffered properly.
The Asynchronous Status Register (ASSR) is not supported in timers with asynchronous mode. This is due to lack of a generic external clock implementation.
При пошаговой отладке значение счётного регистра увеличивается.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Реклама
У вас предделитель стоит - 0x05. Вы вручную сделали 1024 шага чтобы увидеть что значение TCNT изменилось?Gron писал(а):[...]Ибо постоянно при проходе по циклу wt1 в temp заносится только 0, значит значения не меняются.
- Сообщения: 13
- Зарегистрирован: Ср сен 16, 2009 19:03:31
- Сообщения: 136
- Зарегистрирован: Пн июл 12, 2010 16:03:11
Добрый день. Использую atmega324p. Задача элементарная - мигать светододом каждую секунду. Всё делаю по аналогии с инструкцией. Но когда я ввожу
мне пишется на что мне пишется
Может у кого есть пример уже написанной программы, где используется данная операция с миганием?
Код: Выделить всё
ldi Temp,0b00100111 ;разрешить прерывание компаратора
out TIMSK,TempТогда я изменяю наerror: Undefined symbol: TIMSK
Код: Выделить всё
ldi r18,0b00100111 ;разрешить прерывание компаратора
out 0x6E,r18Помогите обнаружить ошибку.error: Operand 1 out of range: 0x6e
все правильно
для доступа к регистрам выше 0х32 используются команды
sts/lds
TIMSK - проверь в файле m***def.inc как он там обзывается.
для доступа к регистрам выше 0х32 используются команды
sts/lds
TIMSK - проверь в файле m***def.inc как он там обзывается.
Код: Выделить всё
.equ TIMSK2 = 0x70 ; MEMORY MAPPED
.equ TIMSK1 = 0x6f ; MEMORY MAPPED
.equ TIMSK0 = 0x6e ; MEMORY MAPPED
- Сообщения: 136
- Зарегистрирован: Пн июл 12, 2010 16:03:11
А чего сложного? Код такой же, только out меняем на sts, и имя правильное пишем. Или нужен пример программы целиком ?Valek87 писал(а):А нет ли примера?
Код: Выделить всё
ldi Temp,0b00100111 ;разрешить прерывание компаратора
sts TIMSK0,Temp
проблема АВРок в том, сто они не совместимы между собой:
разные имена, разные адреса, и т.д.
поэтому при переходе с одного камня на другой приходится переделывать программу, даже если она работала на предыдущем камне.
в этом отношении STM8 намного удобней
разные имена, разные адреса, и т.д.
поэтому при переходе с одного камня на другой приходится переделывать программу, даже если она работала на предыдущем камне.
в этом отношении STM8 намного удобней
- Сообщения: 136
- Зарегистрирован: Пн июл 12, 2010 16:03:11
Вот составил я программу, но почему то не получается: Помогите пожалуйста. Светодиод подключен к PD2.
Код: Выделить всё
; ******************************************************
; BASIC .ASM template file for AVR
; ******************************************************
;Define here the variables
.def temp=r16
.def temp1=r17
.def temp2=r18
.def temp3=r19
.def temp4=r20
.cseg
.org 0
; Define here Reset and interrupt vectors
rjmp RESET ; Reset
rjmp INT0 ; INT0
rjmp INT1 ; INT1
rjmp INT2 ; INT2
rjmp PCINT0 ; PCINT0
rjmp PCINT1 ; PCINT1
rjmp $000C ; PCINT2
rjmp $000E ; PCINT3
rjmp $0010 ; Watchdog Timeout
rjmp $0012 ; Timer2 CompareA
rjmp $0014 ; Timer2 CompareB
rjmp $0016 ; Timer2 Overflow
rjmp $0018 ; Timer1 Capture
rjmp $001A ; Timer1 CompareA
rjmp $001C ; Timer1 CompareB
rjmp $001E ; Timer1 Overflow
rjmp $0020 ; Timer0 CompareA
rjmp $0022 ; Timer0 CompareB
rjmp $0024 ; Timer0 Overflow
rjmp $0026 ; SPI Transfer Complete
rjmp $0028 ; USART0 RX Complete
rjmp $002A ; USART0,UDR Empty
rjmp $002C ; USART0 TX Complete
rjmp $002E ; Analog Comparator
rjmp $0030 ; ADC Conversion Complete
rjmp $0032 ; EEPROM Ready
rjmp $0034 ; 2-wire Serial
rjmp $0036 ; SPM Ready
rjmp $0038 ; USART1 RX Complete
rjmp $003A ; USART1,UDR Empty
rjmp $003C ; USART1 TX Complete
;****************************************************
;******************************
;RESET:
INT0:
INT1:
INT2:
PCINT0:
PCINT1:
PCINT2:
PCINT3:
WDT:
TIM2_COMPA:
TIM2_COMPB:
TIM2_OVF:
TIM1_COMPA:
TIM1_COMPB:
;TIM1_OVF:
TIM0_COMPA:
TIM0_COMPB:
TIM0_OVF:
SPI_STC:
USART0_RXC:
USART0_UDRE:
USART0_TXC:
ANA_COMP:
;ADC:
EE_RDY:
TWI:
SPM_RDY:
USART1_RXC:
USART1_UDRE:
USART1_TXC:
reti
;****************************************************
; ИНИЦИАЛИЗАЦИЯ
;****************************************************
Reset: ldi r16,0b01111111 ;настройка PORTD
out 0x0A,r16
ldi r16,0b00000100 ;загрузка указателя стека
out $3E,r16
ldi r16,0b10111111 ;загрузка указателя стека
out $3D,r16
ldi r18,0b00100111 ;разрешить прерывание компаратора (TIMSK1)
sts 0x6F,r18
ldi Temp,0b00000101 ;тактовый сигнал = CK/1024 (TCCR1B)
sts 0x81,Temp
ldi Temp,0x4E ;инициализация компаратора
sts 0x89,Temp ;(OCR1AH)
ldi Temp,0x20
sts 0x88,Temp ;(OCR1AL)
ldi Temp1,0b00000100 ;инициализация индикатора
ldi Temp,0 ;обнуление таймера
sts 0x85,Temp ;(TCNT1H)
sts 0x84,Temp ;(TCNT1L)
sei ;разрешить прерывания
;****************************************************
; ОСНОВНОЙ ЦИКЛ
;****************************************************
Inf:
rjmp Inf ;бесконечный цикл
;****************************************************
; ОБРАБОТЧИК ПРЕРЫВАНИЯ КОМПАРАТОРА
;****************************************************
TIM1_OVF:
ldi Temp,0 ;обнуление таймера
sts 0x85,Temp
sts 0x84,Temp
Shift: cpi Temp1,0b00000000 ;сравнить с 0
breq Init ;если равно - загрузка нач. знач.
ldi Temp1,0b00000000
rjmp Output ;перейти на вывод в порт
Init: ldi Temp1,0b00000100 ;загрузить нач. значение
Output: out 0x2B,Temp1 ;вывод в порт D
reti ;выход из обработчика
Последний раз редактировалось Valek87 Пт сен 09, 2011 12:03:00, всего редактировалось 2 раза.
1. где дефайн для проца? ну или хотя бы какой проц.
2. у тебя стек не инициализирован, он стоит до метки Reset
Дальше пока смысла нет смотреть.
2. у тебя стек не инициализирован, он стоит до метки Reset
Дальше пока смысла нет смотреть.
- Сообщения: 136
- Зарегистрирован: Пн июл 12, 2010 16:03:11
Как его сделать? Используется МС atmega324p.1. где дефайн для проца? ну или хотя бы какой проц.
в начале программы напиши:
Код: Выделить всё
#include "m324Pdef.inc"несколько советов:
1. не используй абсолютные адреса, сам потом запутаешься используй имена из дефайна, там описано все что касается процика: вся периферия, распределение памяти, векторов прерываний
2. для своих переменных задавай осмысленные имена, а тупо "temp1", "temp2" и т.д.
3. НИКОГДА не определяй вектора прерываний как описано в местной "обучалке"
обычалка была написана, видимо "в попыхах" в ней очень много вредных советов, лучше почитай обучалку у DiHalt-а
1. не используй абсолютные адреса, сам потом запутаешься используй имена из дефайна, там описано все что касается процика: вся периферия, распределение памяти, векторов прерываний
2. для своих переменных задавай осмысленные имена, а тупо "temp1", "temp2" и т.д.
3. НИКОГДА не определяй вектора прерываний как описано в местной "обучалке"
обычалка была написана, видимо "в попыхах" в ней очень много вредных советов, лучше почитай обучалку у DiHalt-а
- Сообщения: 136
- Зарегистрирован: Пн июл 12, 2010 16:03:11
Сделал:
Вектора прерываний я скопировал с даташита. Мне просто бы иметь образец программы вставки таймера. А там я думаю уже разберусь. Мне бы понять принцип его работы.
Вектора прерываний я скопировал с даташита. Мне просто бы иметь образец программы вставки таймера. А там я думаю уже разберусь. Мне бы понять принцип его работы.
Код: Выделить всё
; ******************************************************
; BASIC .ASM template file for AVR
; ******************************************************
#include "m324Pdef.inc"
.def temp=r16
.def temp1=r17
.def temp2=r18
.def temp3=r19
.def temp4=r20
.cseg
.org 0
; Define here Reset and interrupt vectors
rjmp RESET ; Reset
rjmp INT0 ; INT0
rjmp INT1 ; INT1
rjmp INT2 ; INT2
rjmp PCINT0 ; PCINT0
rjmp PCINT1 ; PCINT1
rjmp $000C ; PCINT2
rjmp $000E ; PCINT3
rjmp $0010 ; Watchdog Timeout
rjmp $0012 ; Timer2 CompareA
rjmp $0014 ; Timer2 CompareB
rjmp $0016 ; Timer2 Overflow
rjmp $0018 ; Timer1 Capture
rjmp $001A ; Timer1 CompareA
rjmp $001C ; Timer1 CompareB
rjmp $001E ; Timer1 Overflow
rjmp $0020 ; Timer0 CompareA
rjmp $0022 ; Timer0 CompareB
rjmp $0024 ; Timer0 Overflow
rjmp $0026 ; SPI Transfer Complete
rjmp $0028 ; USART0 RX Complete
rjmp $002A ; USART0,UDR Empty
rjmp $002C ; USART0 TX Complete
rjmp $002E ; Analog Comparator
rjmp $0030 ; ADC Conversion Complete
rjmp $0032 ; EEPROM Ready
rjmp $0034 ; 2-wire Serial
rjmp $0036 ; SPM Ready
rjmp $0038 ; USART1 RX Complete
rjmp $003A ; USART1,UDR Empty
rjmp $003C ; USART1 TX Complete
;****************************************************
;******************************
;RESET:
;TIM0_COMPA:
reti
;****************************************************
; ИНИЦИАЛИЗАЦИЯ
;****************************************************
Reset: ldi r16,0b01111111 ;настройка PORTD
out 0x0A,r16
ldi r16,0b00000100 ;загрузка указателя стека
out $3E,r16
ldi r16,0b10111111 ;загрузка указателя стека
out $3D,r16
ldi r18,0b00100111 ;разрешить прерывание компаратора (TIMSK1)
sts 0x6F,r18
ldi Temp,0b00000101 ;тактовый сигнал = CK/1024 (TCCR1B)
sts 0x81,Temp
ldi Temp,0x4E ;инициализация компаратора
sts 0x89,Temp ;(OCR1AH)
ldi Temp,0x20
sts 0x88,Temp ;(OCR1AL)
ldi Temp1,0b00000100 ;инициализация индикатора
ldi Temp,0 ;обнуление таймера
sts 0x85,Temp ;(TCNT1H)
sts 0x84,Temp ;(TCNT1L)
sei ;разрешить прерывания
;****************************************************
; ОСНОВНОЙ ЦИКЛ
;****************************************************
Inf:
rjmp Inf ;бесконечный цикл
;****************************************************
; ОБРАБОТЧИК ПРЕРЫВАНИЯ КОМПАРАТОРА
;****************************************************
TIM1_COMPA:
ldi Temp,0 ;обнуление таймера
sts 0x85,Temp
sts 0x84,Temp
Shift: cpi Temp1,0b00000000 ;сравнить с 0
breq Init ;если равно - загрузка нач. знач.
ldi Temp1,0b00000000
rjmp Output ;перейти на вывод в порт
Init: ldi Temp1,0b00000100 ;загрузить нач. значение
Output: out 0x2B,Temp1 ;вывод в порт D
reti ;выход из обработчика
а теперь смотри
первое куда упал взгляд
и посмотри на свою таблиц векторов прерываний...
у меги324 вектора 2х словные, а у тебя там каша.
Вообще-то это не относится к студии переноси вопросы сюда, http://radiokot.ru/forum/viewtopic.php?f=20&t=5931
будем дальше ковырять.
Код: Выделить всё
ldi r18,0b00100111 ;разрешить прерывание компаратора (TIMSK1)
sts 0x6F,r18
и посмотри на свою таблиц векторов прерываний...
у меги324 вектора 2х словные, а у тебя там каша.
Вообще-то это не относится к студии переноси вопросы сюда, http://radiokot.ru/forum/viewtopic.php?f=20&t=5931
будем дальше ковырять.
Код: Выделить всё
rjmp RESET ; Reset
Код: Выделить всё
rjmp INT0 ; INT0
...
...
Код: Выделить всё
rjmp $000C ; PCINT2
...
...
Код: Выделить всё
Reset: ldi r16,0b01111111 ;настройка PORTD
out 0x0A,r16



