Страница 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
Ошибка выходит в этой строке:

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

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 кБайт!!! :shock: Вот вам и хваленая компактность кода на СИ!!! :tea:

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

Добавлено: Пт янв 22, 2010 13:14:16
Igor_67
Конечно читал, не обижайтесь, Роман! :beer: Подправил свой пост.

Добавлено: Пт янв 22, 2010 13:15:58
Igor_67
Похоже, что ругается как раз на переменную times типа int. Не нравится ему, что она именно int.

Добавлено: Пт янв 22, 2010 14:06:34
ARV
Igor_67 писал(а):Конечно читал, не обижайтесь, Роман! :beer: Подправил свой пост.
Похоже, что ругается как раз на переменную 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);
Как время то получить??? :oops:
Мне стыдно конечно, но я только учусь на СИ программировать...

Добавлено: Пт янв 22, 2010 14:56:20
ARV
Igor_67 писал(а):Чего то я нифига не догоняю...
На индикаторе: 0:0:0
Понятно, что это из-за функции rtc_get_time(0,0,0);
Как время то получить??? :oops:
Мне стыдно конечно, но я только учусь на СИ программировать...
дружище, ваша проблема в том, что вы абсолютно невнимательно читаете (если дочитываете до конца вообще) то, что вам тут я пишу - пытаюсь же помочь, всех делов-то: надо прочесть все-все, если требуется - два раз :) ну писал же вам, как время получить:
то есть надо так: 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);
      };
Теперь все работает как надо! :tea:

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

Добавлено: Пт янв 22, 2010 22:18:31
Igor_67
так тоже пробовал, код меньше всего на 0.3 кб, по сравнению с баскомом ваще не рулит. В кодвижне 30, в баскоме 23 - учитывая прерывание и обработку кнопок и ещё запись в еепром!!!