CodeVision AVR в вопросах и ответах
Здравствуйте. Решил сделать генератор сигналов по статье http://www.scienceprog.com/avr-dds-sign ... rator-v20/
но просто скопировать мне не подходит. Изучаю cvavr а данная статья и исходники для winavr. Не могу записать массивы во flash по
заданному адресу как в оригинале на winavr если кто сталкивался помогите.
это тот самый массив
const uint8_t sinewave[] __attribute__ ((section (“.MySection1?)))= //256 values
{0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,…}
DDS Signal tables has to be placed in flash sections where address starts with 0xXX00. So these sections has to be defined in makefile for proper memory placement:
Таблица сигналов DDS должна быть расположена во flash секциях адрес которой начинается с 0xXX00 Поэтому секции должны быть определены в makefile для того что бы они были
расположены по соответствующему адресу
#Define sections where to store signal tables
LDFLAGS += -Wl,-section-start=.MySection1=0x3A00
LDFLAGS += -Wl,-section-start=.MySection2=0x3B00
как это можно сделать в cvavr
но просто скопировать мне не подходит. Изучаю cvavr а данная статья и исходники для winavr. Не могу записать массивы во flash по
заданному адресу как в оригинале на winavr если кто сталкивался помогите.
это тот самый массив
const uint8_t sinewave[] __attribute__ ((section (“.MySection1?)))= //256 values
{0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,…}
DDS Signal tables has to be placed in flash sections where address starts with 0xXX00. So these sections has to be defined in makefile for proper memory placement:
Таблица сигналов DDS должна быть расположена во flash секциях адрес которой начинается с 0xXX00 Поэтому секции должны быть определены в makefile для того что бы они были
расположены по соответствующему адресу
#Define sections where to store signal tables
LDFLAGS += -Wl,-section-start=.MySection1=0x3A00
LDFLAGS += -Wl,-section-start=.MySection2=0x3B00
как это можно сделать в cvavr
Всем МЯУ!
Помогите с выводом на LCD времени из RTC DS1307. Компилятор ругается: Error: C:\cvavr2\temp\8535_clock_test\clk.c(169): a value of type 'const void' can't be assigned to an entity of type 'int'
У меня сделано так:
Как правильно?
Помогите с выводом на LCD времени из RTC DS1307. Компилятор ругается: Error: C:\cvavr2\temp\8535_clock_test\clk.c(169): a value of type 'const void' can't be assigned to an entity of type 'int'
У меня сделано так:
Код: Выделить всё
int times;
...
...
...
while (1)
{
times = rtc_get_time(0,0,0);
lcd_clear();
sprintf(lcd_buffer,"%u:%u:%u",times);
lcd_puts(lcd_buffer);
delay_ms(1000);
};Как правильно?
Цапу крутить надо!!! Ку или не ку?
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
ну, во-первых, если мне не изменяет память, в функцию rtc_get_time() надо передать адреса трех переменных, в которые будут записаны значения часов, минут и секунд соответственно. а вы передаете три нуля, т.е. явно не то, что надо. хотя CVAVR я весьма поверхностно знаю и могу быть не прав.
во-вторых, если у вас возникает ошибка - вы бы хоть указали, в какой именно строке вашего текста. а то вдруг проблема совсем не в этом куске кода? по идее, компилятору должно быть по барабану, передаете вы 0 или реальный адрес - это я про вышеупомянутую функцию. то есть по идее warning он выдать должен, а error - нет... что наталкивает на мысль об ошибке в другом месте
в-третьих, у вас еще проблемка есть: при выводе времени... написали строку для вывода трех чисел, а реально указали только одну переменную, в итоге выведет первое число нормально (то, что хотели, т.е. переменную time), а потом выведет еще 2 непонятно каких значения - будете удивляться.
наконец, в-четвертых, разберитесь: а на самом ли деле выводить вам надо именно переменную time? что она у вас будет хранить за значение?
во-вторых, если у вас возникает ошибка - вы бы хоть указали, в какой именно строке вашего текста. а то вдруг проблема совсем не в этом куске кода? по идее, компилятору должно быть по барабану, передаете вы 0 или реальный адрес - это я про вышеупомянутую функцию. то есть по идее warning он выдать должен, а error - нет... что наталкивает на мысль об ошибке в другом месте
в-третьих, у вас еще проблемка есть: при выводе времени... написали строку для вывода трех чисел, а реально указали только одну переменную, в итоге выведет первое число нормально (то, что хотели, т.е. переменную time), а потом выведет еще 2 непонятно каких значения - будете удивляться.
наконец, в-четвертых, разберитесь: а на самом ли деле выводить вам надо именно переменную time? что она у вас будет хранить за значение?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Ошибка выходит в этой строке:
Еще пробовал так:
На индикатор выводится 12:0:204, хотя в переменную rtc_set_time() заранее записано значение (12,25,36). Получается, что читается только первое число - часы, а минуты и секунды идут лесом...
И что еще интересно, сделал то же самое в Баскоме, код получился весом 16 кБайт, а в Кодвижне - выходит 26 кБайт!!!
Вот вам и хваленая компактность кода на СИ!!! 
Код: Выделить всё
times = rtc_get_time(0,0,0);Еще пробовал так:
Код: Выделить всё
sprintf(lcd_buffer,"%u:%u:%u",rtc_get_time(0,0,0));
lcd_puts(lcd_buffer); На индикатор выводится 12:0:204, хотя в переменную rtc_set_time() заранее записано значение (12,25,36). Получается, что читается только первое число - часы, а минуты и секунды идут лесом...
И что еще интересно, сделал то же самое в Баскоме, код получился весом 16 кБайт, а в Кодвижне - выходит 26 кБайт!!!

