Перейти к содержанию

Переход С Cvavr На Avr Studio 6


squad_leader

Рекомендуемые сообщения

Решил перейти с CV AVR на AVR Studio так как купил себе AVR Dragon.

Весь выходной просидел, так и не сумел написать удобоваримой прошивки.

Для знающих есть несколько простых вопросов, которые меня пока в тупик ставят.

1) В CV AVR первичную инициализацию например портов I\O я делал сразу после #include и #define. Со студией проблемы, ругается и не компилируются, если инициализацию не запихнуть в процедуру и не вызвать ее сразу после main() и до while(1).

Так как визардов по настройке МК не предусмотрено в Студии - вопрос знатокам: куда и как правильно и верно запихивать инициализацию портов/таймеров и пр.?

2) В CV AVR можно было просто обращаться напрямую к биту порта типа PORTC.5=.... к пятому. В AVR Srudio приходится использовать вот такую конструкцию PORTD = (1 << 7), что бы в 7ой бит записать "единичку". Есть ли более изящный способ управления ногами порта по отдельности. Буду очень благодарен даже ссылке.

3) Решил написать простенькую программу.

Нажал кнопку - горит светодиод. Пропаянная плата в наличии.

Как я не пробовал - светодиод горит только если задать его моргание в цикле. Если поставить условие if - молчит как партизан. Ножки объявлены "входами", подтянуты в +пит. При нажатии кнопки нога просаживается на "землю"

А вот Студия, точнее прошивка в ней написанная никак этот факт не отлавливает.

Листинг примитивного кода тут. В PORTD.7-диод, в PORTD.6-пищалка

int main(void)

{

initIOports();

while(1)

{

//TODO:: Please write your application code

if (!PIND5) {

PORTD= (1 << 7) | (1 << 6) ;

_delay_ms(100);

PORTD= (0 << 7) | (0 << 6) ;

_delay_ms(100);

}

}

}

PS. Плата 100% рабочая, диоды тоже, сделал такую же прошивку в CV AVR - залил - работает и пищит как надо.

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

  • Ответов 50
  • Создана
  • Последний ответ

Топ авторов темы

#include...

int main(void)

{

инициализация всего аппаратного

while(1)

{

тут программа

}

}

//работа с битами

PORTx|=(1<<Pxx);установить бит

PORTx&=~(1<<Pxx);сбросить бит

//рекомендуемо

PORTx|=_BV(Pxx);установить бит

PORTx&=~_BV(Pxx);сбросить бит

//макрос для работы с битами

#define SetBit(port,bit) port|=(1<<bit)

#define ClearBit(port,bit) port&=~(1<<bit)

//или

#define SetBit(port,bit) port|=_BV(bit)

#define ClearBit(port,bit) port&=~_BV(bit)

- А совесть в курсе? - А совесть в доле! :-D

Эксперт — это человек, который совершил все возможные ошибки в некотором узком поле.

Все грамматические ошибки являются авторским стилем изложения материала.

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Rhime, болагодарю, попробую вечером.

Вопрос по PIN остался открытым. Как на основе состояние "ножки" правильно условия писать? Как обозвать регистр, где храниться текущее состояние ноги О или 1?

Ссылка на комментарий
Поделиться на другие сайты

Особенности хранения литиевых аккумуляторов и батареек

Потеря емкости аккумулятора напрямую зависит от условий хранения и эксплуатации. При неправильном хранении даже самый лучший литиевый источник тока с превосходными характеристиками может не оправдать ожиданий. Технология, основанная на рекомендациях таких известных производителей литиевых источников тока, как компании FANSO и EVE Energy, поможет организовать правильный процесс хранения батареек и аккумуляторов. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

DDRD=(0<<PD0);

PORT=(1<<PD0);

while(1)

{

if((PIND&(1<<PD0))==0)//если PIND0 имеет значение 0 выполнить код

{

здесь код условия

};

}

или

while(PIND!=0b11111110)

{

}

тут код выполняющийся при нажатии на кнопку

или просто

if(PIND==0b11111110)

{

код

}

Ваша программа выглядит так

int main (void)

