Страница 288 из 421

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

Добавлено: Пт ноя 29, 2013 11:02:27
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);
имхо второе понятнее первого

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

Добавлено: Пт ноя 29, 2013 11:29:51
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 и начинался отсчет вермени по таймеру ??

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

Добавлено: Пт ноя 29, 2013 11:43:46
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")    
Попробуйте так:

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

Добавлено: Пт ноя 29, 2013 22:28:20
LINKS_234
pashaumnov, читайте внимательно даташит и обучалки по сишке авровской. как уже сказал vitalik_1984 - присвоение (=) далеко не то же самое что "или" (|). логическим "или" можно максимум выставить нужные биты в логическую "1". в то время как присвоение перепишет сразу весь байт на то, что после знака "=". получается что вы пишете единицы и нули и только единицы логическим "или" присвоятся переменной в тех местах где они были в ней или вы устанавливаете, а при присвоении перепишется полностью байт (или несколько байт, в зависимости от типа переменной или регистра) на тот что вы хотите. но при этом я бы не рекомендовал устанавливать и сбрасывать биты в регистрах присвоением, потому как велика вероятность что-то не то куда-то не туда записать, т.к. не всегда можно угадать что в этих регистрах находится до вашего вмешательства.
насчёт прерывания - опять же - читайте даташит на МК. как у тинек точно не знаю (да и лень читать даташит), а вот у меги 16 прерывания по внешнему сигналу бывают : по спадающему фронту, по нарастающему, по "0", по изменению уровня. всё это расписано в закладке ДШ "external interrupts". насколько я могу предположить прерывание по "0" будет циклически вызываться до тех пор, пока на выводе прерывания будет торчать "0". по-мне так вообще не самый лучший режим для детектирования события. он больше подходит для отсчёта времени пока на выводе находится логический "0". для кнопок датчиков и пр. принято использовать спадающий фронт, т.е. через 1-10кОм вывод сажается на +питания микроконтроллера, параллельно резистору ставится керамический конденсатор скажем так на 100nF, а кнопка (датчик с открытым коллектором или ещё что-либо) сажается на вывод МК и "землю" (GND, минус питания МК).

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

Добавлено: Пт ноя 29, 2013 22:51:00
vitalik_1984
LINKS_234 Всё верно, только еще косяк новопрограммера в том, что он разрешил эти самые прерывания еще до инициализации периферии
Смотрим регистр MCUCR два последних бита в нуле означают прерывание по низкому уровню

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

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

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

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

 GIMSK=0x54;  

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

Добавлено: Сб ноя 30, 2013 00:36:56
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 то все работает как надо.

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

Добавлено: Сб ноя 30, 2013 02:30:05
LINKS_234
vitalik_1984, особо не вчитывался в это творение собранное по всему интернету, но вообще да - как минимум странно устанавливать sei до конфига периферии. мало того - ещё перед основным циклом повторение sei. по итогу, при "удачном" стечении обстоятельств (а тут всё к этому располагает), МК может даже не войти в основной цикл.
в протеусе как только на pin3 подать 1, portb4 становится 1, ...
... нажимаем кнопку сброса int0 кратковременно и потом подаем 1 на пин3 то все работает как надо.
голова взорвалась и забрызгала мозгами всё вокруг.
вы уж лучше напишите кратко и лаконично что требуется от этого загадочного устройства - вам хоть кусками кода помогут, чем будут гадать что не так в этом ... так сказать, коде...
а если хочется оставить то что есть, то для начала посмотрите что за регистр SREG, затем что туда за бит устанавливается, и если это действительно глобальное разрешение прерываний, то удалите этот кусок кода. глобальное разрешение прерываний чаще всего принято писать ассемблерной вставкой #asm("sei"); , а снимать флаг вставкой #asm("cli");
затем взгляните на кусок GICR|=(1<<0); и оцените необходимость сдвига на 0. я ещё пойму если бы там вместо нуля было название бита в регистре. оно бы хоть о чём-нибудь сказало. а так можно написать и GICR|=0x01; и оставить тот же коментарий.

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

