FAKULTA ELEKTROTECHNIKY A KOMUNIKAČNÍCH TECHNOLOGIÍ VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ
AVR ovladač pro obvod STV5730A, obvod pro vkládání textu do videa
Autoři projektu:
Ondřej Kožín Tomáš Kreuzwieser Marek Wagner
BRNO 8.1.2003
2
AVR STV5730A
FEKT VUT BRNO
1 Úvod Cílem tohoto projektu bylo navrhnout a realizovat jednoduchý obvod pro vkládání textu do videosignálu. Vlastní řešení probíhalo jak po stránce hardwarové, tak i softwarové. Obvod s čipem STV5730A byl dodán k dispozici. Naším cílem bylo tedy uspokojivě vyřešit vlastní komunikaci mezi obvodem STV5730A a procesorem rodiny ATMEL AVR, v našem případě AT90S2313. Dále pak vyřešit komunikaci mikrokontroleru s počítačem PC pomocí sériového rozhraní RS232 a návrh vlastního softwaru pro ovládání RS232 ze strany PC. Pozn. Tento text nemá nahrazovat datasheet k STV5730A, slouží jako přehled toho, co se podařilo nebo nepodařilo realizovat popř. jak se to podařilo realizovat. Pokud je v textu uveden odkaz na manuál, je tím myšlen 20ti stránkový datasheet pro SGS-THOMSON STV5730A.[7]
Celková koncepce vypadá následovně: 1/ uživatel zadá na PC v námi vytvořeném programu vstup, který požaduje zobrazit na obrazovce 2/ software v PC přes sériovou linku předá požadovaná data procesoru AVR 3/ procesor AVR zajistí komunikaci a obsluhu STV5730A a tento následovně provede vlastní vložení textu do videosignálu
3
AVR STV5730A
FEKT VUT BRNO
2 Software AVR Komunikace AVR, STV5730A Komunikace s STV5730A probíhá pomocí třívodičové synchronní sběrnice: DATA, CLK, CSN, kde DATA = datová sběrnice CLK = hodiny CSN = chip select V našem případě byly tyto tři signály vyvedeny na port B procesoru AT90S2313. Podrobnější popis viz. část hardware. Popis komunikace 1) Před započetím zápisu dat na STV5730A je nutné jej nejdříve inicializovat následujícím způsobem: Vyslat na STV5730A : 3000H //RESET 3000H //RESET 00dbH //INICIALIZACE 1000H //INICIALIZACE 2) Dále je nutno nastavit kontrol registry, tzn. určit, jak se bude text zobrazovat. Do kontrol registrů je možno zapisovat dvěma způsoby. Sekvenčně – nastavím první pointer pro zoom registr a pro další registry (color, control atd.) již pointery neuvádím a posílám pouze hodnoty pro nastavení těchto registrů - je nutno respektovat pořadí registrů. Druhým způsobem je individuální přístup k registrům, to znamená že pro každý registr zvlášt vždy nastavím pointer a následně pošlu hodnotu, na kterou jej chci inicializovat. Nemusím zachovávat pořadí registrů. My jsme zvolili sekvenční přístup k registrům. Je nutno nastavit ZOOM, COLOR, CONTROL, POSITION, MODE registry. 3) nastavit řádkové atributy = např.posunutí stránky vlevo, vpravo... viz. datasheet k STV5730A 4) nastavit RAM atributy = pointer a data, tzn. co a kde se má na stránce zobrazovat. Popis programu pro AVR AT90S2313 Popis funkcí: Vlastní ovládání stavů jednotlivých vodičů sběrnice (DATA, CLK, CSN) je realizováno pomocí 3 funkcí. void Sda(uint8_t state2) void Clk(uint8_t state1) -
nastavuje stav pro DATA vodič nastavuje stav pro CLOCK vodič
4
AVR STV5730A
FEKT VUT BRNO
void Csn(uint8_t state0) - nastavuje stav pro CHIP_SELECT vodič Př. Chci-li uvést vodič DATA (pin_2 portu B) do stavu logické jedničky, volám fci. Sda(1), pro logickou nulu fci. Sda(0) void Pause(void) -
slouží pro zajištění nutných časových prodlev, viz. časování sběrnice manuál str.5
void Send(uint16_t Data) - realizuje vlastní odeslání hodnoty v proměnné typu word a to následujícím způsobem (viz. také datasheet k STV5730A na str.12): a) začátek přenosu - Clk(1); Csn(0); Clk(0); b) odeslání 16 datových bitů - logická 1: Sda(1); Clk(0); Clk(1); - logická 0: Sda(0); Clk(0); Clk(1); c) ukončení přenosu -Clk(1); Csn(1); Vše samozřejmě s příslušným časovým zpožděním. (manuál str. 5) void InitSTV(void) – provádí reset, inicializaci, nastavení kontrol registrů, nastavení řádkových atributů void ClrScr(void) – smaže obrazovku, tzn. zapíše na všechny pozice na obrazovce prázdný znak 0bH, viz. str.18 manuálu, nutno brát v úvahu, že smazání celé obrazovky trvá relativně dlouho. void uart_init(void) – inicializace rozhraní UART mikroprocesoru AVR, nastavení rychlosti přenosu, v našem případě přenosová rychlost 9600 baud void uart_send(uint8_t *buf) – realizuje zapsání prvního Bytu dat, která chceme poslat přes UART do počítače (přes MAX232), do registru UDR. Následuje volání fce SIGNAL(SIG_UART_TRANS) SIGNAL(SIG_UART_TRANS) – vysílá v přerušovacím režimu data na UART Byte po Bytu. SIGNAL(SIG_UART_RECV) – příjem Bytu z UARTu v přerušovacím režimu, zjištění typu přijatého znaku, reakce na požadovanou událost, vykonání příkazu pro ovládání STV. void GotoXY(uint8_t X, uint8_t Y) – nastaví write pointer na požadovanou pozici, tzn. na pozici kam bude zapsán příští znak. void WriteCharXY(char c, uint8_t X, uint8_t Y) – konverze znaku z ASCII na kódování používané STV5730A, viz. str.18 manuálu, následné vyslání znaku na STV void CR(char character) – ošetření stavů pro klávesu backspace (skok na předchozí řádek, stav v počátku x=0, y=0)
5
AVR STV5730A
FEKT VUT BRNO
Popis příkazů pro ovládání STV5730 z klávesnice počítače Příkaz začíná vždy lomítkem „\“ za lomítkem musí následovat jeden z následujících znaků: ‘x‘ – nastavování horizontální souřadnice, za tímto znakem musí bezprostředně následovat dva znaky udávající polohu, např. ‘\x10’ nastaví horizontální pozici na x=10 ‘y‘ – nastavování vertikální souřadnice, za tímto znakem musí bezprostředně následovat dva znaky udávající polohu, např. ‘\y05’ nastaví vertikální pozici na y=5 ‘c‘ – clear screen, tedy příkaz ‘\c’ smaže obrazovku Dále pak k ovládání pohybu po obrazovce slouží následující klávesy: Enter – odřádkování Backspace – smaže předchozí znak Space – vloží mezeru Co se povedlo a co se nepovedlo 1)Reset a inicializace – bez problémů. 2)Nastavení kontrol registrů: ZOOM registr - funguje vše COLOR registr - v mixed modu nastavení barev nefungovalo vůbec CONTROL registr - mixed mod funguje (do videosignálu přimíchávám text), full page nebyl testován POSITION registr - funguje vertikální i horizontální nastavení pozice MODE registr- požadované a nastavené hodnoty fungovaly, zbytek nebyl testován 3)Nastavení row atributů: funguje vše 4)Nastavení RAM atributů: bez problémů Výpis programu v jazyce C pro procesor AVR #include
#include #include <signal.h> /* Pin_2 - data */ /* Pin_1 - clock */ /* Pin_0 - chip select */ /*---------------------- prototypy fci --------------------------*/ void InitSTV(void); void Send(uint16_t data); void Pause(void); void GotoXY(uint8_t X, uint8_t Y); void Write(char character,char attr); void WriteCharXY(char c, uint8_t X, uint8_t Y);
6 void void void void
AVR STV5730A
FEKT VUT BRNO
InitTCNT0(void); ClrScr(void); CR(char character); uart_send(uint8_t *buf);
void Sda(uint8_t state2); void Clk(uint8_t state1); void Csn(uint8_t state0); /* globalni promenne */ int8_t volatile Char_Counter = 0; int8_t volatile Line_Counter = 0; uint8_t volatile prikaz = 0; uint8_t volatile ctem_parametr = 0; uint8_t volatile typ_parametru = 0; uint8_t volatile cisla[2] = {0,0}; /* uart globals */ static volatile uint8_t *uart_data_ptr; static volatile uint8_t uart_counter; #define F_CPU #define UART_BAUD_RATE
10000000 9600
/* 10Mhz */ /* baudrate 9600 */
/*----------------Přerušení od UART-vysilani-----------------------*/ SIGNAL(SIG_UART_TRANS) /* signal handler for uart txd ready interrupt */ { uart_data_ptr++; if (--uart_counter) outp(*uart_data_ptr, UDR); /* write byte to data buffer */ } /*----------------Přerušení od UART-prijem------------------------*/ SIGNAL(SIG_UART_RECV) { uint8_t volatile Character = 0; Character=inp(UDR); if (ctem_parametr) { cisla[ctem_parametr-1]=Character-48; /*prevod charu na cislo*/ ctem_parametr++; if (ctem_parametr==3) //nacetli jsme dve cisla parametru { switch (typ_parametru) { case 'x': { Char_Counter=cisla[0]*10+cisla[1]; GotoXY(Char_Counter,Line_Counter); break; } case 'y': { Line_Counter=cisla[0]*10+cisla[1]; GotoXY(Char_Counter,Line_Counter); break; } }
7
AVR STV5730A
} else {
Line_Counter=0;
}
FEKT VUT BRNO
ctem_parametr=0; prikaz=0;
if (prikaz) /* nasleduje prikaz */ { typ_parametru=Character; switch (Character) { case 'c': { ClrScr(); prikaz=0; break; } case 'x': { ctem_parametr=1; break; } case 'y': { ctem_parametr=1; break; } case '\\': { CR(Character); prikaz=0; ctem_parametr=0; break; } default: { prikaz=0; break; } } } else { if (Character=='\\') { prikaz=1; } else { if (Character==0xD) //enter { Line_Counter++; Char_Counter=0; if (Line_Counter>10) } else if (Character==0x8) //backspace { Char_Counter--;
8
AVR STV5730A
',Char_Counter,Line_Counter);
}
}
}
}
FEKT VUT BRNO
if (Char_Counter<0) { if (Line_Counter>0) Char_Counter=27; else Char_Counter=0; Line_Counter--; } if (Line_Counter<0) { Line_Counter=0; } WriteCharXY(' } else CR(Character);
/*----------------inicializace UARTa---------------------------*/ void uart_init(void) /* initialize uart */ { /* enable RxD/TxD and ints */ outp((1< to uart */ { if (!uart_counter) { /* write first byte to data buffer */ uart_data_ptr = buf; uart_counter = strlen(buf); outp(*buf, UDR); } } /*--------------------------------------------------------------*/ void Write(char character, char attr) { Send(0x1000 | character | (unsigned int)attr<<8); /* 0x0080=blikani */ /* 0x0800=pozadi */ } /*--------------------------------------------------------------*/ void CR(char character) { if (Char_Counter>27) { Char_Counter=0; Line_Counter++; } if (Line_Counter>10)
9
AVR STV5730A
FEKT VUT BRNO
{
}
Line_Counter=0; } WriteCharXY(character,Char_Counter,Line_Counter); Char_Counter++;
/*--------------------------------------------------------------*/ void WriteCharXY(char c, uint8_t X, uint8_t Y) { char c2=0x70; /* znak "?" */ GotoXY(X, Y); if ((c>47) && (c<58)) /* cislice */ c2=c-48; if ((c>64) && (c<91)) /* velka pismena */ c2=c-53; if ((c>96) && (c<123)) /* mala pismena */ c2=c-55; if (c==0x20) /* mezera */ c2=0x0B; if (c==':') /* dvojtecka */ c2=0x26; if (c=='.') /* tecka */ c2=0x27; if (c=='/') /* unixove lomitko */ c2=0x28; if (c=='\\') /* widlove lomitko, lepsi neco nes nic */ c2=0x28; if (c=='\'') /* uvozovka ' */ c2=0x29; if (c=='"') /* uvozovka ' */ c2=0x29; if (c=='+') /* plus */ c2=0x5E; if (c=='*') /* krat */ c2=0x5F; Write(c2,0x00); } /*--------------------------------------------------------------*/ void ClrScr(void) { int i,j; for (i=0;i<28;i++) { for (j=0;j<11;j++) { Send(256*j+i); /* write pointer */ Send(0x100B); /* write character " " */ } } GotoXY(0,0); } /*------------------Nastavení na příslušnou pozici---------------*/ void GotoXY(uint8_t X, uint8_t Y) { Send(Y*256 + X); /* write pointer */ Char_Counter=X; Line_Counter=Y; }
10
AVR STV5730A
FEKT VUT BRNO
/*---------------------Zpoždění----------------------------------*/ void Pause(void) { asm volatile ("NOP; NOP; NOP; NOP;"::); } /*-------------------Ovládání signálů----------------------------*/ void Sda(uint8_t state2) { if (state2) sbi (PORTB, 2); else cbi (PORTB, 2); } void Clk(uint8_t state1) { if (state1) sbi (PORTB, 1); else cbi (PORTB, 1); } void Csn(uint8_t state0) { if (state0) sbi (PORTB, 0); else cbi (PORTB, 0); } /*----------------------------InitSTV---------------------------*/ void InitSTV(void) { uint8_t i=0; outp(0x07, DDRB); jako input */ outp(0x07, PORTB); pocatecni stav 3-wire busu */ Pause(); Send(0x3000); Send(0x3000); Send(0x00db); Send(0x1000);
/* 3 LSB piny PortuC jako output, zbytek
Send(0x00cc);
/* Init registers (point to register 12)
*/
Send(0x1000); Send(0x1C24); characterbackg=blue */ Send(0x1bd4); Send(0x15a1); */ Send(0x183e); Send(0x00C0); for (i=0;i<11;i++) { Send(0x10C4); }
/* csn,clk,sda = high --> Nastavi /* Init STV5730, RESET & INITIALIZE */
/* nastav na Zoom registr */ /* Color -- screenbackg=red, /* Control */ /* Position = 33 horizontal, 22 vertical /* Mode */ /* Set row attributes */
11
AVR STV5730A
FEKT VUT BRNO
} /*--------------------------Send----------------------------*/ void Send(uint16_t Data) { uint8_t pbit; /* begin of startcommunication */ Pause(); Clk(1); Pause(); Csn(0); Pause(); Clk(0); Pause(); /* end of startcommunication */ for (pbit=0;pbit<16;pbit++) /* posli word */ { if (((Data)&(0x8000))) /* test na jednicku v MSb */ { /* 1 */ Pause(); Sda(1); Clk(0); Pause(); Clk(1); Pause(); } else { /* 0 */ Pause(); Sda(0); Clk(0); Pause(); Clk(1); Pause(); } Data<<=1;/* shift doleva */ } /* start komunikace */ Pause(); Clk(1); Pause(); Csn(1); Pause(); /* konec komunikace */
} /*--------------------------main----------------------------*/ int main(void) { InitSTV(); /* Inicializuj STV */ ClrScr(); uart_init(); sei(); /* enable interrupts */ uart_send("\n\rAVR Titulkovac\n\r(c) 2002 Tomas Kreuzwieser, Ondrej Kozin, Marek Wagner\n\r"); for(;;); /* nekonecna smycka */ return 0; }
12
AVR STV5730A
FEKT VUT BRNO
Překlad a download do procesoru AVR Překlad probíhá pomocí GNU GCC kompilátoru. Vlastní download do procesoru AVR pak pomocí PONY-PROGu.
13
AVR STV5730A
FEKT VUT BRNO
3 Hardware Deska titulkovače Ve funkci obvodu pro směšování video signálu a titulků je použit obvod STV5730A Tento čip je PAL i NTSC kompatibilní, v našem případě se jako nejvhodnější zdroj signálu osvědčil PAL/F, což je originální francouzský PAL. Jako zdroj signálu jsme používali grafickou kartu počítače (výstup S-Video) a pro zobrazování LCD televizi Lenco. Zapojení STV obvodu vychází z katalogového zapojení zmiňovaném v STV5730.pdf. Je jen částečně modifikované. Toto zapojení generuje titulky na základě údajů z ovládacího modulu pomocí 3bitové sběrnice. Tato sběrnice je tvořena pomocí klasické I2C komunikace a navíc pomocí chip-select signálu. Jako budiče vstupních a výstupních vodičů je použit IO SN7407, což je čtveřice neinvertujících jednovstupových hradel. Ovládací deska s AVR Cílem této desky je jednak přijímat a odesílat data z a do počítače přes sériový port prostřednictvím obvodu Maxim MAX232, což je převodník úrovně z/na 5V a jednak ovládat činnost desky titulkovače. Jako základ ovládací desky titulkovače byl zvolen uP Atmel AT89S2313 s RISCovou architekturou AVR a možností ISP programování. Hodinová frekvence tohoto obvodu je určena krystalem 10MHz. Z této frekvence se poměrně dobře odvozuje přenosová rychlost 9600 bps pro sériový port. Pro připojení desky titulkovače jsou použity piny 0, 1 a 2 brány PB ve své primární funkci. DATA CLK CSN
datová sběrnice hodiny chip select
Programátor Pro programování AVR byl použit ISP programátor na paralelní port podle schématu na HW Serveru. Zapojení konektoru bylo následující: Název AVR Pin AVR
Název na desce
PIN na desce
MOSI MISO SCK RESET GND VCC
MOSI MISO SCK RESET GND PROGRAMÁTORU UCC PROGRAMÁTORU
1 2 3 4 5 6
17 18 19 1 10 20
14
AVR STV5730A
FEKT VUT BRNO
Zapojení programátoru k AT90S2313 Vzájemné propojení Propojení s počítačem je realizováno pomocí dvouvodičového (tří, když počítáme i GND RS232) kabelu. Při propojování této desky s počítačem bude s největší pravděpodobností použit křížený RS232 kabel, proto je nutné dbát na správné propojení TX a RX. V našem případě byl použit křížený propojovací kabel k UPS, proto jsme použili tyto signály Název AVR TXD RXD GND
Pin AVR 2* 3* 10
Název na desce TX RX GND RS232
PIN na desce 7 8 10
* 5V logika
blokové schéma propojení jednotlivých částí
15
AVR STV5730A
FEKT VUT BRNO
Zapojení konektorů
Konektor pro připojení desky titulkovače a pro připojení desky programátoru a RS232
16
AVR STV5730A
FEKT VUT BRNO
Pouzdra použitých obvodů
AT90S2313
MAX232
SN7407
17
AVR STV5730A
Zapojení desky s AVR
FEKT VUT BRNO
18
AVR STV5730A
FEKT VUT BRNO
4 Software pro MS Windows Funkce Ovládací program má za úkol demonstrovat možnosti a funkčnost titulkovače. Nemá konkrétní využití. Dá se použít ve dvou režimech funkce. První je, že se psaný text přímo zobrazuje na televizní obrazovce. Druhý umožňuje poslat na obrazovku textový soubor. V obou režimech je možno zadávat řídící příkazy \xXX, \yXX, \c, \\. Po spuštění programu se automaticky inicializuje port COM2 s příslušnými (parametry 9600bps, 8 datových bitů, jeden stop bit). Vzhled Základní obrazovka programu obsahuje terminál, do kterého je možné přímo psát text nebo řídící příkazy, dále obsahuje tlačítka pro smazání obrazovky (\c), tlačítka pro nastavení pozice kurzoru na obrazovce a tlačítko test, pro výpis přednastaveného textu. Základní obrazovka také obsahuje listbox na výběr portu a stavový řádek s nastavenými parametry. Menu soubor umožňuje posíláni souborů a smazání terminálového okna. V menu konfigurace je nastavení vybraného portu. Program Zdrojový text byl napsán v programovacím prostředí Borland Delphi 6 a pro komunikaci přes RS232 používá komponentu asyncfree.
Obrazovka ovládacího programu titulkovače Odkazy [1] AVR Studio [2] AVR GCC [3] Atmel [4] PonyProg [5] HW Server [6] PIC projekt [7] STV5730A [8] AsyncFree
http://www.atmel.com/atmel/products/prod203.htm http://gcc.gnu.org , http://combio.de/avr/ http://www.atmel.com http://www.lancos.com/prog.html http://www.hw.cz http://www.stv5730a.co.uk/ http://f5ad.free.fr/Docs_Composants/STV5730A.pdf http://delphree.clexpert.com/pages/projects/asyncfree/default.htm