{

DDRD=0b11011111;

PORTD=1<<PD5;

while(1)

{

if((PIND&(1<<PD5))==0)

{

PORTD= (1 << 7) | (1 << 6) | (1<<PD5);

_delay_ms(100);

PORTD= (0 << 7) | (0 << 6) | (1<<PD5);

_delay_ms(100);

}else;

};

}

Попробуйте еще так

int main (void)

{

DDRD=0b11011111;

PORTD|=_BV(PD5);

while(1)

{

if((PIND&(1<<PD5))==0)

{

PORTD|= _BV(PD7) | _BV(PD6);

_delay_ms(100);

PORTD&=~_BV(PD7)&~_BV(PD6);

_delay_ms(100);

}else;

};

}

Изменено пользователем Rhime

- А совесть в курсе? - А совесть в доле! :-D

Эксперт — это человек, который совершил все возможные ошибки в некотором узком поле.

Все грамматические ошибки являются авторским стилем изложения материала.

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Попробовал эту конструкцию if((PIND&(1<<PD0))==0)

Очень даже рабочая. Правда есть нюанс +)

При нажатии кнопки - лампочка загорается =) При отпускании должна гаснуть, но не гаснет.

Ссылка на комментарий
Поделиться на другие сайты

Это стандартная операция как в AVRStudio так и в CVAVR.

Можете попробовать описать действия так:

int main (void)

{

DDRD=0b11011111;

PORTD|=_BV(PD5);

while(1)

{

if((PIND&(1<<PD5))==0)

{

PORTD^= _BV(PD7) | _BV(PD6);

_delay_ms(100);

}else PORTD=(0<<PD7)|(0<<PD6)|(1<<PD5);

};

}

Изменено пользователем Rhime

- А совесть в курсе? - А совесть в доле! :-D

Эксперт — это человек, который совершил все возможные ошибки в некотором узком поле.

Все грамматические ошибки являются авторским стилем изложения материала.

Ссылка на комментарий
Поделиться на другие сайты

  • 5 месяцев спустя...

Всем доброго времени суток. Подскажите плз, почему в AVR Studio 6+ STK500 нет в списке программируемых МК Atmega128?....может кто знает как ее туда добавить?. Спасибо

post-19750-0-17433400-1354285078_thumb.jpg

Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...

если качать отсюда http://rutracker.org/forum/viewtopic.php?t=4265815

есть папка CodeVisionAVR а в ней CodeVisionAVR.vsix после установки появится значок на панели инструментов.

Может и на оф сайте есть, подсмотрено тут http://radiokot.ru/forum/viewtopic.php?p=1521351#p1521351

Ссылка на комментарий
Поделиться на другие сайты

да я уже сам разобрался

в самой студии есть модуль для установки доп. компонентов и я там установил сvavr

но спасибо что сказал

Изменено пользователем Babajko
Ссылка на комментарий
Поделиться на другие сайты

1) Сколько я помню язык Си, весь выполняемый код должен быть расположен в функциях. Программа начинает выполняться с функции int main(void){}. Если можно писать и выполнять код между функциями это уже какая-то надстройка, причем довольно странная.

Настройку и инициализацию так же как в любом Си - в начале main'а, можно оттуда вызывать какую-то еще функцию инициализации, сути дела это не меняет.

2) Опять-таки не помню в Си такой возможности. Вся работа с битами осуществляется масками (компилятор WinAVR неплохо обучен оптимизации и знает что такое sbi, cbi и т.д.). Так что да, все делается PORTx |= (1<<Pxy); PORTx &= ~(1<<Pxy)

3) Ну программу уже написали, нет смысла повторяться.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Записать нужный байт в UDR. Ну перед этим настроить UBRRH:UBRRL, UCSRA:UCSRB:UCSRC, зависит от того что есть в контроллере, см. даташит. Что конкретно не получается?

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

как настроить уарт я знаю і передавать через регистр но меня интересует такое может есть функция или макрос типа putchar(х) как в cvavr

почему интересуюсь, у мене есть борд кит на B1 (ATXMEGAB1-XPLD) вот хочу розобратся

Изменено пользователем Babajko
Ссылка на комментарий
Поделиться на другие сайты

