Запись в PORTA и PORTB

simmetric
Offline
Зарегистрирован: 27.05.2017

Добрый день, хочу вывести без использования 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);
            
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вы забыли указать на каком именно контроллере Вы это собрались делать.

simmetric пишет:

3. У Atmega328 и Atmega2560  PORTA и PORTB устроены одинаково?

У 328 нет никакого порта А, а на порте B сидит много чего, в том числе SPI и кварц. Так что, чтобы использовать порт B полностью, придётся кварц отключать и тактировать от чего-то другого.

у 2560 на порте B сидит, например SPI.

А вообще. прежде чем строить такие планы, посмотрели бы даташиты.

simmetric
Offline
Зарегистрирован: 27.05.2017

ЕвгенийП пишет:
Вы забыли указать на каком именно контроллере Вы это собрались делать.
Atmega328P или Atmega2560

ЕвгенийП пишет:
у 2560 на порте B сидит, например SPI.
готов пожертвовать SPI

ЕвгенийП пишет:
А вообще. прежде чем строить такие планы, посмотрели бы даташиты.
Читаю, но пока нет понимания как сделать тк описание сложное. Переформулирую вопрос - в какие порты писать данные, помогите пожалуйста.

И в  чем  я накосячил со struct и union? Объявил экземпляр типа UNION16, а компилятор не видит нужную  переменную value.w16.LowByte




  typedef struct { uint8_t  LowByte;  uint8_t  HigByte;} STRUCT16;
  typedef union { STRUCT16 w16;  uint16_t  a;} UNION16;
  UNION16 value;
  uint8_t b;

void setup(){ value.w16=oxFFFF; b=value.w16.LowByte;}
voif loop(){}
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

simmetric пишет:

Читаю

Ну, если бы читали, то не спрашивали бы

simmetric пишет:

3. У Atmega328 и Atmega2560  PORTA и PORTB устроены одинаково?

т.к. у 328 просто нет порта А.

simmetric пишет:

в какие порты писать данные, помогите пожалуйста.

Писать-то можно в любые, если понимаешь, что делаешь. Просто реально посмотрите даташит. Если посмотрите. то узнаете, что у 328 есть три порта B, C и D.

На B живёт кварц - если Вы готовы от него отказаться и использовать его пины как GPIO - нет проблем.

Порт С неполный - у него только 7 битов (0-6, а седьмого нет). И на этом порте (бит 6) сидит Reset. если Вы готовы отказаться от Reset (и знаете как в этом случае заливать прошивки), то в путь.

На порте D сидит UART через который Вы заливаете скетчи. Если Вы готовы от этого отказаться и заливать через SPI - вперёд.

Всё о чём я писал написано в даташите, причём в самом начале. Так что с 2560 разберётесь сами. 

simmetric пишет:

И в  чем  я накосячил со struct и union? Объявил экземпляр типа UNION16, а компилятор не видит нужную  переменную value.w16.LowByte


  typedef struct { uint8_t  LowByte;  uint8_t  HigByte;} STRUCT16;
  typedef union { STRUCT16 w16;  uint16_t  a;} UNION16;
  UNION16 value;
  uint8_t b;

void setup(){ value.w16=oxFFFF; b=value.w16.LowByte;}
voif loop(){}

Да, всё он находит. Если Вы в 7-ой строке напишете void, а не voif, в 6-ой строке напишете 0x, а не ox, и в той же шестой будете присваивать не структуре, а специально для этого заведённому элементу a, то будет Вам счастье в полном объёме.

simmetric
Offline
Зарегистрирован: 27.05.2017

ЕвгенийП пишет:
Да, всё он находит. Если Вы в 7-ой строке напишете void, а не voif, в 6-ой строке напишете 0x, а не ox, и в той же шестой будете присваивать не структуре, а специально для этого заведённому элементу a, то будет Вам счастье в полном объёме.

Спасибо, со структурами и union разобрался

