Zdravím kiklhorn a LuciusMare,
... na konkrétním procesoru zas tak moc nesejde.
Ano, nesejde, pokud program, který reálně řeší problematiku nepotřebuje
žádnou vazbu na použitou platformu anebo okolí. Což v případě Lucia Mare neplatí :
jeho program minimálně musí použít přerušovací systém , což si vyžaduje základní nastudování
architektury přerušení zcela konkrétního mikroprocessoru, dále bude nucen použít minimálně
aspoň jeden timer/counter (další studium konkrétní platformy).
S konkrétním typem mikroprocessoru je i svázán konkrétní typ použitého vyššího programovacího jazyka,
použitého pro vývoj programu (lépe aplikace).
Předpokládám, Lucie Mare, že budete psát aplikaci ve vyšším programovacím jazyce (C, Modula) a nebudete
mít k dispozici profesionální prostředky pro vývoj sw pro mikroprocessory (i když i zde se dají
získat profi tools, zdarma, které mají omezenou funkcionalitu, ale pro Váš účel by bohatě vyhověly...).
Nakrásně můžete napsat aplikaci pro mikroprocessor
třeba v Javě (reálně se používá např. na některých processorech Dallas)
a pak můžete tu aplikaci zrovna poslat do stoupy, protože nebudete mít překladač z Javy do nativního code
použitého mikroprocessoru (leda byste si koupil development tools, které to umožňují, samozřejmě nezanedbatelné ceny..).
Čili opět budete muset znát konkrétní typ processoru a potažmo i typ jazyka použitého pro vývoj sw.
Problematika vývoje sw pro mikroprocessory leží mj. právě v jejich vazbě na konkrétní prostředí,
tedy processor, na kterém poběží. Na určitém processoru máte určité funkční moduly k dispozici, na jiném ne,
některý processor je lépe připraven na řešení realtime aplikací, jiný ne, ale ten jiný má třeba
implementován prostředky pro komunikaci v ethernetovské síti, některý processor koupíte za pár Kč, na netu
je pro něj sposusta aplikací v C, pro jiný abyste aplikace hledal mikroskopem, atd..
Dle mých zkušeností vývoj aplikace pro mikroprocessor nezačíná napsáním programu, ale právě výběrem mikprocessoru.
Osobně bych Vám doporučil : podle povahy řešení vybrat mikroprocessor, najít dostupné tools pro vývoj sw
k tomuto processoru, ověřit dostupnost tools pro ladění programu k vybranému processoru , hlavně debugger a simulátor,
emulátor ve Vašem případě asi ne
a v neposlední řadě mít jistotu, že vyvinutou a odladěnou aplikaci budete také schopen fyzicky
v daném processoru spustit (pochybuju, že budete aplikaci spuštět z externí paměti), tedy že ji budete schopen do toho processoru
v rámci Vašich možností nahrát..
kiklhorn zde podal naprosto pregnantní řešení Vašeho problému. Na Vás je, abyste zvolil
platformu (mikroprocessor) a vývojové sw technologie a jako poslední bod napsal aplikaci,
což pro Vás, myslím, nebude problém.
Výběr platformy a vývojové technologie je o hodně nezáviděnáhodnější proces než
samotné naprogramování problému, které často bývá oproti těmto rozhodovacím procesům mnohokrát zábavnější...
P.S. Klidně to napište i v ASM daného processoru...
Pokud tedy budete stát o nějaké zkušenosti, rád Vám je předám, pokud budu vědět, včetně nějakých hotových kusů code v C
Edit : pro inspiraci přikládám malou aplikaci, v nekonečné hlavní smyčce se neděje nic, tam si umístěte rutinu
pro měření, v obslužné rutině pro přerušení od timeru 2 se generují pulsy 10 kHz, tam vložte code pro refresh
7 segment displays, změňte konstantu přetečení timeru2 ze 100 mikros na nějakých cca 20 mS (tuto periodu mám dojem ještě lidské oko nevnímá jako blikání), pro aplikaci použit mikroprocessor : AT89S52, překladač : Keil.
/*
* file : gen10kHz.c51
* last updated : 13.08.2005
*
*/
/***************************************************************************/
/* */
/* GEN10KHZ : GENERATOR 10 KHZ */
/* */
/***************************************************************************/
/*
*
* Veskere casove konstanty vypocteny pro Xtal = 12 Mhz
*
*/
#pragma ROM (LARGE) /* uvolneni 64 kbyte ROM pro program */
#include <reg52_e.h> /* rozsirena definice registru pro 8052*/
#include <absacc.h> /* pristup k absolutnim adresam */
#include <intrins.h> /* knihovna pro nop, crol, atp. */
#include <stdio.h> /* stardard i/o definice */
#define STO_MIKROS (256-100) /* konstanta pro zpozd. 100 mikrosekund*/
#define PADESAT_MIKROS (256- 50) /* konstanta pro zpozd. 50 mikrosekund*/
#define LO_PERIOD_2 STO_MIKROS
#define HI_PERIOD_2 0
#define CONTROL_TIMER_2 TR2 /* pouze jine jmeno pro TR2 */
#define CONTROL_TIMER_0 TR0 /* pouze jine jmeno pro TR0 */
/* SEKCE DEFINICE JMEN PINU */
/* ------------------------ */
#define DESET_KHZ_OUT P10 /* kontrolni vystup 10 kHz */
/* SEKCE DEFINICE PROMENNYCH TYPU 0/1 */
/* ---------------------------------- */
#define DISAB 0
#define ENAB 1
#define COUNT_DISAB 0
#define COUNT_ENAB 1
#define STOP 0
#define START 1
#define LOG_0 0
#define LOG_1 1
#define VYPNUTO 0
#define ZAPNUTO 1
#define ZHASNUTO 0
#define ROZSVICENO 1
#define NESTISKNUTO 0
#define STISKNUTO 1
#define NE 0
#define ANO 1
#define NEBLIKAT 0
#define BLIKAT 1
#define NEPROBIHA 0
#define PROBIHA 1
#define INCORRECT 0
#define CORRECT 1
// local functions
void genInit(void);
/*****************************************************************************/
#pragma REGISTERBANK (1) /* use Register Bank 1 for coding */
/*****************************************************************************/
/******************************************************************/
/* Timer 0/2 interrupt service function pro sw timery tim1 a tim2 */
/******************************************************************/
/* timer2 : Int Vector at 002BH */
/* timer0 : Int Vector at 002BH */
// timer 2 : void genTimer2(void) interrupt 5 using 1
void genTimer0(void) interrupt 1 using 1
{
/*
* Obsluzna rutina preruseni od hw timeru 2 (pro 8052)/0 (pro 8051)
*
* Je volana periodicky, perioda preruseni je dana nastavenim konstant
* hw timeru 2 TH2 a TL2 procesoru tak, aby bylo preruseni vyvolano
* kazdych 100 mikrosekund
*
*/
/* musi byt u hw timeru2 vynulovano jinak okamzite po vystupu z prerus. */
/* nastava dalsi preruseni */
TF2 = 0;
DESET_KHZ_OUT = !DESET_KHZ_OUT; /* generuj level obd. signalu 10 kHz */
}
// end function genTimer0()
/*****************************************************************************/
#pragma REGISTERBANK (0) /* use Register Bank 0 for coding */
/*****************************************************************************/
/*****************************************************************************/
/* Funkce zajistujici init vsech promennych periferii, atp. */
/*****************************************************************************/
void genInit (void) {
/*
* Provede inicializaci vybranych programovych a systemovych promennych
*/
/* setup hw timeru 2 */
TH2 = HI_PERIOD_2;
TL2 = LO_PERIOD_2;
RCAP2H = HI_PERIOD_2;
RCAP2L = LO_PERIOD_2;
T2CON = (T2CON & 0x00); /* hw timer2, mode : 16 bit,autoreload */
ET2 = ENAB; /* enable hw timer2 interrupt */
DESET_KHZ_OUT = LOG_1; /* prvni puls obd. signalu s 10 kHz */
}
// end function genInit()
/****************/
/* main program */
/****************/
void main (void) {
genInit(); /* init promennych, periferii, atp... */
EA = ENAB; /* povoleni prerus-nast. glob priznaku */
CONTROL_TIMER_2 = START;
while(1){};
}