макроса putchar(x) вроде нет но его и самому написать не проблема while(!UCSRA & (1<<UDRE)){} UDR=x; (написал по памяти, глянув в AVRStudio только где расположен бит UDRE, потом проверил в умной книжке, не ошибся). А вообще, такой дубовый способ все равно годится только для тестовых целей, уж больно медленная штука этот USART по сравнению с ядром, правильнее реализовать весь обмен в прерываниях.

P.S. С ATXMega дела не имел, писал исключительно относительно AT90S / ATtiny / ATmega.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Сейчас пишу программу на ATMega88 и у меня возникла проблема с переключением выводов я делаю так:

PORTB=(1<<PORTB0);

{2-5 строк кода}

PORTB=(1<<PORTB1);

проблема в том что после такого действия оно не работает корректно кто сталкивался с таким

PORTB=(1<<PORTB1)|(1<<PORTB0); такой вариант не подходит

Ссылка на комментарий
Поделиться на другие сайты

спасибо огромное я разобрался

PORTB |= (1<<PORTB1); так должно работать

но я сделал через макрос

#define SetBit(port,bit) port|=(1<<bit)

#define ClearBit(port,bit) port&=~(1<<bit)

как написано выше

кто то пробовал так делать как написано здесь http://asf.atmel.com/docs/latest/mega/html/ioport_quickstart.html ????

Ссылка на комментарий
Поделиться на другие сайты

  • 2 месяца спустя...
  • 3 недели спустя...
  • 1 месяц спустя...

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Сообщения

    • Так с паролями на Лого вроде не было проблем, есть программы для взлома.
    • Думаю оставить такой вариант (модельку ручки на резистор не стал делать). Сделаю ещё крышку на измерительную головку, чтоб пылью не покрывалась от частого использования :-) .  
    • на самом деле понятно но не до конца...  я так понимаю будет следующее: низкое сопротивления катушки может привести к падению напряжения на блоке питания, что в свою очередь  повлечет что цепи питания каскадов раскачки, будут продолжать держать напряжение на базах выходных транзисторов. На коллекторах которых окажется напряжение ниже, чем на базе. Следом выходники резко перебрасывают основной ток из цепи К-Э, на цепь Б-Э, следом горит регулировка уровня ("краник") в открытом состоянии, ни и вся дурь из банок БП ломится как оголтелая, что приведет к красивому но ужасному бадабум... успеет ли удержать этот процесс защита тоже вопрос.  Если не прав, прошу поправить, проседаю я в схемотехники... 
    • ОБР выходников.
    • Это "классика жанра".  Аналоговые стабилизаторы поэтому до сих пор еще существуют, потому что они не дают импульсных помех. Даже если после импульсного понижающего стабилизатора поставить аналоговый, все равно идет генерация от катушек трансформаторов. Если вы в это время налаживаете какой-то прибор у которого полезный сигнал измеряется единицами милливольт, например вход радиоприемника, то представьте себе источник помех рядом. Задавить такой источник помех не так просто. Иначе можно было бы просто использовать полностью импульсный блок питания и не возиться с тем чтобы обеспечить малую разность напряжения на регулирующем транзисторе. Самый простой вариант - это автоматическое переключение обмоток как в схеме Шелестова.
    • Доброго времени суток, такой вопрос от чайника. Как то собрал, настроил, играет, радует меня данный усилитель, не смотря на то что кто то нет нет да булыжник в огород подкинет (не понимаю зачем правда). Играло все на горемычной соло1, с выдранной родной начинкой, увы пока не разжился чем то поинтереснее, я даже как то и не обращал внимание вот на такой пункт:  Важное уточнение. При работе усилителя с нагрузкой сопротивлением 4 Ом, напряжение питания усилителя не должно превышать +/- 38 В. Эксплуатация усилителя при большем питающем напряжении, допускается исключительно при работе с нагрузкой сопротивлением не менее 6 Ом. Вопрос: с чем связанно ограничение. Только прошу не много раскрытый ответ, нежели "потому что гладиолус ©".  Зы. питание AC30 -> шоттки (ну были в загашнике вот и поставил) ->  DC на х.х. 45. просад до 42-43х. БП 35тыр мкФ. 
×
×
  • Создать...