Sivu 2/4

ViestiLähetetty: Ma Tammi 16, 2012 13:40
Kirjoittaja L18
En tuota flowcodea tunne, saako sieltä jotain koodia nähtäville jotenkin?
Kyllä ne signaalit voi ihan hyvin samassakin portissa olla, pitäisi toimia.

ViestiLähetetty: Ma Tammi 16, 2012 14:09
Kirjoittaja Niksa
Jees, me tehtiin koulussa digitaali kello, ja lcd näytössä olevista 0-4 nastoista vain 4 oli kytkettynä. Ohjelma tehtiin flowcodella, ja hyvin toimi.
Kuva

Uploaded with ImageShack.us
Ps. piirinä oli pic16F877p

ViestiLähetetty: Ma Tammi 16, 2012 14:11
Kirjoittaja Jussi
No, kun 8-bit dataa pitää swappaamalla käsitellä puolikas kerrallaan, ja toisen
puolikkaan biteissä on ohjauskarvat, niin joka kerta ennen porttiin ajoa pitää
varmistaa ohjausbittien pysyminen oikeassa tasossa. Minusta turhaa puuhastelua,
jos karvoja on vapaana.

ViestiLähetetty: Ma Tammi 16, 2012 14:25
Kirjoittaja P10neer1
Nyt toimii, vaihdoin kiteen oskillaattoriksi flowcoden asetuksista. Nyt loppui myös näytön vilkkuminen :)

ViestiLähetetty: La Helmi 04, 2012 13:59
Kirjoittaja P10neer1
Voiko 16f84:seen ladata ohjelman tuolla pickit2:sella, kun se on kytkennässä kiinni vai pitääkö se olla irrallaan?


Tuntuu toimivan

ViestiLähetetty: Su Helmi 05, 2012 11:24
Kirjoittaja L18
P10neer1 kirjoitti:Voiko 16f84:seen ladata ohjelman tuolla pickit2:sella, kun se on kytkennässä kiinni vai pitääkö se olla irrallaan?


Tuntuu toimivan


Ettei olisi 16F84A? Pelkkä 16F84 ei mielestäni tue icsp-ohjelmointia.

ViestiLähetetty: Su Helmi 05, 2012 13:12
Kirjoittaja Jussi
Eikös se ollut niin, että ei siihen mitään erityistä tukea tarvittu? Kaikki sarjamuodossa ohjelmoitavat onnistuu, kunhan mclr, data ja kello on
sopivasti erotettu. LVP on sitten eri juttu.
Pickit2:ssa on varmaan mclr erotus valmiina, eli nyt riippuu siitä, mitä siellä on kytkettynä ohjelmoinnin data-ja kellokarvoihin.

ViestiLähetetty: Su Helmi 05, 2012 15:16
Kirjoittaja L18
Jussi kirjoitti:Eikös se ollut niin, että ei siihen mitään erityistä tukea tarvittu? Kaikki sarjamuodossa ohjelmoitavat onnistuu, kunhan mclr, data ja kello on
sopivasti erotettu. LVP on sitten eri juttu.
Pickit2:ssa on varmaan mclr erotus valmiina, eli nyt riippuu siitä, mitä siellä on kytkettynä ohjelmoinnin data-ja kellokarvoihin.

Hmm, taisi olla sitten niin että tuo pickit 2 ei sitä tue.
Ainakaan 16f628:a en sillä saanut ohjelmoitua, piti olla 16f628A -versio.

ViestiLähetetty: Ma Helmi 06, 2012 19:25
Kirjoittaja P10neer1
Joo se on 16f84a, mulla on tossa b-portissa toi näyttö ja a-portissa yksi kytkin.

Onko muuten normaalia että, kun ohjelmassa lukee 1s viive niin oikeasti se on vaikka 1.1s, olettaen että kaikki oskillaattorit ja muut on oikein aseteltu. Olen vertaillut tuota tuntilaskuria tietokoneen kelloon niin 988.5ms on jo lähellä oikeaa viiveen asetusarvoa.

ViestiLähetetty: Ti Helmi 07, 2012 7:37
Kirjoittaja L18
P10neer1 kirjoitti:Joo se on 16f84a, mulla on tossa b-portissa toi näyttö ja a-portissa yksi kytkin.

Onko muuten normaalia että, kun ohjelmassa lukee 1s viive niin oikeasti se on vaikka 1.1s, olettaen että kaikki oskillaattorit ja muut on oikein aseteltu. Olen vertaillut tuota tuntilaskuria tietokoneen kelloon niin 988.5ms on jo lähellä oikeaa viiveen asetusarvoa.


