Передавайте это значение как аргумент функции, а вот уже там, где эта функция вызывается - там для конкретного массива уже это число должно быть известно.
CodeVision AVR в вопросах и ответах
Сериг, sizeof - это не функция (значение должно быть известно на этапе компиляции) и не магия. В функцию передаётся массив, размер которого неизвестен, sizeof просто чисто логически не может знать это число.
Передавайте это значение как аргумент функции, а вот уже там, где эта функция вызывается - там для конкретного массива уже это число должно быть известно.
Передавайте это значение как аргумент функции, а вот уже там, где эта функция вызывается - там для конкретного массива уже это число должно быть известно.
- Реклама
ARV, WiseLord, скажите, вы предлагаете сделать так, или до вызова функции просто считать?
, где num_bytes глобальная переменная
Код: Выделить всё
void small_image(unsigned char x,unsigned char y, flash unsigned char image [], num_bytes = sizeof(image) )я, конечно, не знаю, как там у вас конкретно сделано, но предполагаю, что как-то так:так вот, 345 вы и должны передать в функцию, и для этого вам не нужна какая-то особая переменная:
Код: Выделить всё
flash char img[345] = {0x01, 0x02, 0x03 ... и т.д.}Код: Выделить всё
small_image(10,10,img, 345); // можно так
small_image(20,20,img, sizeof(img)); // а можно и такесли рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
ARV, первый вариант точно отпадает, т.к. Массив у меня безразмерный (и не один), а посему я заведомо не знаю его размер. А вот второй вариант сейчас попробую, отпишусь.
вообще говоря, если вы и в самом деле работаете с выводом картинок на дисплей, то я просто не представляю, как при этом вы обходитесь без знания "размеров картинки". ведь где-то там в массиве у вас явно должны храниться ширина и высота картинки в пикселах, а уж по ним можно вычислить и размер массива в байтах... так что даже и sizeof не понадобится.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Реклама
ARV, размер в пикселях я знаю (х на у), но корректно посчитать перемножив эти данные - получается только в случае равносторонней картинки. На дисплей вывод происходит постранично (5х8 пикселей одно знакоместо (x на y)), из-за этого мне надо понимать, когда переносить курсор на следующую строку. Зная объем данных в байтах, я могу понимать, когда необходимо заканчивать вывод (ну это для вас совершенно очевидно). Из-за этого я и пытаюсь придумать велосипед...
P.s.
Так работает, большое спасибо!
P.s.
Код: Выделить всё
small_image(20,20,img, sizeof(img)); // а можно и так- Сообщения: 64
- Зарегистрирован: Вт сен 10, 2019 16:18:33
Вопросик,озадачился,реально ли сделать,что бы нажали кнопку и если допустим не нажали повторно через определенное время,например пять секунд,то выключился определенный пин или весь порт?Если да,то можно пример,я использую внешнее прерывание INT0 и INT1
Запустить таймер на 5 секунд, при срабатывании - выключиться. Если что-то нажато - таймер снова устанавливается в 5 секунд.
- Сообщения: 64
- Зарегистрирован: Вт сен 10, 2019 16:18:33
простите только deley освоил))))может примерчик?не ругайтесь только плз
Освойте таймеры, тогда и пример не понадобится. Информации в интернете полно.
- Сообщения: 64
- Зарегистрирован: Вт сен 10, 2019 16:18:33
Подскажите где можно скачать годную книжку по програмипованию avr си в пдф,а то ищу ищу и все не то,то лажа,то вирусы и тп
не уверен, что это "годная" книжка, но я старался... время течет, все меняется, кое-что с тех пор уже устарело... но, возможно, что-то будет и полезным: https://simple-devices.ru/articles/7-so ... avr-studio
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
[uquote="shrus43",url="/forum/viewtopic.php?p=3762327#p3762327"]Подскажите где можно скачать годную книжку по програмипованию avr си в пдф[/uquote]Спроси у Яндекса "di halt avr. учебный курс", вторая ссылка отдает очень хорошую ПДФ-ку. Первая половина - программирование AVR на АСМе, вторая - на Си. ИМХО, это лучший учебник по АВР.
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
- Сообщения: 64
- Зарегистрирован: Вт сен 10, 2019 16:18:33
Спасибо вроде норм,а еще что-нибудь посоветуйте именно AVR на СИ,просто там на асме много листов,а я хотел напечатать на работе почитать,так как дома нет времени,я бегло пробежался по той книге,просто там вся тема снизу,иногда цепляет вверх по некоторым моментам и частично часть СИ неоч.будет печатать,кстати вопрос дурацкий возник,а если в перемешку на асме и си написать программу,прокатит?)))
- Сообщения: 64
- Зарегистрирован: Вт сен 10, 2019 16:18:33
- Сообщения: 349
- Зарегистрирован: Сб окт 20, 2007 14:12:03
Я скачал последнюю эволюшн версию с офф сайта и при компиляции примерно на 200 байт меньше она сделала прошивку (около 4К размер) что я считаю довольно таки неплохо. Но нифига ее нигде нет. Не покупать же право слово.
Народ подскажите. Вот у меня имеется переменная:
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) \\должно быть так
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 КБ) 259 скачиваний
Последний раз редактировалось mixon46 Пт фев 07, 2020 13:48:02, всего редактировалось 1 раз.
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))));
с портом с - аналогично...
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))));
с портом с - аналогично...
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
жесть. спасибо
Добавлено after 19 minutes 4 seconds:
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3786689#p3786689"]x&=~(1<<7);[/uquote]
третья строчка. Тут переменная уже смещенная на бит влево.
я вижу эту строчку так.
Смещенная на 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. но должны быть нули как в переменной.
Добавлено after 19 minutes 4 seconds:
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3786689#p3786689"]x&=~(1<<7);[/uquote]
третья строчка. Тут переменная уже смещенная на бит влево.
я вижу эту строчку так.
Смещенная на 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. но должны быть нули как в переменной.
давай по порядку:
биты х - 87654321 (я специально так указал, потомучто 0 будетиобозначать 0)
портб<—87000000
портс<—60543210
в порт б отправить легко - просто ммаской отфильтруем 2 старших бита
теперь порт с:
сдвинем на 1 влево х<<=1;
х — 76543210
очистим 7 бит х&=~(1<<7);
х — 06543210
и перенесём один бит на нудное место
для этого его надо отфильтровать и сдвинуть на одну позицию влево
х
06543210
х'=х<<1
65432100
(х')&(1<<7)
60000000
теперь сложим с исходной х
66543210
6 бит нам не нужен, поэтому не важно что в нём лежит
отфильтруем по маске для портс
60543210
биты х - 87654321 (я специально так указал, потомучто 0 будетиобозначать 0)
портб<—87000000
портс<—60543210
в порт б отправить легко - просто ммаской отфильтруем 2 старших бита
теперь порт с:
сдвинем на 1 влево х<<=1;
х — 76543210
очистим 7 бит х&=~(1<<7);
х — 06543210
и перенесём один бит на нудное место
для этого его надо отфильтровать и сдвинуть на одну позицию влево
х
06543210
х'=х<<1
65432100
(х')&(1<<7)
60000000
теперь сложим с исходной х
66543210
6 бит нам не нужен, поэтому не важно что в нём лежит
отфильтруем по маске для портс
60543210
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...


