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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Поставщик валерьянки для Кота
Сообщения: 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) );}
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 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: не знаю куда отнести свой вопрос.
Реклама
Эиком - электронные компоненты и радиодетали
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 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
Реклама
Друг Кота
Аватара пользователя
Сообщения: 25447
Зарегистрирован: Чт янв 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 КБ) 159 скачиваний
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 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 подключать не планирую.
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 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 читал на разных форумах.
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 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)
С классом не будет лишних скобок и параметров, имена функций тоже будут короче, т.к. они ни с какими другими именами не конфликтуют.
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

Олегыч1 писал(а):чем по сути отличается микроконтроллер от микропроцессора?
https://ru.wikipedia.org/wiki/Однокрист ... контроллер
https://ru.wikipedia.org/wiki/Микропроцессор

Если кратко, то в состав микроконтроллера входит микропроцессор, память (постоянная и оперативная), периферия и др. модули например задающий генератор, умножитель частоты и т. д. То есть микропроцессор это одна из составных частей микроконтроллера.
Олегыч1 писал(а):А ниже написано BJ8P508/153 is an 8-bit microprocessor with low-power and high-speed CMOS technology
Это значит что в микроконтроллере 8-ми битный микропроцессор. Устаревший на данный момент. Ориентируйтесь на 32 бита если нужны современные микроконтроллеры.
Олегыч1 писал(а):Короче производители и сами точно не уверены к чему отнести данную микросхему
Нет, это вы не поняли суть. Это примерно тоже что если бы вы написали
В компе 32-ух битный пароцессор. Короче производители и сами точно не уверены это компьютер или процессор.
Абсурд, согласны?
Олегыч1 писал(а):сильной принципиальной разны получается и нет.
Процессор только выполняет инструкции. Он не содержит памяти и периферии.
Микроконтроллер в виде одной микросхемы, а для процессора нужно много других микросхем - память, контроллер прерываний, система тактирования и т. д.
Вот классический процессор https://ru.wikipedia.org/wiki/КР580ВМ80А
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18682
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Мурик писал(а):Процессор только выполняет инструкции. Он не содержит памяти и периферии.
современный пентиум или там что еще - микроконтрроллер, получается?

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

Мой уютный бложик... заходите!
Контактная информация:
Мудрый кот
Сообщения: 1759
Зарегистрирован: Пт июн 01, 2018 07:28:45

Сообщение parovoZZ »

Если кратко, то в состав микроконтроллера входит микропроцессор, память (постоянная и оперативная), периферия и др. модули например задающий генератор, умножитель частоты и т. д.
В микропроцессоре это всё тоже есть. По ссылке, что я дал, по сути всё разобрано.
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

ARV писал(а):современный пентиум или там что еще - микроконтрроллер, получается?
Пентиум это что однокристальный контроллер или много других микросхем требует? В нем есть ПЗУ и ОЗУ (кеши не в счет)? Это будет ответ на вопрос.
Читайте вики там все написано.
parovoZZ писал(а):В микропроцессоре это всё тоже есть.
Покажите где именно в этом есть https://ru.wikipedia.org/wiki/КР580ВМ80А

PS.
Не думаю что стоит спорить на эту тему. Олегыч1 спросил в чем отличие, я ответил.
Речь не про современные процессоры типа Intel Core или AMD, а про тем что во встраиваемых решениях в виде одной микросхемы https://ru.wikipedia.org/wiki/Однокрист ... контроллер
Олегыч1 ведь не про компы спрашивал.
Ответить

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