Připojení sedmisegmentového displeje přes 74HCT595 - řešení v C

Z MAM wiki

Přejít na: navigace, hledání

V této úloze realizujeme připojení sedmisegmentového displeje přes 74HC595 v jazyce C. Předchozí úlohu ale vylepšíme. Na displeji se budou periodicky střídat znaky 0, 1, 2, ... F, interval mezi zobrazením jednotlivých znaků budeme řídit z klávesnice stisky tlačítek 0 ... 9. Čísla 1 ... 9 určují interval v desetinách sekundy, 0 zastaví displej. Části kódu v C víceméně kopírují předchozí úlohy; v pípadě ovládání klávesnice jsou ale neaktivní řádky uvedeny do třetího stavu, namísto logické 1, aby nedošlo k eventuálnímu poškození procesoru při současném stisku několika kláves.

Obsah

[editovat] Konfigurace přerušení

Pro ovládání klávesnice budeme opět používat přerušení, vyvolané změnou logické úrovně na vstupních pinech portu, na který jsou připojeny sloupce klávesnice. Toto řešení má své nevýhody (je to pin change interrupt, který je vyvolán při změně logické úrovně, tedy pro každý stisk tlačítka dvakrát). Je to ale jednoduché řešení, kdy můžeme procesor uvést do režimu úspory energie. To ale můžeme i při periodickém testování klávesnice, spouštěném časovačem. V jazyku C nedefinujeme tabulku vektorů přerušení, to za nás udělá překladač. Rutinu obsluhy přerušení definujeme makrem

ISR(PCINT1_vect)
{
  // zde je kód rutiny obsluhy přerušení
}

(pro pin change interrupt)

a

ISR(TIMER1_COMPA_vect)
{
  // zde je kód rutiny obsluhy přerušení
}

(pro časovač). Makro ISR definuje rutinu obsluhy přerušení, xxx_vect je vektor obsluhy přerušení (tedy symbolické jméno určující přerušení, které má kód obsloužit). Další používaná makra a parametry jsou popsány zde. Nesmíme samozřejmě zapomenout vložit patřičnou knihovnu.

#include <avr/interrupt.h>

[editovat] Režim spánku

Požadovaný režim spánku nastavíme voláním makra set_sleep_mode(SLEEP_MODE_xxx). Procesor poté uspíme voláním makra sleep_mode(); Podrobnosti jsou posány zde. Nesmíme samozřejmě zapomenout vložit patřičnou knihovnu.

#include <avr/sleep.h>


[editovat] Kód

Zdrojový kód je k dispozici na serveru Moodle. Detaily (konfigurace portů, časovače, ...) bude vysvětlena na cvičení.


[editovat] Co se ještě může hodit

Pokud bychom chtěli k našemu kódu v C přidat již hotový kód v asembleru, nemůžeme jednoduše použít často užívanou direktivu _asm. Překladač sice tuto direktivu podporuje, ale poněkud komplikovaně. Na stránkách AVR Libc Home Page je příklad, jak číst hodnotu z portu D:

asm("in %0, %1" : "=r" (value) : "I" (_SFR_IO_ADDR(PORTD)) );

Na uvedené stránce najdete podrobné vysvětlení. Mnohem jednodušší je vložit asemblerovský kód do samostatného souboru. Tedy např.:

// toto je hlavní soubor s kódem v jazyce C
extern int eeprom_diff_val(uint16_t address);  // deklarace funkce v asembleru
int main(void) {
	volatile int x;
	x = eeprom_diff_val (0x0123);  // volání funkce v asembleru
	...
}

; toto je samostatný soubor - asembler
.global eeprom_diff_val  ; deklarace funkce
eeprom_diff_val:         ; návěští, které musí být stejné, jako jméno funkce
; zde je kód v asembleru

Pro volání kódu v asembleru je potřeba vědět, jak si C a asembler vyměňuje data. Tento popis najdete zde.

Osobní nástroje