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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

Codevision v3 wizard теперь вместо магических чисел

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

// Было
// SPI initialization
// SPI Type: Master
// SPI Clock Rate: 2000,000 kHz
// SPI Clock Phase: Cycle Start
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
SPCR=0x50;
SPSR=0x00;

генерирует так

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

// Стало
// SPI initialization
// SPI Type: Master
// SPI Clock Rate: 2000,000 kHz
// SPI Clock Phase: Cycle Start
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
SPCR=(0<<SPIE) | (1<<SPE) | (0<<DORD) | (1<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);
SPSR=(0<<SPI2X);

имхо второе понятнее первого
Аватара пользователя
pashaumnov
Прорезались зубы
Сообщения: 236
Зарегистрирован: Чт июн 25, 2009 16:00:25
Откуда: нижний новгород

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

Сообщение pashaumnov »

afz писал(а): приходится городить ерунду (1<<SE)|(0<<SM2)|(0<<SM1)|(1<<SM0), из которой хрен что поймешь.

согласен с вами сам не догадался как присвоить поэтому нашел похожий пример в инете и позаимствовал от тутда. там написано было как у вас в выделеной мною цитате , но и моя конструкция тоже работает так же, проверял в отладчике авр студио. но в вашей понятнее что включается.))
[/quote]
LINKS_234 писал(а):смысла писать | (логическое "или"), а потом туда пихать нули - совершенно нету. логическим "или" присваивают необходимому биту(битам) значение 1. обнуляют логическим "и" - &

тоже согласен с вами , до всего доходил своими мозгами 2 вечера, тоже предпологал как вы говорите но решил перестраховаться))) ну не чего страшного если одна лишняя команда в скобочках затесалась.
vitalik_1984 писал(а):MCUCR|=(1<<5)|(1<<4)|(0<<3)|(0<<0)|(1<<0);
Сомневаюсь, что эта строчка работает так как бы вы хотели...

так работает и так как вы предложили, тоже работает. проверял в отладчике авр студо, после обработки данной функции галки встают в нужных местах.
работа странно начинается в отладчике до бита GIMSK=0x54; все идет построчно но потом передвигается на TIMSK0=0x02; и после этой строчки прыгает на
interrupt [EXT_INT0] void ext_int0_isr(void)
{
if(PINB.1)
#asm("cli");
}
----------
потом АCSR=0x80; и снова на строчку
interrupt [EXT_INT0] void ext_int0_isr(void)
{
if(PINB.1)
#asm("cli");
}
----------
затем ADCSRB=0x00; и снова на строчку
interrupt [EXT_INT0] void ext_int0_isr(void)
{
if(PINB.1)
#asm("cli");

}
----------

затем DIDR0=0x00; и снова на строку
interrupt [EXT_INT0] void ext_int0_isr(void)
{
if(PINB.1)
#asm("cli");

}
----------
потом DCSRA=0x00; и опять на строку
interrupt [EXT_INT0] void ext_int0_isr(void)
{
if(PINB.1)
#asm("cli");

}
и так вся программа работает. это если PINB.1 равен 0 а если 1 то все нормально построчно проходит до команды спать и на ней останавливается, но вот выход из слип в отладчике можно сделать как 0 так и единицей подавая их поочередно на pinb.1
но вот в протеусе это дело не работает . ??? почему что нужно писать в обработчике прерываний что бы при возникновении его на portb.4 появлялась 1 и начинался отсчет вермени по таймеру ??
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

pashaumnov писал(а):так работает и так как вы предложили, тоже работает. проверял в отладчике авр студо, после обработки данной функции галки встают в нужных местах.
:facepalm: Читайте внимательно,что я написал. Ваша версия работает только в одну сторону, только устанавливает |= моя версия затрагивает все биты так как = для сброса отдельных бит используется &= как вам и писали выше.
pashaumnov писал(а):этой строчки прыгает на

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

interrupt [EXT_INT0] void ext_int0_isr(void)
{
if(
PINB.1)
#asm("cli");
} 
---------- 
потом АCSR
=0x80; и снова на строчку
interrupt 
[EXT_INT0] void ext_int0_isr(void) 

