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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Эйлер Леонард",url="/forum/viewtopic.php?p=3965269#p3965269"]и еще перевод "Ошибка невозможного ограничения в 'asm' "
Вопрос - как аргумент функции передать в асемблерный код? Если поставить напрямую PB0 в код, то компилируется, 0...7 тоже компилируется.[/uquote]
Номер пина - это константа прошитая в инструкции SBI, а аргумент функции - это не константа времени компиляции. Можно или макрос использовать или на C++ передавать номер пина в качестве шаблонного параметра.
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 104
Зарегистрирован: Пн ноя 04, 2019 09:58:29
Откуда: г. Нижний Тагил Свердл. обл.

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

Уважаемые коты - это мой первый опыт на ассемблере, пытаюсь сделать некоторые ардуиновские функции для голого МК (ATtiny напр.). digitalWrite, digitalRead, pinMode ну и пр. ( на Си сделал, работает. слишком просто и не интересно )
Реклама
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Эйлер Леонард",url="/forum/viewtopic.php?p=3965539#p3965539"]( на Си сделал, работает. слишком просто и не интересно )[/uquote]
Самый оптимизированный код сейчас генерит C++, там можно сказать компилятору, что вот тебе 5 экранов кода, все посчитай и верни константу времени компиляции... Но по мнению многих получается наоборот слишком сложно :) В любом случае ардуино явно не лучший пример для подражания...
Встал на лапы
Аватара пользователя
Сообщения: 104
Зарегистрирован: Пн ноя 04, 2019 09:58:29
Откуда: г. Нижний Тагил Свердл. обл.

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

О макросах. http://we.easyelectronics.ru/AVR/assemb ... r-gcc.html На этом форуме есть в обсуждениях полезные макросы на ASM. Установка бита, сброс бита...(полистать несколько экранов вниз). Однако как говорил наш командир роты. Макрос, это макрос. А функция, это функция.

Добавлено after 3 minutes 40 seconds:
А вот как раз я и ненавижу Ардуино. (Но это так по секрету всему свету)
Реклама
Эиком - электронные компоненты и радиодетали
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Эйлер Леонард",url="/forum/viewtopic.php?p=3965552#p3965552"]Макрос, это макрос. А функция, это функция.[/uquote]
С функцией получится только на плюсах, там PB0 может быть классом, тогда порт и номер пина он хранит как константы и в функцию их передавать не нужно:

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

PB1 led;
led.write(0);
PB5::write(1);
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 104
Зарегистрирован: Пн ноя 04, 2019 09:58:29
Откуда: г. Нижний Тагил Свердл. обл.

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

Ну вот незабвенный digitalRead. Надо бы переложить на ASM. Чем я сейчас и занят. Ну как там говорят, когда коту делать нечего..
uint8_t digitalRead(uint8_t pin){ return !!( PINB & (1<<pin) );}
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Эйлер Леонард",url="/forum/viewtopic.php?p=3965565#p3965565"]Надо бы переложить на ASM.[/uquote]Может сначала посмотреть во что это компилируется и не заниматься ерундой?

Добавлено after 2 minutes 12 seconds:
[uquote="Reflector",url="/forum/viewtopic.php?p=3965564#p3965564"]там PB0 может быть классом[/uquote]Добавлю вариантов

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

PB1 led;
led=1;
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1941
Зарегистрирован: Пт фев 27, 2015 20:57:08
Откуда: Курск

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

Подскажите пожалуйста, чем по сути отличается микроконтроллер от микропроцессора? Я знаком только с AVR-микроконтроллерами. А сейчас вот столкнулся с микропроцессором, который так же нуждается в прошивке, как и AVR... И имя ему: bj8p153. Что это вообще за зверек такой? Прошу прощения, если не в тот раздел написал :oops: не знаю куда отнести свой вопрос.
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Олегыч1",url="/forum/viewtopic.php?p=3966160#p3966160"]А сейчас вот столкнулся с микропроцессором,
....
И имя ему: bj8p153.[/uquote]Смешно. AVR по сравнению с ним - суперкомпьютер! Даташит гуглится в 3 сек. В чём проблема почитать?
Мудрый кот
Сообщения: 1759
Зарегистрирован: Пт июн 01, 2018 07:28:45

Сообщение parovoZZ »

[uquote="Олегыч1",url="/forum/viewtopic.php?p=3966160#p3966160"]Подскажите пожалуйста, чем по сути отличается микроконтроллер от микропроцессора?[/uquote]
Ответ дан здесь

https://radiokot.ru/forum/viewtopic.php?f=61&t=175053
Друг Кота
Аватара пользователя
Сообщения: 25862
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

[uquote="Олегыч1",url="/forum/viewtopic.php?p=3966160#p3966160"]А сейчас вот столкнулся с микропроцессором[/uquote]
Это КОНТРОЛЛЕР, а не процессор (даташит об этом недвусмысленно намекает прямо в заголовке), причем с ОТР (One Time Programming - однократно программируемой) программной памятью.
Встал на лапы
Аватара пользователя
Сообщения: 104
Зарегистрирован: Пн ноя 04, 2019 09:58:29
Откуда: г. Нижний Тагил Свердл. обл.

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

Решено. Самый быстрый в мире digitalWrite() и pinMode() и незабвенный подмигиватель светодиодной лампочкой. Всего то и надо было перейти на С++ и применить шаблон в качестве одного из параметров функции.
Спойлер

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

