Страница 119 из 160

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

Добавлено: Ср авг 31, 2016 11:46:18
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;
}
Это правильно?

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

Добавлено: Ср авг 31, 2016 12:06:46
ARV
правильно то оно правильно, да только можно и лучше...

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

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

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

Добавлено: Ср авг 31, 2016 13:06:12
Jman
особенностью "новой" архитектуры портов AVR
Где читать?

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

Добавлено: Ср авг 31, 2016 13:37:17
ARV
читать в даташитах.
"старые" МК так не умеют, новые (с индексами А или Р - уточнять по даташиту) умеют.

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

Добавлено: Ср авг 31, 2016 14:30:15
Jman
для меандра есть смысл делать

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

ISR(TIM0_OVF_vect)
{
    PORTA ^= _BV(PINA3);
}
Как правильно сделать меандр с тем кодом что у меня есть? Нужна-ли бибка для функции _BV в Atmel Studio?

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

Добавлено: Ср авг 31, 2016 15:01:47
ARV
_BV - это макрос, стандартный для avr-gcc. как у вас в последнем сообщении должно работать. разумеется, в самом начале программы надо #include <avr/io.h>

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

Добавлено: Ср авг 31, 2016 15:23:58
Jman
Работает но подчеркивается. Сделал так

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

#include <avr/sfr_defs.h>

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

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

Добавлено: Чт сен 01, 2016 11:34:14
Сем30
Не знаю как правильно объяснить но попытаюсь. Интерисует меня память EEPROM. В программе использую просто переменную и при старте программы в самой студии или в протеусе моя переменная в EEPROM имеет значение 0 но мне надо чтоб в реальном контроллере при первом запуске она была уже прописана в EEPROM т.к. она в ходе работы будет меняться и нельзя чтоб при старте контроллера она перезаписывалась. Как в студии, протеусе прописать что в данной переменной EEPROM лежит именно именно 2. Надо ли в студии переменную привязывать к конкретной ячейке и как вообще объявить переменную привязанную к конкретной ячейке?

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

Добавлено: Чт сен 01, 2016 11:44:38
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

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

Добавлено: Чт сен 01, 2016 19:57:41
Q-ti
Добрый вечер подскажите в чем проблема создал проект выбрал Atmega32 , пытаюсь откомпилировать пустой проект , а у меня выскакивает ошибка . В чем проблема ? Программа Avr Studio версия 4.19 .

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

Добавлено: Чт сен 01, 2016 20:53:21
ARV
как бы сообщение об ошибке есть, можно на крайний случай онлайн-переводчиком воспользоваться, чтобы понять, что не так...

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

Добавлено: Вс сен 04, 2016 08:46:47
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;
И потом уже обращаться по ним. Ну и что-то не работает ничего, возможно новые секции нужно как-то отдельно выделять в линкере, или еще что-то? Я так-то больше по ассемблеру, и то что иногда происходит в программах написанных на языках высокого уровня меня немного пугает.

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

Добавлено: Вс сен 04, 2016 09:43:39
COKPOWEHEU
Можно обойтись без EEPROM-переменных, используя адреса напрямую. Вроде такого

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

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

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

Добавлено: Вс сен 04, 2016 13:51:28
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, где-то явно определяется. Но вот как, я не нашел.

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

Добавлено: Вс сен 04, 2016 18:49:22
blazer
Решил подправить прошивку по рекомендации автора. Обрадовался, я(в AVR Studio 4 лишь МК прошивал, с программированием не знаком совершенно)– оказывается просто всё! «запускаете компиллятор (например AVRASM2) и получаете готовый для программирования HEX- файл. Удобнее это делать, в среде программирования, (например AVR Studio 4) по команде "Build"".
Ну, открыть-то нужный файл сумел, а дальше … «курить» AVR Studio нужно. Может быть кто укажет конкретно, где именно об этой процедуре прочитать можно. Второй день бьюсь и никак не найду инструкцию этой проги.

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

Добавлено: Вс сен 04, 2016 20:15:57
uk8amk
blazer писал(а):где именно об этой процедуре прочитать можно.
раз.Меню-Help-AVR Studio User Guide
два.http://radiokot.ru/start/mcu_fpga/avr/02/
три.Программирование на языке С для AVR и PIC микроконтроллеров. Там немного картинок.

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

Добавлено: Ср сен 07, 2016 12:05:34
COKPOWEHEU
#define EEPROM_ONE __attribute__((section (".eeprom")))
Эта секция определена в <avr/eeprom.h> как EEMEM, например EEMEM char x;
Преимущество моего способа в том, что адреса задаются в программе, а не линкере. Недостаток - приходится следить за адресами вручную.

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

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

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

if (PIND==1) PORTB1 = 1;
должна обрабатываться без ошибок, но на деле вылезает ошибка:
  • lvalue required as left operand of assignment
Причем не нравится именно PORTB1=1, потому как если перенести на другую строку и закомментировать, то компиляция проходит. В итоге такая конструкция допустима для Студии или допустима только для CodevisionAVR? Спасибо!

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

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

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

if (PIND==1) PORTB1 = 1;
должна обрабатываться без ошибок, но на деле вылезает ошибка:
  • lvalue required as left operand of assignment
Причем не нравится именно PORTB1=1, потому как если перенести на другую строку и закомментировать, то компиляция проходит. В итоге такая конструкция допустима для Студии или допустима только для CodevisionAVR? Спасибо!
потому, что PORTB1, это константа, а вы ее пытаетесь менять

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

Добавлено: Пт сен 09, 2016 10:33:37
pyzhman
Такая конструкция не допустима и в CV. Допустима А для AVRS катит