А то что ваше прерывание называется низкий уровень ничего? :))) После пробуждения нужно выставить прерывание в режим спада и стереть флаг прерывания записав в него 1цу. При засыпании снова в режим низкого уровня.И будет вам счастье.
А так все правильно выполняется прерывание, потом одна команда основного кода, потом если есть запрос прерывания переход в прерывание

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

SREG|= (1<<7); //разрешаем общие прерывания
GICR|=(1<<0); //разрешаем прерывание по INT0 
MCUCR=0x00;
GIMSK=0x54; 

Тут вот я не понял зачем мы разрешаем прерывания, пока еще не вся периферия настроена???? :dont_know: Тем более у вас в конце настройки стоит

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

// Global enable interrupts
#asm("sei")    

Попробуйте так:
Вложения
Sample_kot.rar
(52.33 КБ) 172 скачивания
Аватара пользователя
LINKS_234
Поставщик валерьянки для Кота
Сообщения: 2296
Зарегистрирован: Пн июл 14, 2008 18:12:37

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

Сообщение LINKS_234 »

pashaumnov, читайте внимательно даташит и обучалки по сишке авровской. как уже сказал vitalik_1984 - присвоение (=) далеко не то же самое что "или" (|). логическим "или" можно максимум выставить нужные биты в логическую "1". в то время как присвоение перепишет сразу весь байт на то, что после знака "=". получается что вы пишете единицы и нули и только единицы логическим "или" присвоятся переменной в тех местах где они были в ней или вы устанавливаете, а при присвоении перепишется полностью байт (или несколько байт, в зависимости от типа переменной или регистра) на тот что вы хотите. но при этом я бы не рекомендовал устанавливать и сбрасывать биты в регистрах присвоением, потому как велика вероятность что-то не то куда-то не туда записать, т.к. не всегда можно угадать что в этих регистрах находится до вашего вмешательства.
насчёт прерывания - опять же - читайте даташит на МК. как у тинек точно не знаю (да и лень читать даташит), а вот у меги 16 прерывания по внешнему сигналу бывают : по спадающему фронту, по нарастающему, по "0", по изменению уровня. всё это расписано в закладке ДШ "external interrupts". насколько я могу предположить прерывание по "0" будет циклически вызываться до тех пор, пока на выводе прерывания будет торчать "0". по-мне так вообще не самый лучший режим для детектирования события. он больше подходит для отсчёта времени пока на выводе находится логический "0". для кнопок датчиков и пр. принято использовать спадающий фронт, т.е. через 1-10кОм вывод сажается на +питания микроконтроллера, параллельно резистору ставится керамический конденсатор скажем так на 100nF, а кнопка (датчик с открытым коллектором или ещё что-либо) сажается на вывод МК и "землю" (GND, минус питания МК).
есть вопросы ? чего-то не знаешь ? [url=http://s61.radikal.ru/i174/1006/79/bc6a635c1451.jpg][color=blue][b]прежде всего смотри это[/b][/color][/url]
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

LINKS_234 Всё верно, только еще косяк новопрограммера в том, что он разрешил эти самые прерывания еще до инициализации периферии
Смотрим регистр MCUCR два последних бита в нуле означают прерывание по низкому уровню

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

 SREG|= (1<<7); //разрешаем общие прерывания
GICR|=(1<<0); //разрешаем прерывание по INT0  
MCUCR=0x00

Далее идет разрешение перехода по векторам прерываний (а флаг уже наверняка взведен) и отсюда начинаются якобы "глюки"

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

 GIMSK=0x54;  
Аватара пользователя
pashaumnov
Прорезались зубы
Сообщения: 236
Зарегистрирован: Чт июн 25, 2009 16:00:25
Откуда: нижний новгород

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

Сообщение pashaumnov »

[/quote]
pashaumnov писал(а):Попробуйте так:


в протеусе как только на pin3 подать 1, portb4 становится 1, пока там присутствует 1 светодиод горит. пин3 =0 тогда идет отсчет заданного времени и поистечении времени порт 4 переходит в 0 и контролер засыпает. теперь подавай не подавай на порт 3 еденицу не чего не будет пока на пинб1 не подать кратковременно 0. так работает программа .мне бы хотелось что бы мк просыпался при подаче на порт 3 единицы. вот как это реализовать в тни есть несколлько режимов по прерыванию в том числе и при любом изменении int0

да и еще в протеусе замечен маленький глюк если запускаешь проект и на пин3 -0, а потом подаем 1 то порт4 продалжает гореть пока несколько раз не сбросить его int0
а если начать работу по другому на пин 3-0, нажимаем кнопку сброса int0 кратковременно и потом подаем 1 на пин3 то все работает как надо.
Аватара пользователя
LINKS_234
Поставщик валерьянки для Кота
Сообщения: 2296
Зарегистрирован: Пн июл 14, 2008 18:12:37

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

Сообщение LINKS_234 »

vitalik_1984, особо не вчитывался в это творение собранное по всему интернету, но вообще да - как минимум странно устанавливать sei до конфига периферии. мало того - ещё перед основным циклом повторение sei. по итогу, при "удачном" стечении обстоятельств (а тут всё к этому располагает), МК может даже не войти в основной цикл.

в протеусе как только на pin3 подать 1, portb4 становится 1, ...
... нажимаем кнопку сброса int0 кратковременно и потом подаем 1 на пин3 то все работает как надо.

голова взорвалась и забрызгала мозгами всё вокруг.
вы уж лучше напишите кратко и лаконично что требуется от этого загадочного устройства - вам хоть кусками кода помогут, чем будут гадать что не так в этом ... так сказать, коде...
а если хочется оставить то что есть, то для начала посмотрите что за регистр SREG, затем что туда за бит устанавливается, и если это действительно глобальное разрешение прерываний, то удалите этот кусок кода. глобальное разрешение прерываний чаще всего принято писать ассемблерной вставкой #asm("sei"); , а снимать флаг вставкой #asm("cli");
затем взгляните на кусок GICR|=(1<<0); и оцените необходимость сдвига на 0. я ещё пойму если бы там вместо нуля было название бита в регистре. оно бы хоть о чём-нибудь сказало. а так можно написать и GICR|=0x01; и оставить тот же коментарий.
есть вопросы ? чего-то не знаешь ? [url=http://s61.radikal.ru/i174/1006/79/bc6a635c1451.jpg][color=blue][b]прежде всего смотри это[/b][/color][/url]
Резистор
Открыл глаза
Сообщения: 63
Зарегистрирован: Вс фев 03, 2013 13:11:59

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

Сообщение Резистор »

Здравствуйте, уважаемые коты.
Имеется вот такая проблема, я хочу использовать прерывание RESET. пишу код:
#include <mega8.h>
#include <delay.h>
#define nop() { #asm("nop"); }
#define sei() { #asm("sei"); }
#define cli() { #asm("cli"); }

volatile char x = 0;


interrupt [RESET] void res_int(void)
{
if ( x == 254 )
{
x = 0;
PORTD = 0x00;
delay_ms(250);
}
PORTD = 0x00;
delay_ms(900);
x++;
}
void main(void)
{
DDRD = 0xFF;
start:
PORTD = 0xFF;
#asm ("sleep");
goto start;
}
(это ещё не полная программа, поэтому прошу не ругаться на то, что эта программа - сама бесполезность)
при компиляции выводит ошибку:
Error: C:\ProgrammingMC\CVAvr\Projects\LABIRINT\main.c(35): undefined symbol 'RESET'
порылся в файле mega8, там действительно не описан RESET, попытался опис'ать сам, следующей строчкой:
#define RESET 1
Но компилятор теперь ругается:
Error: C:\ProgrammingMC\CVAvr\Projects\LABIRINT\main.c(35): bad interrupt vector
Посмотрел в других заголовочных файлах, тоже не описано. :dont_know:
Что можно с этим сделать?
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

Так не получится. Хотя бы потому, что похерится переменная х. Посмотрите в сторону Startup.asm, который автоматом пришлепывается к вашей программе (и который, кстати, можно написать ручками :)) ).
Docendo discimus
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

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