typedef struct { uint8_t  LowByte;  uint8_t  HigByte;} STRUCT16;
  typedef union { STRUCT16 w16;  uint16_t  a;} UNION16;
  UNION16 value;
   byte any_port1,any_port2; // PORTA PORTB
   
  void setup(void)
  { 
    byte j, i;
    //for(i=0; i<8; i++) pinMode(???,OUTPUT); // PORTA, какие № PIN указать для него?  
    //for(j=0; j<8; j++) pinMode(???,OUTPUT); // PORTB, какие № PIN указать для него?
  }
  
   
  void loop(void)
  {
    // цикл на 16 проходов, поочередно перемещаем  1 из младшего разряда в старший 
    for(value.a=1; value.a >0; value.a << 1) 
  
        { any_port1=value.w16.LowByte;  
          any_port2=value.w16.HigByte;
          delay(500);
        }
   
   // включить 16 LED на 1 сек
   value.a=0xFFFF;
   any_port1= value.w16.LowByte;
   any_port2=value.w16.HigByte;
   delay(1000);
   
   // выключить 16 LED на 1 сек
   value.a=0x0000; 
   any_port1= value.w16.LowByte;
   any_port2=value.w16.HigByte;
   delay(1000);
            
}

 

simmetric
Offline
Зарегистрирован: 27.05.2017

ЕвгенийП пишет:
Писать-то можно в любые, если понимаешь, что делаешь. Просто реально посмотрите даташит. Если посмотрите. то узнаете, что у 328 есть три порта B, C и D.

На B живёт кварц - если Вы готовы от него отказаться и использовать его пины как GPIO - нет проблем.

Порт С неполный - у него только 7 битов (0-6, а седьмого нет). И на этом порте (бит 6) сидит Reset. если Вы готовы отказаться от Reset (и знаете как в этом случае заливать прошивки), то в путь.

На порте D сидит UART через который Вы заливаете скетчи. Если Вы готовы от этого отказаться и заливать через SPI - вперёд.

PORTD -  я предполагал, что при загрузке программы подается RESET и bootloader-у все равно выводится программой информация на ножки RX TX или не выводится.  Это на самом деле не так?

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

 

simmetric
Offline
Зарегистрирован: 27.05.2017

прочел здесь, что запись в выводы RX TXне рекомендована  http://arduino.ru/Tutorial/Upravlenie_portami_cherez_registry

те действительно можно по незнанию устроить капкан: если программа пишет в эти выводы, то другую программу черз bootloader загрузить уже не удастся?

simmetric
Offline
Зарегистрирован: 27.05.2017

ЕвгенийП пишет:
Всё о чём я писал написано в даташите, причём в самом начале. Так что с 2560 разберётесь сами.

А у 2560 принципиально есть такие регистры, в которые можно записать 8 бит для управления выводами и не иметь проблем и капканов как в случае UART c Atmega328?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

simmetric пишет:

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

Ну, почему?

Если у Вас есть копеечный программатор типа USBASP за 100 рублей, то Вы можете прошивать через SPI. Тогда, если самой программе USART не нужен, то какие проблемы? Можете использовать пины 0 и 1 как Вам заблагорассудится.

Опять же кварц. Вам обязательно иметь 16 МГц? Сконфигурируйте на "внутренни 8МГц" и кврацевые пины свободны, можно использовать

Да и Reset ... если у Вас есть некопеечный (к сожалению) программатор типа STK-500, то прошивать можно и без Reset, а пин использовать.

simmetric пишет:

если программа пишет в эти выводы, то другую программу черз bootloader загрузить уже не удастся?

Там много на что можно налететь. Я как-то спалил CH340.

simmetric пишет:

А у 2560 принципиально есть такие регистры, в которые можно записать 8 бит для управления выводами и не иметь проблем и капканов как в случае UART c Atmega328?

Ну, прочитайте ж даташит, наконец :) Там реально всё написано, что на каком пине.

simmetric
Offline
Зарегистрирован: 27.05.2017

