Обсуждаем контроллеры компании Atmel.
Ответить

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

Чт июн 28, 2018 07:29:37

OKF писал(а):Конечно зря. Как раз таки при SPI используется минимум ресурсов контроллера. Вообще, если возможно аппаратное решение, на кой использовать программное!

Да потому что аппаратное - это строгозаданное и ничего там не поменяешь (практически). Программное решение даёт возможность повесить на любой порт, свести к минимуму количество функций вывода, можно вместить а мелкие МК, да плюсов гора.

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

Чт июн 28, 2018 09:15:04

В случае работы с этими светодиодами посылка байта по SPI - это всего лишь посылка одного бита из 24.

Единственное преимущество использования SPI в данном случае - это лишь возможность заранее подготовить для отправки (все эти циклы, смены указателей и т.п.) следующий бит, параллельно посылке текущего, после чего всё равно придётся "висеть", ожидая окончания посылки этого бита.

То есть, на общую скорость работы (посылки всей последовательности для, к примеру, цепочки из 50 светодиодов => 50*24 бит) использование SPI особо не влияет.

P.S. Кстати, в процедуре отправки бита я бы "висел", ожидая готовности SPI, не после отправки данных, а перед ней. Иначе вообще особого преимущества в скорости нет.

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

Чт июн 28, 2018 11:56:03

Преимущество SPI не в скорости, а в том, что формируемые интервалы идеальны и не поплывут ни от температуры, ни от прерываний, ни от чего-то ещё. А именно с нечеткими интервалами последовательности импульсов основные проблемы с этими светодиодами.
И да, кварц обязателен.

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

Чт июн 28, 2018 14:53:27

Длительность импульса (единичные биты в 0xE0 или 0xF8) - да, не поплывёт, так как она определяется только SPI. Но вот паузы между импульсами могут вполне поплыть, так как стороннее прерывание может вкрасться между отправками байтов по SPI.

Хотя, возможно, для светодиодов важно именно первое, а второе не так уж и критично - лишь бы не было слишком долго, когда данные защёлкиваются и начинают ШИМ-иться.

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

Чт июн 28, 2018 15:30:09

WiseLord, Trigger,
Как вы считаете, как ещё можно организовать общение с данными светодиодами? Хочу именно программно, в самом деле что ли нельзя сделать?
Или и правда пробовать переходить под 20 МГц с внешним кварцом и тем самым минимизировать погрешности...

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

Чт июн 28, 2018 16:53:18

Если нет желания использовать SPI, единственный вменяемый вариант - писать на ассемблере (делать ассемблерную вставку). Иначе за таймингами никак не уследить.
Пример: https://github.com/adafruit/Adafruit_Ne ... oPixel.cpp
Конечно, написанное там в CVAVR без доработки работать не будет, там по-другому оформляются ассемблерные вставки.

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

Чт июн 28, 2018 21:35:58

