www.kn34pc.com

Форум на силистренските радиолюбители
Дата и час: 17 Юли 2025, 12:04

Часовете са според зоната UTC + 2 часа




Напиши нова тема Отговори на тема  [ 13 мнения ] 
Автор Съобщение
 Заглавие: bit banging
МнениеПубликувано на: 21 Авг 2023, 09:52 
Offline
Аватар

Регистриран на: 07 Дек 2006, 17:24
Мнения: 1591
Местоположение: Силистра
Задача: съвсем прост тест на скоростта на превключване на извод при различни микроконтролери.
в основния цикъл: извод LOW, извод HIGH ...

Скоростта зависи от начина на управление. Ще пробвам по няколко начина.
---
Arduino Nano, ATmega328, 16 MHz

Прогр. код в Arduino IDE v1.8.19
Код за потвърждение:
void setup() {
  pinMode(10, OUTPUT);
}

void loop() {
  digitalWrite(10, HIGH);
  digitalWrite(10, LOW);
}

резултат:
pin 2 : 147,200 kHz
pin 5 : 116,900 kHz
pin 10: 114,100 kHz
pin A0: 147,200 kHz


Върнете се в началото
 Профил  
 
 Заглавие: Re: bit banging
МнениеПубликувано на: 21 Авг 2023, 10:02 
Offline
Аватар

Регистриран на: 07 Дек 2006, 17:24
Мнения: 1591
Местоположение: Силистра
Arduino Nano, ATmega328, 16 MHz

Прогр. код в Arduino IDE v1.8.19
Код за потвърждение:
void setup() {
  DDRB |= 0b00000100;  // output pin 10
}

void loop() {
  PORTB = 0b00000000; // pin 10 -> LOW
  PORTB = 0b00000100; // pin 10 -> HIGH
}

резултат:
pin 10: 2,650000 MHz


Върнете се в началото
 Профил  
 
 Заглавие: Re: bit banging
МнениеПубликувано на: 21 Авг 2023, 10:34 
Offline
Аватар

Регистриран на: 07 Дек 2006, 17:24
Мнения: 1591
Местоположение: Силистра
PIC16F1503, INT 16 MHz
Код за потвърждение:
#use delay(internal = 16000000)
#use STANDARD_IO(A_outputs = PIN_A5)

void main() {
  while (TRUE) {
    output_low(PIN_A5);
    output_high(PIN_A5);
  }
}

резултат:
PIN_A5 : 401,100 kHz
---
Код за потвърждение:
#use delay(internal = 16000000)

#byte TRISA = 0x08C    // TRISA
#byte PORTA = 0x00C    // PORTA
#bit RA5 = 0x00C.5     // RA5

void main() {
  TRISA = 0b11011111;  // RA5 -> output

  while (TRUE) {
    RA5 = 1;
    RA5 = 0;
  }
}

резултат:
PIN_A5: 1,002700 MHz


Върнете се в началото
 Профил  
 
 Заглавие: Re: bit banging
МнениеПубликувано на: 22 Авг 2023, 13:35 
Offline
Аватар

Регистриран на: 07 Дек 2006, 17:24
Мнения: 1591
Местоположение: Силистра
ATtiny13A през MicroCore, INT 9,6 MHz

Прогр. код в Arduino IDE v1.8.19
Код за потвърждение:
void setup() {
  pinMode(4, OUTPUT);
}

void loop() {
  digitalWrite(4, HIGH);
  digitalWrite(4, LOW);
}

резултат:
PB4 : 1,585500 MHz
---
Код за потвърждение:
void setup() {
  DDRB = 0b00010000;
}

void loop() {
  PORTB = 0b00000000;
  PORTB = 0b00010000;
}

резултат:
PB4 : 2,455200 MHz


Върнете се в началото
 Профил  
 
 Заглавие: Re: bit banging
МнениеПубликувано на: 23 Авг 2023, 20:38 
Offline
Аватар

Регистриран на: 07 Дек 2006, 17:24
Мнения: 1591
Местоположение: Силистра
ATmega1609, INT 16 MHz

Прогр. код в Arduino IDE v1.8.19
Код за потвърждение:
void setup() {
  pinMode(26, OUTPUT);
}

void loop() {
  digitalWrite(26, HIGH); // PD4
  digitalWrite(26, LOW);  // PD4
}

резултат:
PD4 (pin 24) : 409,120 kHz
---
Код за потвърждение:
void setup() {
  PORTD.DIRSET = 0b00010000;  // output PD4
}

void loop() {
  PORTD.OUTCLR = 0b00010000;  // PD4 = 0
  PORTD.OUTSET = 0b00010000;  // PD4 = 1
}