ЕвгенийП пишет:
Ну, прочитайте ж даташит, наконец :) Там реально всё написано, что на каком пине.
Я прочту 2560 обязательно сегодня, но полную картиру в отличие от Вас еще не вижу и не сразу смогу составить ее и сопоставить информацию. Можете сказать общее да или нет - есть у 2560 возможность записать в 1 регистр  бит и управлять 8 выводами не создавая больших проблем ?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Есть, конечно, при условии, что пины этого порта Вам не нужны для чего-нибудь другого.

simmetric
Offline
Зарегистрирован: 27.05.2017

ЕвгенийП пишет:
Опять же кварц. Вам обязательно иметь 16 МГц? Сконфигурируйте на "внутренни 8МГц" и кврацевые пины свободны, можно использовать
По принципиальной схеме UNO,  XTAIL1 и XTAIL2 не выведены наружу, как же их использовать без перепайки печатной платы? 

simmetric
Offline
Зарегистрирован: 27.05.2017

ЕвгенийП пишет:
Есть, конечно, при условии, что пины этого порта Вам не нужны для чего-нибудь другого
описание контроллера 2560 http://www.atmel.com/Images/doc2549.pdf не открывается  онлайн (The requested page cannot be found in this server. The page you have requested might have moved or has been archived. Please use our Product Finder or site search to locate your document or page.),  а при открытии локально  сохраненного пишет поврежден pdf

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

simmetric пишет:

По принципиальной схеме UNO,  XTAIL1 и XTAIL2 не выведены наружу, как же их использовать без перепайки печатной платы? 

Ну, не знаю. Вопрос ведь в том, насколько Вам это нужно. Если нужно, то можно и вывести.

simmetric пишет:

описание контроллера 2560 http://www.atmel.com/Images/doc2549.pdf не открывается  онлайн 

Вы, кажется, говорили, что уже "читаете" :). Возьмите здесь.

simmetric
Offline
Зарегистрирован: 27.05.2017

ЕвгенийП пишет:
Вы, кажется, говорили, что уже "читаете" :). 
Неоднозначно выразился, читаю 328P и он тоже немаленький
ЕвгенийП пишет:
Возьмите здесь.
Спасибо

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

simmetric пишет:

1. Как определить номера выводов, соответствующие пинам PORTA PORTB для функции pinmode() ?

Не используйте функцию pinMode(), раз уж собрались работать с портами напрямую. Вместо этого есть регистры DDRA, DDRB и т.д. http://arduino.ru/forum/programmirovanie/simmetrichnyi-multivibrator-na-arduino#comment-281857

Но если сильно хочется, пишете в гугле запрос arduino uno pinout или arduino mega2560 pinout и переключаетесь на картинки. Там будет приведена ардуиновская нумерация пинов и нумерация пинов МК по даташиту.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

simmetric пишет:

По принципиальной схеме UNO,  XTAIL1 и XTAIL2 не выведены наружу, как же их использовать без перепайки печатной платы? 

Вы определитесь, что именно Вы собираетесь использовать, Arduino или AVR.

Если Ардуино - используются только те пины, что выведены наружу. Для управления пинами используется digitalWrite и digitalRead.

Если AVR - сами разводите, травите и распаиваете плату с теми выводами, которые Вам нужны. Ну и обращаетесь к пинам через порты. Ну и само-собой информацию черпаете из дэйташита, а не с форума или литераьтуры по Ардуино.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Если нужен полный порт, без заморочек, берешь 6 рублей, и оппа!,  у тебя есть 74нс595. 3 входа - 8 выходов. Небыстро, зато биты подряд. Можно, кста, их (595-е регистры) и последовательно подключать. 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

DetSimen пишет:

Если нужен полный порт, без заморочек, берешь 6 рублей, и оппа!,  у тебя есть 74нс595. 3 входа - 8 выходов.

И вместо 1 такта тратишь на запись в порт 3000 (прописью: три тысячи) тактов.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

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