Eli viive on vähän reilu 10ms pidempi kuin pitää?
En tiedä kuinka tarkkaan tuo flowcode osaa tehdä oikean koodin, että viive olisi juuri oikean mittainen.

ViestiLähetetty: Ti Helmi 07, 2012 10:25
Kirjoittaja jjw
P10neer1 kirjoitti:Joo se on 16f84a, mulla on tossa b-portissa toi näyttö ja a-portissa yksi kytkin.

Onko muuten normaalia että, kun ohjelmassa lukee 1s viive niin oikeasti se on vaikka 1.1s, olettaen että kaikki oskillaattorit ja muut on oikein aseteltu. Olen vertaillut tuota tuntilaskuria tietokoneen kelloon niin 988.5ms on jo lähellä oikeaa viiveen asetusarvoa.

Onko oskillaattori kideoskillaattori ?
Yleensä viiveet on toteutettu softa-silmukalla ja voisivat periaatteessa olla suht. tarkkoja, mutta jos esim. 1ms viive on toteutettu useammalla lyhyemmällä viiveellä virheet kertautuvat.
Käyttääkö ohjelmasi keskeytyksia ?
Ne pidentävät softalla tehtyä viivettä.
Tarkka kello pitäisi toteuttaa PIC:n ajastimella.

ViestiLähetetty: Ti Helmi 07, 2012 11:06
Kirjoittaja P10neer1
- On kideoskillaattori

-Jouduin tekemään viiven kahdella "viivepalikalla", koska yhden viiven
tarkkuus ei riittänyt.

- Mitäs tuolla keskeytyksillä tarkoitettiin, onko ne niitä jos jossain kohtaa ohjelmaa palataan vaikka alkuun. Ohjelmassani on sellaisia esim ."mene liitäntäpisteeseen A"


Nyt tuo laskuri edistää noin 15min vuodessa, joten käytännössä ei merkitystä kun ei sitä mäntää minuutilleen eikä tunnilleen tarvii vaihtaa. Hieman silti vielä säädän tarkemmaksi.

ViestiLähetetty: Ti Helmi 07, 2012 11:27
Kirjoittaja jjw
P10neer1 kirjoitti:

- Mitäs tuolla keskeytyksillä tarkoitettiin, onko ne niitä jos jossain kohtaa ohjelmaa palataan vaikka alkuun. Ohjelmassani on sellaisia esim ."mene liitäntäpisteeseen A"



Keskeytys on mekanismi, jossa jokin ulkoinen ( esim. näppäimen painallus ) tai sisäinen ( esim. ajastimen pyörähtäminen nollaan ) signaali keskeyttää
suorituksessa olevan ohjelman ja hypätään suorittamaan keskeytysaliohjelmaa.

ViestiLähetetty: Ti Helmi 07, 2012 12:17
Kirjoittaja Jussi
Siksi ajan laskeminen olisikin hyvä tehdä lyhyessä keskeytysrutiinissa, ettei mahdollisesti vaihtelevan pituinen muun ohjelman suorittaminen muuttelisi
aikalaskennan tarkkuutta.

ViestiLähetetty: Ti Helmi 07, 2012 12:29
Kirjoittaja P10neer1
Tuossa Flowcoden antama C versio ohjelmasta analysoitavaksi, jos tuosta nyt selvää saa.




#define MX_PIC

//Määrittää mikro-ohjaimen
#define P16F84A
#define MX_EE
#define MX_EE_TYPE1
#define MX_EE_SIZE 64

//funktiot
#define MX_CLK_SPEED 4000000
#ifdef _BOOSTC
#include <system.h>
#endif
#ifdef HI_TECH_C
#include <pic.h>
#endif

//Konfigurointi data
#ifdef _BOOSTC
#pragma DATA 0x2007, 0x3ffa
#endif
#ifdef HI_TECH_C
__CONFIG(0x3ffa);
#endif

//Sisäiset toiminnot
#include "C:\Program Files\Matrix Multimedia\Flowcode V4\FCD\internals.h"

//Makro-funktion kuvaukset


//Muuttujakuvaukset
char FCV_NOLLAUS;
char FCV_MINUUTTI;
char FCV_MUISTI;
char FCV_KYTKIN;
char FCV_SEKUNTI;
char FCV_TUNTI;


//Defines:

/**** Macro Substitutions ****
portb = D1 Port
trisb = D1 Data Direction
portb = D2 Port
trisb = D2 Data Direction
portb = D3 Port
trisb = D3 Data Direction
portb = D4 Port
trisb = D4 Data Direction
portb = RS Port
trisb = RS Data Direction
portb = E Port
trisb = E Data Direction
0 = Data 1_Pin
1 = Data 2 Pin
2 = Data 3 Pin
3 = Data 4 Pin
4 = RS Pin
5 = Enable Pin
LCD_657806 = Unique Component Reference Number
2 = Row Count
16 = Column Count
******************************/

//component connections
#define LCD_657806_PORT0 portb
#define LCD_657806_TRIS0 trisb
#define LCD_657806_PORT1 portb
#define LCD_657806_TRIS1 trisb
#define LCD_657806_PORT2 portb
#define LCD_657806_TRIS2 trisb
#define LCD_657806_PORT3 portb
#define LCD_657806_TRIS3 trisb
#define LCD_657806_PORT4 portb
#define LCD_657806_TRIS4 trisb
#define LCD_657806_PORT5 portb
#define LCD_657806_TRIS5 trisb
#define LCD_657806_BIT0 0
#define LCD_657806_BIT1 1
#define LCD_657806_BIT2 2
#define LCD_657806_BIT3 3
#define LCD_657806_RS 4
#define LCD_657806_E 5
#define LCD_657806_ROWCNT 2
#define LCD_657806_COLCNT 16

#ifdef _BOOSTC
#define LCD_657806_DELAY delay_10us(10)
#endif
#ifdef _C2C_
#define LCD_657806_DELAY delay_us(100)
#endif
#ifdef HI_TECH_C
#define LCD_657806_DELAY __delay_us(120)
#endif
#ifndef LCD_657806_DELAY
#define LCD_657806_DELAY delay_us(100)
#endif




//LCDDisplay0: //Makro-funktion kuvaukset

void FCD_LCDDisplay0_RawSend(char in, char mask);
void FCD_LCDDisplay0_Start();
void FCD_LCDDisplay0_Clear();
void FCD_LCDDisplay0_PrintASCII(char Character);
void FCD_LCDDisplay0_Command(char in);
void FCD_LCDDisplay0_Cursor(char x, char y);
void FCD_LCDDisplay0_PrintNumber(short Number);
void FCD_LCDDisplay0_PrintString(char* String, char MSZ_String);
void FCD_LCDDisplay0_ScrollDisplay(char Direction, char Num_Positions);
void FCD_LCDDisplay0_ClearLine(char Line);
void FCD_LCDDisplay0_RAM_Write(char nIdx, char d0, char d1, char d2, char d3, char d4, char d5, char d6, char d7);
//Defines:

/**** Macro Substitutions ****
******************************/




//EEPROM0: //Makro-funktion kuvaukset

char FCD_EEPROM0_EEPROMRead(short addr);
void FCD_EEPROM0_WriteEEPROM(short addr, char data);



//LCDDisplay0: //Makro-toteutukset


void FCD_LCDDisplay0_RawSend(char in, char mask)
{
unsigned char pt;

clear_bit(LCD_657806_PORT0, LCD_657806_BIT0);
clear_bit(LCD_657806_PORT1, LCD_657806_BIT1);
clear_bit(LCD_657806_PORT2, LCD_657806_BIT2);
clear_bit(LCD_657806_PORT3, LCD_657806_BIT3);
clear_bit(LCD_657806_PORT4, LCD_657806_RS);
clear_bit(LCD_657806_PORT5, LCD_657806_E);
pt = ((in >> 4) & 0x0f);
if (pt & 0x01)
set_bit(LCD_657806_PORT0, LCD_657806_BIT0);
if (pt & 0x02)
set_bit(LCD_657806_PORT1, LCD_657806_BIT1);
if (pt & 0x04)
set_bit(LCD_657806_PORT2, LCD_657806_BIT2);
if (pt & 0x08)
set_bit(LCD_657806_PORT3, LCD_657806_BIT3);
if (mask)
set_bit(LCD_657806_PORT4, LCD_657806_RS);
LCD_657806_DELAY;
set_bit (LCD_657806_PORT5, LCD_657806_E);
LCD_657806_DELAY;
clear_bit (LCD_657806_PORT5, LCD_657806_E);
pt = (in & 0x0f);
LCD_657806_DELAY;
clear_bit(LCD_657806_PORT0, LCD_657806_BIT0);
clear_bit(LCD_657806_PORT1, LCD_657806_BIT1);
clear_bit(LCD_657806_PORT2, LCD_657806_BIT2);
clear_bit(LCD_657806_PORT3, LCD_657806_BIT3);
clear_bit(LCD_657806_PORT4, LCD_657806_RS);
clear_bit(LCD_657806_PORT5, LCD_657806_E);
if (pt & 0x01)
set_bit(LCD_657806_PORT0, LCD_657806_BIT0);
if (pt & 0x02)
set_bit(LCD_657806_PORT1, LCD_657806_BIT1);
if (pt & 0x04)
set_bit(LCD_657806_PORT2, LCD_657806_BIT2);
if (pt & 0x08)
set_bit(LCD_657806_PORT3, LCD_657806_BIT3);
if (mask)
set_bit(LCD_657806_PORT4, LCD_657806_RS);
LCD_657806_DELAY;
set_bit (LCD_657806_PORT5, LCD_657806_E);
LCD_657806_DELAY;
clear_bit (LCD_657806_PORT5, LCD_657806_E);
LCD_657806_DELAY;
}

