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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

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

unsigned char bukva_0 = 255;
unsigned char bukva_1 = 255;
unsigned char bukva_2 = 255;
unsigned char bukva_3 = 255;

Это что за "чудо"? Вы не знаете что в языке си есть массивы или просто не умеете ими пользоваться?
Если с массивом :

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

unsigned char bukva[4] = {255,255,255,255};

void vukluchit_bukvu(void)
{     for(unsigned char i=0;i<4;i++)
     {bukva[i]= 255;}

}


Зачем городить кучу переменных, если они все делают одно и то же?
Реклама
Amstron
Нашел транзистор. Понюхал.
Сообщения: 173
Зарегистрирован: Вт дек 21, 2010 21:18:52

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

Сообщение Amstron »

Об этом варианте я не задумывался. Спасибо )))
А по объему кода это гораздо больше наверное выйдет!?
Последний раз редактировалось Аlex Пт июл 19, 2013 07:20:47, всего редактировалось 1 раз.
Причина: Убрал цитату
Реклама
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

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

Сообщение urry »

Ну а где принципиальная схема или проект в протеусе ?
Назначение кнопок ? Зачем все лепить в 1 файл ? Основной main.c должен быть максимально почищен от мусора.
По объему кода меньше выйдет, если вы уберете флоаты и будете их использовать только там, где это крайне необходимо.Идея включить часы и подбирать секунды отставания - запаздывания - она как-то тоже не из лучших- используют в этом случае алгоритм брезенхема для коррекции - почитайте

http://www.microchip.ru/phorum/read.php ... eply_39000
http://piclist.ru/S-ZERO-ERR-TIMER-RUS/ ... R-RUS.html

, а лучше поставить что-то энергонезависимое с батарейкой - типа 1307.
gavrila
Родился
Сообщения: 16
Зарегистрирован: Ср ноя 23, 2011 01:31:28
Откуда: Украина, Харьков

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

Сообщение gavrila »

Всем привет!
пробую написать первую прогу на ATMega8А-PU - мигание светодиодом.
написал простенькую программку - МК прошивается без ошибок и вроде как работает, т.е. диод загорается и гаснет. вот только проблемка нарисовалась... по программе я сделал чтобы диод загорелся на 1000мс, потом погас на 1000мс и так в основном цикле до бесконечности. Но диод почему-то загорается и гаснет не каждую секунду, а каждые 16 секунд (примерно). Помогите, плс, понять что не так, где накосячил? или хотя бы в какую сторону искать дальше. Может фьюзы надо какие выставить?

вот сама программа. она вся полностью сгенерирована из CodeWizardAVR, кроме этого куска, где я дописал, чтобы диод загорелся и потух:

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

    PORTC.5 = 1;
    delay_ms(1000);
   
    PORTC.5 = 0;
    delay_ms(1000);


под спойлером вся программа:
Спойлер

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

/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.0 Professional
Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date    : 21.07.2013
Author  :
Company :
Comments:


Chip type               : ATmega8
Program type            : Application
AVR Core Clock frequency: 16,003000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 256
*****************************************************/

#include <mega8.h>
#include <delay.h>

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func6=In Func5=Out Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=0 State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x20;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// USART initialization
// USART disabled
UCSRB=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

while (1)
      {
    PORTC.5 = 1;
    delay_ms(1000);
   
    PORTC.5 = 0;
    delay_ms(1000);

      }
}
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Garin
Потрогал лапой паяльник
Сообщения: 351
Зарегистрирован: Пн сен 12, 2011 12:13:46

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

Сообщение Garin »

gavrila, неправильно выставлены фьюзы, у тебя 1 MHz , а надо на внешний кварц 16 MHz ....
Реклама
gavrila
Родился
Сообщения: 16
Зарегистрирован: Ср ноя 23, 2011 01:31:28
Откуда: Украина, Харьков

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

Сообщение gavrila »

судя по описанию, нужно установить CKOPT=0 - правильно я понял?
Реклама
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

Тема по фьюзам: viewtopic.php?f=57&t=1279
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
gavrila
Родился
Сообщения: 16
Зарегистрирован: Ср ноя 23, 2011 01:31:28
Откуда: Украина, Харьков

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

