
Předem hodně dík za rady, hlavně od miv. Zkusil jsem si z tvojí rady něco vzít a poskládat (podle sebe) kód, ale moc mi nefungoval, tak jsem to pak od Tebe viceméně zkopíroval

Aktuální stav je takový, že to možná funguje tak jak má, připadá mi, že se mi párkrát stalo, že když jsem zmáčkl tlačítko, tak se program sekl a už se nic nevypisovalo a ledka se neměnila. Ještě musím nějak vymyslet, jak udělat, aby to nevypisovalo od prvního zmáčknutí, ale až od 2. protože absolutně prvotní stisk by neměl vypisovat čas.
#define LED PORTB.B1
unsigned char data_pripravena;
unsigned int citac;
unsigned char muzes_ukoncit;
volatile int M_citac;
volatile int M_casovac;
volatile unsigned char mereni_hotovo;
volatile unsigned char existuje_vysledek;
volatile float vysledek;
volatile unsigned char muze_se_merit;
char txt[7];
void Init(void);
void interrupt () {
if(muze_se_merit == 1)
{
citac++;
if(INTCON.B1 == 1)
{
LED = !LED;
muze_se_merit = 0;
}
}
if(muze_se_merit == 0)
{
if(data_pripravena == 0)
{
M_citac = citac; //prirazeni hodnoty citace k M_citac
M_casovac = TMR0; //prirazeni hodnoty k M_casovac
muze_se_merit = 1;
data_pripravena = 1;
citac = 0;
TMR0 = 0;
//INTCON.b1 = 0;
}
}
INTCON.b1 = 0; //vymazani flagu pro preruseni externi
INTCON.b2 = 0; //vymazani flagu pro preruseni preteceni casovace
}
void main() {
Init();
LED = 0;
citac = 0;
muze_se_merit = 1;
data_pripravena = 0;
while(1){
if(data_pripravena) {
vysledek = (0.0131*M_citac) + (M_casovac * (4/78125)) ;
FloatToStr(vysledek, txt);
UART1_Write_Text(txt);
data_pripravena = 0;
}
}
}
void Init(void){
//PUVODNI NASTAVENI
TRISB.B0 = 1; //port 0 registru B je input
TRISB.B1 = 0; //port 1 registru B je output
//nastaveni registru pro preruseni INTCON
INTCON.B7 = 1; //GIE = 1; dovoleni externiho preruseni
INTCON.B6 = 1; //PEIE = 1; dovoleni preruseni of periferii
INTCON.B5 = 1; //TMR0IE = 1; preteceni casovace vyhodi preruseni
INTCON.B4 = 1; //INTE = 1; povoleni externiho preruseni na pinu RB0
//nastaveni registru OPTION_reg
//Fosc = 20MHz, Fosc/4=5MHz,
OPTION_REG.b6 = 1; //preruseni bude aktivni pri high na RB0, 0 - kdyz je low
OPTION_REG.b5 = 0; //casovani je pres vnitrni oscilator 20MHz,
OPTION_REG.b3 = 0; //delicka je prirazena Timeru0
//DELICKA
OPTION_REG.b2 = 1; //nastaveni delicky na 256 ... perioda 5.12x(10ˇ-5)
OPTION_REG.b1 = 1; //delicka na 256
OPTION_REG.b0 = 1; //delicka na 256
TMR0 = 0; // neni potreba nastavit pocatecni hodnotu casovace
UART1_Init(9600);
}