или
Код за потвърждение:
void setup() {
  PORTD.DIRSET = 0b00010000;  // output PD4
}
void loop() {
  PORTD.OUT = 0b00000000;  // PD4 = 0
  PORTD.OUT = 0b00010000;  // PD4 = 1
}

резултат:
PD4 (pin 24) : 2,002400 MHz


Върнете се в началото
 Профил  
 
 Заглавие: Re: bit banging
МнениеПубликувано на: 24 Авг 2023, 08:58 
Offline
Аватар

Регистриран на: 07 Дек 2006, 17:24
Мнения: 1591
Местоположение: Силистра
PIC24F16KA102, INT 16 MHz
Код за потвърждение:
#use delay(internal = 16000000)
#use FIXED_IO(B_outputs = PIN_B5)

void main() {
  while (TRUE) {
    output_low(PIN_B5);
    output_high(PIN_B5);
  }
}

резултат:
PB5 (pin 14) : 1,001500 MHz
---
Код за потвърждение:
#use delay(internal = 16000000)

#byte TRISB = 0x02C8   // TRISB
#byte PORTB = 0x02CA   // PORTB
#bit RB5 = 0x02CA.5    // RB5

void main() {
  TRISB = 0b1111111111011111;  // PB5 output
 
  while (TRUE) {
    RB5 = 1;
    RB5 = 0;
  }
}

резултат:
PB5 (pin 14) : 2,002500 MHz


Върнете се в началото
 Профил  
 
 Заглавие: Re: bit banging
МнениеПубликувано на: 05 Сеп 2023, 00:22 
Offline
Аватар

Регистриран на: 07 Дек 2006, 17:24
Мнения: 1591
Местоположение: Силистра
STM32G030F6P6, INT 16 MHz, PA3

Прогр. код в STM32Cube IDE
Код за потвърждение:
   // 171.666 kHz
   // HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET);
   // HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);

   // 797.902 kHz
   // GPIOA->ODR ^= (1 << 3);  // toggling pin PA3

   // 886.553 kHz
   // GPIOA->ODR |= 1 << 3;     // set pin PA3
   // GPIOA->ODR &= ~(1 << 3);  // reset pin PA3

   // 840.050 kHz
   // GPIOA->BSRR |= (1 << 3);   // set pin PA3
   // GPIOA->BSRR |= (1 << 19);  // reset pin PA3

Друга идея?


Върнете се в началото
 Профил  
 
 Заглавие: Re: bit banging
МнениеПубликувано на: 23 Сеп 2023, 22:43 
Offline
Аватар

Регистриран на: 07 Дек 2006, 17:24
Мнения: 1591
Местоположение: Силистра
STM32F103C8T6, INT 16 MHz, PC13

Прогр. код в STM32Cube IDE
Код за потвърждение:
    // 694.378 kHz
    // HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
    // HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);

    // 887.306 kHz
    // GPIOC->ODR |= 1 << 13;     // set pin PC13
    // GPIOC->ODR &= ~(1 << 13);  // reset pin PC13

    // 887.306 kHz
    // GPIOC->BSRR |= (1 << 13);  // set pin PC13
    // GPIOC->BSRR |= (1 << 29);  // reset pin PC13

    // 3.194204 MHz
    // GPIOC->BSRR = GPIO_BRR_BR13;  // set pin PC13
    // GPIOC->BRR = GPIO_BRR_BR13;   // reset pin PC13


STM32F103C8T6, INT 72 MHz, PC13
Код за потвърждение:
    // 10.280652 MHz
    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) ...
...
    GPIOC->BSRR = GPIO_BRR_BR13;  // set pin PC13
    GPIOC->BRR = GPIO_BRR_BR13;   // reset pin PC13


Код за потвърждение:
    // 14.393912 MHz
    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) ...
...
    GPIOC->BSRR = GPIO_BRR_BR13;  // set pin PC13
    GPIOC->BRR = GPIO_BRR_BR13;   // reset pin PC13


Върнете се в началото
 Профил  
 
 Заглавие: Re: bit banging
МнениеПубликувано на: 02 Май 2024, 10:36 
Offline
Аватар

Регистриран на: 07 Дек 2006, 17:24
Мнения: 1591
Местоположение: Силистра
ESP-32 WROOM-32

Прогр. код в Arduino IDE v1.8.19
Код за потвърждение:
void setup() {
  pinMode(13, OUTPUT);
}

// CPU Frequency: 240 MHz, G13 -> 1289030 Hz
// CPU Frequency: 160 MHz, G13 -> 855816 Hz
// CPU Frequency: 10 MHz, G13 -> 450004 Hz