void FCD_LCDDisplay0_Start()
{

clear_bit(LCD_657806_TRIS0, LCD_657806_BIT0);
clear_bit(LCD_657806_TRIS1, LCD_657806_BIT1);
clear_bit(LCD_657806_TRIS2, LCD_657806_BIT2);
clear_bit(LCD_657806_TRIS3, LCD_657806_BIT3);
clear_bit(LCD_657806_TRIS4, LCD_657806_RS);
clear_bit(LCD_657806_TRIS5, LCD_657806_E);

Wdt_Delay_Ms(12);

FCD_LCDDisplay0_RawSend(0x33, 0);
Wdt_Delay_Ms(2);
FCD_LCDDisplay0_RawSend(0x33, 0);
Wdt_Delay_Ms(2);
FCD_LCDDisplay0_RawSend(0x32, 0);
Wdt_Delay_Ms(2);
FCD_LCDDisplay0_RawSend(0x2c, 0);
Wdt_Delay_Ms(2);
FCD_LCDDisplay0_RawSend(0x06, 0);
Wdt_Delay_Ms(2);
FCD_LCDDisplay0_RawSend(0x0c, 0);
Wdt_Delay_Ms(2);

//clear the display
FCD_LCDDisplay0_RawSend(0x01, 0);
Wdt_Delay_Ms(2);
FCD_LCDDisplay0_RawSend(0x02, 0);
Wdt_Delay_Ms(2);

}

void FCD_LCDDisplay0_Clear()
{

FCD_LCDDisplay0_RawSend(0x01, 0);
Wdt_Delay_Ms(2);
FCD_LCDDisplay0_RawSend(0x02, 0);
Wdt_Delay_Ms(2);

}

void FCD_LCDDisplay0_PrintASCII(char Character)
{

FCD_LCDDisplay0_RawSend(Character, 0x10);

}

void FCD_LCDDisplay0_Command(char in)
{

FCD_LCDDisplay0_RawSend(in, 0);
Wdt_Delay_Ms(2);

}

void FCD_LCDDisplay0_Cursor(char x, char y)
{

#if (LCD_657806_ROWCNT == 1)
y=0x80;
#endif

#if (LCD_657806_ROWCNT == 2)
if (y==0)
y=0x80;
else
y=0xc0;
#endif

#if (LCD_657806_ROWCNT == 4)
if (y==0)
y=0x80;
else if (y==1)
y=0xc0;

#if (LCD_657806_COLCNT == 16)
else if (y==2)
y=0x90;
else
y=0xd0;
#endif

#if (LCD_657806_COLCNT == 20)
else if (y==2)
y=0x94;
else
y=0xd4;
#endif
#endif

FCD_LCDDisplay0_RawSend(y+x, 0);
Wdt_Delay_Ms(2);

}