/*  Attiny85  */ 
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
//----
enum { LOW, HIGH };
enum { INPUT, OUTPUT };
//----
template <typename T>
void digitalWrite(T pin, uint8_t val){
if(!val) {
	__asm__ __volatile__("cbi %0, %1" :: "I" (_SFR_IO_ADDR(DDRB)), "I" (pin) );
 	 } else {
	__asm__ __volatile__("sbi %0, %1" :: "I" (_SFR_IO_ADDR(DDRB)), "I" (pin) );
	 }
}
//----
template <typename M>
void pinMode(M pin, uint8_t mode ){//mode: INPUT, OUTPUT
if(!mode) {
	__asm__ __volatile__("cbi %0, %1" :: "I" (_SFR_IO_ADDR(DDRB)-1), "I" (pin) );
	} else {
	__asm__ __volatile__("sbi %0, %1" :: "I" (_SFR_IO_ADDR(DDRB)-1), "I" (pin) );
    }
}
//--------
int main(void){
	
pinMode(PB0, OUTPUT);
	
    while (1) {
digitalWrite(PB0, HIGH);  // зажигаем светодиод
    _delay_ms(50);        // ждем
digitalWrite(PB0, LOW);   // выключаем светодиод
    _delay_ms(50);        // ждем
	}
	
}
Правда только для Attiny85. НУ.. За дружбу, Си++ и ассемблера!
Вложения
Test(3).gif
Снимок с протеуса
(29.38 КБ) 174 скачивания
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

А теперь с удивлением узнаём, что командами SBI и CBI доступны не все порты. А вот C конструкцию типа PINx |= (1<<pin); компилятор сам способен перевести либо в SBI, либо в OUT исходя из номера порта. Без всякого асма.
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

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

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

Вполне может быть и так.

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

void digitalWrite(volatile uint8_t *port, uint8_t pin, uint8_t val){
	if(!val){ (*(port)) &= ~(1<<pin); }
	else { (*(port)) |= (1<<pin); }
}
Не много поизгалявшись над оригинальной Ардуиновской функцией. (отвязал её от Меги и всех Ардуиновских библиотек) Там - не иначе как тихий ужас я бы не назвал. Ну а насчет подрыгать лапами. Я все-таки лампочки на Reset подключать не планирую.
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Эйлер Леонард",url="/forum/viewtopic.php?p=3966675#p3966675"]Вполне может быть и так.[/uquote]Тут недостаток в том, что функция не будет заинлайнена из другой единицы трансляции. Стоит обернуть её в шаблонный класс и сделать статическим методом. Тогда С++ действительно сделает её эффективной. Можно так же продумать реализации, когда на вход подаются константные данные. Тогда проверка условия будет "вырождаться" на этапе компиляции.
Встал на лапы
Аватара пользователя
Сообщения: 104
Зарегистрирован: Пн ноя 04, 2019 09:58:29
Откуда: г. Нижний Тагил Свердл. обл.

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

Сейчас я пока просто изучаю. Напр.

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

uint8_t digitalRead(volatile uint8_t *port, uint8_t pin){
	return !!( (*(port-2)) & (1<<pin) );
}
И работает ли такой эквивалент?

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

template <typename K>
uint8_t digitalRead(K pin){
	uint8_t result;
__asm__ __volatile__("inb %[retval], %[pin]" :[retval] "=a" (result) : [pin] "I" (_SFR_IO_ADDR(DDRB)-2) );
	return result;
}
А то на этой стезе много всяких ловушек и капканов. Пока просто для интереса. А о войне миров С++ & ASM читал на разных форумах.
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

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

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

[uquote="КРАМ",url="/forum/viewtopic.php?p=3966182#p3966182"][uquote="Олегыч1",url="/forum/viewtopic.php?p=3966160#p3966160"]А сейчас вот столкнулся с микропроцессором[/uquote]
Это КОНТРОЛЛЕР, а не процессор (даташит об этом недвусмысленно намекает прямо в заголовке), причем с ОТР (One Time Programming - однократно программируемой) программной памятью.[/uquote]
А ниже написано BJ8P508/153 is an 8-bit microprocessor with low-power and high-speed CMOS technology и я запутался поэтому немного. Короче производители и сами точно не уверены к чему отнести данную микросхему, т.к. сильной принципиальной разны получается и нет.
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Эйлер Леонард",url="/forum/viewtopic.php?p=3966631#p3966631"]

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

template <typename T>
void digitalWrite(T pin, uint8_t val){
if(!val) {
	__asm__ __volatile__("cbi %0, %1" :: "I" (_SFR_IO_ADDR(DDRB)), "I" (pin) );
 	 } else {
	__asm__ __volatile__("sbi %0, %1" :: "I" (_SFR_IO_ADDR(DDRB)), "I" (pin) );
	 }
}
[/uquote]
Это совсем не то, о чем я говорил изначально, аргумент функции тут по-прежнему присутствует и формально он не константа времени компиляции, потому подобный код не будет компилироваться всегда. Например, если отключить оптимизацию, то не помогут даже навешеные на функцию атрибуты оптимизации и инлайнинга если сама функцию вызывается из неоптимизированного контекста, потому что в таком случае инлайнинг невозможен, а без инлайнинга pin будет передаваться в регистре... Через шаблон нужно передавать само значение, а не тип:

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

template <uint8_t pin>
void digitalWrite(bool val){
В таком виде будет компилироваться всегда, но сам вызов выглядит не лучшим образом:

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

digitalWrite<PB0>(HIGH)
С классом не будет лишних скобок и параметров, имена функций тоже будут короче, т.к. они ни с какими другими именами не конфликтуют.
Ответить

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