Сообщение uk8amk »

Какой толк от вашего кода если "прерыванием по RESET" и так является сама функция main() ?

А так да, стартап написан таким образом, что обнуляет всю SRAM.
AlexJ
Встал на лапы
Сообщения: 127
Зарегистрирован: Чт ноя 01, 2012 15:02:31
Откуда: Н.Новгород

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

Сообщение AlexJ »

Здравствуйте.
Давно и успешно пользуюсь для программирования AVR, USB программатором а-ля 910 на 8й меге, купленным на евее, и оболочкой AVRProg от автора из Первоуральска, все бы ничего, но сегодня потребовалось зашить 328 мегу, а ее нет в списке доступа..., есть 324, 329, а этой нет. Что посоветуете, премудрые коты? в программировании не айс, только пользователь...
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

А просто попробовать не судьба?
Docendo discimus
AlexJ
Встал на лапы
Сообщения: 127
Зарегистрирован: Чт ноя 01, 2012 15:02:31
Откуда: Н.Новгород

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

Сообщение AlexJ »

pyzhman писал(а):А просто попробовать не судьба?

Это Вы мне?
Последний раз редактировалось AlexJ Сб ноя 30, 2013 23:19:15, всего редактировалось 1 раз.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

Резистор писал(а):Посмотрел в других заголовочных файлах, тоже не описано. :dont_know:
Что можно с этим сделать?

