WinAvr в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
VasaShmidt
Родился
Сообщения: 16
Зарегистрирован: Ср май 26, 2010 13:48:40

Re: WinAvr в вопросах и ответах

Сообщение VasaShmidt »

ARV писал(а):в результате программа теряет основное качество хорошо написанной программы: портируемость.

Аргумент, с которым не поспоришь... Не учла...
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение avreal »

Ну я там кое-чего нацарапал на тему секций в GCC.
Если кому непонятен текст, то смотрите исходники в приложении, там всё должно быть понятно :-)
Последний раз редактировалось avreal Вс май 22, 2011 22:55:07, всего редактировалось 1 раз.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
Zwanzig
Нашел транзистор. Понюхал.
Сообщения: 190
Зарегистрирован: Вт янв 26, 2010 21:49:41
Откуда: モスクワ

Re: WinAvr в вопросах и ответах

Сообщение Zwanzig »

Решил пересесть с асма на Си, и вылезла тут непонятная ошибка :) Подключаю я util/delay.h, а компилятор ругается и выдаёт сразу три варнинга:

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

c:/winavr-20100110/lib/gcc/../../avr/include/util/delay.h:113: error: expected expression before '=' token
c:/winavr-20100110/lib/gcc/../../avr/include/util/delay.h:123: error: expected expression before '=' token
c:/winavr-20100110/lib/gcc/../../avr/include/util/delay.h:151: error: expected expression before '=' token

:?
Что такое? В delay.h посмотрел, там всё правильно в плане синтаксиса, да и неужто в заголовочном файле ошибки будут?
Аватара пользователя
Zwanzig
Нашел транзистор. Понюхал.
Сообщения: 190
Зарегистрирован: Вт янв 26, 2010 21:49:41
Откуда: モスクワ

Re: WinAvr в вопросах и ответах

Сообщение Zwanzig »

Ахах, вопрос закрыт, я идиот :))) Написал #define F_CPU = 8000000L
Аватара пользователя
AI_Disable
Сверлит текстолит когтями
Сообщения: 1116
Зарегистрирован: Чт окт 15, 2009 14:16:18
Откуда: Екб
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение AI_Disable »

Подскажите, что за ворны вылезают на функцию strncat(buff,temp_buff,4);

../main.c:254: warning: implicit declaration of function 'strncat'
../main.c:254: warning: incompatible implicit declaration of built-in function 'strncat'

buff и temp_buff объявлены так:
char buff[10],temp_buff[10];

PS: всё работает как надо: к строке buff присоединяются первые 4 символа temp_buff.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение Мастер Ломастер »

AI_Disable писал(а):Подскажите, что за ворны вылезают на функцию strncat(buff,temp_buff,4);

../main.c:254: warning: implicit declaration of function 'strncat'
../main.c:254: warning: incompatible implicit declaration of built-in function 'strncat'

buff и temp_buff объявлены так:
char buff[10],temp_buff[10];

PS: всё работает как надо: к строке buff присоединяются первые 4 символа temp_buff.

#include <string.h> присутствует?
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
AI_Disable
Сверлит текстолит когтями
Сообщения: 1116
Зарегистрирован: Чт окт 15, 2009 14:16:18
Откуда: Екб
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение AI_Disable »

Мастер Ломастер, вы правы, данный инклюд отсутствовал, благодарю. Как же оно тогда работало... :roll: :)
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение Мастер Ломастер »

AI_Disable писал(а):Мастер Ломастер, вы правы, данный инклюд отсутствовал, благодарю. Как же оно тогда работало... :roll: :)
линкер по умолчанию подключает системные библиотеки, поэтому файлы собираются без проблем. а вот компилятору не нравится, что в проекте нет определений функций - вот и варнинг
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
Savelek
Прорезались зубы
Сообщения: 221
Зарегистрирован: Сб апр 25, 2009 14:29:05

Re: WinAvr в вопросах и ответах

Сообщение Savelek »

Здравствуйте! Пишу на GCC, интегрированном в AVR Studio.
Есть функция:

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