Сообщение gavrila »

Garin писал(а):gavrila, неправильно выставлены фьюзы, у тебя 1 MHz , а надо на внешний кварц 16 MHz ....

спасибо, так и было
gavrila писал(а):судя по описанию, нужно установить CKOPT=0 - правильно я понял?
Исправлю самого себя - вместо этого фуза, надо было другие парочку поставить. в общем покопавшись в даташите и испортив всего один МК, все получилось.
под спойлером установленые фузы для внешнего кварца(может кому пригодится)
СпойлерИзображение

Gudd-Head писал(а):Тема по фьюзам: viewtopic.php?f=57&t=1279
честно говоря, та тема настолько обширная, что полистав 10страниц ответа не нашел и пошел читать даташит :oops:
Druppi
Родился
Сообщения: 5
Зарегистрирован: Пт авг 17, 2012 05:40:29

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

Сообщение Druppi »

привет у меня вопрос какая максимальная глубина вложений в codevision ?
используется МК AT Mega16 в программе присутствует основная программа main() в неё вложен while(1) чтоб было не одноразово в него вложен счётчик for() и т.д.
во вложении примерная структура программы
Спойлерmain()
{
while(1)
{
while(PINB.0)
{
for(i=0;i<10;i++)
{
if(PINB.1)
{
for(i=0;i<10;i++)
{
print_time() // подпрограмма в которой имеется ещё 3 вложеня
}
}
}
}
}

}

программа в принципе работает если отключить (закомментировать) выполнение подпрограммы или если подпрограмма выполняется отдельно в main() но если запускать её внутри структуры то начинаются танцы с бубном
помогите уже 2 недели мучаюсь
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

как в CV записать массив в память програм и как его считывать ?
Tell Me The Truth
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

насколько я помню просто объявить как

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

flash some_constant[]={15,25,36,255,364,2};//объявление содержания массива.
a=some_constant[1];//чтение a=25

В общем использование мало отличается от использования обычного массива это же CVAVR.
только объявить нужно правильно.
Писать во флеш во время работы Мк получится только из области загрузчика.
Druppi
Родился
Сообщения: 5
Зарегистрирован: Пт авг 17, 2012 05:40:29

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

Сообщение Druppi »

vitalik_1984 писал(а):насколько я помню просто объявить как

помоему даже слово flash не надо писать у контроллера всего 2 памяти
FLASH - память программ и EEPROM - память данных
если перед объявлением переменной (массива) не стоит слово EEPROM то он пишет всё в память программ

char mass[]={10,42,16}; => массив в памяти программ ( FLASH )
eeprom char mass[]={10,42,16}; => массив в памяти данных ( EEPROM )
Последний раз редактировалось Gudd-Head Чт июл 25, 2013 08:29:28, всего редактировалось 1 раз.
Причина: Нарушение п.2.7 Правил Форума
a_skr
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

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

Сообщение a_skr »

В корне НЕВЕРНО! Не вводите в заблуждение!
Переменные - на то и переменные, чтобы располагаться в ОЗУ.
Druppi
Родился
Сообщения: 5
Зарегистрирован: Пт авг 17, 2012 05:40:29

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

Сообщение Druppi »

a_skr писал(а):В корне НЕВЕРНО! Не вводите в заблуждение!
Переменные - на то и переменные, чтобы располагаться в ОЗУ.

поправьте пожалуйста что неправильно заодно и я обновлю своё представление о структуре процессора
Аватара пользователя
*Trigger*
Друг Кота
Сообщения: 3059
Зарегистрирован: Пн май 11, 2009 14:15:00
Откуда: СПб

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

Сообщение *Trigger* »

Если flash не написать, массив при включении питания будет размещён в ОЗУ и в него изначально будут загружены значения из flash. При этом значения элементов массива можно будет изменять в программе.
Если же flash будет написано, массив в ОЗУ загружаться не будет, и в программе можно будет только считывать из него значания, то есть он становится константой и не занимает ОЗУ.
Этот пост оказался полезен? Не поленись, нажми Изображение слева!
:) :)) :)))
Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
Druppi
Родился
Сообщения: 5
Зарегистрирован: Пт авг 17, 2012 05:40:29

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

