Individální projekty MPOA

Mikroprocesory s architekturou ARM

Uživatelské nástroje

Nástroje pro tento web


2018:matrix-led

MATICOVÝ LED DISPLEJ

Zadání

Navrhněte zařízení zobrazující pohyblivý text na maticovém 8×8 LED displeji. Zařízení bude ovládáno pomocí procesoru STM32F100. Text k zobrazování se bude zadávat z PC prostřednictvím sériové linky RS-485.

Úvod

Navržené zařízení je určeno k zobrazování uživatelem definovaného textu. K zobrazení je použit 8×8 maticový LED displej, který je ovládán pomocí obvodu MAX7219. Výhodou tohoto obvodu je, že k řízení vyušívá rozhraní SPI, a jednotlivé obvody lze zapoji za sebe a vytvořit velký displej k zobrazování. Data k zobrazení jsou odesílána z PC po lince RS-485. Řízení celého zařízení obstarává procesor od firmy ST Microelectronic STM32F100RBT6.

Hardware

MAX7219

Tento obvod od Maxim Integrated je schopen řídit buď 64 individuálních LED nebo až osm číslic na sedmisegmentovém displeji. Dále tento obvod obsahuje rozhraní SPI, takže k ovládání postačí využití tří pinů od řídícího procesoru.

STM32VLDISCOVERY

Jedná se o vývojový kit obsahující procesor STM32F100RBT6. Je založen na jádře ARM Cortex-M3, taktován je 8MHz krystalem, má 128kB Flash paměť a 8kB RAM. Vývojový kit také obsahuje ST-Link programátor/debugger.

Zapojení

Uvedené zapojení není kompletní z důvodu přehlednosti. Celkem je zapojeno osm displejů (uvedené jsou pouze tři).

Software

Vývojové prostředí jsem zvolil Atollic TrueSTUDIO, které je založeno na vývojové platformě Eclipse. Základní části programu s nastavením periférii byla vytvořena v programu STM32Cube-MX. Bylo nastaveno rozhraní SPI, UART a Timer2

Pro ovládíní obvodu MAX7219 byla vytvořena funkce:

void Write_MAX7219(uint8_t before, uint8_t address, uint8_t data, uint8_t after)
{
	uint8_t message [2];
	uint8_t noop[2] = {0x00,0x00};
	message[0] = address;
	message[1] = data;
	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);
	if (before != 0)
	{
		for (uint8_t i = 0; i < before; i++)
		{
			HAL_SPI_Transmit(&hspi1,noop,2,HAL_MAX_DELAY);
		}
	}
	HAL_SPI_Transmit(&hspi1,message,2,HAL_MAX_DELAY);
	if (after != 0)
	{
		for(uint8_t i = 0; i < after; i++)
		{
			HAL_SPI_Transmit(&hspi1,noop,2,HAL_MAX_DELAY);
		}
	}
	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);
}

Data pro řízení obvodu jsou 16 bitová. Nejdříve je odeslána adresa příkazu a následně data pro zvolený příkaz. Pokud jsou obvody kaskádově zapojeny, je nutné každému obvodu zaslat nějaký příkaz. Např. pokud budou zapojeny tři obvody a chceme ovládat druhý v pořadí, musí se prvnímu a třetímu odeslat adresa příkazu „No-op“ (žádná operace). Přikaz bude odeslán v tomto formátu: „No-op, požadovaný příkaz, No-op“. V hlavičce funkce jsou definovány vstupní proměnné before, adress, data, after. Before resp. after znamená kolik obvodů je zapojeno před resp. za ovládaným obvodem.

Vstupní data jsou přenášena po rozhraní UART1 s DMA nastaven na kruhový buffer délky 64 znaků. Znaky k zobrazení jsou omezené jen na tisknutelné znaky v ascii tabulce (ASCII kódy 32 až 126). Přijatý znak je dekódován pro zobrazení na displeji. Každý znak na displeji zabírá pět pozic. Jednotlivé LED diody, které mají svítit resp. být shasnuty jsou definovány v paměti procesoru. Např. pro znak „A“ je definice následující:

const uint8_t znakA[5] = {0xF8,0x24,0x22,0x24,0xF8};

Dekódované znaky jsou uloženy v jednorozměrném poli „zprava“. Toto pole je následně s každým přerušením od Timer2 postupně odesíláno na displej. Aby obsluha přerušení byla co nejkratší nostaví se pouze pomocná proměnná, která je následně v nekonečné smyčce testována. Znaky které jsou právě zobrazené na displeji jsou uloženy v poli buffer délky 64 (8 LED matic po 8 sloupcích). Nová data jsou zapsána na pozici nula a stará data jsou posunuta o jednu pozici vzad. Jakmile je dosaženo konce pole je zpráva zase zobrazována od začátku. O fyzický zápis se stará funkce „display_data()“, kde vstupním parametrem je zmíněné pole buffer.

Kromě dat k zobrazení jsou definovány čtyři řídící příkazy (stop, run, jas, clear). Příkaz musí začínat znakem tilda (~), jinak jsou přijaté data prány jako zpráva k zobrazení. Jak již název jednotlivých příkazu napovídá jejich funkce je následující:

  • stop - zastaví pohyb znaků na displeji
  • run - opětovně povolí pohyb znaků
  • jas xx - změna jasu displeje, kde xx je jas displeje v rozsahu 0 - 15
  • clear - vymazání dat na displeji

Video

Zdrojové soubory

Zdroje

2018/matrix-led.txt · Poslední úprava: 2019/01/14 18:32 autor: Lukáš Hartmann