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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Jman
Мучитель микросхем
Сообщения: 414
Зарегистрирован: Ср янв 26, 2011 13:43:30
Откуда: С того берега моря
Контактная информация:

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

Сообщение Jman »

Небольшой вопрос к гуру. Ребята как можно организовать строчку из Codevision Avr в Atmel Studio;
CVAVR

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


#define PULSE PORTA.3

interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
    TCNT0=0xF8;                     // 500 Гц на выходе;
    PULSE = ~PULSE ;
}

В Atmel studio сделал так

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

#define PULSE (1<<PINA3)

ISR(TIM0_OVF_vect)
{
    PORTA |=PULSE;
    TCNT0=0xF8;           // значение для переполнения - получаем 500 Гц на выходе;
    PORTA &= ~PULSE;
}

Это правильно?
[color=#4080FF]- Бежит этот подлец-электрон, а вокруг его масса (аж 10 в 23й) штук ионов кремния и 10 в 15й ионов примеси и он, подлец, взаимодействует![/color]
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

правильно то оно правильно, да только можно и лучше...

судя по коду вам больше подошел бы режим CTC таймера с соответствующим прерыванием - не надо было бы делать TCNT0=0xF8;
так же в студии для замены (1<<PINA3) предназначен макрос _BV(PINA3), соответственно нет смысла вводить PULSE

кстати, первый код генерирует меандр, а второй выдает короткие импульсы. для меандра есть смысл делать PORTA ^= _BV(PINA3); или воспользоваться особенностью "новой" архитектуры портов AVR и делать PINA = _BV(PINA3);
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Jman
Мучитель микросхем
Сообщения: 414
Зарегистрирован: Ср янв 26, 2011 13:43:30
Откуда: С того берега моря
Контактная информация:

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

Сообщение Jman »

особенностью "новой" архитектуры портов AVR

Где читать?
[color=#4080FF]- Бежит этот подлец-электрон, а вокруг его масса (аж 10 в 23й) штук ионов кремния и 10 в 15й ионов примеси и он, подлец, взаимодействует![/color]
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

читать в даташитах.
"старые" МК так не умеют, новые (с индексами А или Р - уточнять по даташиту) умеют.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Jman
Мучитель микросхем
Сообщения: 414
Зарегистрирован: Ср янв 26, 2011 13:43:30
Откуда: С того берега моря
Контактная информация:

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

Сообщение Jman »

для меандра есть смысл делать

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

ISR(TIM0_OVF_vect)
{
    PORTA ^= _BV(PINA3);
}

Как правильно сделать меандр с тем кодом что у меня есть? Нужна-ли бибка для функции _BV в Atmel Studio?
[color=#4080FF]- Бежит этот подлец-электрон, а вокруг его масса (аж 10 в 23й) штук ионов кремния и 10 в 15й ионов примеси и он, подлец, взаимодействует![/color]
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

_BV - это макрос, стандартный для avr-gcc. как у вас в последнем сообщении должно работать. разумеется, в самом начале программы надо #include <avr/io.h>
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Jman
Мучитель микросхем
Сообщения: 414
Зарегистрирован: Ср янв 26, 2011 13:43:30
Откуда: С того берега моря
Контактная информация:

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

Сообщение Jman »

Работает но подчеркивается. Сделал так

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

#include <avr/sfr_defs.h>

ISR(TIM0_OVF_vect)
{
   TCNT0=0xF8;           // значение для переполнения - получаем 500 Гц на выходе;
    PORTA ^= _BV(PINA3);
}


Есть на выходе меандр с нужной частотой и _BV не подчеркивается.
[color=#4080FF]- Бежит этот подлец-электрон, а вокруг его масса (аж 10 в 23й) штук ионов кремния и 10 в 15й ионов примеси и он, подлец, взаимодействует![/color]
Аватара пользователя
Сем30
Открыл глаза
Сообщения: 68
Зарегистрирован: Чт июн 12, 2014 05:32:20

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

Сообщение Сем30 »

Не знаю как правильно объяснить но попытаюсь. Интерисует меня память EEPROM. В программе использую просто переменную и при старте программы в самой студии или в протеусе моя переменная в EEPROM имеет значение 0 но мне надо чтоб в реальном контроллере при первом запуске она была уже прописана в EEPROM т.к. она в ходе работы будет меняться и нельзя чтоб при старте контроллера она перезаписывалась. Как в студии, протеусе прописать что в данной переменной EEPROM лежит именно именно 2. Надо ли в студии переменную привязывать к конкретной ячейке и как вообще объявить переменную привязанную к конкретной ячейке?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

в "студии" - это означает в AVR-GCC.
1. в AVR-GCC для работы с EEPROM необходимо подключить заголовочник <avr/eeprom.h>
2. в коде надо описать "переменную" с префиксом EEMEM:

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

EEMEM int variable = 257;
3. если при компиляции задан режим создания файла для прошивания EEPROM, то будет создан файл *.eep, который по сути есть обычный HEX - если этот файл прошить в EEPROM микроконтроллера, то вот вам и будет "значение ячейки в программе из EEPROM"
4. работать с переменными, определенными по п.2, надо при помощи специальных функций: eeprom_read_ХХХ и eeprom_write_XXX, где ХХХ - может быть byte, word, dword или float - для работы с переменными соответственного типа

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

if(eeprom_read_word(&variable) == 257){// проверка содержимого той самой переменной
   eeprom_write_word(&variable, 1234); // задаем новое значение переменной
}
5. так как ресурс EEPROM не безграничный, надо стараться писать туда пореже. рекомендуется использовать вариант функций для записи, которая прежде чем записать, проверят содержимое ячеек EEPROM: если значение не изменилось, запись не делается. так работают функции eeprom_update_XXX
6. следует помнить, что работать с этими функциями в обработчиках прерываний надо с особой осторожностью: функции не реентерабельны!
7. следует помнить, что функция записи может занять время до 8 миллисекунд при работе с обычным int
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Q-ti
Встал на лапы
Сообщения: 134
Зарегистрирован: Чт ноя 17, 2011 00:57:23
Откуда: Харьков

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

Сообщение Q-ti »

Добрый вечер подскажите в чем проблема создал проект выбрал Atmega32 , пытаюсь откомпилировать пустой проект , а у меня выскакивает ошибка . В чем проблема ? Программа Avr Studio версия 4.19 .
Вложения
1.JPG
(195.75 КБ) 562 скачивания
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

как бы сообщение об ошибке есть, можно на крайний случай онлайн-переводчиком воспользоваться, чтобы понять, что не так...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
knoppix
Родился
Сообщения: 2
Зарегистрирован: Вс сен 04, 2016 08:42:15

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

Сообщение knoppix »

А вот вопрос, как использовать в AVR Studio, такую вещь как Linker->Memory Setting.
Требуется чтобы МК под определенные данные в EEPROM выделял строго определенные ячейки (накосячил я так немного с кодом, что автоматические выделение с помощью EEMEM не проходит).
Первая мысль была в Memory Setting разделе EEPROM задать два новых сегмента, допустим:

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

.eeprom_one 0x00
.eeprom_two 0x10

А затем определить их как:

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

#define EEPROM_ONE    __attribute__((section (".eeprom_one")))
#define EEPROM_TWO   __attribute__((section (".eeprom_two")))

Указатели на эти ячейки памяти определить как:

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

uint8_t pointer_one EEPROM_ONE;
uint8_t pointer_two EEPROM_TWO;

И потом уже обращаться по ним. Ну и что-то не работает ничего, возможно новые секции нужно как-то отдельно выделять в линкере, или еще что-то? Я так-то больше по ассемблеру, и то что иногда происходит в программах написанных на языках высокого уровня меня немного пугает.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

Можно обойтись без EEPROM-переменных, используя адреса напрямую. Вроде такого

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

#define VAR1 ((const unsigned char*)0x5A) //переменная по адресу 0x5A
char var1 = eeprom_read_byte( VAR1 );
knoppix
Родился
Сообщения: 2
Зарегистрирован: Вс сен 04, 2016 08:42:15

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

Сообщение knoppix »

COKPOWEHEU писал(а):Можно обойтись без EEPROM-переменных, используя адреса напрямую. Вроде такого

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

#define VAR1 ((const unsigned char*)0x5A) //переменная по адресу 0x5A
char var1 = eeprom_read_byte( VAR1 );


Такой вариант я пробовал, в целом можно сказать что проблема решена, но осталось желание разобраться именно с особенностью того, что я писал выше. Потому как если указать:

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

#define EEPROM_ONE    __attribute__((section (".eeprom")))

И потом в окне Linker->Memory Setting менять значение адреса, то все работает корректно, пишется куда укажешь. Получается что сегмент .eeprom в отличии .eeprom_one и .eeprom_two, где-то явно определяется. Но вот как, я не нашел.
blazer
Мучитель микросхем
Сообщения: 480
Зарегистрирован: Ср июн 29, 2011 14:30:41

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

Сообщение blazer »

Решил подправить прошивку по рекомендации автора. Обрадовался, я(в AVR Studio 4 лишь МК прошивал, с программированием не знаком совершенно)– оказывается просто всё! «запускаете компиллятор (например AVRASM2) и получаете готовый для программирования HEX- файл. Удобнее это делать, в среде программирования, (например AVR Studio 4) по команде "Build"".
Ну, открыть-то нужный файл сумел, а дальше … «курить» AVR Studio нужно. Может быть кто укажет конкретно, где именно об этой процедуре прочитать можно. Второй день бьюсь и никак не найду инструкцию этой проги.
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

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

Сообщение uk8amk »

blazer писал(а):где именно об этой процедуре прочитать можно.

раз.Меню-Help-AVR Studio User Guide
два.http://radiokot.ru/start/mcu_fpga/avr/02/
три.Программирование на языке С для AVR и PIC микроконтроллеров. Там немного картинок.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

#define EEPROM_ONE __attribute__((section (".eeprom")))
Эта секция определена в <avr/eeprom.h> как EEMEM, например EEMEM char x;
Преимущество моего способа в том, что адреса задаются в программе, а не линкере. Недостаток - приходится следить за адресами вручную.
Аватара пользователя
Алексей bird
Встал на лапы
Сообщения: 134
Зарегистрирован: Вс дек 28, 2008 18:07:28
Откуда: Москва

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

Сообщение Алексей bird »

Привет коллеги!
Решил с Баскома перейти на Студию седьмой версии, с целью изучать Си. Так вот, судя по листингам, которые я находил в инете, конструкция типа:

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

if (PIND==1) PORTB1 = 1;
должна обрабатываться без ошибок, но на деле вылезает ошибка:
    lvalue required as left operand of assignment

Причем не нравится именно PORTB1=1, потому как если перенести на другую строку и закомментировать, то компиляция проходит. В итоге такая конструкция допустима для Студии или допустима только для CodevisionAVR? Спасибо!
ozonn
Вымогатель припоя
Сообщения: 522
Зарегистрирован: Чт янв 21, 2016 15:59:10

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

Сообщение ozonn »

Алексей bird писал(а):Привет коллеги!
Решил с Баскома перейти на Студию седьмой версии, с целью изучать Си. Так вот, судя по листингам, которые я находил в инете, конструкция типа:

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

if (PIND==1) PORTB1 = 1;
должна обрабатываться без ошибок, но на деле вылезает ошибка:
    lvalue required as left operand of assignment

Причем не нравится именно PORTB1=1, потому как если перенести на другую строку и закомментировать, то компиляция проходит. В итоге такая конструкция допустима для Студии или допустима только для CodevisionAVR? Спасибо!

потому, что PORTB1, это константа, а вы ее пытаетесь менять
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

Такая конструкция не допустима и в CV. Допустима

А для AVRS катит
Docendo discimus
Ответить

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