Добавлено: Сб ноя 30, 2013 09:37:53
Резистор
Здравствуйте, уважаемые коты.
Имеется вот такая проблема, я хочу использовать прерывание 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:
Что можно с этим сделать?

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

Добавлено: Сб ноя 30, 2013 10:00:14
pyzhman
Так не получится. Хотя бы потому, что похерится переменная х. Посмотрите в сторону Startup.asm, который автоматом пришлепывается к вашей программе (и который, кстати, можно написать ручками :)) ).

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

Добавлено: Сб ноя 30, 2013 10:43:19
uk8amk
Какой толк от вашего кода если "прерыванием по RESET" и так является сама функция main() ?

А так да, стартап написан таким образом, что обнуляет всю SRAM.

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

Добавлено: Сб ноя 30, 2013 22:03:28
AlexJ
Здравствуйте.
Давно и успешно пользуюсь для программирования AVR, USB программатором а-ля 910 на 8й меге, купленным на евее, и оболочкой AVRProg от автора из Первоуральска, все бы ничего, но сегодня потребовалось зашить 328 мегу, а ее нет в списке доступа..., есть 324, 329, а этой нет. Что посоветуете, премудрые коты? в программировании не айс, только пользователь...

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

Добавлено: Сб ноя 30, 2013 22:16:08
pyzhman
А просто попробовать не судьба?

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

Добавлено: Сб ноя 30, 2013 22:24:47
AlexJ
pyzhman писал(а):А просто попробовать не судьба?
Это Вы мне?

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

Добавлено: Сб ноя 30, 2013 22:41:03
vitalik_1984
Резистор писал(а): Посмотрел в других заголовочных файлах, тоже не описано. :dont_know:
Что можно с этим сделать?
:facepalm: У меня нет слов.....
Я бы сказал что нибудь, но не стану так как у меня на это пять причин :music: скриншотов
Изображение
На последнем фото видно, что анализируется причина ресета и соответственно причине производятся действия.
Если не пользоваться мастером, нафига тогда инженеры голову ломали придумывали его?
Нафига тогда вообще CVAVR

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

Добавлено: Вс дек 01, 2013 00:48:54
pyzhman
Да.

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

Добавлено: Пн дек 02, 2013 22:14:19
Darti
Здравствуйте, есть ли у кого нибудь положительный опыт использования, встроенной либы для ММC. Сейчас использую ЦАВР 2.05.3 и как бы я не пытался скомпилить проект, даже заведомо рабочий, компилятору сносит крышу. После этого какой бы я проект не открыл он начинает писать, Program has no main function либо ругается на DATA STACK SIZE. Что означают эти ошибки я знаю, но проблема очевидно не в этом. Попадались на форумах восторженные отзывы что либа работает, существует ли не жадная версия с рабочей либой ММЦ?

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

Добавлено: Пн дек 02, 2013 22:19:21
Panda_Y2K
либа там рабочая http://radiokot.ru/circuit/digital/game/25/
первая ошибка означает, что отсутсвует функция майн, без нее то по любому работать не будет.

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

Добавлено: Вт дек 03, 2013 23:28:49
levaclaus
Генератор кода в Codevision поддерживает двучиповые hd44780 экраны (с EN1 EN2 линиями)? С какой версии?

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

Добавлено: Ср дек 04, 2013 17:03:53
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}};///ошибка


что не так прошу тыкнуть носом.спасибо

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

Добавлено: Ср дек 04, 2013 17:29:44
oleg110592
в кодевижене вроде не было объявлений констант типа _flash - просто flash, все проще можно (из хэлпа):

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

/* Global constant structure located in FLASH */
flash struct flash_structure {
             int  a;
             char b[30], c[10];
             } sf;
p.s. с кодевиженом идут примеры для этого индикатора