Fórum témák
- • Villanyszerelés
- • Hibrid erősítő
- • Sprint-Layout NYÁK-tervező
- • Felajánlás, azaz ingyen elvihető
- • Elektromos távirányítós kapunyitó
- • Szárítógép problémák
- • Klíma szervizelés, javítás
- • Muzeális készülékek-alkatrészek restaurálása
- • Aktív USB kábel készítése
- • Sztereó erősítő olcsón
- • Borhűtő vezérlő panel
- • Érdekességek
- • Hegesztő inverter javítás
- • Mosógép vezérlők és általános problémáik
- • Li-Ion saját akkucsomag készítése
- • Kombikazán működési hiba
- • Rádióamatőrök topikja
- • Erősítő mindig és mindig
- • Toroid transzformátor
- • Oszcilloszkóp vétel, mit gondoltok?
- • Forrasztási 1×1 forrasztástechnikai miértek
- • Elektronikai témájú könyvek újságok
- • Lézer érzékelő
- • Logikai analizátor
- • VF2 végerősítő
- • Autós fejegységek kapcsolási rajza
- • Számítógép hiba, de mi a probléma?
- • Rádió javítás
- • Áramlökés határoló lágyindító
- • Boombox javítás
- • Elfogadnám, ha ingyen elvihető
- • Porszívó javítás
- • Fejhallgató erősítő
- • Autórádió építés, szerelés
- • Transzformátor készítés, méretezés
- • Elektromos sütő
- • MIka 6E kazán paraméter lista
- • Mobiltelefon hiba
- • ESR mérő
- • Hangsugárzó építés, javítás - miértek, hogyanok
- • TV hiba, mi a megoldás?
- • Műhelyünk felszerelése, szerszámai
- • Arduino
- • Hangszóró készítése
- • FET vezérlése
- • Napelem alkalmazása a lakás energia ellátásában
- • Általános antennás kérdések, válaszok
- • Kapcsolóüzemű táp 230V-ról
- • RP2040
- • Klíma beszerelése, fűtés-hűtés házilag
- • Flexibilis nyák
- • Robot porszívó - Roomba
- • Kondenzátor
- • Alternativ HE találkozó(k)
- • Rádió adó építése
» Több friss téma
|
- A PIC ÖSSZES Vdd és Vss (AVdd és AVss) (tápfeszültség) lábát be kell kötni!
- A táplábak mellé a lehető legközelebb 100nF-os KERÁMIA kondenzátorokat kell elhelyezni.
- Az MCLR lábat, 10kohm-mal fel kell húzni a Vdd tápfeszültségre.
- Külső kvarc használatakor 4MHz-ig XT, a fölött pedig HS konfigurációt kell beállítani.
- Stabilizált tápegységet kell használni, a kapcsoló üzemű "telefon töltő" adapterek okozhatnak hibákat.
- Programozáshoz, használj lehetőleg PICKIT2 vagy 3 programozót. Kerülendő a JDM (soros porti) programozó.
- A PIC adatlapja (PDF), tartalmazza a lábak kiosztását és a PIC minden paraméterét. Az adatlap ingyen letölthető!
- Egyes PIC típusoknál az RA4 nyitott nyelőelektródás (Csak lefelé húz L szintre, H szintet nem ad ki!)
- Ha a PGM lábat digitális ki-/bemenetnek használod, az alacsony feszültségű programozási lehetőséget le kell tiltani.
Szia! raktam egy smd csokit. A legalja -0,13 V. Kösz néked a mindent.
(#) |
doup hozzászólása |
Nov 11, 2011 |
 |
/ |
 |
|
Sziasztok lenne egy kérdésem. Van egy digitális órám ds1307-el. Szeretnék időzítette kapcsolást csinálni. Mondjuk ha a ds1307 ideje megeggyezik a felhasználó által megadott idővel akkor a portd.b7 lábát magas szintre emelem x ideig csak ugye ezzel az a baj hogy a késleltetés miatt az lcd-n megáll az idő. Ezt hogy lehetne megolnani, hogy a késleletetés közben azért az lcd-n ugyan úgy frissüljön I2C az adat?
Számtalan sok módja van. Meg kell barátkozni a Timer egységekkel, az időszeleteléssel, a megszakításokkal, a szemaforokkal, vagy a többfeladatos, többszálon futó alkalmazások módszereivel (korutinok vagy RTOS). Ízlés és elhatározás kérdése, hogy a felsoroltak közül melyiket választod.
Te mind hozzáértő kezdőnek mit javasolnál és mondjuk amit javasolt hol tudnám egy példán keresztül megnézni vagy megtanulni?
Ha a lábat magas szintre állítod, az úgy is marad. Ekkor indítasz egy timert (vagy a másodpercek múlását figyeled) aminek a lejáratakor visszabillented a port kimeneted. Közben 1000-szer, tízezerszer is lefuthat a fő ciklusod...
Ezt mikroc forrásban tudnád nekem szemléltetni mert soha nem használtam timer-t de e nélkül nem igazán lehet nagyobb programokat írni. Javaban egész más mert ott szálak vannak, de a mikroc-t csak nemrég kezdtem ezért kérném a segítségedet.
Mondom: ha nem ragaszkodsz az egy másodpercnél rövidebb időzítésnél, figyeld a másodperceket, valahogy így:
ha óra==beállított óra és perc==beállított perc és sec==0
akkor kimenet=1 //bekapcsol
ha óra==beállított óra és perc==beállított perc és sec==beállított sec
akkor kimenet==0 //kikapcs
Még néha magyarul is elég megérteni nem hogy angolul.
Igazad van ennél a feladatnál ez hibátlan megoldás!
De a timer azért is érdekelne mert mondjuk van egy vagy több gombom amivel majd a felhasználó beállíthatja a kívánt időt amikor kapcsoljon a szerkezet, ezért is szeretném.
Ezt írtam le. Eleve adott változókat használsz az órához, perchez és másodperchez. Utána még felveszed ezek változtatható változóit. Ezek a beállítható óra perc és mp. Pl.: AlarmHours-AlarmMinutes-Alarlarmseconds. Ezeket a változókat már menüből vezérelve növelheted, csökkentheted. Az RTC kiolvasása után meg összehasonlítod, hogy van-e egyezés...
(#) |
doup hozzászólása |
Nov 11, 2011 |
 |
/ |
 |
|
Ezt valaki el tudná magyarázni mit is csinál pontosan?
/*
* Project name:
Timer0_Interrupt (Using Timer0 to obtain interrupts)
* Copyright:
(c) Mikroelektronika, 2008.
* Revision History:
20080930:
- initial release;
* Description:
This code demonstrates how to use Timer0 and it's interrupt.
Program toggles LEDs on PORTB.
* Test configuration:
http://ww1.microchip.com/downloads/en/DeviceDoc/41291F.pdf
Dev.Board: EasyPIC6
Oscillator: HS, 08.0000 MHz
Ext. Modules: -
SW: mikroC PRO for PIC
* NOTES:
- Turn on LEDs on PORTB switch SW9.2 (board specific).
*/
unsigned cnt;
void interrupt() {
if (TMR0IF_bit) {
cnt++; // increment counter
TMR0IF_bit = 0; // clear TMR0IF
TMR0 = 96;
}
}
void main() {
OPTION_REG = 0x84; // Assign prescaler to TMR0
ANSEL = 0; // Configure AN pins as digital
ANSELH = 0;
C1ON_bit = 0; // Disable comparators
C2ON_bit = 0;
TRISB = 0; // PORTB is output
PORTB = 0xFF; // Initialize PORTB
TMR0 = 96; // Timer0 initial value
INTCON = 0xA0; // Enable TMRO interrupt
cnt = 0; // Initialize cnt
do {
if (cnt >= 400) {
PORTB = ~PORTB; // Toggle PORTB LEDs
cnt = 0; // Reset cnt
}
} while(1);
}
A Timer0-t megszakítással használja ciklusosan, növeli a cnt változó értékét, majd a főprogramban ha eléri a 400-t cnt értéke akkor a kimenetre beállított PORTB-t invertálja bitenként. (Toogle)
Idézet: „Még néha magyarul is elég megérteni nem hogy angolul.” Mégis, hogy képzeled? Az adatlapot ki fordítja le neked magyarra? Vagy majd mindenre háromszor rákérdezel itt?!
(#) |
doup hozzászólása |
Nov 12, 2011 |
 |
/ |
 |
|
Sziasztok, a digitális órámnál szeretnék egy kis lcd-s látványos csúsztatgatást csinálni amiben muszáj használnom késleltetéseket viszont így már a másodperc része kijelzésnél nem folyamatos mivel a késleltetésem a fő ciklusban több mint 1 sec. Ilyenkor kell timereket használni?
while(1)
{
sec=read_ ds1307(0); // másodperc kiolvasása
minute=read_ ds1307(1); // perc kiolvasása
hour=read_ ds1307(2); // óra kiolvasása
day=read_ ds1307(3); // nap kiolvasása
date=read_ ds1307(4); // dátum kiolvasása
month=read_ ds1307(5); // hónap kiolvasása
year=read_ ds1307(6); // év kiolvasása
time[0] = BCD2UpperCh(hour);
time[1] = BCD2LowerCh(hour);
time[2] = ':';
time[3] = BCD2UpperCh(minute);
time[4] = BCD2LowerCh(minute);
time[5] = ':';
time[6] = BCD2UpperCh(sec);
time[7] = BCD2LowerCh(sec);
time[8] = '\0';
ddate[0] = '2';
ddate[1] = '0';
ddate[2] = BCD2UpperCh(year);
ddate[3] = BCD2LowerCh(year);
ddate[4] ='.';
ddate[5] = BCD2UpperCh(month);
ddate[6] = BCD2LowerCh(month);
ddate[7] ='.';
ddate[8] = BCD2UpperCh(date);
ddate[9] = BCD2LowerCh(date);
ddate[10] = '\0';
for(k = 0; k < 8; ++k)
{
Lcd_Chr(1, 5+k, time[k]);
Delay_ms(150);
}
for(k = 0; k < 10; ++k)
{
Lcd_Chr(2, 4+k, ddate[k]);
Delay_ms(150);
}
}
}
Azt még ki is bogarászom de nem fogok pic programozást angol könyvből tanulni.
Igazad van, van két másik alternatíva: Japán és Kinai...
(#) |
doup hozzászólása |
Nov 12, 2011 |
 |
/ |
 |
|
Lehet hogy nagy hülyeséget csinálok de sajna nem tudom hogy kell használni a timereket. Amit én szeretnék csinálni az az hogy az lcd-re sorfojtonosan jelenítem meg a karaktereket közben azt szeretném hogy az óra egy másik szálon folyamatosan járjon a kijelzőn
de ez így nem jó mert nem csinál semmit
// LCD module connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// End LCD module connections
unsigned short read_ ds1307(unsigned short address );
void write_ ds1307(unsigned short address, unsigned short w_data );
unsigned short sec;
unsigned short minute;
unsigned short hour;
unsigned short day;
unsigned short date;
unsigned short month;
unsigned short year;
unsigned short dat;
char time[9];
char tim[9] = {'1','8',':','3','0',':','0','0','\0'};
char ddate[11];
int k = 0;
unsigned char BCD2UpperCh(unsigned char bcd);
unsigned char BCD2LowerCh(unsigned char bcd);
void interrupt() {
if (TMR0IF_bit) {
Lcd_Init();
Lcd_Cmd(_Lcd_CLEAR);
Lcd_Cmd(_Lcd_CURSOR_OFF);
for(k = 0; k < 8; ++k)
{
Lcd_Chr(1, 5+k, time[k]);
Delay_ms(150);
}
for(k = 0; k < 10; ++k)
{
Lcd_Chr(2, 4+k, ddate[k]);
Delay_ms(150);
}
TMR0IF_bit = 0; // clear TMR0IF
TMR0 = 96;
}
}
void main(){
OPTION_REG = 0x84;
I2C1_Init(100000);
PORTB = 0;
TRISB = 0;
TRISD = 0;
PORTD = 0;
TRISC = 0xFF;
TMR0 = 96; // Timer0 initial value
INTCON = 0xA0; // Enable TMRO interrupt
write_ ds1307(0, 0x80); //Reset second to 0 sec. and stop Oscillator
write_ ds1307(1, 0x34); //write min 27
write_ ds1307(2, 0x21); //write hour 14
write_ ds1307(3, 0x02); //write day of week 2:Monday
write_ ds1307(4, 0x11); // write date 17
write_ ds1307(5, 0x11); // write month 6 June
write_ ds1307(6, 0x11); // write year 8 --> 2008
write_ ds1307(7, 0x10); //SQWE output at 1 Hz
write_ ds1307(0, 0x00); //Reset second to 0 sec. and start Oscillator
while(1)
{
sec=read_ ds1307(0); // másodperc kiolvasása
minute=read_ ds1307(1); // perc kiolvasása
hour=read_ ds1307(2); // óra kiolvasása
day=read_ ds1307(3); // nap kiolvasása
date=read_ ds1307(4); // dátum kiolvasása
month=read_ ds1307(5); // hónap kiolvasása
year=read_ ds1307(6); // év kiolvasása
time[0] = BCD2UpperCh(hour);
time[1] = BCD2LowerCh(hour);
time[2] = ':';
time[3] = BCD2UpperCh(minute);
time[4] = BCD2LowerCh(minute);
time[5] = ':';
time[6] = BCD2UpperCh(sec);
time[7] = BCD2LowerCh(sec);
time[8] = '\0';
ddate[0] = '2';
ddate[1] = '0';
ddate[2] = BCD2UpperCh(year);
ddate[3] = BCD2LowerCh(year);
ddate[4] ='.';
ddate[5] = BCD2UpperCh(month);
ddate[6] = BCD2LowerCh(month);
ddate[7] ='.';
ddate[8] = BCD2UpperCh(date);
ddate[9] = BCD2LowerCh(date);
ddate[10] = '\0';
}
}
unsigned short read_ ds1307(unsigned short address )
{
I2C1_Start();
I2C1_Wr(0xd0); //address 0x68 followed by direction bit (0 for write, 1 for read) 0x68 followed by 0 --> 0xD0
I2C1_Wr(address);
I2C1_Repeated_Start();
I2C1_Wr(0xd1); //0x68 followed by 1 --> 0xD1
dat=I2C1_Rd(0);
I2C1_Stop();
return(dat);
}
unsigned char BCD2UpperCh(unsigned char bcd)
{
return ((bcd >> 4) + '0');
}
unsigned char BCD2LowerCh(unsigned char bcd)
{
return ((bcd & 0x0F) + '0');
}
void write_ ds1307(unsigned short address, unsigned short w_data )
{
I2C1_Start(); // issue I2C start signal
//address 0x68 followed by direction bit (0 for write, 1 for read) 0x68 followed by 0 --> 0xD0
I2C1_Wr(0xD0); // send byte via I2C (device address + W)
I2C1_Wr (address ); // send byte (address of DS1307 location)
I2C1_Wr(w_data); // send data (data to be written)
I2C1_Stop(); // issue I2C stop signal
}
Az LCD inicializálást miért végzed el mindig az IT rutinban?
A c fordító egy ilyen hibát dob ha nem oda rakom hanem hagyom a main ciklusban 'funvtion LCD_CHR called from two thread'
Annak akkor is a main-ban kell lennie. Szerintem hibát az IT rutinban lévő időzítés okozza. Ilyet nem szoktunk csinálni. IT-ben delay ráadásul ciklusban......kétszer......ez harakiri a PIC-nek.
Egy gombot szeretnék rákötni a digitális órámra a setup menünek ezt hogyan lehetne figyelni mert a delayek miatt ha megnyomom a gombot nem igazán reagál
A delay-ket az IT-ben változó növeléssel old meg, így nem lassítod a program futását. A main-ben használhatsz BUTTON.... függvényt. Nézd meg a lib-eket.
Tudnál nekem egy C-s példát mutatni rá mert fogalmam sincs hogy gondolod mert mondjuk ha nekem 20 fajta delayre van szükségem akkor mi van?
Egyébként a button-t megnézetem az nagyon jó ötlet köszönöm.
void interrupt() {
if (TMR0IF_bit) {
if(idozit==10)
{
PORTB ~= PORTB;
idozit =0;
}
else
{
idozit++;
}
TMR0IF_bit = 0; // clear TMR0IF
TMR0 = 96;
}
}
A portB váltása minden 10 IT rutin futása után. Persze a port beállítást meg kell oldani main-ban. Nem próbáltam le, de remélem segít.
Mondjuk itt a másodpercenkénti RCT olvasást hogy oldanád meg Timerrel?
unsigned short read_ ds1307(unsigned short address );
void write_ ds1307(unsigned short address, unsigned short w_data );
unsigned short sec;
unsigned short minute;
unsigned short hour;
unsigned short day;
unsigned short date;
unsigned short month;
unsigned short year;
unsigned short data;
char time[9];
char ddate[11];
unsigned char BCD2UpperCh(unsigned char bcd);
unsigned char BCD2LowerCh(unsigned char bcd);
void main(){
I2C_Init (100000); //DS1307 I2C is running at 100KHz
PORTB = 0;
TRISB = 0; // Configure PORTB as output
TRISC = 0xFF;
Lcd_Init(&PORTB); // Initialize LCD connected to PORTB
Lcd_Cmd(Lcd_CLEAR); // Clear display
Lcd_Cmd(Lcd_CURSOR_OFF); // Turn cursor off
Lcd_Out(1, 1, "TIME:");
Lcd_Out(2, 1, "DATE:");
//Set Time
write_ ds1307(0, 0x80); //Reset second to 0 sec. and stop Oscillator
write_ ds1307(1, 0x10); //write min 27
write_ ds1307(2, 0x01); //write hour 14
write_ ds1307(3, 0x02); //write day of week 2:Monday
write_ ds1307(4, 0x05); // write date 17
write_ ds1307(5, 0x01); // write month 6 June
write_ ds1307(6, 0x09); // write year 8 --> 2008
write_ ds1307(7, 0x10); //SQWE output at 1 Hz
write_ ds1307(0, 0x00); //Reset second to 0 sec. and start Oscillator
while(1)
{
sec=read_ ds1307(0); // read second
minute=read_ ds1307(1); // read minute
hour=read_ ds1307(2); // read hour
day=read_ ds1307(3); // read day
date=read_ ds1307(4); // read date
month=read_ ds1307(5); // read month
year=read_ ds1307(6); // read year
time[0] = BCD2UpperCh(hour);
time[1] = BCD2LowerCh(hour);
time[2] = ':';
time[3] = BCD2UpperCh(minute);
time[4] = BCD2LowerCh(minute);
time[5] = ':';
time[6] = BCD2UpperCh(sec);
time[7] = BCD2LowerCh(sec);
time[8] = '\0';
ddate[0] = BCD2UpperCh(date);
ddate[1] = BCD2LowerCh(date);
ddate[2] ='/';
ddate[3] = BCD2UpperCh(month);
ddate[4] = BCD2LowerCh(month);
ddate[5] ='/';
ddate[6] = '2';
ddate[7] = '0';
ddate[8] = BCD2UpperCh(year);
ddate[9] = BCD2LowerCh(year);
ddate[10] = '\0';
Lcd_Out(1,6,time);
Lcd_Out(2,6,ddate);
Delay_ms(1000);
}
}
unsigned short read_ ds1307(unsigned short address )
{
I2C_Start();
I2C_Wr(0xd0); //address 0x68 followed by direction bit (0 for write, 1 for read) 0x68 followed by 0 --> 0xD0
I2C_Wr(address);
I2C_Repeated_Start();
I2C_Wr(0xd1); //0x68 followed by 1 --> 0xD1
data=I2C_Rd(0);
I2C_Stop();
return(data);
}
unsigned char BCD2UpperCh(unsigned char bcd)
{
return ((bcd >> 4) + '0');
}
unsigned char BCD2LowerCh(unsigned char bcd)
{
return ((bcd & 0x0F) + '0');
}
void write_ ds1307(unsigned short address, unsigned short w_data )
{
I2C_Start(); // issue I2C start signal
//address 0x68 followed by direction bit (0 for write, 1 for read) 0x68 followed by 0 --> 0xD0
I2C_Wr(0xD0); // send byte via I2C (device address + W)
I2C_Wr (address ); // send byte (address of DS1307 location)
I2C_Wr(w_data); // send data (data to be written)
I2C_Stop(); // issue I2C stop signal
}
Milyen sűrűn keletkezik most megszakítás, ebben a beállításodban?
A jelenlegi programom az ez
// LCD beállítás
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
//~
//Változók deklarálásának listája
unsigned short read_ ds1307(unsigned short address );
void write_ ds1307(unsigned short address, unsigned short w_data );
unsigned short sec;
unsigned short minute;
unsigned short hour;
unsigned short day;
unsigned short date;
unsigned short month;
unsigned short year;
unsigned short dat;
char time[9];
char tim[9] = {'1','8',':','3','0',':','0','0','\0'};
char ddate[11];
const unsigned short TEMP_RESOLUTION = 9;
char *text = " 00.0", text_sign;
unsigned temp;
int homerseklet = 0, k = 0, i = 0, j = 0, gomb = 0;
char text2[12] = {'T','h','e','m','p','e','r','a','t','u','r','e'};
char textsign[2] = {'°', 'C'};
unsigned char BCD2UpperCh(unsigned char bcd);
unsigned char BCD2LowerCh(unsigned char bcd);
//~
void Display_Temperature(unsigned int temp2write) {
const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8;
char temp_whole;
unsigned int temp_fraction;
//--- Hőmérséklet negatív részének vizsgálata
if (temp2write & 0x8000) {
text[0] = '-';
temp2write = ~temp2write + 1;
}
//--- Egész rész
temp_whole = temp2write >> RES_SHIFT ;
//--- Egész rész karakterré konvertálás
if (temp_whole/100)
text[0] = temp_whole/100 + 48;
text[1] = (temp_whole/10)%10 + 48; //--- Tizes digit
text[2] = temp_whole%10 + 48; //--- Egyes digit
//--- Előjel nélküli egészre konvertálás
temp_fraction = temp2write << (4-RES_SHIFT);
temp_fraction &= 0x000F;
temp_fraction *= 625;
//--- Konvertálás karakterré
text[4] = temp_fraction/1000 + 48; //--- Ezres digit
//--- Hőmérséklet kiírása az LCD-re
for(k = 0; k < strlen(text); k++)
{
Lcd_Chr(2, 5+k, text[k]);
Delay_ms(150);
}
for(k = 0; k < 2; k++)
{
Lcd_Chr(2, 10+k, textsign[k]);
Delay_ms(150);
}
}
void Homerseklet_lekerdezes()
{
//--- Hőmérséklet értékének kiolvasása
Ow_Reset(&PORTD, 0);
Ow_Write(&PORTD, 0, 0xCC);
Ow_Write(&PORTD, 0, 0x44);
Delay_ms(1000);
Ow_Reset(&PORTD, 0);
Ow_Write(&PORTD, 0, 0xCC);
Ow_Write(&PORTD, 0, 0xBE);
temp = Ow_Read(&PORTD, 0);
temp = (Ow_Read(&PORTD, 0) << 8) + temp;
Display_Temperature(temp);
}
unsigned short cnt;
void main(){
I2C1_Init(100000);
PORTB = 0;
TRISB = 0;
TRISD = 0;
PORTD = 0;
TRISC = 0xFF;
PORTB.RB2 = 0Xff; //A PORTB 2. lábát bemenetre állítom
Lcd_Init();
Lcd_Cmd(_Lcd_CLEAR);
Lcd_Cmd(_Lcd_CURSOR_OFF);
write_ ds1307(0, 0x80); //Reset second to 0 sec. and stop Oscillator
write_ ds1307(1, 0x34); //write min 27
write_ ds1307(2, 0x10); //write hour 14
write_ ds1307(3, 0x02); //write day of week 2:Monday
write_ ds1307(4, 0x12); // write date 17
write_ ds1307(5, 0x11); // write month 6 June
write_ ds1307(6, 0x11); // write year 8 --> 2008
write_ ds1307(7, 0x10); //SQWE output at 1 Hz
write_ ds1307(0, 0x00); //Reset second to 0 sec. and start Oscillator
while(1)
{
if(PORTB.RB2 == 0)
gomb++;
if(gomb % 2){
//IDŐ MEGJELENÍTÉSE
for(i = 0; i <=29; i++)
{
sec=read_ ds1307(0); // másodperc kiolvasása
minute=read_ ds1307(1); // perc kiolvasása
hour=read_ ds1307(2); // óra kiolvasása
day=read_ ds1307(3); // nap kiolvasása
date=read_ ds1307(4); // dátum kiolvasása
month=read_ ds1307(5); // hónap kiolvasása
year=read_ ds1307(6); // év kiolvasása
time[0] = BCD2UpperCh(hour);
time[1] = BCD2LowerCh(hour);
time[2] = ':';
time[3] = BCD2UpperCh(minute);
time[4] = BCD2LowerCh(minute);
time[5] = ':';
time[6] = BCD2UpperCh(sec);
time[7] = BCD2LowerCh(sec);
time[8] = '\0';
ddate[0] = '2';
ddate[1] = '0';
ddate[2] = BCD2UpperCh(year);
ddate[3] = BCD2LowerCh(year);
ddate[4] ='.';
ddate[5] = BCD2UpperCh(month);
ddate[6] = BCD2LowerCh(month);
ddate[7] ='.';
ddate[8] = BCD2UpperCh(date);
ddate[9] = BCD2LowerCh(date);
ddate[10] = '\0';
Lcd_Out(1,5,time);
Lcd_Out(2,4,ddate);
Delay_ms(1000);
if(i == 29)
{
for(k = 0; k < 13; k++)
{
Lcd_Cmd(_LCD_SHIFT_RIGHT);
Delay_ms(100);
}
Lcd_Cmd(_LCD_CLEAR);
}
}
//~
//HŐMÉRSÉKLET MEGJELENÍTÉSE
for(j = 0; j <= 10; j++)
{
for(k = 0; k < 12; ++k)
{
Lcd_Chr(1, 3+k, text2[k]);
Delay_ms(150);
}
Homerseklet_lekerdezes();
if(j == 10)
{
for(k = 0; k < 13; k++)
{
Lcd_Cmd(_LCD_SHIFT_RIGHT);
Delay_ms(100);
}
Lcd_Cmd(_LCD_CLEAR);
}
}
//~
}
else
Lcd_Out(1,1,"Setup");
}
}
unsigned short read_ ds1307(unsigned short address )
{
I2C1_Start();
I2C1_Wr(0xd0);
I2C1_Wr(address);
I2C1_Repeated_Start();
I2C1_Wr(0xd1);
dat=I2C1_Rd(0);
I2C1_Stop();
return(dat);
}
unsigned char BCD2UpperCh(unsigned char bcd)
{
return ((bcd >> 4) + '0');
}
unsigned char BCD2LowerCh(unsigned char bcd)
{
return ((bcd & 0x0F) + '0');
}
void write_ ds1307(unsigned short address, unsigned short w_data )
{
I2C1_Start();
I2C1_Wr(0xD0);
I2C1_Wr(address);
I2C1_Wr(w_data);
I2C1_Stop();
}
de így nem működik a gombnyomás!
|
|