Ай да мужики, ай да красавцы :))) Всем спасибо за участие! Безумно рад, что получилось запустить!
Короче как действовал:
Подключил осциллограф и методом научной пробы подобрал как располагать нупы. Не прибегая к ассемблерной вставке всей функции (а точнее языка, который я никогда толком не затрагивал), вот что получилось:
Код:
void SET_COLOR_1_LED (unsigned char R,unsigned char G, unsigned char B){
DIN_out = 1;
 
#asm("cli")
if (B & 0x80) { DIN = 1;  #asm("nop")#asm("nop")#asm("nop") DIN = 0;}
    else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;}

if (B & 0x40) { DIN = 1;  #asm("nop")#asm("nop")#asm("nop") DIN = 0;}
    else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;}

if (B & 0x20) { DIN = 1;  #asm("nop")#asm("nop")#asm("nop") DIN = 0;}
    else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;}

if (B & 0x10) { DIN = 1;  #asm("nop")#asm("nop")#asm("nop") DIN = 0;}
    else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;}

if (B & 0x08) { DIN = 1;  #asm("nop")#asm("nop")#asm("nop") DIN = 0;}
    else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;}

if (B & 0x04) { DIN = 1;  #asm("nop")#asm("nop")#asm("nop") DIN = 0;}
    else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;}

if (B & 0x02) { DIN = 1;  #asm("nop")#asm("nop")#asm("nop") DIN = 0;}
    else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;}

if (B & 0x10) { DIN = 1;  #asm("nop")#asm("nop")#asm("nop") DIN = 0;}
    else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;}     
   

if (R & 0x80) { DIN = 1;  #asm("nop")#asm("nop")#asm("nop") DIN = 0;}
    else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;}

if (R & 0x40) { DIN = 1;  #asm("nop")#asm("nop")#asm("nop") DIN = 0;}
    else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;}

if (R & 0x20) { DIN = 1;  #asm("nop")#asm("nop")#asm("nop") DIN = 0;}
    else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;}

if (R & 0x10) { DIN = 1;  #asm("nop")#asm("nop")#asm("nop") DIN = 0;}
    else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;}

if (R & 0x08) { DIN = 1;  #asm("nop")#asm("nop")#asm("nop") DIN = 0;}
    else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;}

if (R & 0x04) { DIN = 1;  #asm("nop")#asm("nop")#asm("nop") DIN = 0;}
    else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;}

if (R & 0x02) { DIN = 1;  #asm("nop")#asm("nop")#asm("nop") DIN = 0;}
    else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;}

if (R & 0x10) { DIN = 1;  #asm("nop")#asm("nop")#asm("nop") DIN = 0;}
    else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;}     

   
if (G & 0x80) { DIN = 1;  #asm("nop")#asm("nop")#asm("nop") DIN = 0;}
    else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;}

if (G & 0x40) { DIN = 1;  #asm("nop")#asm("nop")#asm("nop") DIN = 0;}
    else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;}

if (G & 0x20) { DIN = 1;  #asm("nop")#asm("nop")#asm("nop") DIN = 0;}
    else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;}

if (G & 0x10) { DIN = 1;  #asm("nop")#asm("nop")#asm("nop") DIN = 0;}
    else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;}

if (G & 0x08) { DIN = 1;  #asm("nop")#asm("nop")#asm("nop") DIN = 0;}
    else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;}

if (G & 0x04) { DIN = 1;  #asm("nop")#asm("nop")#asm("nop") DIN = 0;}
    else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;}

if (G & 0x02) { DIN = 1;  #asm("nop")#asm("nop")#asm("nop") DIN = 0;}
    else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;}

if (G & 0x10) { DIN = 1;  #asm("nop")#asm("nop")#asm("nop") DIN = 0;}
    else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;}
delay_us(60);
 
}

Да, глупо. Но по-другому никак не выходило. Надеюсь кто-то когда-то будет искать решение такой же проблемы в интернете и наткнется на этот мой пост, может карму почистит :)))
P.s. тут еще дисплейчики на SSD1326 появились (256х32), так что пропадаю не на долго :)))
P.s.s. Чип у меня работает на встроенном генераторе на 8 мГц.
Еще раз благодарю *Trigger*, WiseLord, ARV :beer:

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

Чт июн 28, 2018 22:38:12

Вы бы не просили, а то за такой код могут и начистить что-нибудь...
И нагреется МК, поплывет встроенный генератор, и ваши NOP-ы передадут вам привет.

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

Пт июн 29, 2018 04:01:10

Было бы интереснее, если бы в AVR был DMA. Тогда использовать SPI было бы вообще милое дело - заготовил массив данных для передачи, и МК бы сам всё отправил аппаратно, с точными интервалами, выполняя при этом параллельно другой полезный код.

P.S. Игрался с гирляндой на 50 светодиодов месяца три назад, делал на обычных задержках с замером осциллографом. Если код интересен, можно посмотреть на github, залил только что.

Основная идея следующая: заброс в ленту 24 * 50 битов (массив в 120 байтов) занимает около 3мс. Заброс делается автоматически по таймеру, один раз в 16мс, что даёт возможность обновлять ленту раз в 60 секунд в автоматическом режиме. В принципе, здесь можно было бы и SPI использовать, но обошёлся обычными задержками.

Получается, из 16мс между прерываниями таймера около 3мс (20% времени) МК занят собственно посылкой данных (столько бы отнимало это и при использовании SPI), а остальное время может делать прочую работу - огранизовывать эффекты. То есть, просто по заданным алгоритмам обновлять сам этот массив данных, уже не заботясь о том, как именно он будет выведен в ленту.

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

Пт июн 29, 2018 08:44:28

Вы бы не просили, а то за такой код могут и начистить что-нибудь...
И нагреется МК, поплывет встроенный генератор, и ваши NOP-ы передадут вам привет.

Я вообще фигею от этих пионеров. Не стыдно то самому такой код выкладывать?

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

Пт июн 29, 2018 15:55:18

ARV писал(а):Вы бы не просили, а то за такой код могут и начистить что-нибудь...
И нагреется МК, поплывет встроенный генератор, и ваши NOP-ы передадут вам привет.

Как только запаял - включил, все работает при любых положительных (образно любых).
OKF писал(а):
Вы бы не просили, а то за такой код могут и начистить что-нибудь...
И нагреется МК, поплывет встроенный генератор, и ваши NOP-ы передадут вам привет.

Я вообще фигею от этих пионеров. Не стыдно то самому такой код выкладывать?

Можешь что-то лучше предложить? Давай!

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

