Мелкие вопросы по МК и ПЛИС.

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1941
Зарегистрирован: Пт фев 27, 2015 20:57:08
Откуда: Курск

Сообщение Олегыч1 »

ARV, Прошу прощения. :oops: Последние вопросы к данному разделу действительно не относятся...

Добавлено after 9 minutes 28 seconds:
Увлекся...
Кстати, действительно помехи могут мешать. Не подумал... На собственном опыте убедился. приемник радиолюстры вдруг начал переставать принимать сигнал от пульта после первой успешной команды от пульта (включение первой половины люстры). Оказалось косяк шел от 12 вольтовых светодиодных лампочек (аналог галогенных). Внутри каждой лампочки был ШИМ и дроссель помимо прочих компонентов. И видимо его частота как-то конфликтовала с несущей частотой от пульта. Проблему решить увы так и не удалось, кроме как поставить назад галогенки.
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 104
Зарегистрирован: Пн ноя 04, 2019 09:58:29
Откуда: г. Нижний Тагил Свердл. обл.

Сообщение Эйлер Леонард »

Добрый вечер. У меня не большой вопросик.
Вот классический код начинающего микроконтроллерщика
Спойлер// ATtiny85 test
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>

int main(void){

PORTB |= (1 << PB2);
DDRB |= ( 1 << PB2 );// output

while(1){
PORTB |= (1<<PB2);
_delay_ms(500);
PORTB &= ~(1<<PB2);
_delay_ms(500);
}

}

/*
0x18 PORTB – – PORTB5 PORTB4 PORTB3 PORTB2 PORTB1 PORTB0
0x17 DDRB – – DDB5 DDB4 DDB3 DDB2 DDB1 DDB0
0x16 PINB – – PINB5 PINB4 PINB3 PINB2 PINB1 PINB0
*/
Необходимо переписать тот же код без использования имен регистров, используя исключительно их адреса (0x18, 0x17, 0x16) согласно ДШ.
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

а слабО проследить по цепочке инклюдников, начиная с avr/io.h, как там все эти PORTB и прочее описаны? вряд ли что-то иное придумать выйдет...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 104
Зарегистрирован: Пн ноя 04, 2019 09:58:29
Откуда: г. Нижний Тагил Свердл. обл.

Сообщение Эйлер Леонард »

Нет. Чем сейчас я и занимаюсь. Разбираю по запчастям вот это. Очень интересные файлики Board.h GPIO.h. Скачал, установил. Немного подкорректировал, что бы отвязаться от Ардуины. Перевожу комментарии. Устал просто.

Добавлено after 4 minutes 48 seconds:
Особенно записывать биты столбиком на листочке и смотреть, что получится после << >> | & :))

Добавлено after 4 hours 32 minutes 2 seconds:
Решено. Выпотрошил из файла GPIO.h. всё то без чего класс может работать. Пусть не по фэн-шую. Зато теперь всё понятно и работает. А теперь меня заинтересовала идея напр. реализовать таким методом аппаратный SPI интерфейс (да мало ли чего).
Спойлер/* ATiny85
регистр специального назначения
регистры SFR
*/
#define F_CPU 8000000UL //
#include <avr/io.h>
#include <util/delay.h>

#define GPIO_PIN(port,pin) (((port) << 4) | (pin))
#define GPIO_REG(pin) ((pin) >> 4)
#define GPIO_MASK(pin) _BV((pin) & 0xF)

class BOARD {
public: enum pin_t {
D0 = GPIO_PIN(0x36,0), // PINB:0
D1 = GPIO_PIN(0x36,1), // PINB:1
D2 = GPIO_PIN(0x36,2), // PINB:2
D3 = GPIO_PIN(0x36,3), // PINB:3
D4 = GPIO_PIN(0x36,4), // PINB:4
D5 = GPIO_PIN(0x36,5), // PINB:5
};
};

template<BOARD::pin_t PIN>
class GPIO {
public:

GPIO<PIN>& input() {
SFR()->ddr &= ~MASK;
return (*this);
}

void output(){ SFR()->ddr |= MASK;}

void low(){ SFR()->port &= ~MASK; }

void high(){ SFR()->port |= MASK; }

void write(int value){
if(value){ high(); } else { low(); }
}

bool read(){ return ((SFR()->pin & MASK) != 0); }

void operator=(int value) {
write(value);
}

protected:
struct gpio_reg_t {
volatile uint8_t pin; //!< Port Input Pins.
volatile uint8_t ddr; //!< Data Direction Register.
volatile uint8_t port; //!< Data Register.
};

gpio_reg_t* SFR(){ return ((gpio_reg_t*) GPIO_REG(PIN)); }

static const uint8_t MASK = GPIO_MASK(PIN);
};


GPIO<BOARD::D3> led;

int main(void){

led.output();// пин на выход

while (1) {// мигание светодиодом

led = 1; // зажечь
_delay_ms(500);
led = 0; // погасить
_delay_ms(500);

}
}
Реклама
Эиком - электронные компоненты и радиодетали
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Эйлер Леонард",url="/forum/viewtopic.php?p=4142042#p4142042"]Пусть не по фэн-шую.[/uquote]
С появлением constexpr перечисления для констант не используют:

Код: Выделить всё

struct BOARD 
{
    static constexpr auto D0 = GPIO_PIN(0x36,0);
.....
};
И макросы тут лучше заменить constexpr/consteval функциями.
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 104
Зарегистрирован: Пн ноя 04, 2019 09:58:29
Откуда: г. Нижний Тагил Свердл. обл.

Сообщение Эйлер Леонард »

Если внутри main() доступ к полям структуры такой: uint8_t MASK2 = GPIO_MASK(BOARDn::D3); Но вот как структуру сделать параметром шаблона с возможностью доступа к полям, пока затрудняюсь. Голый(не class) enum pin_t в шаблоне такой <pin_t PIN> :dont_know:

Добавлено after 2 minutes 3 seconds:
Код:
Спойлер/* ATiny85 -std=c++11
регистр специального назначения SFR
*/

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

#define GPIO_PIN(port, pin) ( ((port) << 4) | (pin) )
#define GPIO_REG(pin) ((pin ) >> 4)
#define GPIO_MASK(pin) _BV( (pin) & 0xF )

class BOARD {
public:
enum pin_t {
D0 = GPIO_PIN(0x36,0), // PINB:0
D1 = GPIO_PIN(0x36,1), // PINB:1
D2 = GPIO_PIN(0x36,2), // PINB:2
D3 = GPIO_PIN(0x36,3), // PINB:3
D4 = GPIO_PIN(0x36,4), // PINB:4
D5 = GPIO_PIN(0x36,5), // PINB:5
};
};
/*
enum pin_t {
D0 = GPIO_PIN(0x36,0), // PINB:0
D1 = GPIO_PIN(0x36,1), // PINB:1
D2 = GPIO_PIN(0x36,2), // PINB:2
D3 = GPIO_PIN(0x36,3), // PINB:3
D4 = GPIO_PIN(0x36,4), // PINB:4
D5 = GPIO_PIN(0x36,5), // PINB:5
};
*/
/**/
struct BOARDn {
static constexpr auto D0 = GPIO_PIN(0x36,0); // PINB:0
static constexpr auto D1 = GPIO_PIN(0x36,1); // PINB:1
static constexpr auto D2 = GPIO_PIN(0x36,2); // PINB:2
static constexpr auto D3 = GPIO_PIN(0x36,3); // PINB:3
static constexpr auto D4 = GPIO_PIN(0x36,4); // PINB:4
static constexpr auto D5 = GPIO_PIN(0x36,5); // PINB:5
};

//template<pin_t PIN>
template<BOARD::pin_t PIN>
class GPIO {
public:
void output(){ SFR()->ddr |= MASK;}
void low(){ SFR()->port &= ~MASK; }
void high(){ SFR()->port |= MASK; }
void write(int value){
if(value){ high(); } else { low(); }
}
void operator=(int value){ write(value); }

protected:
struct gpio_reg_t {
volatile uint8_t pin; //!< Port Input Pins.
volatile uint8_t ddr; //!< Data Direction Register.
volatile uint8_t port; //!< Data Register.
};

gpio_reg_t* SFR(){ return ( (gpio_reg_t*)GPIO_REG(PIN) ); }

static const uint8_t MASK = GPIO_MASK(PIN);
};
/**/

GPIO<BOARD::D3> led;
//GPIO<pin_t::D3> led;

int main(void){

uint8_t TestMASK = GPIO_MASK(BOARDn::D3);// test

led.output();// пин на выход

while (1) {// мигание светодиодом

led=1; // зажечь
_delay_ms(500);
led=0; // погасить
_delay_ms(500);

}
}
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Эйлер Леонард",url="/forum/viewtopic.php?p=4143525#p4143525"]Но вот как структуру сделать параметром шаблона с возможностью доступа к полям, пока затрудняюсь.[/uquote]

Лучше передавать адрес структуры. Так как порты это volatile сущности, которые из constexpr "вышибают".
Спойлер

Код: Выделить всё

struct PIN
{
  volatile int x;
  volatile int y;
};

#define PIN_A_BASE (0x1234)
#define PIN_A ((PIN*)PIN_A_BASE)

template <uint32_t PIN_BASE>
class TEST
{
public:
  TEST() = default;
 
  static inline void WriteX(int x) { base()->x = x; }
 
private:
  static constexpr auto base() { return (PIN *)PIN_BASE; }
};

using TEST_PA = TEST<PIN_A_BASE>;

TEST_PA pa;

int main()
{
  PIN_A->x=0;
  TEST_PA::WriteX(1);
  pa.WriteX(2);
}
Compiler Exploer
Последний раз редактировалось VladislavS Сб дек 18, 2021 11:34:25, всего редактировалось 6 раз.
Электрический кот
Аватара пользователя
Сообщения: 1043
Зарегистрирован: Вт июн 16, 2020 22:43:47