void loop() {
  digitalWrite(13, HIGH);
  digitalWrite(13, LOW);
}

Очаквах други резултати. Други начини?


Върнете се в началото
 Профил  
 
 Заглавие: Re: bit banging
МнениеПубликувано на: 09 Авг 2024, 10:17 
Offline
Аватар

Регистриран на: 07 Дек 2006, 17:24
Мнения: 1591
Местоположение: Силистра
CH32V003F4P6 на SYSCLK_FREQ_48MHz_HSI 48000000

Прогр. код в MounRiver Studio
Код за потвърждение:
    GPIO_InitTypeDef GPIO_InitStructure = {0};

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
    ...
    while(1)
    {
        GPIOC->BSHR = GPIO_BSHR_BR0;  // 6.010761 MHz
        GPIOC->BSHR = GPIO_BSHR_BS0;

        // GPIO_WriteBit(GPIOC, GPIO_Pin_0, Bit_RESET);  // 1,201872 MHz
        // GPIO_WriteBit(GPIOC, GPIO_Pin_0, Bit_SET);
    }
}


Върнете се в началото
 Профил  
 
 Заглавие: Re: bit banging
МнениеПубликувано на: 15 Авг 2024, 20:43 
Offline
Аватар

Регистриран на: 07 Дек 2006, 17:24
Мнения: 1591
Местоположение: Силистра
CH32V203C8T6 на SYSCLK_FREQ_144MHz_HSE 144000000

Прогр. код в MounRiver Studio
Код за потвърждение:
    GPIO_InitTypeDef GPIO_InitStructure = {0};

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    ...
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
    SystemCoreClockUpdate();
    Delay_Init();
    GPIO_Toggle_INIT();

    while(1)
    {
        // Delay_Ms(250);
        // GPIO_WriteBit(GPIOB, GPIO_Pin_0, (i == 0) ? (i = Bit_SET) : (i = Bit_RESET));

        // GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_RESET);  // 4.363651 MHz
        // GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_SET);

        // GPIOB->BSHR = GPIO_BSHR_BR0;  // 24.000079 MHz
        // GPIOB->BSHR = GPIO_BSHR_BS0;

        GPIOB->BSHR = GPIO_Pin_0;  // 24.000079 MHz
        GPIOB->BCR = GPIO_Pin_0;
    }

:rolleyes


Върнете се в началото
 Профил  
 
 Заглавие: Re: bit banging
МнениеПубликувано на: 21 Ное 2024, 09:55 
Offline
Аватар

Регистриран на: 07 Дек 2006, 17:24
Мнения: 1591
Местоположение: Силистра
STM32F030F4P6, INT 48 MHz, PA4

Прогр. код в STM32Cube IDE
Код за потвърждение:
    // HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);  // 1.000546 MHz
    // HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);

    GPIOA->BSRR = GPIO_PIN_4;  // 5.992794 MHz
    GPIOA->BRR = GPIO_PIN_4;

Прогр. код в EmBitz 2.63
Код за потвърждение:
    // GPIO_SetBits(GPIOA, GPIO_Pin_4);  // 1.411715 MHz
    // GPIO_ResetBits(GPIOA, GPIO_Pin_4);

    GPIOA->BSRR = GPIO_Pin_4;  // 5.999458 MHz
    GPIOA->BRR = GPIO_Pin_4;

Ще трябва да се пише в CMSIS, ама .... :mail


Върнете се в началото
 Профил  
 
 Заглавие: Re: bit banging
МнениеПубликувано на: 27 Май 2025, 13:37 
Offline
Аватар

Регистриран на: 07 Дек 2006, 17:24
Мнения: 1591
Местоположение: Силистра
STM32G431C8T6, кварц HSE 8 MHz -> PLL 170 MHz
При GPIO_SPEED_FREQ_HIGH:

Код за потвърждение:
while (1) {
  GPIOC->BSRR = GPIO_PIN_13;  // 34.382965 MHz
  GPIOC->BRR = GPIO_PIN_13;
}

Такива стойности не съм достигал. Но не са толкова важни, при това, че има хардуерни компоненти с излишък, напр. SPI с SPI clock frequency, Master mode = 75 MHz.


Върнете се в началото
 Профил  
 
Покажи мненията от миналия:  Сортирай по  
Напиши нова тема Отговори на тема  [ 13 мнения ] 

Часовете са според зоната UTC + 2 часа


Кой е на линия

Потребители, разглеждащи този форум: 0 регистрирани и 1 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
cron
Форумът се задвижва от phpBB® Forum Software © phpBB Group
Преведено от yarnaudov.com