Страница 269 из 421
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт июл 18, 2013 23:17:07
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;}
}
Зачем городить кучу переменных, если они все делают одно и то же?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт июл 19, 2013 06:07:05
Amstron
Об этом варианте я не задумывался. Спасибо )))
А по объему кода это гораздо больше наверное выйдет!?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт июл 19, 2013 08:26:07
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.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс июл 21, 2013 18:14:05
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);
}
}
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс июл 21, 2013 18:27:25
Garin
gavrila, неправильно выставлены фьюзы, у тебя 1 MHz , а надо на внешний кварц 16 MHz ....
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс июл 21, 2013 19:01:36
gavrila
судя по описанию, нужно установить CKOPT=0 - правильно я понял?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн июл 22, 2013 09:15:31
Gudd-Head
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн июл 22, 2013 10:18:07
gavrila
Garin писал(а):gavrila, неправильно выставлены фьюзы, у тебя 1 MHz , а надо на внешний кварц 16 MHz ....
спасибо, так и было
gavrila писал(а):судя по описанию, нужно установить CKOPT=0 - правильно я понял?
Исправлю самого себя - вместо этого фуза, надо было другие парочку поставить. в общем покопавшись в даташите и испортив всего один МК, все получилось.
под спойлером установленые фузы для внешнего кварца(может кому пригодится)
Спойлер

честно говоря, та тема настолько обширная, что полистав 10страниц ответа не нашел и пошел читать даташит

Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн июл 22, 2013 18:40:58
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 недели мучаюсь
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср июл 24, 2013 10:36:04
FreshMan
как в CV записать массив в память програм и как его считывать ?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср июл 24, 2013 21:57:07
vitalik_1984
насколько я помню просто объявить как
Код: Выделить всё
flash some_constant[]={15,25,36,255,364,2};//объявление содержания массива.
a=some_constant[1];//чтение a=25
В общем использование мало отличается от использования обычного массива это же CVAVR.
только объявить нужно правильно.
Писать во флеш во время работы Мк получится только из области загрузчика.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт июл 25, 2013 05:47:29
Druppi
vitalik_1984 писал(а):насколько я помню просто объявить как
помоему даже слово flash не надо писать у контроллера всего 2 памяти
FLASH - память программ и EEPROM - память данных
если перед объявлением переменной (массива) не стоит слово EEPROM то он пишет всё в память программ
char mass[]={10,42,16}; => массив в памяти программ ( FLASH )
eeprom char mass[]={10,42,16}; => массив в памяти данных ( EEPROM )
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт июл 25, 2013 08:36:51
a_skr
В корне НЕВЕРНО! Не вводите в заблуждение!
Переменные - на то и переменные, чтобы располагаться в ОЗУ.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт июл 25, 2013 08:53:34
Druppi
a_skr писал(а):В корне НЕВЕРНО! Не вводите в заблуждение!
Переменные - на то и переменные, чтобы располагаться в ОЗУ.
поправьте пожалуйста что неправильно заодно и я обновлю своё представление о структуре процессора
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт июл 25, 2013 12:14:12
*Trigger*
Если flash не написать, массив при включении питания будет размещён в ОЗУ и в него изначально будут загружены значения из flash. При этом значения элементов массива можно будет изменять в программе.
Если же flash будет написано, массив в ОЗУ загружаться не будет, и в программе можно будет только считывать из него значания, то есть он становится константой и не занимает ОЗУ.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт июл 25, 2013 12:55:39
Druppi
спасибо за объяснения я почему то считал что FLASH это и есть ОЗУ и что в него при запуске подгружается исполняемая программа с переменными
видать лекции по этой теме плохо слушал
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт июл 25, 2013 13:01:22
ibiza11
Druppi писал(а):видать лекции по этой теме плохо слушал
все ок. просто лекции были не про AVR

Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт июл 25, 2013 13:25:21
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
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт июл 25, 2013 13:31:08
vitalik_1984
Druppi писал(а):спасибо за объяснения я почему то считал что FLASH это и есть ОЗУ и что в него при запуске подгружается исполняемая программа с переменными
При запуске откуда? флеш это как жесткий диск на обычном компе. Есть и RAM куда помещаются переменные. Еще есть EEPROM в который пишутся всякие настройки так как EEPROM имеет больший ресурс циклов перезаписи, чем у Flash.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт июл 25, 2013 19:46:47
FreshMan
а кто быстрее flash или eeprom ?