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

Переход С 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?

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

Hongfa для различных применений в Компэл. Большой выбор в наличии!

Компания HONGFA - это не только крупнейший в мире производитель электромеханических реле, но также производитель конденсаторов, вакуумных прерывателей, трансформаторов и низковольтного коммутационного оборудования. На складе КОМПЭЛ регулярно поддерживаются около 100 самых популярных позиций электромеханических реле. Реле Hongfa могут заместить многие изделия производства недоступных брендов. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 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

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

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

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

Тренды и лучшие решения для разработки зарядных станций в России

К 2029 году в России прогнозируется увеличение числа зарядных станций до 40 000. При этом отечественный рынок электротранспорта имеет климатические, потребительские и географические особенности. Для успешной разработки и построения инфраструктуры станций заряда в России идеальным вариантом является использование решений и электронных компонентов китайских производителей – лидеров индустрии электротранспорта и возобновляемой энергетики, которые уже представлены в КОМПЭЛ. Подробнее>>

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

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

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

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

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

Секреты депассивации литиевых батареек FANSO EVE Energy

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

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

Это стандартная операция как в 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 пользователей онлайн

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

  • Сообщения

    • именно так и есть их пишут теоретики, которые практически с этим не сталкивались, а знают об этом со слов других и часто пишут откровенные глупости я уже приводил пример из своей практики  одно дело заземлить корпус электроустановки и совсем другое рабочее место или ванну в которой, находящийся в ней человек, при случайном касании например провода с нарушенной изоляцией, получит гарантированный удар эл. током и хорошо если без фатальных последствий
    • Вы вбили магнитную проницаемость всего 200, вот и получили ток намагничивания первичной обмотки под ампер. Очень маловероятно, что силовой феррит с такой низкой проницаемостью. Измерьте ток намагничивния. От магнитной проницаемости сердечника его габаритная мощность зависит слабо. А вот ток намагничивания - сильно. Вот ваш же рассчёт для типовой магнитной проницаемости 1800: Как видите, намоточные данные трансформатора практически не изменились. Вас смущает, что неизвестен материал сердечника. Ничего страшного. Марка материала влияет больше на величину потерь в сердечнике в зависимости от частоты. Максимально-допустимая амплитуда индукции у всех силовых ферритов примерно одинаковая, около 0,3 Тл. Предположим, что материал похуже, чем N87. Так как запас по габаритной мощности есть, на всякий случай можно немножко понизить частоту. Число витков первичной обмотки возрастёт не сильно: Зато на частоте ниже 40 кГц даже паршивенький материал будет сносно работать. И 50 витков первички - удобное число. Ну и ещё раз: измерьте ток намагничивания первичной обмотки - ток холостого хода. Во-первых, он должен получиться приемлемым, а во-вторых, прикинете магнитную проницаемость сердечника, чтобы не переживать из-за неизвестности.
    • Жесть, вот это внимательность у вас. Как вы только замечаете такие мелочи ))  Кстати, может посоветует кто, что можно установить по размеру взамен сломанного выключателя? С завода там какая то адская конструкция (( Хотелось бы подобрать по размеру чтобы подходило и ничего не пилить.  Разговаривал с продавцами запчастей на авито, один человек хотел мне помочь, но не смог выкрутить шпильку, которая держит рычаг. 
×
×
  • Создать...