void FCD_LCDDisplay0_PrintNumber(short Number)
{

short tmp_int;
char tmp_byte;
if (Number < 0)
{
FCD_LCDDisplay0_RawSend('-', 0x10);
Number = 0 - Number;
}

tmp_int = Number;
if (Number >= 10000)
{
tmp_byte = tmp_int / 10000;
FCD_LCDDisplay0_RawSend('0' + tmp_byte, 0x10);

while (tmp_byte > 0)
{
tmp_int = tmp_int - 10000;
tmp_byte--;
}
}
if (Number >= 1000)
{
tmp_byte = tmp_int / 1000;
FCD_LCDDisplay0_RawSend('0' + tmp_byte, 0x10);

while (tmp_byte > 0)
{
tmp_int = tmp_int - 1000;
tmp_byte--;
}
}
if (Number >= 100)
{
tmp_byte = tmp_int / 100;
FCD_LCDDisplay0_RawSend('0' + tmp_byte, 0x10);

while (tmp_byte > 0)
{
tmp_int = tmp_int - 100;
tmp_byte--;
}
}
if (Number >= 10)
{
tmp_byte = tmp_int / 10;
FCD_LCDDisplay0_RawSend('0' + tmp_byte, 0x10);

while (tmp_byte > 0)
{
tmp_int = tmp_int - 10;
tmp_byte--;
}
}
FCD_LCDDisplay0_RawSend('0' + tmp_int, 0x10);

}

void FCD_LCDDisplay0_PrintString(char* String, char MSZ_String)
{

char idx = 0;

for (idx=0; idx<MSZ_String; idx++)
{
#ifdef _BOOSTC
if (String[idx] == 0)
{
break;
}
FCD_LCDDisplay0_RawSend(String[idx], 0x10);
#endif

#ifdef HI_TECH_C
if (*String == 0)
{
break;
}
FCD_LCDDisplay0_RawSend(*String, 0x10);
String++;
#endif
}

}

void FCD_LCDDisplay0_ScrollDisplay(char Direction, char Num_Positions)
{

char cmd = 0;
char count;

//Choose the direction
switch (Direction)
{
case 0:
case 'l':
case 'L':

cmd = 0x18;
break;

case 1:
case 'r':
case 'R':

cmd = 0x1C;
break;

default:
break;
}

//If direction accepted then scroll the specified amount
if (cmd)
{
for (count = 0; count < Num_Positions; count++)
FCD_LCDDisplay0_Command(cmd);
}

}

void FCD_LCDDisplay0_ClearLine(char Line)
{

char count;
char rowcount;

//Define number of columns per line
#if (LCD_657806_ROWCNT == 1)
rowcount=80;
#endif

#if (LCD_657806_ROWCNT == 2)
rowcount=40;
#endif

#if (LCD_657806_ROWCNT == 4)
#if (LCD_657806_COLCNT == 16)
rowcount=16;
#endif
#if (LCD_657806_COLCNT == 20)
rowcount=20;
#endif
#endif

//Start at beginning of the line
FCD_LCDDisplay0_Cursor (0, Line);

//Send out spaces to clear line
for (count = 0; count < rowcount; count++)
FCD_LCDDisplay0_RawSend(' ', 0x10);

//Move back to the beginning of the line.
FCD_LCDDisplay0_Cursor (0, Line);

}

void FCD_LCDDisplay0_RAM_Write(char nIdx, char d0, char d1, char d2, char d3, char d4, char d5, char d6, char d7)
{
//set CGRAM address
FCD_LCDDisplay0_RawSend(64 + (nIdx << 3), 0);
delay_ms(2);

//write CGRAM data
FCD_LCDDisplay0_RawSend(d0, 0x10);
FCD_LCDDisplay0_RawSend(d1, 0x10);
FCD_LCDDisplay0_RawSend(d2, 0x10);
FCD_LCDDisplay0_RawSend(d3, 0x10);
FCD_LCDDisplay0_RawSend(d4, 0x10);
FCD_LCDDisplay0_RawSend(d5, 0x10);
FCD_LCDDisplay0_RawSend(d6, 0x10);
FCD_LCDDisplay0_RawSend(d7, 0x10);

//Clear the display
FCD_LCDDisplay0_RawSend(0x01, 0);
delay_ms(2);
FCD_LCDDisplay0_RawSend(0x02, 0);
delay_ms(2);
}



//EEPROM0: //Makro-toteutukset


