Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision

Target

Select target project
  • ok1kvk.cz/content
  • isbl/content
  • david.gerner/content
3 results
Select Git revision
Show changes
Showing
with 811 additions and 0 deletions
content/articles/2012/a1-contest-2012/03.jpg

129 B

+++
title = "A1 Contest 2012"
tags = ["Závody", "VHF", "Rozbité články"]
published = "2012-11-06T12:59:00.000Z"
author = "Míra, OK7KM"
perex_e = "
Na rozdíl od loňského A1 kontestu, který proběhl za nezvykle krásného počasí, jsme si letos užili asi jako všichni, kdo vyrazili do hor, spoustu deště, trochu sněhu, ale hlavně hodně větru. Po loňském poměrně úspěšném ukončení 2m závodní sezóny A1 kontestem, kdy se nám podařilo překonat náš klubový rekord, byla naše očekávání hodně vysoká, ale člověk míní a příroda mění. Namlsáni výsledky loňského A1 kontestu jsme do letošního závodu šli s velkým očekáváním, které se však nenaplnilo. Více o našem závodění se dočtete uvnitř článku.
"
+++
Na rozdíl od loňského A1 kontestu, který proběhl za nezvykle krásného počasí, jsme si letos užili asi jako všichni, kdo vyrazili do hor, spoustu deště, trochu sněhu, ale hlavně hodně větru. Po loňském poměrně úspěšném ukončení 2m závodní sezóny A1 kontestem, kdy se nám podařilo překonat náš klubový rekord, byla naše očekávání hodně vysoká, ale člověk míní a příroda mění. Namlsáni výsledky loňského A1 kontestu jsme do letošního závodu šli s velkým očekáváním, které se však nenaplnilo. Více o našem závodění se dočtete uvnitř článku.
Na Blaťák vyrazil jako první Vláďa OK1FIK už v pátek brzo ráno, aby za pomoci plošiny demontoval z 15m výsuvného stožáru KV jednopásmové yaginy na 14 m a 20 m. Tím se tento stožár uvolnil pro dvojče 8 el. 2m DK7ZB a KV tribander. Na kopci bylo docela dost sněhu a nepříjemné větrné počasí. Jako obvykle, Vláďa vše připravil na příjezd ostatních posil, aby přijeli do příjemně vyhřáté chaty. Před obědem dorazili Jirka UBO s Vencou VKQ. Po krátké debatě jsme se vrhli na demontáž tribanderu z 19m stožáru a jeho namontování na 15m stožár. Nad něj jsme namontovali opravené dvojče 2m 8el. DK7ZB. I pro něj jsme měli připravený PA a LNA se sdružovačem, ale díky různým problémům nakonec zůstalo dvojče nezapojené. Páteční venkovní práce jsme ukončili osazením 2x18 el. M2 na 19m RDM 6 stožár, a po změření jsme ho schválili, jako schopné provozu. V chatě zatím Vláďa OK1FIK pomalu vybaloval vše, co bylo potřeba pro vysílací pracoviště, a připravoval ostatní nezbytnosti pro závod. Jakmile jsme se přesunuli do chaty, tak se naplno projevil hlad a žízeň, protože dokud bylo trochu vidět, tak jsme se snažili dokončit veškeré venkovní práce a na jídlo a pití nebyl čas. V komorním prostředí příjemně vyhřáté chaty jsme shodili promočené pracovní oblečení a s veškerou vervou se vrhli na jídlo a pití. Mezitím se k nám připojili další operátoři a kamarádi - Pavel OK1AW, Míra OK1DUB a Honza OK5XM. Za družného hovoru jsme také udělali i nějakou tu práci. Honza si přivezl PEP wattmetr, který se nám nakonec i podařilo nastavit za pomoci nově resuscituovaného třicet let starého PA s elektronkou 4CX250\. Předzávodní porada nám vydržela do pozdních nočních i ranních hodin.V sobotu ráno sice přestalo pršet, ale foukalo jako o život. Za tohoto počasí jsme rozvinuli kotvy pro 19m stožár a za hodinu nebylo co dělat. Stožár jsme ale nevysunuli do plné výšky, protože jsme si to prostě nedovolili kvůli silnému větru s nárazy o rychlosti přes 20 m/s. Na řadě byla instalace vysílacího zařízení a ostatní bižuterie. První zádrhel se objevil, když nešel zapnout PA s GS31B. Závada byla velmi rychle objevena, ale s opravou to už bylo slabší. Z nějakého důvodu nebyl funkční spínaný zdroj pro žhavení elektronky a bez něj nejde nahodit další ovládání PA. Nakonec nás zachránil Roman OK1VTV, který přijel na BV uvést do provozu infračervené reflektory webové kamery na BV. Na dotaz zda nemá náhodou u sebe 12V zdroj 5 A, tak mi odpověděl: „ … a jaký by to měl být, větší, menší nebo na DIN lištu?“.
Takže po jednoduchém zadrátování byl PA funkční. Přesto nedával žádný výkon. Podezření padlo na tranzistorový budič, který od posledního závodu z nějakého důvodu také přestal fungovat. Asi prostředí s vysokou vlhkostí, mrazem a se zvýšenou bleskovou činností citlivějším polovodičovým zařízením nedělá dobře..V sobotu dopoledne nás přijel podpořit a zkontrolovat náš dlouholetý bývalý VO a anténní guru Gerhard OK1GP. Během dopoledne dorazil rovněž Michal OK1WMR se členy našeho kroužku elektroniky, v jejichž řadách se, doufáme, objeví noví operátoři radioklubu. Chvíli po jejich příjezdu jsme nakonec zprovoznili skoro všechno zařízení, jen ten čtvrtý směr se nepodařilo dát dohromady, protože jsme PA s 4CX250 použili jako budič pro další PA. Nastal tedy čas na poslech majáků a byla to slabota:PI7CIS, 144,416 Mhz, QRB 614 km, QTF 291° - 4x10 el. +LNA – jen občas slabě slyšitelný na úrovni šumu
OZ7IGY, 144,471 Mhz, QRB 571 km, QTF 354°- 4x10 el. +LNA – ani stopa po signálu
ON0VHF, 144,418 Mhz, QRB 578 km. QTF 276° - 4x10 el. +LNA – jen občas slabě slyšitelný na úrovni šumu
DB0JT, 144,428 Mhz, QRB 289 km, QTF 180° - 2x18 el. +LNA – výborně slyšitelný, 20 dB nad šumemBylo nám jasné, že západ a sever je v podstatě uzavřený. Na jihovýchod jsme toho také moc neslyšeli, protože dvojče 18 el. M2 bylo díky silnému větru vysunuté jen na úroveň vrcholků stromů mokrého smrkového lesa a bylo to znát.První tři hodiny závodu byl u pastičky Vláďa a závod se rozjížděl velmi zvolna (33 + 27 + 33 QSO/h a 8 + 9 + 11 tis. b/h). Po celou dobu závodu byl pro nás zavřený směr na Z, SZ a S, odkud se velmi obtížně dolovalo jakékoli delší spojení. I přes bídné podmínky šíření (střední Evropou přecházely frontální systémy a troposféra byla hodně rozbitá) se Mírovi DUB díky perfektně fungujícímu technickému vybavení závod líbil - na pásmu se objevovaly QSB roztřepané signály ze severního Německa, signály "rozmazané" ozvěnou způsobenou vícecestným šířením v troposféře z Holandska a Belgie a další zajímavé efekty na CW signálech. I když nešlo o žádné pile-upy, byla to příjemná procházka dvoumetrovým pásmem.
Podmínky se postupně zlepšovaly a jak utichal vítr, tak jsme si dovolili kolem dvaadvacáté hodiny vysunout stožár s dvojčetem 18 el. M2 do plné výše. Začala trochu chodit spojení V a JV. V noci a nad ránem bylo na pásmu vymeteno a při sledování KST Chatu bylo jen vidět, jak všechny stanice na pásmu dávají zoufalé výzvy: „PLS anybody for sked?“. Ráno se situace postupně zlepšila a dalo se dosáhnout počtu spojení přes 10 QSO/h 5 až 7 tis. bodů/h.Dvě hodiny před koncem závodu se ozval z venku hrozivý rachot, a když jsme vyběhli ven, tak jsme jen mohli němě zírat na zlomený 19m výsuvný stožár, který nesl dvojče 18 el. M2 (záznam [web kamery](http://youtu.be/qMjUh2gDkes) z průběhu zlomení stožáru viz [fotogalerie](index.php/fotogalerie/category/122-2012-a1)). V té době za pastičkou seděl Míra DUB, a přestože došlo ke zlomení stožáru se dvěma M2, a současném „zkrácení“ jedné antény ze čtyřčete DK0ZB (způsobeným pádem 2x M2) - soustava měla od té chvíle dva rozštěpené nesymetrické laloky místo jednoho hlavního - tak ještě do konce závodu udělal 2x HB9 a několik DL. Nicméně tím skončily naše naděje na to , že bychom snad mohli překonat loňský rekord, který nám nakonec utekl 9 tisíc bodů.Úroveň rušení byla tentokrát velmi dobrá. Lépe řečeno nikdo v podstatě nerušil, pokud nebudu uvažovat moment a vzájemné nasměrování ANT s blízkými stanicemi. V tomto ohledu to byl celkem pohodový závod.Spojení jsme udělali relativně málo, i průměr bodů/QSO nebyl vysoký (339,2 km/QSO). Celkový výsledek nakonec činil 383 QSO a skoro 130 tis. bodů, ODX YU7ACO z KN05 (870 km). Pokud nebude výrazně vysoká chybovost, tak i přes všechnu smůlu a nepříznivé podmínky to bude jeden z našich nejlepších výsledků na A1 kontestu. Původní touha byla pokořit hranici 500 QSO, ale za panujících podmínek to nebylo vůbec možné. Podmínky šíření byly velmi špatné zejména na západ. V druhé polovině závodu se trochu zlepšil V, JV a J. Přesto delší spojení do tohoto segmentu se nedařila. Oproti loňskému roku nám scházely především DL (- 60 QSO), HB (-7), PA (-3), 9A (-4) a YU (-2) stanice. Nepodařilo se nám udělat ani jedno QSO s G, přestože nás jich pár spotovalo s tím, že jsme velmi dobře slyšitelní. Naopak nás potěšil větší počet OM (+8 QSO), F (+7), OK (+7), I (+5), HA (+3) a zvětšila se i aktivita SP stanic (+7).[![](graf_sm.png)](../upload/ok1-36134/photo/12_11_a1/graf.png)Závěrem chci všem poděkovat za QSO a těšíme se NSL v další sezoně.Značka: **OL7C - JO60JJ - 1044m A.S.L.
**Závod: [A1 Kontest 2012](http://vkvzavody.moravany.com/zavody/a12012/index.php) - [předběžné výsledky](http://www.vhfcontest.net/getlog/gentxtsql.php?zavod=63&country=1)144 MHz - 383 QSO - 129 824 pts, průměr 339,2 km/QSOODX - YU7ACO - KN05 - 870 km
..Vybavení:ANT: 2x 18el. M2@19m, 4x10el. DK7ZB@14m, 8x5el. DK7ZB
RIG: IC756PROIII + TRV Sitno + 3xPA (GU43b, 2xGI7b,GS31b).SW: [Win-Test
](http://www.win-test.com/)![01](01.jpg)![01](02.jpg) [](../upload/ok1-36134/photo/12_07_pd/mraky.jpg) [](../upload/ok1-36134/photo/12_07_pd/nejde.jpg)![01](03.jpg)[Fotogalerie](index.php/fotogalerie/category/122-2012-a1)
content/articles/2012/a1-contest-2012/graf_sm.png

130 B

+++
title = "AVR - LCD panel - #1 Program"
tags = ["Technické články", "Programování", "C/C++", "Rozbité články"]
published = "2012-03-14T07:09:35.000Z"
author = "Michal, OK1WMR"
perex_e = "Kompatibilní zapojení: LCD panel s ATmega8"
+++
Kompatibilní zapojení: LCD panel s ATmega8
Ke stažení: LCD_001.c == LCD_001.pdf == LCD_001.htm
---
```c
/*
Začínáme s novým přípravkem ATmega_lcd_uni, který je vybaven znakovým
LCD displejem a klávesnicí.
LCD displej má zobrazovací kapacitu dva řádky po šestnácti sloupcích (32 znaků)
znaky (písmenka a speciální znaky jsou uložené přímo v paměti displeje a
přibližně odpovídají ASCII tabulce (viz datasheet displeje rc1602b-biw-esx)
Protože je ale výrobci jasné, že by někdo mohl chtít na displeji zobrazovat
i jiné znaky, než které jsou uvedeny v tabulce, ponechal 8 míst volných, kam
si můžeme nahrát vlastní znaky Většinou se tato místa využívají pro písmena
s českou interpunkcí (ta v základní tabulce nejsou)
Klávesnice je tvořena dvěma řadami po třech tlačítkách, což je pro většinu
aplikací dostatečný počet. Navíc je ke každému tlačítku sériově připojena
dioda, a to tak, že lze rozlišit i více stisknutých tlačítek najednou.
Je tedy možné používat dvojhmaty (i "vícehmaty"), což nám rozšiřuje počet
samotných tlačítek o jejich vzájemné kombinace.
*/
/*
Jak už to v programování bývá, první co program napíše, je text "Hello World".
Náš první program tedy bude dělat to samé, ale protože jsme Češi, přidáme
ještě tuto hlášku v češtině.
Nejprve ale musíme do našeho programu vložit rutiny pro komunikaci s displejem,
a soubor s konfigurací pinů mikrokontroléru pro tento přípravek.
jedná se o soubory "atmega_lcd_uni_cfg.c" a "lcd.c".
Soubor "atmega_lcd_uni_cfg.c" obsahuje informace o tom, ke kterým pinům je
připojen displej a ke kterým je připojena klávesnice. Musí být proto vložen
ještě před souborem "lcd.c".
Soubor "lcd.c" obsahuje rutiny pro práci s displejem. Nemusíme se tedy starat
o to jak s displejem komunikovat, ale můžeme již rovnou na něj posílat data
pomocí již hotových funkcí.
Funkce v souboru "lcd.c" jsou:
void lcd_ini (void);//inicializace displeje (nastavení pinů a zahájení komunikace)
void lcd_char (unsigned char dat);//napíše znak pomocí ASCII kódu (písmena, čísla)
void lcd_num3 (unsigned int num,unsigned char znak);//napíše cislo (3 cifry)
void lcd_num2 (unsigned char num,unsigned char znak);//napíše cislo (2 cifry)
```
+++
title = "AVR - LCD panel - #2 Program"
tags = ["Technické články", "Programování", "C/C++", "Rozbité články"]
published = "2012-03-14T07:20:05.000Z"
author = "Michal, OK1WMR"
perex_e = "Kompatibilní zapojení: LCD panel s ATmega8"
+++
Kompatibilní zapojení: LCD panel s ATmega8
Ke stažení: LCD_002.c == LCD_002.pdf == LCD_002.htm
---
```c
/*
Minule jsme na přípravku ATmega_LCD_uni vyzkoušeli displej, a nyní se pokusíme
"oživit" i klávesnici.
*/
/*
Obslužné rutiny pro klávesnici jsou uloženy v souboru "kbd_2x3dm.c". Tento
soubor je opět závislý na konfiguraci uložené v souboru "atmega_lcd_uni_cfg.c"
a je proto nutné, aby soubor "atmega_lcd_uni_cfg.c" byl vložen ještě před
souborem "kbd_2x3dm.c".
Soubor "kbd_2x3dm.c" obsahuje následující dvě rutiny:
void kbd_ini(void) //inicializace klávesnice (nastavení vstupních a výstupních pinů)
unsigned char kbd_read(void) //tato funkce "přečte" klávesnici, kdykoli je
volána, a vrátí hodnotu právě stisknutých tlačítek
Funkce "kbd_read(void)" vrací hodnotu kláves které jsou stisknuty právě v tom
okamžiku, kdy je volána. Pokud tedy chceme na stisk klávesy reagovat okamžitě,
je vhodné tuto funkci volat přibližně 10 - 20 krát za vteřinu.
Jinak by bylapatrná prodleva, kdy je potřeba tlačítko chvíli držet, než si
toho procesor "všimne".
Soubor "kbd_2x3dm.c" také obsahuje dvě zajímavé konstanty, které řídí chování
klávesnice, pokud je tlačítko drženo déle.
Tyto konstanty jsou:
KBD_SKIP
KBD_ACC
Konstanta "KBD_SKIP" určuje, kolik cyklů se má vynechat, pokud je stisknuto
stále totéž tlačítko. To znamená, že když funkce "kbd_read()" zjistí, že je
stisknuto stejné tlačítko (nebo stejná tlačítka), jako když byla volána minule,
vrátí místo hodnoty tohoto tlačítka nulu (jako kdyby nebylo stisknuto žádné
tlačítko). Konstanta "KBD_SKIP" tedy určuje, kolikrát má funkce "kbd_read()"
toto tlačítko ignorovat, než opět vrátí jeho hodnotu.
Pokud je tlačítko drženo i nadále, poté co funkce "kbd_read()" již podruhé
vrátila jeho hodnotu, začíná se uplatňovat konstanta "KBD_ACC". Tato konstanta
určuje, o kolik cyklů se má vynechat méně před každým dalším navrácením hodnoty
téhož tlačítka.
Výsledkem tedy je, že pokud uživatel stiskne a drží tlačítko, vrátí se jeho
hodnota, čeká se podle "KBD_SKIP", znovu se vrátí jeho hodnota, čeká se
o "KBD_ACC" méně, zase se vrátí hodnota, čeká se o další "KBD_ACC" méně,
a tak to jde až do doby, kdy se vrací hodnota drženého tlačítka při každém
cyklu (volání funkce "kbd_read()"), nebo dokud uživatel tlačítko opět neuvolní.
Tato funkce se nazývá "autorepeat" a hodí se například, pokud je potřeba
nastavit nějakou proměnnou ve velkém rozsahu.
*/
/*
Nyní se tedy můžeme pustit do psaní programu. Náš program bude jednoduše
vypisovat kódy stisknutých tlačítek na displej. Tento program bude pro nás
velmi užitečný, protože až budeme později potřebovat, aby program reagoval
na dané tlačítko, budeme potřebovat vědět, jaké číslo (kód) toto tlačítko
představuje.
Čtení klávesnice bude probíhat vždy jednou za 100 ms (10x za vteřinu), což
zajistíme pomocí časovače. pro čtení klávesnice nám bude stačit jednoduchý
časovač TC0\.
Zároveň budeme na displej vypisovat proměnnou "opakovani" která se pokaždé,
když je navrácen kód tlačítka zvýší o jednnu. Je to proměnná typu unsigned
char - bude se tedy zvyšovat jen do 255, protože pak přeteče a začíná
opět od nuly.
*/
#define F_CPU 1000000 // Taktovací frekvence procesoru 1 MHz
#include <avr/io.h> //Knihovna vstupů a výstupů
#include <avr/interrupt.h> //Knihovna přerušení
#include "atmega_lcd_uni_cfg.c" //konfigurace vstupů a výstupů pro přípravek ATmega_lcd_uni
#include "lcd.c" //Obslužné rutiny pro display
#include "kbd_2x3dm.c" //Obslužné rutiny pro klávesnici
#define TCNT0VAL (256-(F_CPU/1024/10))//Hodnota, od které bude časovač
//počítat, než přeteče a vyvolá přerušení.
//256 => maximum čítače + 1 = přetečení
//1024 => dělička,
//10 => přerušení se vyvolá 10x za vteřinu
volatile unsigned char tlacitko=0;//Globální proměnná obsahující kód stisknutého
//tlačítka. Používá se v main() a přerušení.
//vektor přerušení vykoná se vždy když přeteče časovač TC0 (cca 10x za vteřinu)
ISR(TIMER0_OVF_vect)
{
TCNT0=TCNT0VAL; //nastavení hodnoty, od které časovač počítá
//(jinak by počítal od nuly)
tlacitko=kbd_read(); //přečti klávesnici a hodnotu ulož do "tlacitko"
}
int main(void)
{
unsigned char opakovani=0; //proměnná, která se pokaždé po vrácení kódu
//tlačítka zvýší o 1
TCCR0=0B00000101; //zapnout TC0 s předděličkou 1024
setb (TIMSK,0); //povol přerušení při přetečení TC0 (TCNT0==0x100)
SREG |= (1<<7); //povolení globálního přerušení
TCNT0=TCNT0VAL; //resetTC
lcd_ini(); //inicializace displeje (nastavení výstupních pinů a zahájení komunikace)
kbd_ini(); //inicializace klávesnice (nastavení vstupních pinů)
cls(); //smazání displeje
gotoxy(1,1); //kurzor na začátek prvního řádku
lcd_text("Tlacitko:"); //napíšeme text
gotoxy(2,1); //kurzor na začátek druhého řádku
lcd_text("Opakovani:"); //napíšeme text
while(1) //hlavní smyčka
{
if(tlacitko) //pokud je stisknuté nějaké tlačítko ("tlacitko" není nula)
{
gotoxy(1,13); //nastavení kurzoru za text (abychom jej nepřepsali)
lcd_byt(tlacitko); //vypiš kód tlačítka
tlacitko=0; //hodnotu tlačítka už nepotřebujeme
gotoxy(2,13); //nastavení kurzoru za text
lcd_byt(opakovani); //vypiš číslo opakování
opakovani++;
}
}
}
//konec programu
//Pro radioklub OK1KVK naspal Vašek Král
```
+++
title = "AVR - LCD panel - atmega_lcd_uni_cfg.c"
tags = ["Technické články", "Programování", "C/C++", "Rozbité články"]
published = "2012-03-14T06:53:07.000Z"
author = "Michal, OK1WMR"
perex_e = "Kompatibilní zapojení: LCD panel s ATmega8"
+++
Kompatibilní zapojení: LCD panel s ATmega8
Ke stažení: atmega_lcd_uni_cfg.c == atmega_lcd_uni_cfg.pdf == atmega_lcd_uni_cfg.htm
---
```c
/*---------------------------------------------------------------------------
soubor: atmega_lcd_uni_cfg.c
verze: 1.0
datum: 13.1.2012
popis:
Konfigurace pinu displeje a klavesnice na pripravku "ATmega_LCD_uni"
pro rutiny ze souboru:
lcd.c
kbd_2x3dm.c
---------------------------------------------------------------------------*/
//klávesnice
#define DDR_KBD1 DDRC
#define DDR_KBD2 DDRC
#define DDR_KBD3 DDRC
#define PIN_KBD1 PINC
#define PIN_KBD2 PINC
#define PIN_KBD3 PINC
#define PORT_KBD1 PORTC
#define PORT_KBD2 PORTC
#define PORT_KBD3 PORTC
#define KBD1 0
#define KBD2 1
#define KBD3 2
#define DDR_KBDAB DDRB
#define PORT_KBDAB PORTB
#define KBDAB 0
//displej:
#define DDR_D4 DDRD
#define DDR_D5 DDRD
#define DDR_D6 DDRD
#define DDR_D7 DDRD
#define PORT_D4 PORTD
#define PORT_D5 PORTD
#define PORT_D6 PORTD
#define PORT_D7 PORTD
#define DDR_RS DDRD
#define PORT_RS PORTD
#define DDR_EN DDRD
#define PORT_EN PORTD
#define RS 2
#define EN 3
#define D4 4
#define D5 5
#define D6 6
#define D7 7
//eof
//(c) OK1ZKV 2012
```
+++
title = "AVR - LCD panel - kbd_2x3dm.c"
tags = ["Technické články", "Programování", "C/C++", "Rozbité články"]
published = "2012-03-14T06:58:52.000Z"
author = "Michal, OK1WMR"
perex_e = "Kompatibilní zapojení: LCD panel s ATmega8"
+++
Kompatibilní zapojení: LCD panel s ATmega8
Ke stažení: kbd_2x3dm.c == kbd_2x3dm.pdf == kbd_2x3dm.htm
---
```c
/*---------------------------------------------------------------------------
soubor: kbd_2x3dm.c
verze: 1.0
datum: 9.1.2012
popis:
Rutiny pro obsluhu maticove klavesnice 2x3 klavesy.
Prepinani rad klavesnice je rizeno pomoci signalu KBDAB.
Pokud jsou v serii s klavesami zapojeny diody, jsou presne detekovana vsechna
stisknuta tlacitka (umoznuje pouziti dvojhmatu)
rutina kbd_ini() slouzi k inicializaci portu a pinu ke kterym je pripojena klavesnice
rutina kbd_read() precte klavesnici a vrati hodnotu stiskle klavesy (klaves)
- optimalni je spoustet tuto funkci 10 - 20 krat za sekundu
---------------------------------------------------------------------------*/
#ifndef setb //setb = makro ze souboru "wait.c"
#include "wait.c"
#endif
//Defaultni definice portu a pinu, ke kterym je pripojena klavesnice
#ifndef PIN_KBD1
#define PIN_KBD1 PINC
#define PORT_KBD1 PORTC
#define DDR_KBD1 DDRC
#endif
#ifndef PIN_KBD2
#define PIN_KBD2 PINC
#define PORT_KBD2 PORTC
#define DDR_KBD2 DDRC
#endif
#ifndef PIN_KBD3
#define PIN_KBD3 PINC
#define PORT_KBD3 PORTC
#define DDR_KBD3 DDRC
#endif
#ifndef PORT_KBDAB
#define PORT_KBDAB PORTC
#define DDR_KBDAB DDRC
#endif
#ifndef KBD1
#define KBD1 0
#endif
#ifndef KBD2
#define KBD2 1
#endif
#ifndef KBD3
#define KBD3 2
#endif
#ifndef KBDAB
#define KBDAB 3
#endif
//konstanty pro klávesnici:
#ifndef KBD_SKIP
#define KBD_SKIP 20 //pocet vynechanych cyklu mezi opakovanym navracenim
#endif //hodnoty stale stiskleho tlacitka (autorepeat)
#ifndef KBD_ACC
#define KBD_ACC 4 //pocet cyklu, o ktery se zrychluje opakovani (autorepeat)
#endif
//inicializace klavesnice
void kbd_ini(void)
{
clrb(DDR_KBD1,KBD1);
clrb(DDR_KBD2,KBD2);
clrb(DDR_KBD3,KBD3); //tlacitka - vstupy
setb(PORT_KBD1,KBD1);
setb(PORT_KBD2,KBD2);
setb(PORT_KBD3,KBD3); //zapnuti pull-up rezistoru na vstupech
setb(DDR_KBDAB,KBDAB); //prepinani rad klaves - vystup
}
//cteni klavesnice
unsigned char kbd_read(void)
{
static unsigned char klavesa_old=0, cekani=0, zrychleni=0;
unsigned char klavesa=0, i;
clrb(PORT_KBDAB,KBDAB);
for(i=0;i<2;i++) //cyklus probehne dvakrat (2 rady tlacitek)
{
wait_us(5); //cekani (kvuli fyzicke konstrukci klavesnice (parazitni kapacity)
if((PIN_KBD1&(1<<KBD1))==0) //pokud je stisknute tlacitko 1 (na vstupu je log. nula)
setb(klavesa,0+(3*i)); //nastav prislusny bit promenne klavesa
if((PIN_KBD2&(1<<KBD2))==0) //pokud je stisknute tlacitko 2
setb(klavesa,1+(3*i)); //nastav prislusny bit promenne klavesa
if((PIN_KBD3&(1<<KBD3))==0) //pokud je stisknute tlacitko 3
setb(klavesa,2+(3*i)); //nastav prislusny bit promenne klavesa
negb(PORT_KBDAB,KBDAB); //prepni na druhou radu tlacitek
}
if(klavesa>0) //pokud bylo stisknuto nejake tlacitko
{
if(klavesa_old==klavesa) //pokud je stisknuto porad stejne tlacitko
{
if(cekani>KBD_SKIP) //pokud se jiz vynechal dostatecny pocet cyklu
{
cekani=zrychleni; //priste se bude cekat o nekolik cyklu mene
//(pocet je dan aktualni hodnotou promenne "zrychleni")
if(zrychleni<=KBD_SKIP) //pokud jeste ma smysl zrychlovat
zrychleni+=KBD_ACC; //zrychli
return klavesa; //vrat hodnotu klavesy volajici funkci
}
else //pokud se jeste nevynechal dostatecny pocet cyklu
cekani++; //pripocti dalsi vynechany cyklus
}//if(klavesa_old==klavesa)
else //pokud neni stisknuto stejne tlacitko jako minule
{
cekani=0;
zrychleni=0;
klavesa_old=klavesa; //uloz jeho hodnotu pro priste
return klavesa; //a vrat tuto hodnotu volajici funkci
}//else(klavesa_old==klavesa)
}//if(klavesa>0)
else
klavesa_old=0;
return 0;
}
//eof
//(c) OK1ZKV 2012
```
+++
title = "AVR - LCD panel - lcd.c"
tags = ["Technické články", "Programování", "C/C++", "Rozbité články"]
published = "2012-03-14T06:42:07.000Z"
author = "Michal, OK1WMR"
perex_e = "Kompatibilní zapojení: LCD panel s ATmega8"
+++
Kompatibilní zapojení: LCD panel s ATmega8
Ke stažení: lcd.c == lcd.pdf == lcd.htm
---
```c
/*---------------------------------------------------------------------------
soubor: lcd.c
verze: 1.0
datum: 13.1.2012
popis:
Obsluzne rutiny pro displej 2x16 znaku s radicem HD44780
-Komunikace je ctyrbitova (pouzivaji se pouze piny displeje D4 - D7)
-Displej je v rezimu "pouze zapis" (signal "R/W" displeje je uzemen)
-Displej je pripojen k mikrokontroleru pouze signaly: RS, EN a D4 az D7.
Tento soubor vynikl upravou souboru "mojelib.h" jehoz autora bohuzel neznam.
---------------------------------------------------------------------------*/
#include <avr/pgmspace.h> // pgm_read_byte()
#ifndef setb //setb = makro ze souboru "wait.c"
#include "wait.c"
#endif
//Defaultni definice pinu, ke kterym je displej pripojen
#ifndef PORT_RS
#define PORT_RS PORTD
#define DDR_RS DDRD
#endif
#ifndef PORT_EN
#define PORT_EN PORTD
#define DDR_EN DDRD
#endif
#ifndef PORT_D4
#define PORT_D4 PORTD
#define PORT_D5 PORTD
#define PORT_D6 PORTD
#define PORT_D7 PORTD
#define DDR_D4 DDRD
#define DDR_D5 DDRD
#define DDR_D6 DDRD
#define DDR_D7 DDRD
#endif
#ifndef RS
#define RS 2
#endif
#ifndef EN
#define EN 3
#endif
#ifndef D4
#define D4 4
#define D5 5
#define D6 6
#define D7 7
#endif
// Funkce pro displej:
void lcd_ini (void); //inicializace
void lcd_instr(unsigned char ins); //napis instrukci
void lcd_char (unsigned char dat); //napis znak
void lcd_num3 (unsigned int num,unsigned char znak); //napis cislo (3 cifry)
void lcd_num2 (unsigned char num,unsigned char znak);//napis cislo (2 cifry)
```
content/articles/2012/avr-lcd-panel-s-atmega8/01.jpg

131 B

content/articles/2012/avr-lcd-panel-s-atmega8/02.jpg

131 B

File added
File added
File added
File added
+++
title = "AVR - LCD panel s ATmega8"
tags = ["Technické články", "Konstrukce", "Konstrukce s mikroprocesorem", "Rozbité články"]
published = "2012-03-14T06:04:01.000Z"
author = "Michal, OK1WMR"
image = "01.jpg"
perex_e = "Tato konstrukce slouží k dalšímu seznámení s mikroprocesory od firmy
Atmel. Jde o jednoduché zapojení, kde jsme připojili nové rozhraní - LCD
displej. Na jednoduchých příkladech programů budeme postupně pronikat do tajů
jednočipů."
+++
Tato konstrukce slouží k dalšímu seznámení s mikroprocesory od firmy Atmel.
Jde o jednoduché zapojení, kde jsme připojili nové rozhraní - LCD displej.
Na jednoduchých příkladech programů budeme postupně pronikat do tajů
jednočipů.
.
.
Zde můžete najít články a výukové programy s popisem, které budeme zkoušet na tomto zapojení.
**PROGRAMY:**
[LCD_001.c](index.php/koutek-avr/94-kit-2-lcd-panel-s-atmega8-zapojeni-a-programy/529-avr-lcd-panel-1-program)
[LCD_002.c](index.php/koutek-avr/94-kit-2-lcd-panel-s-atmega8-zapojeni-a-programy/530-avr-lcd-panel-2-program)
**Pomocné programy:**
[atmega_lcd_uni_cfg.c](index.php/koutek-avr/94-kit-2-lcd-panel-s-atmega8-zapojeni-a-programy/526-avr-lcd-panel-atmegalcdunicfgc)
[kbd_2x3dm.c](index.php/koutek-avr/94-kit-2-lcd-panel-s-atmega8-zapojeni-a-programy/527-avr-lcd-panel-kbd2x3dmc)
[lcd.c](index.php/koutek-avr/94-kit-2-lcd-panel-s-atmega8-zapojeni-a-programy/525-avr-lcd-panel-lcdc)
[wait.c](index.php/koutek-avr/94-kit-2-lcd-panel-s-atmega8-zapojeni-a-programy/528-avr-lcd-panel-waitc)
![](01.jpg)
Schéma:
![schema](sch.png)
Plošný spoj:
![pcb](pcb.png).
PDF verze: [schéma](LCD_panel_sch.pdf), [plošný spoj 1:1 (100x105mm)](LCD_panel_pcb.pdf), osazovací plán [TOP](LCD_panel_osaz_TOP.pdf) a [BOT](LCD_panel_osaz_BOT.pdf)
Eagle 6.1: [SCH](LCD_panel.sch) a [BRD](LCD_panel.brd) + doporučená [Pájovo](http://paja-trb.unas.cz/elektronika/eagle.html) knihovna součástek [#PaJa_22.lbr](http://paja-trb.unas.cz/elektronika/eagle/paja_lbr_413.zip)
Seznam použitých součástek:
- LCD - displej 16x2 s řadičem HD44780 - [TME.cz](http://www.tme.eu/cz/katalog/?idp=1#cleanParameters%3D1%26md5%3Dtbd5d22cb4e6847d41578d92275a384d9%26search%3DRC1602BB%2B)
- IC1 - ATmega8 - DIL28 - mikroprocesor
- Krabička - konstrukční krabička s bočnicemi - SE100x105mm + 2x FEF100 + 4x vrut M3x25
![](02.jpg).
content/articles/2012/avr-lcd-panel-s-atmega8/pcb.png

130 B

content/articles/2012/avr-lcd-panel-s-atmega8/sch.png

130 B

+++
title = "AVR - LCD panel - wait.c"
tags = ["Technické články", "Programování", "C/C++", "Rozbité články"]
published = "2012-03-14T07:03:37.000Z"
author = "Michal, OK1WMR"
perex_e = "Kompatibilní zapojení: LCD panel s ATmega8"
+++
Kompatibilní zapojení: LCD panel s ATmega8
Ke stažení: wait.c == wait.pdf == wait.htm
---
```c
/*---------------------------------------------------------------------------
soubor: wait.c
verze: 1.0
datum: 9.1.2012
popis:
Cekaci rutiny a makra pro bitove operace
Cekaci rutiny jsou mnohem uspornejsi nez bezne "delay.h"
Tento soubor vynikl ze souboru "mojelib.h" jehoz autora bohuzel neznam.
---------------------------------------------------------------------------*/
// Zmena bitu portu, IO registru nebo promenne:
#define setb(bajt,bit) bajt |= 1<<(bit) //nastav bit
#define clrb(bajt,bit) bajt &= ~(1<<(bit)) //nuluj bit
#define negb(bajt,bit) bajt ^= 1<<(bit) //neguj bit
// Casove smycky:
void wait_ms (unsigned int c); // cekej milisekund(max65553):
void wait_us (unsigned int c); // cekej mikrosekund(max65553):
//cekej milisekund:
unsigned char reg21 = F_CPU / 60000; // F_CPU = frekv. oscilatoru [Hz],
// (vnitrni konstanta prekladace)
void wait_ms (unsigned int c)
{
asm("push r20");
asm("push r21");
asm("_Wms0:");
asm("ldi r20,0x14");
asm("_Wms1:");
asm("lds r21,reg21");
asm("_Wms2:");
asm("dec r21");
asm("brne _Wms2");
asm("dec r20");
asm("brne _Wms1");
asm("dec r24");
asm("brne _Wms0");
asm("dec r25");
asm("brpl _Wms0");
asm("pop r21");
asm("pop r20");
}
//cekej mikrosekund:
unsigned char reg20 = F_CPU / 6000000 + 1;
void wait_us(unsigned int c)
{
asm("push r20");
asm("_wus0:");
asm("lds r20,reg20"); // 1-6MHz: r20=1 6-12MHz: r20=2
asm("_wus1:");
asm("dec r20");
asm("brne _wus1");
asm("dec r24");
asm("brne _wus0");
asm("dec r25");
asm("brpl _wus0");
asm("pop r20");
}
//eof
//(c) OK1ZKV 2012
```
+++
title = "AVR Školička - LEKCE #1"
tags = ["Technické články", "Programování", "C/C++", "Rozbité články"]
published = "2012-01-12T08:54:54.000Z"
author = "Michal, OK1WMR"
perex_e = "LEKCE #1 - Blikáme s LED
PDF verze pro tisk ke stažení zde
Použitý vývojový kit LED panel s ATmega8 + schéma LED panelu
Untitled
&amp;amp;amp;amp;amp;lt;!--
body { color: #000000; background-color: #FFFFFF; }
.cpp1-assembler { }
.cpp1-brackets { }
.cpp1-comment { color: #008000; font-style: italic; }
.cpp1-float { color: #000080; }
.cpp1-hexadecimal { color: #000080; }
.cpp1-character { }
.cpp1-identifier { }
.cpp1-illegalchar { }
.cpp1-number { color: #000080; }
.cpp1-octal { color: #0000FF; }
.cpp1-preprocessor { }
.cpp1-reservedword { font-weight: bold; }
.cpp1-space { color: #008080; }
.cpp1-string { color: #800000; }
.cpp1-symbol { }
--&amp;amp;amp;amp;amp;gt;
#define F_CPU 1000000UL // 1 MHz (základní frekvence) kvůli časování delay.h
#include &lt;avr/io.h&gt; //Knihovna vstupů a výstupů (PORT, DDR, PIN)
#include &lt;util/delay.h&gt; //Knihovna čekacích funkcí (delay=čekej [ms])
int main (void)
{ // zažátek funkce main
DDRB =0xff;
for(;;) // vytvoření nekonečné smyčky
{ //začátek hlavní smyčky
PORTB=0b00000001; // nastav PORT B na 0b00000001
_delay_ms (1000); // počkej 1s
PORTB=0b00000000; // nastav PORT B na 0b00000000
_delay_ms (1000); // počkej 1s
} //konec hlavní smyčky
} //konec funkce main
Vývojový graf programu:
"
+++
LEKCE #1 - Blikáme s LED
PDF verze pro tisk ke stažení zde
Použitý vývojový kit LED panel s ATmega8 + schéma LED panelu
Untitled
&amp;amp;amp;amp;amp;lt;!--
body { color: #000000; background-color: #FFFFFF; }
.cpp1-assembler { }
.cpp1-brackets { }
.cpp1-comment { color: #008000; font-style: italic; }
.cpp1-float { color: #000080; }
.cpp1-hexadecimal { color: #000080; }
.cpp1-character { }
.cpp1-identifier { }
.cpp1-illegalchar { }
.cpp1-number { color: #000080; }
.cpp1-octal { color: #0000FF; }
.cpp1-preprocessor { }
.cpp1-reservedword { font-weight: bold; }
.cpp1-space { color: #008080; }
.cpp1-string { color: #800000; }
.cpp1-symbol { }
--&amp;amp;amp;amp;amp;gt;
#define F_CPU 1000000UL // 1 MHz (základní frekvence) kvůli časování delay.h
#include &lt;avr/io.h&gt; //Knihovna vstupů a výstupů (PORT, DDR, PIN)
#include &lt;util/delay.h&gt; //Knihovna čekacích funkcí (delay=čekej [ms])
int main (void)
{ // zažátek funkce main
DDRB =0xff;
for(;;) // vytvoření nekonečné smyčky
{ //začátek hlavní smyčky
PORTB=0b00000001; // nastav PORT B na 0b00000001
_delay_ms (1000); // počkej 1s
PORTB=0b00000000; // nastav PORT B na 0b00000000
_delay_ms (1000); // počkej 1s
} //konec hlavní smyčky
} //konec funkce main
Vývojový graf programu:
content/articles/2012/cq-world-wide-wpx-cw-2012/12_wpx_graf.png

129 B