Обсуждаем контроллеры компании Atmel.
Пн дек 16, 2019 15:14:26
Сериг, sizeof - это не функция (значение должно быть известно на этапе компиляции) и не магия. В функцию передаётся массив, размер которого неизвестен, sizeof просто чисто логически не может знать это число.
Передавайте это значение как аргумент функции, а вот уже там, где эта функция вызывается - там для конкретного массива уже это число должно быть известно.
Пн дек 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 глобальная переменная
Пн дек 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)); // а можно и так
Пн дек 16, 2019 19:05:41
ARV, первый вариант точно отпадает, т.к. Массив у меня безразмерный (и не один), а посему я заведомо не знаю его размер. А вот второй вариант сейчас попробую, отпишусь.
Пн дек 16, 2019 19:10:21
вообще говоря, если вы и в самом деле работаете с выводом картинок на дисплей, то я просто не представляю, как при этом вы обходитесь без знания "размеров картинки". ведь где-то там в массиве у вас явно должны храниться ширина и высота картинки в пикселах, а уж по ним можно вычислить и размер массива в байтах... так что даже и sizeof не понадобится.
Пн дек 16, 2019 19:22:43
ARV, размер в пикселях я знаю (х на у), но корректно посчитать перемножив эти данные - получается только в случае равносторонней картинки. На дисплей вывод происходит постранично (5х8 пикселей одно знакоместо (x на y)), из-за этого мне надо понимать, когда переносить курсор на следующую строку. Зная объем данных в байтах, я могу понимать, когда необходимо заканчивать вывод (ну это для вас совершенно очевидно). Из-за этого я и пытаюсь придумать велосипед...
P.s.
- Код:
small_image(20,20,img, sizeof(img)); // а можно и так
Так работает, большое спасибо!
Чт дек 19, 2019 22:23:35
Вопросик,озадачился,реально ли сделать,что бы нажали кнопку и если допустим не нажали повторно через определенное время,например пять секунд,то выключился определенный пин или весь порт?Если да,то можно пример,я использую внешнее прерывание INT0 и INT1
Чт дек 19, 2019 22:25:36
Запустить таймер на 5 секунд, при срабатывании - выключиться. Если что-то нажато - таймер снова устанавливается в 5 секунд.
Чт дек 19, 2019 22:45:46
простите только deley освоил))))может примерчик?не ругайтесь только плз
Пт дек 20, 2019 06:49:13
Освойте таймеры, тогда и пример не понадобится. Информации в интернете полно.
Вт дек 24, 2019 22:31:42
Подскажите где можно скачать годную книжку по програмипованию avr си в пдф,а то ищу ищу и все не то,то лажа,то вирусы и тп
Вт дек 24, 2019 22:36:11
не уверен, что это "годная" книжка, но я старался... время течет, все меняется, кое-что с тех пор уже устарело... но, возможно, что-то будет и полезным:
https://simple-devices.ru/articles/7-so ... avr-studio
Ср дек 25, 2019 07:07:04
Подскажите где можно скачать годную книжку по програмипованию avr си в пдф
Спроси у Яндекса "di halt avr. учебный курс", вторая ссылка отдает очень хорошую ПДФ-ку. Первая половина - программирование AVR на АСМе, вторая - на Си. ИМХО, это лучший учебник по АВР.
Ср дек 25, 2019 18:42:19
Спасибо вроде норм,а еще что-нибудь посоветуйте именно AVR на СИ,просто там на асме много листов,а я хотел напечатать на работе почитать,так как дома нет времени,я бегло пробежался по той книге,просто там вся тема снизу,иногда цепляет вверх по некоторым моментам и частично часть СИ неоч.будет печатать,кстати вопрос дурацкий возник,а если в перемешку на асме и си написать программу,прокатит?)))
Чт дек 26, 2019 18:30:30
Нашел ребят книги,на этом же форуме
Вт фев 04, 2020 16:05:55
Я скачал последнюю эволюшн версию с офф сайта и при компиляции примерно на 200 байт меньше она сделала прошивку (около 4К размер) что я считаю довольно таки неплохо. Но нифига ее нигде нет. Не покупать же право слово.
Пт фев 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) Скачиваний: 235
Последний раз редактировалось
mixon46 Пт фев 07, 2020 13:48:02, всего редактировалось 1 раз.
Пт фев 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))));
с портом с - аналогично...
Пт фев 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. но должны быть нули как в переменной.
Пт фев 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
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.