Пт июн 29, 2018 16:14:09

Сериг писал(а):Давай!
вы как тот юный пионер: в беседах с товарищами он крут "да я любую телку завалю!", а как только в ответ на вопрос "дай" получает "бери!" - тут же краснеет и не знает, куда бежать...
как говорила тетя Роза: дать-то я не против, да не берут...

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

Пт июн 29, 2018 16:21:35

Да это и не к вам претензия, ARV. В ваших способностях я с самого детства уверен. А вот когда человек влезает, чтобы понты покидать, что все туфта, а по факту сам ничего не может - мне это странно. Писал я сюда не чтобы с кем-то поссориться, а чтобы получить помощи. Оффтопить " да что за код, что за туфта и ТД" может каждый, а ты решение дай поставленной задаче более лучшее...

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

Пт июл 20, 2018 16:57:18

Всем привет.

У меня вопрос к корифеям программирования, решил спросить здесь.
Есть исходник, написанный на С, именно для CodeVision (это один из исходников зарядки для Ni-Cd, на ATtiny13 - вот ссылка-обсуждение - https://www.radiokot.ru:443/forum/viewtopic.php?t=7921).

На компе установлена версия CodeVisionAVR v3.12-new, скачан с рутрекера, стал вроде нормально, без проблем.
При попытке просто компилировать - все нормально, а вот если нажать кнопку "Build", или "Build All", то есть с получением выходного HEX-файла, выдается ошибка следующего содержания:

"Linker error: C:\cvavr\BIN\Untitled\charger3.c(109): function 'main' from file: C:\cvavr\BIN\Untitled\charger.c, line: 10 is redefined".
Ошибка указывает на строку "void main(void)".

Я уже голову сломал, чего же у меня не так настроено в этой программе.
Может кто-то уже сталкивался с таким (в прищепке - сам исходник)

С уважением, Евгений.
Вложения
charger4.c
(18.07 KiB) Скачиваний: 348

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

Пт июл 20, 2018 18:46:46

Redefinition of main
The code you posted does not explain the error message you presented. It has some issues, but none that should elicit any error. There are several possible reasons for the error, among them:

1. My best guess would be that you have another source file in the project that has its own main() function, and the IDE is configured to include both in the same target program. That might result simply by virtue of them being collocated in the same directory. That other source file might even be something dumb, such as a backup copy of the file you presented.
2. Alternatively, it may be that you have a project-local header named ctype.h, which defines a main() function, and Dev C++ is choosing that one instead of the standard library's header. (Yes, this is really just a variant on (1); there's not much leeway in "redefinition of 'int main()'".)
2. Or perhaps Dev C++ misspoke, and it's complaining about a redeclaration of main() rather than a redefinition. If its ctype.h header contained a conflicting declaration, such as int main(int argc, char *argv[]), then it might issue a complaint. In that unlikely case, you might be able to resolve the error by changing the declaration of your main() to the two-argument form.
Лучше ответить сложно.
И, как справедливо замечено в самом начале, для объективного анализа хорошо иметь весь проект.
Создав новый проект, вы, наверное, для верности решили добавить в проект и файл charger3.c.

В исходном варианте - без проблем.
Замечание о несопадении типов в данном случае можно игнорировать.
Вложения
123.ZIP
(75.68 KiB) Скачиваний: 184
Последний раз редактировалось elektro.kot Пт июл 20, 2018 19:04:03, всего редактировалось 2 раз(а).

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

Пт июл 20, 2018 18:56:11

Все, сделал.

Почистил каталоги от мусора, переустановил заново Кодевижн 3.12, создал проект заново - все начало компилироваться как надо в любых режимах.

Всем спасибо !!!

С уважением, Евгений.

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

Пт июл 20, 2018 19:43:17

Не пойму, зачем гадать, что не так, если компилятор прямым текстом говорит, что функция main встречается в коде не один раз?

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

Пт июл 20, 2018 19:50:01

Дык, прямой-то текст на непонятном-то языке, только гадать и осталось.

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

Пт июл 20, 2018 20:23:42

Не пойму, зачем гадать, что не так, если компилятор прямым текстом говорит, что функция main встречается в коде не один раз?
Говорить-то он говорит, вот только с исходником я ничего не делал, какой был - такой и остался.
В принципе, раз заработало - меня все устроило, а что там, да как, - это уже неважно.

Просто всегда считал, что если в режиме компиляции - проходит без ошибок, то и в остальных режимах - их тоже не должно быть вроде как.
Столкнулся с такой бякой впервые.

програма CodeVisionAVR

Пн авг 06, 2018 11:46:51

помогите новичку какую версию програмы CodeVisionAVR скачать и на каком сайте что бы работала
Ответить