char FCD_EEPROM0_EEPROMRead(short addr)
{
char data = 0;

#ifdef _BOOSTC
#ifdef MX_EE
#ifndef MX_EEADR
#ifdef EEADR
#define MX_EEADR eeadr
#endif
#ifdef EEADRL
#define MX_EEADR eeadrl
#endif
#endif
#ifndef MX_EEDATA
#ifdef EEDATA
#define MX_EEDATA eedata
#endif
#ifdef EEDATAL
#define MX_EEDATA eedatal
#endif
#ifdef EEDATL
#define MX_EEDATA eedatl
#endif
#endif

#ifndef MX_EEADR //Catch Error
#pragma error EEPROM error - MX_EEADR not set
#endif

#ifndef MX_EEDATA
#pragma error EEPROM error - MX_EEDATA not set
#endif

MX_EEADR = addr & 0xff;
#if (MX_EE_SIZE > 256)
eeadrh = (addr & 0xff00) >> 8;
#endif
#ifdef MX_EE_TYPE2
clear_bit(eecon1, EEPGD);
#endif
#ifdef MX_EE_TYPE3
clear_bit(eecon1, EEPGD);
clear_bit(eecon1, CFGS);
#endif
set_bit(eecon1, RD);
data = MX_EEDATA;
#else
#ifdef MX_EE_TYPE67X
#pragma error "FlowCode does not support EEPROM for this device"
#else
#ifdef MX_EE_TYPE62X
#pragma error "FlowCode does not support EEPROM for this device"
#else
#pragma error "Chip does not have EEPROM memory"
#endif
#endif
#endif
#endif
#ifdef HI_TECH_C
data = eeprom_read(addr);
#endif

return (data);

}

void FCD_EEPROM0_WriteEEPROM(short addr, char data)
{
#ifdef _BOOSTC
#ifdef MX_EE
#ifndef MX_EEADR
#ifdef EEADR
#define MX_EEADR eeadr
#endif
#ifdef EEADRL
#define MX_EEADR eeadrl
#endif
#endif
#ifndef MX_EEDATA
#ifdef EEDATA
#define MX_EEDATA eedata
#endif
#ifdef EEDATAL
#define MX_EEDATA eedatal
#endif
#endif

#ifndef MX_EEADR //Catch Error
#pragma error EEPROM error - MX_EEADR not set
#endif

#ifndef MX_EEDATA
#pragma error EEPROM error - MX_EEDATA not set
#endif

char bInterruptsEnabled;

//wait for previous EE writes to complete...
while (test_bit(eecon1, WR));

MX_EEADR = addr & 0xff;
#if (MX_EE_SIZE > 256)
eeadrh = (addr & 0xff00) >> 8;
#endif
MX_EEDATA = data;
#ifdef MX_EE_TYPE2
clear_bit(eecon1, EEPGD);
#endif
#ifdef MX_EE_TYPE3
clear_bit(eecon1, EEPGD);
clear_bit(eecon1, CFGS);
#endif
set_bit(eecon1, WREN);
bInterruptsEnabled = test_bit(intcon, GIE);
clear_bit(intcon, GIE); //Disable Interrupts

eecon2 = 0x55;
eecon2 = 0xAA;
set_bit(eecon1, WR);
while (test_bit(eecon1, WR)); //wait for EE write to complete...

if (bInterruptsEnabled)
set_bit(intcon, GIE); //Re-enable Interrupts
clear_bit(eecon1, WREN);
#else
#ifdef MX_EE_TYPE67X
#pragma error FlowCode does not support EEPROM for this device
#else
#ifdef MX_EE_TYPE62X
#pragma error FlowCode does not support EEPROM for this device
#else
#pragma error Chip does not have EEPROM memory
#endif
#endif
#endif
#endif
#ifdef HI_TECH_C
eeprom_write(addr, data);
#endif

}

//Makro-toteutukset

