AVR studio в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 13
Зарегистрирован: Ср сен 16, 2009 19:03:31

Сообщение Gron »

Engineer_Keen писал(а):
Gron писал(а):работает ли в AVR Studio счетный регистр TCNTxL (TCNTxH) при запуске таймера?
Не знаю как в 4.18, но в 4.17 точно работает. Ошибка может быть в коде (например не установлен прескалер или установлен такой, что значение меняется очень медленно).
temp, 0x05 - код конфигурации установлен. В микроконтроллере код работает.
Последний раз редактировалось Gron Пт авг 26, 2011 06:47:29, всего редактировалось 1 раз.
Реклама
Родился
Сообщения: 13
Зарегистрирован: Ср сен 16, 2009 19:03:31

Сообщение Gron »

Поставил я версию 4.17 - ничего не изменилось. Наверное я неправильно спросил. Меняется ли (увеличивается) значение счетного регистра при пошаговой отладки, как в реальном котроллере. Или такой возможности AVR Studia 4 не предоставляет. Ибо постоянно при проходе по циклу wt1 в temp заносится только 0, значит значения не меняются.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Gron писал(а):Поставил я версию 4.17 - ничего не изменилось.
Есть такая полезная штука — know issues в хэлпе про симулятор, посмотрите там, нормально ли симулируется таймер для вашеё меги. Как вариант, попробуйте использовать симулятор2.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Родился
Сообщения: 13
Зарегистрирован: Ср сен 16, 2009 19:03:31

Сообщение Gron »

В know issues для своей меги информации нету, только общая. Во втором симуляторе моя мега (atmega32a) недоступна.
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

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.

При пошаговой отладке значение счётного регистра увеличивается.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Gron писал(а):[...]Ибо постоянно при проходе по циклу wt1 в temp заносится только 0, значит значения не меняются.
У вас предделитель стоит - 0x05. Вы вручную сделали 1024 шага чтобы увидеть что значение TCNT изменилось?
Реклама
Родился
Сообщения: 13
Зарегистрирован: Ср сен 16, 2009 19:03:31

Сообщение Gron »

:)) . Engineer_Keen Теперь я понял почему значения не менялось. Спасибо всем за помощь. :))
Встал на лапы
Сообщения: 136
Зарегистрирован: Пн июл 12, 2010 16:03:11

Сообщение Valek87 »

Добрый день. Использую atmega324p. Задача элементарная - мигать светододом каждую секунду. Всё делаю по аналогии с инструкцией. Но когда я ввожу

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

 ldi Temp,0b00100111    ;разрешить прерывание компаратора 
out TIMSK,Temp
мне пишется
error: Undefined symbol: TIMSK
Тогда я изменяю на

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

ldi r18,0b00100111   ;разрешить прерывание компаратора
out 0x6E,r18
на что мне пишется
error: Operand 1 out of range: 0x6e
Помогите обнаружить ошибку. :( Может у кого есть пример уже написанной программы, где используется данная операция с миганием?
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

все правильно
для доступа к регистрам выше 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

Сообщение Valek87 »

А нет ли примера?
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Valek87 писал(а):А нет ли примера?
А чего сложного? Код такой же, только out меняем на sts, и имя правильное пишем. Или нужен пример программы целиком ?

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

ldi Temp,0b00100111    ;разрешить прерывание компаратора
sts TIMSK0,Temp
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

проблема АВРок в том, сто они не совместимы между собой:
разные имена, разные адреса, и т.д.
поэтому при переходе с одного камня на другой приходится переделывать программу, даже если она работала на предыдущем камне.
в этом отношении STM8 намного удобней
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Встал на лапы
Сообщения: 136
Зарегистрирован: Пн июл 12, 2010 16:03:11

Сообщение Valek87 »

Вот составил я программу, но почему то не получается: Помогите пожалуйста. Светодиод подключен к 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 раза.
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

1. где дефайн для проца? ну или хотя бы какой проц.
2. у тебя стек не инициализирован, он стоит до метки Reset

Дальше пока смысла нет смотреть. :dont_know:
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Встал на лапы
Сообщения: 136
Зарегистрирован: Пн июл 12, 2010 16:03:11

Сообщение Valek87 »

1. где дефайн для проца? ну или хотя бы какой проц.
Как его сделать? Используется МС atmega324p.
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

в начале программы напиши:

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

#include "m324Pdef.inc"
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

несколько советов:
1. не используй абсолютные адреса, сам потом запутаешься используй имена из дефайна, там описано все что касается процика: вся периферия, распределение памяти, векторов прерываний
2. для своих переменных задавай осмысленные имена, а тупо "temp1", "temp2" и т.д.
3. НИКОГДА не определяй вектора прерываний как описано в местной "обучалке"
обычалка была написана, видимо "в попыхах" в ней очень много вредных советов, лучше почитай обучалку у DiHalt-а
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Встал на лапы
Сообщения: 136
Зарегистрирован: Пн июл 12, 2010 16:03:11

Сообщение Valek87 »

Сделал:
Вектора прерываний я скопировал с даташита. Мне просто бы иметь образец программы вставки таймера. А там я думаю уже разберусь. Мне бы понять принцип его работы.

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

; ******************************************************
; 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                  ;выход из обработчика
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

а теперь смотри

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

          ldi r18,0b00100111   ;разрешить прерывание компаратора (TIMSK1)
          sts 0x6F,r18
первое куда упал взгляд
и посмотри на свою таблиц векторов прерываний...
у меги324 вектора 2х словные, а у тебя там каша.

Вообще-то это не относится к студии переноси вопросы сюда, http://radiokot.ru/forum/viewtopic.php?f=20&t=5931
будем дальше ковырять.
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

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

rjmp RESET ; Reset
Нормально

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

rjmp INT0 ; INT0
...
...
Метка INT0 есть в программе? Не путаете с уже определенной константой (бит в регистре EIMSK)?

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

rjmp $000C ; PCINT2
...
...
Я конечно понимаю, что на этот адрес вроде бы мы попасть не должны, но делать заглушки прерываний-бесконечными циклами это по-моему нехорошо...

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

Reset:    ldi r16,0b01111111 ;настройка PORTD
          out 0x0A,r16
Ну так и пишите PORTD, а не 0x0A, вам же уже говорили, сами запутаетесь :facepalm:
Ответить

Вернуться в «AVR»