Запись в PORTA и PORTB
- Войдите на сайт для отправки комментариев
Сб, 27/05/2017 - 12:57
Добрый день, хочу вывести без использования digitalwrite() бегующую по 16 пинам PORTA + PORTB единицу
1. Как определить номера выводов, соответствующие пинам PORTA PORTB для функции pinmode() ?
2. Компилятор указывет на ошибку с value.w16.LowByte и value.w16.HigByte насмотря на создание экземпляра UNION16 value; в чем я ошибся?
3. У Atmega328 и Atmega2560 PORTA и PORTB устроены одинаково?
typedef struct { uint8_t LowByte; uint8_t HigByte;} STRUCT16; typedef union { STRUCT16 w16; uint16_t a;} UNION16; UNION16 value; void setup(void) { //uint8_t i,HEGZ=??, HEGZ2=??; Х.Е.Г.З. (хрен его знает) //for(i=HEGZ?; i<HEGZ+8; i++) pinMode(HEGZ,OUTPUT); // PORTA, какие № PIN указать? //for(i=HEGZ2; i<HEGZ2+8; i++) pinMode(HEGZ2,OUTPUT); // PORTB, какие № PIN указать? } void loop(void) { // цикл на 16 проходов, перемещаем 1 из младшего разряда в старший for(value.a=1; value.a >0; value.a << 1) {PORTA=value.w16.LowByte; PORTB=value.w16.Higbyte;delay(500);} delay(500); // включить 16 LED на 1 сек value.w16=oxFFFF; PORTA=value.w16.LowByte; PORTB=value.w16.Higbyte;delay(1000); // выключить 16 LED value.w16=0; PORTA=value.a.LowByte; PORTB=value.a.LowByte; delay(1000); }
Вы забыли указать на каком именно контроллере Вы это собрались делать.
3. У Atmega328 и Atmega2560 PORTA и PORTB устроены одинаково?
У 328 нет никакого порта А, а на порте B сидит много чего, в том числе SPI и кварц. Так что, чтобы использовать порт B полностью, придётся кварц отключать и тактировать от чего-то другого.
у 2560 на порте B сидит, например SPI.
А вообще. прежде чем строить такие планы, посмотрели бы даташиты.
И в чем я накосячил со struct и union? Объявил экземпляр типа UNION16, а компилятор не видит нужную переменную value.w16.LowByte
Читаю
Ну, если бы читали, то не спрашивали бы
3. У Atmega328 и Atmega2560 PORTA и PORTB устроены одинаково?
т.к. у 328 просто нет порта А.
в какие порты писать данные, помогите пожалуйста.
Писать-то можно в любые, если понимаешь, что делаешь. Просто реально посмотрите даташит. Если посмотрите. то узнаете, что у 328 есть три порта B, C и D.
На B живёт кварц - если Вы готовы от него отказаться и использовать его пины как GPIO - нет проблем.
Порт С неполный - у него только 7 битов (0-6, а седьмого нет). И на этом порте (бит 6) сидит Reset. если Вы готовы отказаться от Reset (и знаете как в этом случае заливать прошивки), то в путь.
На порте D сидит UART через который Вы заливаете скетчи. Если Вы готовы от этого отказаться и заливать через SPI - вперёд.
Всё о чём я писал написано в даташите, причём в самом начале. Так что с 2560 разберётесь сами.
И в чем я накосячил со struct и union? Объявил экземпляр типа UNION16, а компилятор не видит нужную переменную value.w16.LowByte
Да, всё он находит. Если Вы в 7-ой строке напишете void, а не voif, в 6-ой строке напишете 0x, а не ox, и в той же шестой будете присваивать не структуре, а специально для этого заведённому элементу a, то будет Вам счастье в полном объёме.
Спасибо, со структурами и union разобрался
На B живёт кварц - если Вы готовы от него отказаться и использовать его пины как GPIO - нет проблем.
Порт С неполный - у него только 7 битов (0-6, а седьмого нет). И на этом порте (бит 6) сидит Reset. если Вы готовы отказаться от Reset (и знаете как в этом случае заливать прошивки), то в путь.
На порте D сидит UART через который Вы заливаете скетчи. Если Вы готовы от этого отказаться и заливать через SPI - вперёд.
PORTD - я предполагал, что при загрузке программы подается RESET и bootloader-у все равно выводится программой информация на ножки RX TX или не выводится. Это на самом деле не так?
Получается, что для Atmega328 задача поставлена мной некорректно и у него нет хотя бы одного 8-битного регистра, в которой можно без сложностей записать байт и таким образом манипулировать 8-выходами ?
прочел здесь, что запись в выводы RX TXне рекомендована http://arduino.ru/Tutorial/Upravlenie_portami_cherez_registry
те действительно можно по незнанию устроить капкан: если программа пишет в эти выводы, то другую программу черз bootloader загрузить уже не удастся?
А у 2560 принципиально есть такие регистры, в которые можно записать 8 бит для управления выводами и не иметь проблем и капканов как в случае UART c Atmega328?
Получается, что для Atmega328 задача поставлена мной некорректно и у него нет хотя бы одного 8-битного регистра, в которой можно без сложностей записать байт и таким образом манипулировать 8-выходами ?
Ну, почему?
Если у Вас есть копеечный программатор типа USBASP за 100 рублей, то Вы можете прошивать через SPI. Тогда, если самой программе USART не нужен, то какие проблемы? Можете использовать пины 0 и 1 как Вам заблагорассудится.
Опять же кварц. Вам обязательно иметь 16 МГц? Сконфигурируйте на "внутренни 8МГц" и кврацевые пины свободны, можно использовать
Да и Reset ... если у Вас есть некопеечный (к сожалению) программатор типа STK-500, то прошивать можно и без Reset, а пин использовать.
если программа пишет в эти выводы, то другую программу черз bootloader загрузить уже не удастся?
Там много на что можно налететь. Я как-то спалил CH340.
А у 2560 принципиально есть такие регистры, в которые можно записать 8 бит для управления выводами и не иметь проблем и капканов как в случае UART c Atmega328?
Ну, прочитайте ж даташит, наконец :) Там реально всё написано, что на каком пине.
Есть, конечно, при условии, что пины этого порта Вам не нужны для чего-нибудь другого.
По принципиальной схеме UNO, XTAIL1 и XTAIL2 не выведены наружу, как же их использовать без перепайки печатной платы?
Ну, не знаю. Вопрос ведь в том, насколько Вам это нужно. Если нужно, то можно и вывести.
описание контроллера 2560 http://www.atmel.com/Images/doc2549.pdf не открывается онлайн
Вы, кажется, говорили, что уже "читаете" :). Возьмите здесь.
1. Как определить номера выводов, соответствующие пинам PORTA PORTB для функции pinmode() ?
Не используйте функцию pinMode(), раз уж собрались работать с портами напрямую. Вместо этого есть регистры DDRA, DDRB и т.д. http://arduino.ru/forum/programmirovanie/simmetrichnyi-multivibrator-na-arduino#comment-281857
Но если сильно хочется, пишете в гугле запрос arduino uno pinout или arduino mega2560 pinout и переключаетесь на картинки. Там будет приведена ардуиновская нумерация пинов и нумерация пинов МК по даташиту.
По принципиальной схеме UNO, XTAIL1 и XTAIL2 не выведены наружу, как же их использовать без перепайки печатной платы?
Вы определитесь, что именно Вы собираетесь использовать, Arduino или AVR.
Если Ардуино - используются только те пины, что выведены наружу. Для управления пинами используется digitalWrite и digitalRead.
Если AVR - сами разводите, травите и распаиваете плату с теми выводами, которые Вам нужны. Ну и обращаетесь к пинам через порты. Ну и само-собой информацию черпаете из дэйташита, а не с форума или литераьтуры по Ардуино.
Если нужен полный порт, без заморочек, берешь 6 рублей, и оппа!, у тебя есть 74нс595. 3 входа - 8 выходов. Небыстро, зато биты подряд. Можно, кста, их (595-е регистры) и последовательно подключать.
Если нужен полный порт, без заморочек, берешь 6 рублей, и оппа!, у тебя есть 74нс595. 3 входа - 8 выходов.
И вместо 1 такта тратишь на запись в порт 3000 (прописью: три тысячи) тактов.
зато единица бегать будет без заморочек. ТС не указал, с какой частотой она должна бегать. И потом, кто мешает писать в порты напрямую? Он же сказал, хочет без digitelWrite() делать, вот пусть и делает.