Tiedote ylläpidolta:

Elektroniikkafoorumi sulkeutuu tietoturva ongelmien takia.
Käyttäjien tietoja (yv:t, sähköpostiosoite ja salasanan hash) on saattanut vuotaa vääriin käsiin.

Foorumi on asettettu vain luku tilaan. Vanhoja keskusteluja voi lukea palvelinsopimuksen päättymiseen asti.
Tietokannasta on poistettu kaikki salasanat, sähköpostiosoitteet ja yksityisviestit.

Jos haluat saada omat yksityisviestisi, lähetä sähköpostia yllapito@elektroniikkafoorumi.com
samasta sähköpostista mikä oli foorumin tiedoissa niin voin kaivella niitä varmuuskopioista.

Mielenkiintoni foorumin ylläpitoon on viime vuosina ollut vähäistä jo muutenkin joten tähän on hyvä lopettaa.
Kiitokset kaikille käyttäjilla ja pahoittelut mahdollisista ongelmista.

Päivitys: Näyttäisi siltä että mahdollinen vuoto koski vanhaa phpBB2 tietokantaa,
joten helmikuuta 2012 uudemmat tiedot pitäisi olla turvassa.

-Lahha
yllapito@elektroniikkafoorumi.com


Tuntimittari

Keskustelua digitaalielektroniikasta

Valvoja: Moderaattorit


Vanhempi jäsen
Vanhempi jäsen
Viestit: 400
Liittynyt: Pe Maalis 06, 2009 18:23
ViestiLähetetty: Ma Tammi 16, 2012 13:40
En tuota flowcodea tunne, saako sieltä jotain koodia nähtäville jotenkin?
Kyllä ne signaalit voi ihan hyvin samassakin portissa olla, pitäisi toimia.
Avatar
Jäsen
Jäsen
Viestit: 62
Liittynyt: Pe Heinä 29, 2011 23:00
ViestiLähetetty: Ma Tammi 16, 2012 14:09
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
Viimeksi muokannut Niksa päivämäärä Ma Tammi 16, 2012 14:13, muokattu yhteensä 1 kerran

Vanhempi jäsen
Vanhempi jäsen
Viestit: 595
Liittynyt: La Marras 12, 2011 14:56
ViestiLähetetty: Ma Tammi 16, 2012 14:11
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.

Jäsen
Jäsen
Viestit: 108
Liittynyt: Pe Heinä 03, 2009 17:18
ViestiLähetetty: Ma Tammi 16, 2012 14:25
Nyt toimii, vaihdoin kiteen oskillaattoriksi flowcoden asetuksista. Nyt loppui myös näytön vilkkuminen :)

Jäsen
Jäsen
Viestit: 108
Liittynyt: Pe Heinä 03, 2009 17:18
ViestiLähetetty: La Helmi 04, 2012 13:59
Voiko 16f84:seen ladata ohjelman tuolla pickit2:sella, kun se on kytkennässä kiinni vai pitääkö se olla irrallaan?


Tuntuu toimivan

Vanhempi jäsen
Vanhempi jäsen
Viestit: 400
Liittynyt: Pe Maalis 06, 2009 18:23
ViestiLähetetty: Su Helmi 05, 2012 11:24
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.

Vanhempi jäsen
Vanhempi jäsen
Viestit: 595
Liittynyt: La Marras 12, 2011 14:56
ViestiLähetetty: Su Helmi 05, 2012 13:12
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.

Vanhempi jäsen
Vanhempi jäsen
Viestit: 400
Liittynyt: Pe Maalis 06, 2009 18:23
ViestiLähetetty: Su Helmi 05, 2012 15:16
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.

Jäsen
Jäsen
Viestit: 108
Liittynyt: Pe Heinä 03, 2009 17:18
ViestiLähetetty: Ma Helmi 06, 2012 19:25
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.

Vanhempi jäsen
Vanhempi jäsen
Viestit: 400
Liittynyt: Pe Maalis 06, 2009 18:23
ViestiLähetetty: Ti Helmi 07, 2012 7:37
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.

Jäsen
Jäsen
Viestit: 147
Liittynyt: Su Elo 30, 2009 13:44
ViestiLähetetty: Ti Helmi 07, 2012 10:25
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.

Jäsen
Jäsen
Viestit: 108
Liittynyt: Pe Heinä 03, 2009 17:18
ViestiLähetetty: Ti Helmi 07, 2012 11:06
- 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.

Jäsen
Jäsen
Viestit: 147
Liittynyt: Su Elo 30, 2009 13:44
ViestiLähetetty: Ti Helmi 07, 2012 11:27
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.

Vanhempi jäsen
Vanhempi jäsen
Viestit: 595
Liittynyt: La Marras 12, 2011 14:56
ViestiLähetetty: Ti Helmi 07, 2012 12:17
Siksi ajan laskeminen olisikin hyvä tehdä lyhyessä keskeytysrutiinissa, ettei mahdollisesti vaihtelevan pituinen muun ohjelman suorittaminen muuttelisi
aikalaskennan tarkkuutta.

Jäsen
Jäsen
Viestit: 108
Liittynyt: Pe Heinä 03, 2009 17:18
ViestiLähetetty: Ti Helmi 07, 2012 12:29
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)
{
}
EdellinenSeuraava

Paluu Digitaalielektroniikka

Paikallaolijat

Käyttäjiä lukemassa tätä aluetta: Ei rekisteröityneitä käyttäjiä ja 1 vierailijaa

cron