Последний раз редактировалось Igor_67 Пт янв 22, 2010 13:12:09, всего редактировалось 1 раз.
Цапу крутить надо!!! Ку или не ку?
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
вы читали мой ответ или сочли несущественным?Igor_67 писал(а):Еще пробовал так:
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
а чего мне обижаться? это вы не обижайтесь, потому что сейчас буду плеваться ядом.Igor_67 писал(а):Конечно читал, не обижайтесь, Роман!Подправил свой пост.
Похоже, что ругается как раз на переменную times типа int. Не нравится ему, что она именно int.
или нифига вы не читали, или просто решили, что можно проигнорировать сказанное. потому что:
1. функция rtc_get_time() определена, как void, то есть она не возвращает результат вообще. а вы пытаетесь этот несуществующий результат записать в time - на что компилятор и ругается. между прочим, описание этой функции есть в хелпе.
2. повторяю еще раз: в эту функцию в качестве параметров надо передавать адреса трех переменных, а не три константы!!! то есть надо так: rtc_get_time(&hour, &min, &sec); тогда после вызова в переменных hour, min, sec окажутся часы, минуты и секунды вашего времени.
3. вывод на дисплей вы так и не переделали, хотя я сказал, что там не так. и удивлялись, что вам кажет 12:0:204, как я и предсказывал.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Чего то я нифига не догоняю...
Вобщем сделал так:
На индикаторе: 0:0:0
Понятно, что это из-за функции rtc_get_time(0,0,0);
Как время то получить???
Мне стыдно конечно, но я только учусь на СИ программировать...
Вобщем сделал так:
Код: Выделить всё
// Declare your global variables here
unsigned char hour;
unsigned char min;
unsigned char sec;
void main(void)
{
// Declare your local variables here
...
...
...
...
// I2C Bus initialization
i2c_init();
// DS1307 Real Time Clock initialization
// Square wave output on pin SQW/OUT: On
// Square wave frequency: 1Hz
rtc_init(0,1,0);
rtc_set_time(12,23,33);
rtc_get_time(0,0,0);
// LCD module initialization
lcd_init(16);
// Global enable interrupts
#asm("sei")
while (1)
{
lcd_clear();
sprintf(lcd_buffer,"%u:%u:%u",hour,min,sec);
lcd_puts(lcd_buffer);
delay_ms(1000);
};
}На индикаторе: 0:0:0
Понятно, что это из-за функции rtc_get_time(0,0,0);
Как время то получить???
Мне стыдно конечно, но я только учусь на СИ программировать...
Цапу крутить надо!!! Ку или не ку?
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
дружище, ваша проблема в том, что вы абсолютно невнимательно читаете (если дочитываете до конца вообще) то, что вам тут я пишу - пытаюсь же помочь, всех делов-то: надо прочесть все-все, если требуется - два разIgor_67 писал(а):Чего то я нифига не догоняю...
На индикаторе: 0:0:0
Понятно, что это из-за функции rtc_get_time(0,0,0);
Как время то получить???![]()
Мне стыдно конечно, но я только учусь на СИ программировать...
то есть надо так: rtc_get_time(&hour, &min, &sec); тогда после вызова в переменных hour, min, sec окажутся часы, минуты и секунды
а вы опять двадцать пять:
Код: Выделить всё
rtc_set_time(12,23,33);
rtc_get_time(0,0,0); если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Уррраааа!!! Пошли часики! Вот так работает:
Вот только когда минуты или секунды доходят до нуля, то на индикаторе по одному нулю, а не по два. Как отформатировать строку так, чтобы при нулевых показаниях в разряде минут и секунд было по два нуля, а в разряде часов - один ноль?
Код: Выделить всё
// DS1307 Real Time Clock initialization
// Square wave output on pin SQW/OUT: On
// Square wave frequency: 1Hz
rtc_init(0,1,0);
rtc_set_time(12,23,33);
// LCD module initialization
lcd_init(16);
// Global enable interrupts
#asm("sei")
while (1)
{
rtc_get_time(&hour,&min,&sec);
lcd_clear();
sprintf(lcd_buffer,"%u:%u:%u",hour,min,sec);
lcd_puts(lcd_buffer);
delay_ms(1000);
};Вот только когда минуты или секунды доходят до нуля, то на индикаторе по одному нулю, а не по два. Как отформатировать строку так, чтобы при нулевых показаниях в разряде минут и секунд было по два нуля, а в разряде часов - один ноль?
Цапу крутить надо!!! Ку или не ку?
Все, разобрался. Просто добавил три условия:
while (1)
{
rtc_get_time(&hour,&min,&sec);
lcd_clear();
if (sec < 10) sprintf(lcd_buffer,"%u:%u:0%u",hour,min,sec);
if (min < 10) sprintf(lcd_buffer,"%u:0%u:%u",hour,min,sec);
if (min <10 & sec < 10) sprintf(lcd_buffer,"%u:0%u:0%u",hour,min,sec);
else (sprintf(lcd_buffer,"%u:%u:%u",hour,min,sec));
lcd_puts(lcd_buffer);
delay_ms(1000);
};
Цапу крутить надо!!! Ку или не ку?
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
не надо никаких условий!
используйте для вывода формат "%2u:%2u.%2u" и будет вам счастье.
используйте для вывода формат "%2u:%2u.%2u" и будет вам счастье.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
не могет такого бытьIgor_67 писал(а):Не-а, так вообще ничего не показывает!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Ну вот, после "танцев с бубном" получил следующее:
Теперь все работает как надо!
Код: Выделить всё
while (1)
{
rtc_get_time(&hour,&min,&sec);
lcd_clear();
sprintf(lcd_buffer,"%u:%u:%u",hour,min,sec);
if (sec<10)
{
sprintf(lcd_buffer,"%u:%u:0%u",hour,min,sec);
};
if (min<10)
{
sprintf(lcd_buffer,"%u:0%u:%u",hour,min,sec);
};
if (sec<10 & min<10)
{
sprintf(lcd_buffer,"%u:0%u:0%u",hour,min,sec);
};
lcd_puts(lcd_buffer);
delay_ms(1000);
};Теперь все работает как надо!

Цапу крутить надо!!! Ку или не ку?
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
ваши танцы через одно место проходят. вместо того, чтобы 1 раз прочесть хелп вы придумываете какие бубны... формат, что я сказал, должен был подойти, но раз у вас вместо нулей пробелы, тогда надо всего-навсего такой формат "%2u:%02u.%02u"
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Подправил свой пост.