Страница 61 из 421
Добавлено: Чт янв 21, 2010 23:28:13
cccaaa
Здравствуйте. Решил сделать генератор сигналов по статье
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
Добавлено: Пт янв 22, 2010 12:03:12
Igor_67
Всем МЯУ!
Помогите с выводом на 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);
};
Как правильно?
Добавлено: Пт янв 22, 2010 12:34:06
ARV
ну, во-первых, если мне не изменяет память, в функцию
rtc_get_time() надо передать адреса трех
переменных, в которые будут записаны значения часов, минут и секунд соответственно. а вы передаете три нуля, т.е. явно не то, что надо. хотя CVAVR я весьма поверхностно знаю и могу быть не прав.
во-вторых, если у вас возникает ошибка - вы бы хоть указали, в какой именно строке вашего текста. а то вдруг проблема совсем не в этом куске кода? по идее, компилятору должно быть по барабану, передаете вы 0 или реальный адрес - это я про вышеупомянутую функцию. то есть по идее
warning он выдать должен, а
error - нет... что наталкивает на мысль об ошибке в другом месте
в-третьих, у вас еще проблемка есть: при выводе времени... написали строку для вывода трех чисел, а реально указали только одну переменную, в итоге выведет первое число нормально (то, что хотели, т.е. переменную
time), а потом выведет еще 2 непонятно каких значения - будете удивляться.
наконец, в-четвертых, разберитесь: а на самом ли деле выводить вам надо именно переменную
time? что она у вас будет хранить за значение?

Добавлено: Пт янв 22, 2010 12:53:33
Igor_67
Ошибка выходит в этой строке:
Еще пробовал так:
Код: Выделить всё
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 кБайт!!!

Вот вам и хваленая компактность кода на СИ!!!

Добавлено: Пт янв 22, 2010 13:12:05
ARV
Igor_67 писал(а):Еще пробовал так:
вы читали мой ответ или сочли несущественным?
Добавлено: Пт янв 22, 2010 13:14:16
Igor_67
Конечно читал, не обижайтесь, Роман!

Подправил свой пост.
Добавлено: Пт янв 22, 2010 13:15:58
Igor_67
Похоже, что ругается как раз на переменную times типа int. Не нравится ему, что она именно int.
Добавлено: Пт янв 22, 2010 14:06:34
ARV
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, как я и предсказывал.
Добавлено: Пт янв 22, 2010 14:41:48
Igor_67
Чего то я нифига не догоняю...
Вобщем сделал так:
Код: Выделить всё
// 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);
Как время то получить???
Мне стыдно конечно, но я только учусь на СИ программировать...
Добавлено: Пт янв 22, 2010 14:56:20
ARV
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);
Добавлено: Пт янв 22, 2010 15:04:06
Igor_67
Уррраааа!!! Пошли часики! Вот так работает:
Код: Выделить всё
// 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);
};
Вот только когда минуты или секунды доходят до нуля, то на индикаторе по одному нулю, а не по два. Как отформатировать строку так, чтобы при нулевых показаниях в разряде минут и секунд было по два нуля, а в разряде часов - один ноль?
Добавлено: Пт янв 22, 2010 15:29:51
Igor_67
Все, разобрался. Просто добавил три условия:
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);
};
Добавлено: Пт янв 22, 2010 15:34:38
ARV
не надо никаких условий!
используйте для вывода формат "%2u:%2u.%2u" и будет вам счастье.
Добавлено: Пт янв 22, 2010 15:57:02
Igor_67
Не-а, так вообще ничего не показывает!
Добавлено: Пт янв 22, 2010 16:01:43
ARV
Igor_67 писал(а):Не-а, так вообще ничего не показывает!
не могет такого быть

попробуйте "%02u:%02u.%02u"
Добавлено: Пт янв 22, 2010 16:06:59
Igor_67
Тоже безрезультатно!

Добавлено: Пт янв 22, 2010 16:37:35
Igor_67
Если в свойствах проекта убрать галочку "Promote char to int", такое форматирование строки ( "%2u:%2u:%2u") прокатывает, но тогда незначащих нулей вообще нет, вместо них - пробелы: 12: 5: 7
Добавлено: Пт янв 22, 2010 17:04:37
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);
};
Теперь все работает как надо!

Добавлено: Пт янв 22, 2010 21:55:09
ARV
ваши танцы через одно место проходят. вместо того, чтобы 1 раз прочесть хелп вы придумываете какие бубны... формат, что я сказал, должен был подойти, но раз у вас вместо нулей пробелы, тогда надо всего-навсего такой формат "%2u:%02u.%02u"
Добавлено: Пт янв 22, 2010 22:18:31
Igor_67
так тоже пробовал, код меньше всего на 0.3 кб, по сравнению с баскомом ваще не рулит. В кодвижне 30, в баскоме 23 - учитывая прерывание и обработку кнопок и ещё запись в еепром!!!