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

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

Пн дек 16, 2019 15:14:26

Сериг, sizeof - это не функция (значение должно быть известно на этапе компиляции) и не магия. В функцию передаётся массив, размер которого неизвестен, sizeof просто чисто логически не может знать это число.

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

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

Пн дек 16, 2019 18:26:35

ARV, WiseLord, скажите, вы предлагаете сделать так, или до вызова функции просто считать?
Код:
 void small_image(unsigned char x,unsigned char y, flash unsigned char image [], num_bytes = sizeof(image) )
, где num_bytes глобальная переменная

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

Пн дек 16, 2019 19:01:08

я, конечно, не знаю, как там у вас конкретно сделано, но предполагаю, что как-то так:
Код:
flash char img[345] = {0x01, 0x02, 0x03 ... и т.д.}
так вот, 345 вы и должны передать в функцию, и для этого вам не нужна какая-то особая переменная:
Код:
small_image(10,10,img, 345); // можно так
small_image(20,20,img, sizeof(img)); // а можно и так

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

Пн дек 16, 2019 19:05:41

ARV, первый вариант точно отпадает, т.к. Массив у меня безразмерный (и не один), а посему я заведомо не знаю его размер. А вот второй вариант сейчас попробую, отпишусь.

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

Пн дек 16, 2019 19:10:21

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

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

Пн дек 16, 2019 19:22:43

ARV, размер в пикселях я знаю (х на у), но корректно посчитать перемножив эти данные - получается только в случае равносторонней картинки. На дисплей вывод происходит постранично (5х8 пикселей одно знакоместо (x на y)), из-за этого мне надо понимать, когда переносить курсор на следующую строку. Зная объем данных в байтах, я могу понимать, когда необходимо заканчивать вывод (ну это для вас совершенно очевидно). Из-за этого я и пытаюсь придумать велосипед...
P.s.
Код:
small_image(20,20,img, sizeof(img)); // а можно и так

Так работает, большое спасибо!

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

Чт дек 19, 2019 22:23:35

Вопросик,озадачился,реально ли сделать,что бы нажали кнопку и если допустим не нажали повторно через определенное время,например пять секунд,то выключился определенный пин или весь порт?Если да,то можно пример,я использую внешнее прерывание INT0 и INT1

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

Чт дек 19, 2019 22:25:36

Запустить таймер на 5 секунд, при срабатывании - выключиться. Если что-то нажато - таймер снова устанавливается в 5 секунд.

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

Чт дек 19, 2019 22:45:46

простите только deley освоил))))может примерчик?не ругайтесь только плз

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

Пт дек 20, 2019 06:49:13

Освойте таймеры, тогда и пример не понадобится. Информации в интернете полно.

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

Вт дек 24, 2019 22:31:42

Подскажите где можно скачать годную книжку по програмипованию avr си в пдф,а то ищу ищу и все не то,то лажа,то вирусы и тп

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

Вт дек 24, 2019 22:36:11

не уверен, что это "годная" книжка, но я старался... время течет, все меняется, кое-что с тех пор уже устарело... но, возможно, что-то будет и полезным: https://simple-devices.ru/articles/7-so ... avr-studio

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

Ср дек 25, 2019 07:07:04

Подскажите где можно скачать годную книжку по програмипованию avr си в пдф
Спроси у Яндекса "di halt avr. учебный курс", вторая ссылка отдает очень хорошую ПДФ-ку. Первая половина - программирование AVR на АСМе, вторая - на Си. ИМХО, это лучший учебник по АВР.

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

Ср дек 25, 2019 18:42:19

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

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

Чт дек 26, 2019 18:30:30

Нашел ребят книги,на этом же форуме

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

Вт фев 04, 2020 16:05:55

Я скачал последнюю эволюшн версию с офф сайта и при компиляции примерно на 200 байт меньше она сделала прошивку (около 4К размер) что я считаю довольно таки неплохо. Но нифига ее нигде нет. Не покупать же право слово.

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

Пт фев 07, 2020 13:34:55

Народ подскажите. Вот у меня имеется переменная:

x=0b 0010 1011

Мне нужно записать в регистры:

PORTB=(1<<7)|(1<<6) \\в регистр PORTB 7 и 6 бит переменной X биты 7 и 6 соответственно
PORTC=(1<<7)|(1<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<1) \\в переменную PORTC 7,5,4,3,2,1 бит переменной X 5,4,3,2,1,0 соответственно

итого должно выйти:

PORTB=(0<<7)|(0<<6)
PORTC=(1<<7)|(0<<5)|(1<<4)|(0<<3)|(1<<2)|(1<<1) \\должно быть так
Вложения
sem.JPG
(25.23 KiB) Скачиваний: 231
Последний раз редактировалось mixon46 Пт фев 07, 2020 13:48:02, всего редактировалось 1 раз.

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

Пт фев 07, 2020 13:52:15

PORTB=x&((1<<7)|(1<<6));
x<<=1; //переставим биты в х так, чтобы они стали соответствовать битам порта с
x&=~(1<<7);
x|=(x<<1)&(1<<7);
PORTC=x&((1<<7)|(<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<1);

Добавлено after 4 minutes 43 seconds:
так неиспользуемые биты портов (портб 0-5 и портс 0, 6) сбросятся в 0
если их состояние требуется сохранить, то присвоение нужно делать так:
PORTB=(x&((1<<7)|(1<<6)))|(PORTB&(~((1<<7)|(1<<6))));
с портом с - аналогично...

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

Пт фев 07, 2020 14:19:15

жесть. спасибо

Добавлено after 19 minutes 4 seconds:
x&=~(1<<7);

третья строчка. Тут переменная уже смещенная на бит влево.
я вижу эту строчку так.
Смещенная на 1 бит влево x:

x<<=1;

x был 00101011
x стал 01010110

затем
x&=(~1<<7); \\инверсия 7 бита? и побитовое И

x был 01010110
x (~1<<7) стал 11010110
x (&) стал 11010110
_____
в переменной x старшие биты 0b00101011
0 и 0 соответственно. а после
PORTB=x&((1<<7)|(1<<6));

получается 0b11000000. но должны быть нули как в переменной.

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

Пт фев 07, 2020 15:05:34

давай по порядку:
биты х - 87654321 (я специально так указал, потомучто 0 будетиобозначать 0)
портб<—87000000
портс<—60543210
в порт б отправить легко - просто ммаской отфильтруем 2 старших бита
теперь порт с:
сдвинем на 1 влево х<<=1;
х — 76543210
очистим 7 бит х&=~(1<<7);
х — 06543210
и перенесём один бит на нудное место
для этого его надо отфильтровать и сдвинуть на одну позицию влево
х
06543210
х'=х<<1
65432100
(х')&(1<<7)
60000000
теперь сложим с исходной х
66543210
6 бит нам не нужен, поэтому не важно что в нём лежит
отфильтруем по маске для портс
60543210
Ответить