#define IR8_data 1
#define IR8_clk 0
#define IR8_PORT PORTC
#define IR8_DDR DDRC
...
void ir8wword(unsigned char byte0,unsigned char byte1)
{
   ir8_byte0=byte0;
   ir8_byte1=byte1;
   unsigned char a,b,c;
   b=byte0;
   for(a=2;a>0;a--)
   {
      for(c=8;c>0;c--)
      {
         if((b & (0b10000000))==0) {IR8_PORT&=~(1<<IR8_data);}
         else {IR8_PORT|=1<<IR8_data;}//копирование 0 бита b в PORTC
         IR8_PORT|=1<<IR8_clk;//подача тактового импульса
         asm(
         "nop\n\t"
         "nop\n\t"
         "nop\n\t");
         IR8_PORT&=~(1<<IR8_clk);
         b<<=1;//сдвиг b влево на 1
         }
      b=byte1;
   }
}

Она выводит в два последовательно соединенные сдвиговые регистры ИР8 byte0 и byte1. Таким образом, сначала отсылается byte0, а затем byte1, и в конце выполнения функции в последнем регистре оказывается byte0, а в первом(в том, который и подключен к контроллеру) byte1. Функция работает нормально только если седьмой бит byte1 равен лог.1. Иначе, если седьмой бит byte1 равен лог.0, то в первом регистре ИР8 везде будут нули, независимо от состояния byte0. В общем, как-то так:
    Левый столбик - то, как вызвана функция, правый столбик - результат на выходе регистров
    ir8wword(0xXX,0b1YYYYYYY); 0b1YYYYYYY 0xXX
    ir8wword(0xXX,0b0YYYYYYY); 0b0YYYYYYY 0x00
Вообще понять не могу, как седьмой бит byte1 может влиять на остальные биты информации, ведь 7-й бит byte1 выгружается самым последним и по логике никак не может повлиять на уже выгруженную информацию byte0. :dont_know:
Пожалуйста, помогите.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение Мастер Ломастер »

вот тут ARV давал совет про SPI: viewtopic.php?p=643101#p643101
тоже последовательный вывод 1 байта. а вывод двух байтов делается повторным обращением к функции:

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

void sendword(unsigned int w){
   sendbyte(w & 0xFF); // младший байт
   sendbyte(w >> 8); // старший байт
}

а вы что-то намудрили...
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
Savelek
Прорезались зубы
Сообщения: 221
Зарегистрирован: Сб апр 25, 2009 14:29:05

Re: WinAvr в вопросах и ответах

Сообщение Savelek »

У меня написано тоже самое, только в одну функцию объединен вывод сразу двух байт, и WinAvr, видимо, не поддерживает точный синтаксис обращения к какому-то разряду байта.
Ошибка оказалась самая идиотская: забыл провести дорожку питания в 14-й ноге микросхемы (+ питания). Как она вообще функционировала?... Причем там полигон питания +5Вольт находился ну прям в миллиметре от этой ножки микросхемы, просто я забыл добавить эту дорожку при редактировании печатной платы. :oops: А ведь печатная плата была изготовлена месяц назад и прошла проверку...
Вывод: пора переходить со SprintLayout на что-то посерьезнее.
Аватара пользователя
Bismark
Открыл глаза
Сообщения: 70
Зарегистрирован: Вт сен 14, 2010 14:40:55
Откуда: Оттуда

Re: WinAvr в вопросах и ответах

Сообщение Bismark »

Всем доброго времени суток!
Возник такой вопрос...
Разбирал я по обучалке Динамический опрос клавиатуры, но вот приспичило мне изучить в данном направлении не ассемблер, а С :)
Собственно, я пробовал приведенный там пример переписать на С, но столкнулся с проблемой - как можно из переменной типа char прочитать конкретный бит???
Есть ли для этого какие-то готовые функции языка? Или как вообще это можно сделать??

З.Ы. нашел в инете такой вариант:
struct BITS
{
bool b1 :1;
bool b2 :1;
bool b3 :1;
bool b4 :1;
bool b5 :1;
bool b6 :1;
bool b7 :1;
bool b8 :1;
};

void myfunction()
{
char cByteRead;
BITS b;

cByteRead = 'a';

cout << "The full byte has a meaning of...: " << cByteRead << endl;
cout << "...which is in int:" << (int)cByteRead << endl;

b = *(BITS*)(&cByteRead);
cout << b.b1 << endl;
cout << b.b2 << endl;
cout << b.b3 << endl;
cout << b.b4 << endl;
cout << b.b5 << endl;
cout << b.b6 << endl;
cout << b.b7 << endl;
cout << b.b8 << endl;
}

