Vzorové riešenie MIPS C1
Zo stránky SensorWiki
Praktická časť skúšky z predmetu MIPS / LS2025 - Richard Balogh
Zadanie
Pred sebou máte novú súčiastku aj s datasheetom. Je to 4-miestny 7-segmentový LED displej, ktorý je potrebné využiť. Viac informácií nájdete v datasheete. Nič nesmiete zapojiť na výstupy D0 a D1 (PORTD.0 a PORTD.1), ktoré sa využívajú pre USB. Inak môžete využiť ktorékoľvek ostatné. Pri práci môžete využiť všetky súčiastky zo semestra, ktoré máte v krabičke a ľubovoľný počet vodičov. Odporúčame pracovať postupne: najprv si zapojte displej a vyskúšajte pripojením na GND a Vcc či bude svietiť to čo potrebujete. Potom jednoduchým programom odskúšajte základnú funkciu a až potom sa pustite do zadanej úlohy. Ak nestihnete v časovom limite všetko, dostanete čiastočný počet bodov zodpovedajúci rozpracovanosti úlohy.

Úloha 1.C.1: Pripojte displej k mikroprocesoru (nezabudnite na ochranné odpory!) a naprogramujte ho tak, že bude zobrazovať na prvom mieste ľubovoľné tri písmená, ktoré prijme po sériovej linke z terminála. Napr. ak pošlete A, tak sa zobrazí A, ak pošlete C, zobrazí sa C a ak pošlete E, zobrazí sa E.
Úloha 1.C.2:
Pripojte displej k mikroprocesoru (nezabudnite na ochranné odpory!) a naprogramujte ho tak, že bude zobrazovať na prvom mieste ľubovoľné tri číslice, ktoré prijme po sériovej linke z terminála. Napr. ak pošlete 1, tak sa zobrazí 1, ak pošlete 8, zobrazí sa 8 a ak pošlete 0, zobrazí sa 0.
Literatúra:
Analýza a opis riešenia
Tu je príklad, ako mohlo vyzerať riešenie úlohy C1, resp C2. Nie je to ideálne, optimálne ani pekné riešenie, ale také, ktoré sa dá stihnúť celkom rýchlo zapojiť aj naprogramovať. Samozrejme, toto riešenie nezohľadňuje žiadne ďalšie vstupy alebo výstupy, ani by sa takto nemalo programovať, ale na skúšku by to bolo asi najrýchlejšie riešenie.
Keďže na doske nie je nič iné pripojené, tak pracujeme s celým portom PORTD súčasne a neovládame ho po bitoch. Displej je so spoločnými anódami, preto zapojíme jednu spoločnú anódu (napr CA4) na +5V a spíname jednotlivé segmenty do nuly (ak majú svietiť), resp. do log. 1 (ak svietiť nemajú). Segmenty sú pripojené k výstupom procesora cez ochranné rezistory. Videl som aj riešenie, kde bol rezistor len jeden - medzi +5V a CA4, tam sa ale potom mení intenzita svitu LED podľa počtu rozsvietených segmentov. Ja som si vybral vhodné písmená - E, F, C a I - ktoré potrebujú len 5 zo 7 segmentov (a a b sú nevyužité), čo mi umožnilo pripojiť displej k portu D, pričom zapojenie nekoliduje so sériovým rozhraním na PORTD.0 a PORTD.1 Samotné zapojenie a poradie segmentov nie je veľmi usporiadané na schéme, ale na doštičke sa mi to takto najľahšie zapojilo a bez križovania vodičov.
Pre zadanie C2 si treba vybrať iné vhodné číslice (napr. 1,4 a 9) a prispôsobiť tomu zapojenie aj bitové masky, ale v princípe je to to isté. Fakt, že displej má spoločnú anódu a preto spínanie jednotlivých segmentov vyžaduje nastaviť na výstup log. 0 (a pre zhasnutie naopak log.1) spôsoboval mnohým problém.

Ak sa zo schémy zapojenia neviete celkom zorientovať, možno vám pomôže fotografia zapojenia priamo na doštičke.

Algoritmus a program
Algoritmus je celkom minimalizovaný, pre krátkosť času nezavádzame ani symbolické názvy výstupov, priamo ovládame jednotlivé segmenty. Rozsvietenie daného znaku sa vždy udeje na dva kroky: najprv zhasneme všetky segmenty a potom rozsvietime tie, ktoré potrebujeme. Takto môžeme pracovať s celým portom naraz a nemusíme sa trápiť po bitoch. Pre zadanie C2 treba pomeniť bitové masky pre jednotlivé číslice. Zvyšok kódu ostane bezo zmeny.
Pre zadanie C2 si treba vybrať iné vhodné číslice (napr. 1,4 a 9) a prispôsobiť tomu zapojenie aj bitové masky, ale v princípe je program rovnaký.
/*
* Priklad riesenia ulohy C1 resp. C2
*/
#include <avr/io.h>
#include "uart.h"
#include <stdio.h>
FILE mystdout = FDEV_SETUP_STREAM(uart_putc, uart_getc, _FDEV_SETUP_WRITE);
int main(void)
{
/* inicializacia portov */
DDRD = 0b11111000; // najvyssich 5 bitov je vystup, spodne tri nechame tak.
hw_init();
uart_init();
stdout = &mystdout; // printf() works from now
printf("Stlac C, E, F alebo I: \n");
while(1)
{
switch (uart_getc() )
{
case 'E':
PORTD = PORTD | 0b11111111;
PORTD = PORTD & 0b00000111; /* Letter E */
break;
case 'F':
PORTD = PORTD | 0b11111111;
PORTD = PORTD & 0b00010111; /* Letter F */
break;
case 'C':
PORTD = PORTD | 0b11111111;
PORTD = PORTD & 0b00001111; /* Letter C */
break;
case 'I':
PORTD = PORTD | 0b11111111;
PORTD = PORTD & 0b01011111; /* Letter I */
break;
default:
PORTD = PORTD | 0b11111111; /* Zhasni vsetko */
break;
}
}
return(0);
}
Overenie
Takto jednoduchý program fungoval na prvý raz, pozrite sa na video.
