Jump to content
Andrey_47

Указатели на отдельные выводы порта. Виртуальный порт

Recommended Posts

Хочу создать виртуальный порт для того, чтобы выводы из разных реальных портов можно было бы объединить в один виртуальный.

Решил для начала попробовать с помощью указателей создать переменную, и, чтобы с помощью этой переменной менять значение вывода одного из портов (PORTA0)

Вот как я это пытался делать:

#define F_CPU 8000000UL
#include <avr/io.h>

 int *a;

int main(void)
{
    DDRA |= (1<<0);
    a = &PA0;
    *a = 1;
       
    while (1) 
    {
    }
}


Разумеется ничего не компилируется, потому что вид записи типа  a = &PA0; является неправильным. 

Кто-нибудь знает как сделать правильный вид записи, чтобы с помощью переменной менять уровень одного из выводов порта???

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

 

Share this post


Link to post
Share on other sites

Задача абсолютно надуманная.

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

Но, с моей точки зрения, во всех случах это не стоит делать вообще: выгода сомнительная.

Указатель невозможно сделать на данные меньше байта размером.

Share this post


Link to post
Share on other sites

Высококачественные конденсаторы Panasonic для надежности вашей электроники!

Электролитические алюминиевые конденсаторы Panasonic отличаются повышенной надежностью, длительным сроком службы, низким импедансом и выдерживают большой ток пульсаций, в то время как семейства полимерных конденсаторов Panasonic SP-CAP, POSCAP, OS-CON и HYBRID характеризуют сверхнизкий ESR и увеличенная емкость, работа при высоких напряжениях и в расширенном температурном диапазоне. Приобретая продукцию Panasonic, вы гарантированно получаете самое передовое решение для ваших задач. Для облегчения вашего выбора, мы подготовили подборку полезных материалов.

Читать статьи

12.10.2019 в 20:18, Andrey_47 сказал:

Разумеется ничего не компилируется, потому что вид записи типа  a = &PA0; является неправильным. 

епстественно неправильный, потомушта PA0 это не переменная и не адрес , это тупая автозамена дефайном для препроцессора вида:

/* ***** PORTB ************************ */
/* PORTB - Data Register, Port B */
#define    PB0          0       // 
#define    PB1          1       // 
#define    PB2          2       // 
#define    PB3          3       // 
#define    PB4          4       // 

а рабочие регистры описываются через асм вставки в тех же командах препроцессора :

#pragma used+
sfrb PINB=0x16;
sfrb DDRB=0x17;
sfrb PORTB=0x18;
sfrb PINA=0x19;
sfrb DDRA=0x1a;
sfrb PORTA=0x1b;
#pragma used-

усе это живет в инклюдах. и вы можете обозвать любой регистр на свое усмотрение теме же командами. но компилятор кодевиженАВР и еже с ним не позволяют создавать/накладывать переменные/структуры/объединения по конкретному адресу RAM в отличии от компиляторов других МК

и полностью согласен с @ARV для работы виртуальный порт на не нать.

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...