Сообщение O5SCP14 »

вместо attiny2313 можно поставить attiny2313a, или не прошьётся ?
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Можно без исключений.
Друг Кота
Аватара пользователя
Сообщения: 43942
Зарегистрирован: Пн ноя 30, 2009 03:00:01
Откуда: Нерезиновая

Сообщение АлександрЛ »

[uquote="O5SCP14",url="/forum/viewtopic.php?p=4143538#p4143538"]вместо attiny2313 можно поставить attiny2313a,[/uquote] :facepalm:
Хотя, вообще- то, с точки зрения некоторых программаторов разница между ними есть, а для других программаторов- нет.. :dont_know:
Например, у TL866 они указаны отдельно:
2313.png
(36.47 КБ) 130 скачиваний
А у AVRDUDESHELL - одной строкой:
2313-Д.png
(11.72 КБ) 127 скачиваний
Электрический кот
Аватара пользователя
Сообщения: 1043
Зарегистрирован: Вт июн 16, 2020 22:43:47

Сообщение O5SCP14 »

АлександрЛ писал(а): точки зрения некоторых программаторов разница между ними есть
С точки зрения моего Изображение
хочу lgbtrgb контроллер с ду собрать https://radioparty.ru/device/avr/390-rg ... attiny2313
но просто 2313 битым оказался, хотя не использовал ни разу, в 2313a зашил так красный светит и 0 реакции. Этот вариант единственный с тв пультом нашёл, потому что все эти специальные пульты это дядя Ляо и ожидание в месяц.
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1146
Зарегистрирован: Вт авг 17, 2010 11:58:06
Откуда: Казань

Сообщение den2 »

Ребят подскажите если можно как быть и что делать.
МК СТМ32 на некоторых из МК отваливается СДВ интерфейс и программа его не видит.Приходится прошивать по УАРТ.
Пины Дата и Клок не подтянуты к плюсу питания.Может в этом проблема?Или всёж сам интерфейс в МК мрет?
И если проблема в этом то стоит ли подтягивать и порт УАРТ к плюсу?Для надежности.
Прорезались зубы
Аватара пользователя
Сообщения: 232
Зарегистрирован: Вт фев 05, 2019 17:20:08
Откуда: Днепр, Украина

Сообщение Roman Solovey »

Поделитесь ссылкой если есть, на терминал у которого есть 9битный режим.. столько их скачал, а такого не нашел((
Одержать сто побед в ста битвах — это не вершина воинского искусства. Повергнуть врага без сражения — вот вершина.
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Roman Solovey, ну, чисто теоретически мой терминал может включать 9-битный режим... вот ссылка: https://cloud.mail.ru/public/Audn/95Vd3Xz1j
только по-моему, драйверы портов этот режим не поддерживают, во всяком случае, мои попытки включить 9 бит дают ошибку
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Прорезались зубы
Аватара пользователя
Сообщения: 232
Зарегистрирован: Вт фев 05, 2019 17:20:08
Откуда: Днепр, Украина

Сообщение Roman Solovey »

ARV, а как же тогда люди проверяют 9 битный режим? тупо два мк соеденяют?
Одержать сто побед в ста битвах — это не вершина воинского искусства. Повергнуть врага без сражения — вот вершина.
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Roman Solovey, понятия не имею, кому он нафиг нужен, этот режим. подозреваю, что никто его и не проверяет и не применяет
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Прорезались зубы
Аватара пользователя
Сообщения: 232
Зарегистрирован: Вт фев 05, 2019 17:20:08
Откуда: Днепр, Украина

Сообщение Roman Solovey »

Есть тензодатчики которые общаются с прибором, и вот у них как раз 9 битный протокол..
нужно скопировать протокол обмена но без терминала сложно отлаживать.
Одержать сто побед в ста битвах — это не вершина воинского искусства. Повергнуть врага без сражения — вот вершина.
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

ну, еще раз: в моём терминале такой режим предусмотрен, но на виртуальном СОМ-порту моего ноутбука он не включается. если вы найдете такой порт с такими дровами, чтобы он включался, можете попробовать. функцию я ввел, но по вышеописанной причине протестировать не смог. 5, 6 и 7 бит вроде как работают, думаю, и 9 тоже сработает, если включить сумеете :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Прорезались зубы
Аватара пользователя
Сообщения: 232
Зарегистрирован: Вт фев 05, 2019 17:20:08
Откуда: Днепр, Украина

Сообщение Roman Solovey »

та я понял. вроде пишут что не поддерживается такой режим. Нужно прям в железе делать терминал)
почему до меня его никто не сделал...
Одержать сто побед в ста битвах — это не вершина воинского искусства. Повергнуть врага без сражения — вот вершина.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

[uquote="Roman Solovey",url="/forum/viewtopic.php?p=4239055#p4239055"]почему до меня его никто не сделал...[/uquote]
Потому что только мсье знает толк в извращениях))
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Ответить

Вернуться в «Разные вопросы по МК»