Сообщение Druppi »

спасибо за объяснения я почему то считал что FLASH это и есть ОЗУ и что в него при запуске подгружается исполняемая программа с переменными

видать лекции по этой теме плохо слушал
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

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

Сообщение ibiza11 »

Druppi писал(а):видать лекции по этой теме плохо слушал
все ок. просто лекции были не про AVR :))
Ставим плюсы: )
VXXXV
Открыл глаза
Сообщения: 49
Зарегистрирован: Сб фев 02, 2013 17:20:04
Откуда: Донецк

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

Сообщение VXXXV »

В общем делаю управление процессором звука по i2c, контроллер мега32а, дисплей от самсунга. Проблема в переменных, которые изменяются непонятно как, а именно. Усиление, высокие и басс, все считатется нормально. LF (левый фронт) тоже вроде бы как все нормально числа переключает, от 1 до 32 значение, соотвествует посылки в процессор числа от 159 до 128. А вот правый фронт ведет себя странно, точнее его переменная. При нажатии кнопок + и -, точнее во время того как они срабатывают, числа в проц идут как надо от 191 до 160 (32шага), после того как операция выполнена, в переменной записывается совсем другое число. Также оно зависит и от переменной LF. Вот думаю может это бок самого CVA.

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

/****************************************BASS******************************************************************/
      if(BASY==1){BASR++; if(BASR>16){BASR=16;} if(BASR<=8){BASS=map(BASR,1,8,96,103);} if (BASR>9){BASS=map(BASR,9,16,111,104);}}
      if(BASN==1){BASR--; if(BASR<1){BASR=1;} if(BASR<8){BASS=map(BASR,1,8,96,103);} if (BASR>=9){BASS=map(BASR,9,16,111,104);}}
     
      sprintf( BASRS,"%03d", BASS );                     //отправить на проц
      LCDtext2(160,7,BASRS, 0 , 255 , 0 ,0,0,0,3);
     
      sprintf(BASSS,"%02d", BASR );                    // ступень на экране
      LCDtext2(152,251,BASSS, 0 , 255 , 0 ,0,0,0,2);
      /**************************************************************************************************************/
     
      /*************************************************LF************************************************************/
      if(LFY==1){LFF++; if(LFF>32){LFF=32;} LFFL=(159-LFF)+1;}
      if(LFN==1){LFF--; if(LFF<1){LFF=1;}   LFFL=(159-LFF)+1;}
     
      sprintf( LFS,"%03d", LFFL );                     //отправить на проц
      LCDtext(45,60,LFS, 0 , 255 , 0 ,0,0,0,3);
     
      sprintf(LFSS,"%02d", LFF );                    // ступень на экране
      LCDtext2(152,51,LFSS, 0 , 255 , 0 ,0,0,0,2);
      /***************************************************************************************************************/
     
      /***********************************************RF*****************************************************************/
      if(RFY==1){RFront++; if(RFront>32){RFront=32;} RFrontP=(191-RFront)+1;}
      if(RFN==1){RFront--; if(RFront<1){RFront=1;}   RFrontP=(191-RFront)+1;}
     
      sprintf( RFstp,"%03d", RFrontP);
      LCDtext(45,110,RFstp, 0 , 255 , 0 ,0,0,0,3);
     
      sprintf(RFstc,"%02d", RFront );                    // ступень на экране
      LCDtext2(152,101,RFstc, 0 , 255 , 0 ,0,0,0,2);


Функция мар аналог такой же функции как в ардуино.

Цифры слева, то что нужно передать в аудиопроц.

http://youtu.be/APKUcKVB-Lg
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

Druppi писал(а):спасибо за объяснения я почему то считал что FLASH это и есть ОЗУ и что в него при запуске подгружается исполняемая программа с переменными

При запуске откуда? флеш это как жесткий диск на обычном компе. Есть и RAM куда помещаются переменные. Еще есть EEPROM в который пишутся всякие настройки так как EEPROM имеет больший ресурс циклов перезаписи, чем у Flash.
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

а кто быстрее flash или eeprom ?
Tell Me The Truth
Ответить

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