ARM36: Burbuliniai LED

Antikvarinis LED indikatorius, tikriausiai iš kokio nors tarybinio kalkuliatoriaus. Žãvi savo netobulumu:

burbulinis LED
АЛС318

Simboliai mažyčiai (todėl ir plastikinės linzės), šviesumas mizernas (prie tausojančių srovių). Bet savotiškai žavingas.
Tokiam indikatoriui pajungti reikia gana daug laidų ir dinaminės indikacijos. Demonstracijai panaudojau breadboard ir “bluepill” plokštę (STM32F103C8t)- mikroschema mažoka, beveik visos kojos sunaudojamos indikatoriui. Prie anodų (pliusinių elektrodų) reikia prikabinti kokius nors rezistorius, kad apriboti srovę per LED, tik 3mA statiniam režime per vieną segmentą. Naudojant dinaminę indikaciją leistina srovė 40mA, bet jei indikacija sustos, tai atia LEDams.

STM32F103 bluepill source code (StmCubeMX) ir kompiliuotas hex.

Pajungimas: PA0-PA7 (per rezistorius) LED segmentai, PB0,PB1, PB3-PB9 – katodai (ženklų vietos).

Kad pagreitinti programos darbą, rašom visą baitą į kojeles:

uint32_t data = GPIOA -> ODR;
data &= 0xFF00;
//Bits 31:16 Reserved, must be kept at reset value.
//Bits 15:0 ODRy: Port output data (y= 0 .. 15)
//These bits can be read and written by software and can be accessed in Word mode only.

data |= font[a];
GPIOA -> ODR = data;

Taip ir biški neaišku- 32 ar 16 bitų reikia rašyti/skaityti. Išbandžiau visus variantus, visi veikia.

Kitoje vietoje:

uint32_t data = GPIOB -> ODR;
data |=0b00000000000000000000001111111011;
GPIOB -> ODR = data;

Irgi tas pats klausimas: 16 ar 32. O galima gal optimizuoti naudojant GPIOx_BSRR? (porto bitų “resetinimo/setinimo” registas)

GPIOB ->BSRR =0b00000000000000000000001111111011;

Veikia ir šis variantas.

Griozdišką:

/* 74LS154 butu geriau */
if (screen_pos==0) { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET);}
else if (screen_pos==1) { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);}
else if (screen_pos==2) { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);}
else if (screen_pos==3) { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);}
else if (screen_pos==4) { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);}
else if (screen_pos==5) { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_RESET);}
else if (screen_pos==6) { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET);}
else if (screen_pos==7) { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);}
else if (screen_pos==8) { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);}

Irgi galima optimizuoti. Bet ar šiais laikais kas nors ką nors optimizuoja?
Gerai…. kaip toks variantas:

unsigned int bitai[]={512,256,128,64,32,16,8,2,1};
GPIOB ->BSRR =(bitai[screen_pos]<< 16);

arba:

GPIOB ->BRR =(bitai[screen_pos]);

Norint pataupyti MCU kojas, galima statyti dekodavimo mikroschemą 74LS154 (К155ИД3). Tada vietoje 9 kojų užtektu kokių 4.
red led decoder

Demonstracinė programa skaičiuoja 32 bitų kintamąjį, tai tikrai pats kairinis simbolis nepasikeis. O ir laukti kitų simbolių gali ir pabosti.

Tai tik tiek. 🙂

(optimizaciniai eksperimentai į archyvą neįtraukti)

Leave a Reply

Your email address will not be published. Required fields are marked *