С чего начать программировать микроконтроллеры?
Re: С чего начать программировать микроконтроллеры?
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=4075222#p4075222"]для более сложных задач (работа с разнообразной периферией, графическими дисплеями) наверно лучше подойдёт С++, т.к. код получается стройнее, и хоть результирующая прошивка получается объёмней, но применяемые в этом случае более мощные МК её потянут. (пример - Марлин (прошивка для 3д принтера) написан на С++ в среде ардуино...)[/uquote]
Вообще не показатель. У меня контроллер 3D принтера на ARM, прошивка на Си. Абсолютно всё конфигурируется из текстового файла. В марлине, насколько я понимаю, необходимо перепрошивать.
Вообще не показатель. У меня контроллер 3D принтера на ARM, прошивка на Си. Абсолютно всё конфигурируется из текстового файла. В марлине, насколько я понимаю, необходимо перепрошивать.
Re: С чего начать программировать микроконтроллеры?
[uquote="КРАМ",url="/forum/viewtopic.php?p=4076684#p4076684"]В третий раз. Спецификатором является ТОЛЬКО p. Знак % применяется и с другими спецификаторами, коих целая туча.[/uquote]
Не вижу разницы. Перевод не меняется.
ДЛЯ указателя. Так понятней, да. Но в коде, который я написал, Указателя нет вообще. А символы ДЛЯ указателя присутствуют.
Осталось только pointer перевести по другому)))
Добавлено after 30 seconds:
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4076737#p4076737"]Что-то тут все в толстый троллинг скатилось…[/uquote]
А ведь хорошие посты писали. Зачем же так.
Когда не можешь или не хочешь объяснить, мир или волшебный или троллит тебя.
Не вижу разницы. Перевод не меняется.
ДЛЯ указателя. Так понятней, да. Но в коде, который я написал, Указателя нет вообще. А символы ДЛЯ указателя присутствуют.
Осталось только pointer перевести по другому)))
Добавлено after 30 seconds:
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4076737#p4076737"]Что-то тут все в толстый троллинг скатилось…[/uquote]
А ведь хорошие посты писали. Зачем же так.
Когда не можешь или не хочешь объяснить, мир или волшебный или троллит тебя.
- КРАМ
- Друг Кота
- Сообщения: 25148
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: С чего начать программировать микроконтроллеры?
[uquote="koeltrad",url="/forum/viewtopic.php?p=4076747#p4076747"]Но в коде, который я написал, Указателя нет вообще. А символы ДЛЯ указателя присутствуют.[/uquote]
В четвертый раз предлагаю прочитать описание функции printf...
Спецификатор р под кавычками определяет СПОСОБ передачи выводимого значения. Это ЛОКАЛЬНЫЙ указатель ВНУТРИ функции. Аргумент передаваемый в функцию расположен ПОСЛЕ ЗАПЯТОЙ и является значением этого локального указателя.
Что не так? Никакого внешнего указателя не требуется.
Не надо переводить аббревиатуры и искать сакральный смысл в буквах. Есть мануал, где некие символы определяют некие соответствующие этим символам действия. Никаких других толкований давать не нужно.
В четвертый раз предлагаю прочитать описание функции printf...
Спецификатор р под кавычками определяет СПОСОБ передачи выводимого значения. Это ЛОКАЛЬНЫЙ указатель ВНУТРИ функции. Аргумент передаваемый в функцию расположен ПОСЛЕ ЗАПЯТОЙ и является значением этого локального указателя.
Что не так? Никакого внешнего указателя не требуется.
Не надо переводить аббревиатуры и искать сакральный смысл в буквах. Есть мануал, где некие символы определяют некие соответствующие этим символам действия. Никаких других толкований давать не нужно.
Re: С чего начать программировать микроконтроллеры?
Кажется нашёл объяснение. Можете оценить?
Вот описание Указателя из интернета:
Указатель — это переменная, которая содержит адрес другой переменной.
В моём примере r содержит адрес самой себя, а не другой переменной. Поэтому r не будет являться указателем. Имеется в виду указатель на адрес другой переменной.
Вот описание Указателя из интернета:
Указатель — это переменная, которая содержит адрес другой переменной.
В моём примере r содержит адрес самой себя, а не другой переменной. Поэтому r не будет являться указателем. Имеется в виду указатель на адрес другой переменной.
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: С чего начать программировать микроконтроллеры?
[uquote="koeltrad",url="/forum/viewtopic.php?p=4076747#p4076747"]Зачем же так.[/uquote]
Вот и мне интересно: зачем ты корчишь комедию и строишь из себя идиота?
Тема давно скатилась в офтоп. Элементарные детские вопросы по С можно одним махом решить, прочитав Кернигана & Ритчи. А вопросы по аргументам функций glibc — почитав маны. Ну набери ты в консоли man 3 printf — и читай на здоровье!
Сначала ptr содержит адрес x, а потом - свой собственный.
Вот и мне интересно: зачем ты корчишь комедию и строишь из себя идиота?
Тема давно скатилась в офтоп. Элементарные детские вопросы по С можно одним махом решить, прочитав Кернигана & Ритчи. А вопросы по аргументам функций glibc — почитав маны. Ну набери ты в консоли man 3 printf — и читай на здоровье!
Вот тебе простой пример:В моём примере r содержит адрес самой себя, а не другой переменной.
Код: Выделить всё
#include <stdio.h>
int main(){
int x = 2;
void *ptr = (void*)&x;
printf("ptr=%p\n", ptr);
ptr = &ptr;
printf("ptr=%p\n", ptr);
return 0;
}- КРАМ
- Друг Кота
- Сообщения: 25148
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: С чего начать программировать микроконтроллеры?
[uquote="koeltrad",url="/forum/viewtopic.php?p=4076769#p4076769"]Указатель — это переменная, которая содержит адрес другой переменной.[/uquote]
Да, именно так.
Да, именно так.
- Эйлер Леонард
- Встал на лапы
- Сообщения: 104
- Зарегистрирован: Пн ноя 04, 2019 09:58:29
- Откуда: г. Нижний Тагил Свердл. обл.
Re: С чего начать программировать микроконтроллеры?
Добрый вечер. У меня не большой вопросик.
Вот классический код начинающего микроконтроллерщика
#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) согласно ДШ. 
Вот классический код начинающего микроконтроллерщика
Спойлер
// 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
*/
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: С чего начать программировать микроконтроллеры?
.... и???
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Эйлер Леонард
- Встал на лапы
- Сообщения: 104
- Зарегистрирован: Пн ноя 04, 2019 09:58:29
- Откуда: г. Нижний Тагил Свердл. обл.
Re: С чего начать программировать микроконтроллеры?
Ну напр. так...
регистр специального назначения
регистры 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 )
//#define GPIO_MASK(pin) (1 << ((pin) & 0xF))
//constexpr
//uint8_t GPIO_MASK(uint8_t pin){
//return 1 << ( (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(){// & - адрес операнда PIN в памяти
SFR()->ddr &= ~MASK;
return (*this);// * - значение по адресу
}
//void input(){ SFR()->ddr &= ~MASK; }
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.write(1); // зажечь
_delay_ms(500);
led.write(0); // погасить
_delay_ms(500);
}
}Взял здесь. Разобрал по запчастям, потом снова собрал. Фурычит. Правда выпотрошил все, то не мешает работе. В целом вроде бы всё понятно. Сначала рылся в io.h. Но там макрос на макросе и макросом подгоняет.
Спойлер
/* ATiny85 -std=c++14регистр специального назначения
регистры 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 )
//#define GPIO_MASK(pin) (1 << ((pin) & 0xF))
//constexpr
//uint8_t GPIO_MASK(uint8_t pin){
//return 1 << ( (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(){// & - адрес операнда PIN в памяти
SFR()->ddr &= ~MASK;
return (*this);// * - значение по адресу
}
//void input(){ SFR()->ddr &= ~MASK; }
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.write(1); // зажечь
_delay_ms(500);
led.write(0); // погасить
_delay_ms(500);
}
}
Re: С чего начать программировать микроконтроллеры?
Зачем вообще отказываться от имён регистров? Кот
становится нечитаемым.
И хрюкотали зелюки,
Как мюмзики в мове.
На каждый РКН
Найдётся VPN.
Как мюмзики в мове.
На каждый РКН
Найдётся VPN.
- Эйлер Леонард
- Встал на лапы
- Сообщения: 104
- Зарегистрирован: Пн ноя 04, 2019 09:58:29
- Откуда: г. Нижний Тагил Свердл. обл.
Re: С чего начать программировать микроконтроллеры?
Я разбираюсь с библиотекой GPIO (ссылка) Перевод со страницы англ.->рус.

Скачал, установил, отвязался от Ардуины. Работает нормально. Но хотелось бы знать больше - что, зачем и почему до каждой строчки. В целом просветление некоторое есть. Самообразование так сказать (ну или делать нех..)Библиотека Arduino GPIO была разработана для обеспечения высокопроизводительного доступа к цифровым выводам. Большинство функций доступа скомпилированы в одну инструкцию и выполняются за 1-2 такта. Функции библиотеки более чем в 10 раз быстрее, чем функции цифровых выводов Arduino. В некоторых случаях в 100 раз быстрее...
Re: С чего начать программировать микроконтроллеры?
Тогда всё правильно, читайте файлы с макросами. Например, из библиотек WinAVR. А про ардуй потихоньку забывайте. Железо применять можно.
И хрюкотали зелюки,
Как мюмзики в мове.
На каждый РКН
Найдётся VPN.
Как мюмзики в мове.
На каждый РКН
Найдётся VPN.
Re: С чего начать программировать микроконтроллеры?
Доброго дня
Подскажите, можно ли реализовать на МК
МК - attiny85
среда - ардуино ИДЕ
Хочу использовать 2 порта под АЦП,
НО
надо на одном порте делать замер 0-5в (опорное = питанию мк 5В)
а на другом - 0-1.1В (опорное внутренней стабилизатор 1.1В
--
можно динамически постоянно менять источник опорного???
//зачем надо - делаю на основе этого МК контроллер для электромашинки и один вход на ручку газа идет, а другой на замер тока на шунте (шунт из медной проволоки 2мм диаметром .. надо фиксировать токи до 150А
Подскажите, можно ли реализовать на МК
МК - attiny85
среда - ардуино ИДЕ
Хочу использовать 2 порта под АЦП,
НО
надо на одном порте делать замер 0-5в (опорное = питанию мк 5В)
а на другом - 0-1.1В (опорное внутренней стабилизатор 1.1В
--
можно динамически постоянно менять источник опорного???
//зачем надо - делаю на основе этого МК контроллер для электромашинки и один вход на ручку газа идет, а другой на замер тока на шунте (шунт из медной проволоки 2мм диаметром .. надо фиксировать токи до 150А
Re: С чего начать программировать микроконтроллеры?
Проще ослабить делителем или даже просто одним добавочным резистором сигнал с ручки газа.
И хрюкотали зелюки,
Как мюмзики в мове.
На каждый РКН
Найдётся VPN.
Как мюмзики в мове.
На каждый РКН
Найдётся VPN.