:facepalm: У меня нет слов.....
Я бы сказал что нибудь, но не стану так как у меня на это пять причин :music: скриншотов
Изображение
На последнем фото видно, что анализируется причина ресета и соответственно причине производятся действия.
Если не пользоваться мастером, нафига тогда инженеры голову ломали придумывали его?
Нафига тогда вообще CVAVR
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

Да.
Docendo discimus
Darti
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Пн июл 23, 2012 20:46:11
Откуда: spb
Контактная информация:

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

Сообщение Darti »

Здравствуйте, есть ли у кого нибудь положительный опыт использования, встроенной либы для ММC. Сейчас использую ЦАВР 2.05.3 и как бы я не пытался скомпилить проект, даже заведомо рабочий, компилятору сносит крышу. После этого какой бы я проект не открыл он начинает писать, Program has no main function либо ругается на DATA STACK SIZE. Что означают эти ошибки я знаю, но проблема очевидно не в этом. Попадались на форумах восторженные отзывы что либа работает, существует ли не жадная версия с рабочей либой ММЦ?
Аватара пользователя
Panda_Y2K
Грызет канифоль
Сообщения: 258
Зарегистрирован: Пт сен 23, 2011 06:44:41
Откуда: ЮФО
Контактная информация:

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

Сообщение Panda_Y2K »

либа там рабочая http://radiokot.ru/circuit/digital/game/25/
первая ошибка означает, что отсутсвует функция майн, без нее то по любому работать не будет.
Купи два беляша и собери из них кошку
Labor est etiam ipse voluptas Труд уже сам по себе есть наслаждение (*Формула любви)
Ave novie-nostra ales Если один человек построил - другой завсегда разобрать может....(*Формула Любви).
Аватара пользователя
levaclaus
Потрогал лапой паяльник
Сообщения: 302
Зарегистрирован: Пн янв 07, 2008 16:56:28
Откуда: Минск

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

Сообщение levaclaus »

Генератор кода в Codevision поддерживает двучиповые hd44780 экраны (с EN1 EN2 линиями)? С какой версии?
elf
Открыл глаза
Сообщения: 60
Зарегистрирован: Чт окт 29, 2009 23:22:03

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

Сообщение elf »

Добрый день уважаемые Коты!

Прошу Вашей помощи.пытаюсь разобраться с библиотекой для контролера индикатора т6963.

застрял на этом куске кода, при компиляции выдает ошибку.

struct _FONTPAR
{
unsigned short width;
unsigned short height;
unsigned short linewidth;
unsigned short size;
};

__flash _FONTPAR _fonts[2] = {{880, 10, 110, 1100}, {1189, 12, 149, 1788}};///ошибка


что не так прошу тыкнуть носом.спасибо
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

в кодевижене вроде не было объявлений констант типа _flash - просто flash, все проще можно (из хэлпа):

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

/* Global constant structure located in FLASH */
flash struct flash_structure {
             int  a;
             char b[30], c[10];
             } sf;

p.s. с кодевиженом идут примеры для этого индикатора
Ответить

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