Хоть и для С++, но это не столь важно. Другая проблема в том, что как по мне, то для МК этот код как-то слишком уж обьемный... А попроще можно ли это реализовать?
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение Мастер Ломастер »

круто... битовые поля, С++ - это вы знаете, а простейшие битовые операции операции - не знаете...

проверка 3-го бита (начиная с 0-го!) в байте if(byte & (1 << 3)){...} об этом писалось уже мульён раз
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
Bismark
Открыл глаза
Сообщения: 70
Зарегистрирован: Вт сен 14, 2010 14:40:55
Откуда: Оттуда

Re: WinAvr в вопросах и ответах

Сообщение Bismark »

Мастер Ломастер писал(а):круто... битовые поля, С++ - это вы знаете, а простейшие битовые операции операции - не знаете...

проверка 3-го бита (начиная с 0-го!) в байте if(byte & (1 << 3)){...} об этом писалось уже мульён раз

Обалдеть... Ну да, протупил :oops: :)))
Просто подобная конструкция описана для проверки битов непосредственно в регистре порта, но я не подумал что таким же образом можно проверить и просто байт...

Спасибо за помощь!
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение Мастер Ломастер »

Bismark писал(а):Просто подобная конструкция описана для проверки битов непосредственно в регистре порта, но я не подумал что таким же образом можно проверить и просто байт...
а в чем разница-то? порт или байт: это все равно для Си - просто переменные...
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
Bismark
Открыл глаза
Сообщения: 70
Зарегистрирован: Вт сен 14, 2010 14:40:55
Откуда: Оттуда

Re: WinAvr в вопросах и ответах

Сообщение Bismark »

Мастер Ломастер писал(а):а в чем разница-то? порт или байт: это все равно для Си - просто переменные...

Ну вот этого как раз я и не учел...
Думал что регистр для WinAVR - это что-то особенное, а не просто однобайтовая переменная :)

Еще раз спасибо!
maxmihan
Родился
Сообщения: 3
Зарегистрирован: Пт июн 03, 2011 17:14:24

Re: WinAvr в вопросах и ответах

Сообщение maxmihan »

День добрый, я здесь новый.
Есть вопрос по программированию в WinAVR, gcc-avr (?) компилятор.

Есть например функция
uint8_t UART0_PrintString( uint8_t * string)

Однако при компиляции строки UART0_PrintString("Preved") выдается warning
pointer targets in passing argument 1 of 'UART0_PrintString' differ in signedness

Если объявить как
uint8_t UART0_PrintString( const char * string)
то ругаться начинает на UART0_PrintString( var_preved ), константная строка понятно проходит

Что мне теперь 2 дублирующие функции объявлять что-ли?

Параметры компилятора
vr-gcc -c -mmcu=atmega64 -I. -gdwarf-2 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=./fat32.lst -std=gnu99 -MMD -MP -MF .dep/fat32.o.d fat32.c -o fat32.o fat32.c
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение ARV »

формально char это не uint8_t вот и все. мне кажется, объявив с параметром char* вы избавитесь от варнинга. и следует уточнить. как у вас определена переменная var_preved - возможно, проблема именно в ней.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
maxmihan
Родился
Сообщения: 3
Зарегистрирован: Пт июн 03, 2011 17:14:24

Re: WinAvr в вопросах и ответах

Сообщение maxmihan »

объявил.
константная строка проходит без ошибки, вариант с переменной выдает предупреждение
переменная объявлена допустим как uint8_t aux_name[10]
при объявлении ее как char aux_name[10] компиляция проходит без предупреждений, однако придется поковырять пару функций, где она еще используется.
Короче, похоже можно все сделать без ошибок, но все как то переусложнено.
Речь ведь идет просто про byte. Надеюсь программа после этого не перестанет работать.
Ar-Gen-Tum
Прорезались зубы
Сообщения: 221
Зарегистрирован: Вс янв 23, 2011 21:51:12

Re: WinAvr в вопросах и ответах

Сообщение Ar-Gen-Tum »

maxmihan писал(а):...
Речь ведь идет просто про byte. Надеюсь программа после этого не перестанет работать.

Смотрите: сюды
Нетути в С типа byte. (Можно лишь определить #typedef unsigned char byte)
Ответить

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