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

Обсуждаем контроллеры компании Atmel.
cccaaa
Родился
Сообщения: 3
Зарегистрирован: Ср янв 20, 2010 18:56:59

Сообщение 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
Аватара пользователя
Igor_67
Электрический кот
Сообщения: 1051
Зарегистрирован: Вт окт 21, 2008 11:46:23
Откуда: Барнаул

Сообщение 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);
      };

Как правильно?
Цапу крутить надо!!! Ку или не ку?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

ну, во-первых, если мне не изменяет память, в функцию rtc_get_time() надо передать адреса трех переменных, в которые будут записаны значения часов, минут и секунд соответственно. а вы передаете три нуля, т.е. явно не то, что надо. хотя CVAVR я весьма поверхностно знаю и могу быть не прав.

во-вторых, если у вас возникает ошибка - вы бы хоть указали, в какой именно строке вашего текста. а то вдруг проблема совсем не в этом куске кода? по идее, компилятору должно быть по барабану, передаете вы 0 или реальный адрес - это я про вышеупомянутую функцию. то есть по идее warning он выдать должен, а error - нет... что наталкивает на мысль об ошибке в другом месте

в-третьих, у вас еще проблемка есть: при выводе времени... написали строку для вывода трех чисел, а реально указали только одну переменную, в итоге выведет первое число нормально (то, что хотели, т.е. переменную time), а потом выведет еще 2 непонятно каких значения - будете удивляться.

наконец, в-четвертых, разберитесь: а на самом ли деле выводить вам надо именно переменную time? что она у вас будет хранить за значение? ;)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Igor_67
Электрический кот
Сообщения: 1051
Зарегистрирован: Вт окт 21, 2008 11:46:23
Откуда: Барнаул

Сообщение 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:
Последний раз редактировалось Igor_67 Пт янв 22, 2010 13:12:09, всего редактировалось 1 раз.
Цапу крутить надо!!! Ку или не ку?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

Igor_67 писал(а):Еще пробовал так:
вы читали мой ответ или сочли несущественным?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Igor_67
Электрический кот
Сообщения: 1051
Зарегистрирован: Вт окт 21, 2008 11:46:23
Откуда: Барнаул

Сообщение Igor_67 »

Конечно читал, не обижайтесь, Роман! :beer: Подправил свой пост.
Цапу крутить надо!!! Ку или не ку?
Аватара пользователя
Igor_67
Электрический кот
Сообщения: 1051
Зарегистрирован: Вт окт 21, 2008 11:46:23
Откуда: Барнаул

Сообщение Igor_67 »

Похоже, что ругается как раз на переменную times типа int. Не нравится ему, что она именно int.
Цапу крутить надо!!! Ку или не ку?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение 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, как я и предсказывал.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Igor_67
Электрический кот
Сообщения: 1051
Зарегистрирован: Вт окт 21, 2008 11:46:23
Откуда: Барнаул

Сообщение 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:
Мне стыдно конечно, но я только учусь на СИ программировать...
Цапу крутить надо!!! Ку или не ку?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение 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);
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Igor_67
Электрический кот
Сообщения: 1051
Зарегистрирован: Вт окт 21, 2008 11:46:23
Откуда: Барнаул

Сообщение 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);
      };

Вот только когда минуты или секунды доходят до нуля, то на индикаторе по одному нулю, а не по два. Как отформатировать строку так, чтобы при нулевых показаниях в разряде минут и секунд было по два нуля, а в разряде часов - один ноль?
Цапу крутить надо!!! Ку или не ку?
Аватара пользователя
Igor_67
Электрический кот
Сообщения: 1051
Зарегистрирован: Вт окт 21, 2008 11:46:23
Откуда: Барнаул

Сообщение 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);
};
Цапу крутить надо!!! Ку или не ку?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

не надо никаких условий!

используйте для вывода формат "%2u:%2u.%2u" и будет вам счастье.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Igor_67
Электрический кот
Сообщения: 1051
Зарегистрирован: Вт окт 21, 2008 11:46:23
Откуда: Барнаул

Сообщение Igor_67 »

Не-а, так вообще ничего не показывает!
Цапу крутить надо!!! Ку или не ку?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

Igor_67 писал(а):Не-а, так вообще ничего не показывает!
не могет такого быть :) попробуйте "%02u:%02u.%02u"
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Igor_67
Электрический кот
Сообщения: 1051
Зарегистрирован: Вт окт 21, 2008 11:46:23
Откуда: Барнаул

Сообщение Igor_67 »

Тоже безрезультатно! :(
Цапу крутить надо!!! Ку или не ку?
Аватара пользователя
Igor_67
Электрический кот
Сообщения: 1051
Зарегистрирован: Вт окт 21, 2008 11:46:23
Откуда: Барнаул

Сообщение Igor_67 »

Если в свойствах проекта убрать галочку "Promote char to int", такое форматирование строки ( "%2u:%2u:%2u") прокатывает, но тогда незначащих нулей вообще нет, вместо них - пробелы: 12: 5: 7
Цапу крутить надо!!! Ку или не ку?
Аватара пользователя
Igor_67
Электрический кот
Сообщения: 1051
Зарегистрирован: Вт окт 21, 2008 11:46:23
Откуда: Барнаул

Сообщение 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:
Цапу крутить надо!!! Ку или не ку?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

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

Мой уютный бложик... заходите!
Аватара пользователя
Igor_67
Электрический кот
Сообщения: 1051
Зарегистрирован: Вт окт 21, 2008 11:46:23
Откуда: Барнаул

Сообщение Igor_67 »

так тоже пробовал, код меньше всего на 0.3 кб, по сравнению с баскомом ваще не рулит. В кодвижне 30, в баскоме 23 - учитывая прерывание и обработку кнопок и ещё запись в еепром!!!
Цапу крутить надо!!! Ку или не ку?
Ответить

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