void main()
{

//alustus


//Keskeytyksen alustuskoodi
option_reg = 0xC0;


//Kommentti:
//Luetaan muistista tunnit


//Kutsu komponenttimakro
//Kutsu komponenttimakro: Tunti=EEPROM(0)::Read(0)
FCV_TUNTI = FCD_EEPROM0_EEPROMRead(0);


//Kutsu komponenttimakro
//Kutsu komponenttimakro: Minuutti=EEPROM(0)::Read(1)
FCV_MINUUTTI = FCD_EEPROM0_EEPROMRead(1);


//Kutsu komponenttimakro
//Kutsu komponenttimakro: sekunti=EEPROM(0)::Read(2)
FCV_SEKUNTI = FCD_EEPROM0_EEPROMRead(2);


//Liitäntäpiste
//Liitäntäpiste: [D]: D
FCC_Perusohjelma_D:
;


//Kommentti:
//Tunti


//Kutsu komponenttimakro
//Kutsu komponenttimakro: LCDDisplay(0)::Start
FCD_LCDDisplay0_Start();


//Kutsu komponenttimakro
//Kutsu komponenttimakro: LCDDisplay(0)::Nollaa
FCD_LCDDisplay0_Clear();


//Kutsu komponenttimakro
//Kutsu komponenttimakro: LCDDisplay(0)::Tulostanumero(Tunti)
FCD_LCDDisplay0_PrintNumber(FCV_TUNTI);


//Kommentti:
//Minuutti


//Kutsu komponenttimakro
//Kutsu komponenttimakro: LCDDisplay(0)::Kursori(2, 0)
FCD_LCDDisplay0_Cursor(2, 0);


//Kutsu komponenttimakro
//Kutsu komponenttimakro: LCDDisplay(0)::Tulostamerkkijono(":")
FCD_LCDDisplay0_PrintString(":",1);


//Kutsu komponenttimakro
//Kutsu komponenttimakro: LCDDisplay(0)::Tulostanumero(Minuutti)
FCD_LCDDisplay0_PrintNumber(FCV_MINUUTTI);


//Kommentti:
//Sekunti


//Kutsu komponenttimakro
//Kutsu komponenttimakro: LCDDisplay(0)::Kursori(5, 0)
FCD_LCDDisplay0_Cursor(5, 0);


//Kutsu komponenttimakro
//Kutsu komponenttimakro: LCDDisplay(0)::Tulostamerkkijono(":")
FCD_LCDDisplay0_PrintString(":",1);


//Kutsu komponenttimakro
//Kutsu komponenttimakro: LCDDisplay(0)::Tulostanumero(sekunti)
FCD_LCDDisplay0_PrintNumber(FCV_SEKUNTI);


//Liitäntäpiste
//Liitäntäpiste: [B]: B
FCC_Perusohjelma_B:
;


//Liitäntäpiste
//Liitäntäpiste: [C]: C
FCC_Perusohjelma_C:
;


//Liitäntäpiste
//Liitäntäpiste: [A]: A
FCC_Perusohjelma_A:
;


//Päätös
//Päätös: sekunti = 60?
if (FCV_SEKUNTI == 60)
{
//Kutsu komponenttimakro
//Kutsu komponenttimakro: sekunti=EEPROM(0)::Read(2)
FCV_SEKUNTI = FCD_EEPROM0_EEPROMRead(2);


//Laskutoimitus
//Laskutoimitus:
// Minuutti = Minuutti + 1
FCV_MINUUTTI = FCV_MINUUTTI + 1;


//Kutsu komponenttimakro
//Kutsu komponenttimakro: LCDDisplay(0)::Kursori(2, 0)
FCD_LCDDisplay0_Cursor(2, 0);


//Kutsu komponenttimakro
//Kutsu komponenttimakro: LCDDisplay(0)::Tulostamerkkijono(":")
FCD_LCDDisplay0_PrintString(":",1);


//Kutsu komponenttimakro
//Kutsu komponenttimakro: LCDDisplay(0)::Tulostanumero(Minuutti)
FCD_LCDDisplay0_PrintNumber(FCV_MINUUTTI);


//Päätös
//Päätös: Minuutti = 60?
if (FCV_MINUUTTI == 60)
{
//Kutsu komponenttimakro
//Kutsu komponenttimakro: Minuutti=EEPROM(0)::Read(1)
FCV_MINUUTTI = FCD_EEPROM0_EEPROMRead(1);


//Kutsu komponenttimakro
//Kutsu komponenttimakro: Tunti=EEPROM(0)::Read(0)
FCV_TUNTI = FCD_EEPROM0_EEPROMRead(0);


//Kutsu komponenttimakro
//Kutsu komponenttimakro: LCDDisplay(0)::Nollaa
FCD_LCDDisplay0_Clear();


//Laskutoimitus
//Laskutoimitus:
// Tunti = Tunti + 1
FCV_TUNTI = FCV_TUNTI + 1;


//Laskutoimitus
//Laskutoimitus:
// sekunti = 0
// Minuutti = 0
FCV_SEKUNTI = 0;
FCV_MINUUTTI = 0;


//Kutsu komponenttimakro
//Kutsu komponenttimakro: LCDDisplay(0)::Tulostanumero(Tunti)
FCD_LCDDisplay0_PrintNumber(FCV_TUNTI);


//Kutsu komponenttimakro
//Kutsu komponenttimakro: LCDDisplay(0)::Kursori(2, 0)
FCD_LCDDisplay0_Cursor(2, 0);


//Kutsu komponenttimakro
//Kutsu komponenttimakro: LCDDisplay(0)::Tulostamerkkijono(":")
FCD_LCDDisplay0_PrintString(":",1);


//Kutsu komponenttimakro
//Kutsu komponenttimakro: LCDDisplay(0)::Tulostanumero(Minuutti)
FCD_LCDDisplay0_PrintNumber(FCV_MINUUTTI);


//Kutsu komponenttimakro
//Kutsu komponenttimakro: EEPROM(0)::Write(0, Tunti)
FCD_EEPROM0_WriteEEPROM(0, FCV_TUNTI);


//Mene liitäntäpisteeseen
//Mene liitäntäpisteeseen: [C]: C
goto FCC_Perusohjelma_C;


} else {
//Kutsu komponenttimakro
//Kutsu komponenttimakro: EEPROM(0)::Write(1, Minuutti)
FCD_EEPROM0_WriteEEPROM(1, FCV_MINUUTTI);


//Kutsu komponenttimakro
//Kutsu komponenttimakro: LCDDisplay(0)::Kursori(6, 0)
FCD_LCDDisplay0_Cursor(6, 0);


//Kutsu komponenttimakro
//Kutsu komponenttimakro: LCDDisplay(0)::Tulostamerkkijono("0 ")
FCD_LCDDisplay0_PrintString("0 ",2);


//Laskutoimitus
//Laskutoimitus:
// sekunti = 0
FCV_SEKUNTI = 0;


//Mene liitäntäpisteeseen
//Mene liitäntäpisteeseen: [A]: A
goto FCC_Perusohjelma_A;


}


} else {
//Tulo
//Tulo: PORT A -> Kytkin
trisa = trisa | 0xff;
FCV_KYTKIN = porta;


//Kommentti:
//Jos kytkin on 5s "1" niin laskuri nollataan


//Päätös
//Päätös: Kytkin=0?
if (FCV_KYTKIN==0)
{
//Laskutoimitus
//Laskutoimitus:
// Nollaus = Nollaus+1
FCV_NOLLAUS = FCV_NOLLAUS+1;


//Päätös
//Päätös: Nollaus=5?
if (FCV_NOLLAUS==5)
{
//Laskutoimitus
//Laskutoimitus:
// Nollaus = 0
// Tunti = 0
// Minuutti = 0
// sekunti = 0
FCV_NOLLAUS = 0;
FCV_TUNTI = 0;
FCV_MINUUTTI = 0;
FCV_SEKUNTI = 0;


//Kutsu komponenttimakro
//Kutsu komponenttimakro: EEPROM(0)::Write(0, Tunti)
FCD_EEPROM0_WriteEEPROM(0, FCV_TUNTI);


//Kutsu komponenttimakro
//Kutsu komponenttimakro: EEPROM(0)::Write(1, Minuutti)
FCD_EEPROM0_WriteEEPROM(1, FCV_MINUUTTI);


//Mene liitäntäpisteeseen
//Mene liitäntäpisteeseen: [D]: D
goto FCC_Perusohjelma_D;


}


} else {
//Laskutoimitus
//Laskutoimitus:
// Nollaus = 0
FCV_NOLLAUS = 0;


}


//Kutsu komponenttimakro
//Kutsu komponenttimakro: EEPROM(0)::Write(2, sekunti)
FCD_EEPROM0_WriteEEPROM(2, FCV_SEKUNTI);


//Laskutoimitus
//Laskutoimitus:
// sekunti = sekunti + 1
FCV_SEKUNTI = FCV_SEKUNTI + 1;


//Viive
//Viive: 988 ms
delay_ms(255);
delay_ms(255);
delay_ms(255);
delay_ms(223);


//Viive
//Viive: 360 us
delay_us(255);
delay_us(105);


//Kutsu komponenttimakro
//Kutsu komponenttimakro: LCDDisplay(0)::Kursori(5, 0)
FCD_LCDDisplay0_Cursor(5, 0);


//Kutsu komponenttimakro
//Kutsu komponenttimakro: LCDDisplay(0)::Tulostamerkkijono(":")
FCD_LCDDisplay0_PrintString(":",1);


//Kutsu komponenttimakro
//Kutsu komponenttimakro: LCDDisplay(0)::Tulostanumero(sekunti)
FCD_LCDDisplay0_PrintNumber(FCV_SEKUNTI);


//Mene liitäntäpisteeseen
//Mene liitäntäpisteeseen: [B]: B
goto FCC_Perusohjelma_B;


}


mainendloop: goto mainendloop;
}

void MX_INTERRUPT_MACRO(void)
{
}