Fórum témák

» Több friss téma
Fórum » PIC kezdőknek
 
Témaindító: Placi84, idő: Okt 3, 2005
Témakörök:
- 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.
Lapozás: OK   171 / 1211
(#) n_yálastrubadúr válasza Hp41C hozzászólására (») Nov 11, 2011 /
 
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?
(#) icserny válasza doup hozzászólására (») Nov 11, 2011 /
 
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.
(#) doup válasza icserny hozzászólására (») Nov 11, 2011 /
 
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?
(#) vicsys válasza doup hozzászólására (») Nov 11, 2011 /
 
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...
(#) doup válasza vicsys hozzászólására (») Nov 11, 2011 /
 
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.
(#) icserny válasza doup hozzászólására (») Nov 11, 2011 /
 
Én csak ezt a könyvet tudom ajánlani.
(#) vicsys válasza doup hozzászólására (») Nov 11, 2011 /
 
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
(#) doup válasza icserny hozzászólására (») Nov 11, 2011 /
 
Még néha magyarul is elég megérteni nem hogy angolul.
(#) doup válasza vicsys hozzászólására (») Nov 11, 2011 /
 
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.
(#) vicsys válasza doup hozzászólására (») Nov 11, 2011 /
 
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?
  1. /*
  2.  * Project name:
  3.      Timer0_Interrupt (Using Timer0 to obtain interrupts)
  4.  * Copyright:
  5.      (c) Mikroelektronika, 2008.
  6.  * Revision History:
  7.      20080930:
  8.        - initial release;
  9.  * Description:
  10.      This code demonstrates how to use Timer0 and it's interrupt.
  11.      Program toggles LEDs on PORTB.
  12.  * Test configuration:
  13.      MCU:             PIC16F887
  14.                       http://ww1.microchip.com/downloads/en/DeviceDoc/41291F.pdf
  15.      Dev.Board:       EasyPIC6
  16.      Oscillator:      HS, 08.0000 MHz
  17.      Ext. Modules:    -
  18.      SW:              mikroC PRO for PIC
  19.  * NOTES:
  20.      - Turn on LEDs on PORTB switch SW9.2 (board specific).
  21. */
  22.  
  23. unsigned cnt;
  24.  
  25. void interrupt() {
  26.   if (TMR0IF_bit) {
  27.     cnt++;                 // increment counter
  28.     TMR0IF_bit = 0;        // clear TMR0IF
  29.     TMR0   = 96;
  30.   }
  31. }
  32.  
  33. void main() {
  34.   OPTION_REG = 0x84;       // Assign prescaler to TMR0
  35.   ANSEL  = 0;              // Configure AN pins as digital
  36.   ANSELH = 0;
  37.   C1ON_bit = 0;            // Disable comparators
  38.   C2ON_bit = 0;
  39.   TRISB = 0;               // PORTB is output
  40.   PORTB = 0xFF;            // Initialize PORTB
  41.   TMR0  = 96;              // Timer0 initial value
  42.   INTCON = 0xA0;           // Enable TMRO interrupt
  43.   cnt = 0;                 // Initialize cnt
  44.  
  45.   do {
  46.     if (cnt >= 400) {
  47.       PORTB = ~PORTB;      // Toggle PORTB LEDs
  48.       cnt = 0;             // Reset cnt
  49.     }
  50.   } while(1);
  51. }
(#) röntgen válasza doup hozzászólására (») Nov 11, 2011 /
 
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)
(#) icserny válasza doup hozzászólására (») Nov 12, 2011 /
 
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?

  1. while(1)
  2. {
  3. sec=read_ds1307(0); // másodperc kiolvasása
  4. minute=read_ds1307(1); // perc kiolvasása
  5. hour=read_ds1307(2); // óra kiolvasása
  6. day=read_ds1307(3); // nap kiolvasása
  7. date=read_ds1307(4); // dátum kiolvasása
  8. month=read_ds1307(5); // hónap kiolvasása
  9. year=read_ds1307(6); // év kiolvasása
  10.  
  11. time[0] = BCD2UpperCh(hour);
  12. time[1] = BCD2LowerCh(hour);
  13. time[2] = ':';
  14. time[3] = BCD2UpperCh(minute);
  15. time[4] = BCD2LowerCh(minute);
  16. time[5] = ':';
  17. time[6] = BCD2UpperCh(sec);
  18. time[7] = BCD2LowerCh(sec);
  19. time[8] = '\0';
  20.  
  21. ddate[0] = '2';
  22. ddate[1] = '0';
  23. ddate[2] = BCD2UpperCh(year);
  24. ddate[3] = BCD2LowerCh(year);
  25. ddate[4] ='.';
  26. ddate[5] = BCD2UpperCh(month);
  27. ddate[6] = BCD2LowerCh(month);
  28. ddate[7] ='.';
  29. ddate[8] = BCD2UpperCh(date);
  30. ddate[9] = BCD2LowerCh(date);
  31. ddate[10] = '\0';
  32. for(k = 0; k < 8; ++k)
  33. {
  34.       Lcd_Chr(1, 5+k, time[k]);
  35.       Delay_ms(150);
  36. }
  37. for(k = 0; k < 10; ++k)
  38. {
  39.       Lcd_Chr(2, 4+k, ddate[k]);
  40.       Delay_ms(150);
  41. }
  42. }
  43. }
(#) doup válasza icserny hozzászólására (») Nov 12, 2011 /
 
Azt még ki is bogarászom de nem fogok pic programozást angol könyvből tanulni.
(#) Hp41C válasza doup hozzászólására (») Nov 12, 2011 /
 
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
  1. // LCD module connections
  2. sbit LCD_RS at RB4_bit;
  3. sbit LCD_EN at RB5_bit;
  4. sbit LCD_D4 at RB0_bit;
  5. sbit LCD_D5 at RB1_bit;
  6. sbit LCD_D6 at RB2_bit;
  7. sbit LCD_D7 at RB3_bit;
  8.  
  9. sbit LCD_RS_Direction at TRISB4_bit;
  10. sbit LCD_EN_Direction at TRISB5_bit;
  11. sbit LCD_D4_Direction at TRISB0_bit;
  12. sbit LCD_D5_Direction at TRISB1_bit;
  13. sbit LCD_D6_Direction at TRISB2_bit;
  14. sbit LCD_D7_Direction at TRISB3_bit;
  15. // End LCD module connections
  16.  
  17. unsigned short read_ds1307(unsigned short address );
  18. void write_ds1307(unsigned short address,unsigned short w_data);
  19. unsigned short sec;
  20. unsigned short minute;
  21. unsigned short hour;
  22. unsigned short day;
  23. unsigned short date;
  24. unsigned short month;
  25. unsigned short year;
  26. unsigned short dat;
  27. char time[9];
  28. char tim[9] = {'1','8',':','3','0',':','0','0','\0'};
  29. char ddate[11];
  30. int k = 0;
  31.  
  32. unsigned char BCD2UpperCh(unsigned char bcd);
  33. unsigned char BCD2LowerCh(unsigned char bcd);
  34.  
  35. void interrupt() {
  36.   if (TMR0IF_bit) {
  37.     Lcd_Init();
  38.     Lcd_Cmd(_Lcd_CLEAR);
  39.     Lcd_Cmd(_Lcd_CURSOR_OFF);
  40.     for(k = 0; k < 8; ++k)
  41.     {
  42.       Lcd_Chr(1, 5+k, time[k]);
  43.       Delay_ms(150);
  44.     }
  45.     for(k = 0; k < 10; ++k)
  46.     {
  47.       Lcd_Chr(2, 4+k, ddate[k]);
  48.       Delay_ms(150);
  49.     }
  50.     TMR0IF_bit = 0;        // clear TMR0IF
  51.     TMR0   = 96;
  52.   }
  53. }
  54.  
  55. void main(){
  56. OPTION_REG = 0x84;
  57. I2C1_Init(100000);
  58. PORTB = 0;
  59. TRISB = 0;
  60. TRISD = 0;
  61. PORTD = 0;
  62. TRISC = 0xFF;
  63. TMR0  = 96;              // Timer0 initial value
  64. INTCON = 0xA0;           // Enable TMRO interrupt
  65. write_ds1307(0,0x80); //Reset second to 0 sec. and stop Oscillator
  66. write_ds1307(1,0x34); //write min 27
  67. write_ds1307(2,0x21); //write hour 14
  68. write_ds1307(3,0x02); //write day of week 2:Monday
  69. write_ds1307(4,0x11); // write date 17
  70. write_ds1307(5,0x11); // write month 6 June
  71. write_ds1307(6,0x11); // write year 8 --> 2008
  72. write_ds1307(7,0x10); //SQWE output at 1 Hz
  73. write_ds1307(0,0x00); //Reset second to 0 sec. and start Oscillator
  74.  
  75. while(1)
  76. {
  77. sec=read_ds1307(0); // másodperc kiolvasása
  78. minute=read_ds1307(1); // perc kiolvasása
  79. hour=read_ds1307(2); // óra kiolvasása
  80. day=read_ds1307(3); // nap kiolvasása
  81. date=read_ds1307(4); // dátum kiolvasása
  82. month=read_ds1307(5); // hónap kiolvasása
  83. year=read_ds1307(6); // év kiolvasása
  84.  
  85. time[0] = BCD2UpperCh(hour);
  86. time[1] = BCD2LowerCh(hour);
  87. time[2] = ':';
  88. time[3] = BCD2UpperCh(minute);
  89. time[4] = BCD2LowerCh(minute);
  90. time[5] = ':';
  91. time[6] = BCD2UpperCh(sec);
  92. time[7] = BCD2LowerCh(sec);
  93. time[8] = '\0';
  94.  
  95. ddate[0] = '2';
  96. ddate[1] = '0';
  97. ddate[2] = BCD2UpperCh(year);
  98. ddate[3] = BCD2LowerCh(year);
  99. ddate[4] ='.';
  100. ddate[5] = BCD2UpperCh(month);
  101. ddate[6] = BCD2LowerCh(month);
  102. ddate[7] ='.';
  103. ddate[8] = BCD2UpperCh(date);
  104. ddate[9] = BCD2LowerCh(date);
  105. ddate[10] = '\0';
  106.  
  107. }
  108. }
  109.  
  110. unsigned short read_ds1307(unsigned short address)
  111. {
  112. I2C1_Start();
  113. I2C1_Wr(0xd0); //address 0x68 followed by direction bit (0 for write, 1 for read) 0x68 followed by 0 --> 0xD0
  114. I2C1_Wr(address);
  115. I2C1_Repeated_Start();
  116. I2C1_Wr(0xd1); //0x68 followed by 1 --> 0xD1
  117. dat=I2C1_Rd(0);
  118. I2C1_Stop();
  119. return(dat);
  120. }
  121.  
  122. unsigned char BCD2UpperCh(unsigned char bcd)
  123. {
  124. return ((bcd >> 4) + '0');
  125. }
  126.  
  127. unsigned char BCD2LowerCh(unsigned char bcd)
  128. {
  129. return ((bcd & 0x0F) + '0');
  130. }
  131. void write_ds1307(unsigned short address,unsigned short w_data)
  132. {
  133. I2C1_Start(); // issue I2C start signal
  134. //address 0x68 followed by direction bit (0 for write, 1 for read) 0x68 followed by 0 --> 0xD0
  135. I2C1_Wr(0xD0); // send byte via I2C (device address + W)
  136. I2C1_Wr(address); // send byte (address of DS1307 location)
  137. I2C1_Wr(w_data); // send data (data to be written)
  138. I2C1_Stop(); // issue I2C stop signal
  139. }
(#) röntgen válasza doup hozzászólására (») Nov 12, 2011 /
 
Az LCD inicializálást miért végzed el mindig az IT rutinban?
(#) röntgen válasza röntgen hozzászólására (») Nov 12, 2011 /
 
És a törlést? minek.....
(#) doup válasza röntgen hozzászólására (») Nov 12, 2011 /
 
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'
(#) röntgen válasza doup hozzászólására (») Nov 12, 2011 /
 
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.
(#) doup válasza röntgen hozzászólására (») Nov 12, 2011 /
 
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
(#) röntgen válasza doup hozzászólására (») Nov 12, 2011 /
 
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.
(#) doup válasza röntgen hozzászólására (») Nov 12, 2011 /
 
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?
(#) doup válasza röntgen hozzászólására (») Nov 12, 2011 /
 
Egyébként a button-t megnézetem az nagyon jó ötlet köszönöm.
(#) röntgen válasza doup hozzászólására (») Nov 12, 2011 /
 
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.
(#) doup válasza röntgen hozzászólására (») Nov 12, 2011 /
 
Mondjuk itt a másodpercenkénti RCT olvasást hogy oldanád meg Timerrel?

  1. unsigned short read_ds1307(unsigned short address );
  2. void write_ds1307(unsigned short address,unsigned short w_data);
  3. unsigned short sec;
  4. unsigned short minute;
  5. unsigned short hour;
  6. unsigned short day;
  7. unsigned short date;
  8. unsigned short month;
  9. unsigned short year;
  10. unsigned short data;
  11. char time[9];
  12. char ddate[11];
  13.  
  14. unsigned char BCD2UpperCh(unsigned char bcd);
  15. unsigned char BCD2LowerCh(unsigned char bcd);
  16.  
  17. void main(){
  18.  
  19. I2C_Init(100000); //DS1307 I2C is running at 100KHz
  20. PORTB = 0;
  21. TRISB = 0; // Configure PORTB as output
  22. TRISC = 0xFF;
  23. Lcd_Init(&PORTB); // Initialize LCD connected to PORTB
  24. Lcd_Cmd(Lcd_CLEAR); // Clear display
  25. Lcd_Cmd(Lcd_CURSOR_OFF); // Turn cursor off
  26. Lcd_Out(1, 1, "TIME:");
  27. Lcd_Out(2, 1, "DATE:");
  28.  
  29. //Set Time
  30. write_ds1307(0,0x80); //Reset second to 0 sec. and stop Oscillator
  31. write_ds1307(1,0x10); //write min 27
  32. write_ds1307(2,0x01); //write hour 14
  33. write_ds1307(3,0x02); //write day of week 2:Monday
  34. write_ds1307(4,0x05); // write date 17
  35. write_ds1307(5,0x01); // write month 6 June
  36. write_ds1307(6,0x09); // write year 8 --> 2008
  37. write_ds1307(7,0x10); //SQWE output at 1 Hz
  38. write_ds1307(0,0x00); //Reset second to 0 sec. and start Oscillator
  39.  
  40. while(1)
  41. {
  42. sec=read_ds1307(0); // read second
  43. minute=read_ds1307(1); // read minute
  44. hour=read_ds1307(2); // read hour
  45. day=read_ds1307(3); // read day
  46. date=read_ds1307(4); // read date
  47. month=read_ds1307(5); // read month
  48. year=read_ds1307(6); // read year
  49.  
  50. time[0] = BCD2UpperCh(hour);
  51. time[1] = BCD2LowerCh(hour);
  52. time[2] = ':';
  53. time[3] = BCD2UpperCh(minute);
  54. time[4] = BCD2LowerCh(minute);
  55. time[5] = ':';
  56. time[6] = BCD2UpperCh(sec);
  57. time[7] = BCD2LowerCh(sec);
  58. time[8] = '\0';
  59.  
  60. ddate[0] = BCD2UpperCh(date);
  61. ddate[1] = BCD2LowerCh(date);
  62. ddate[2] ='/';
  63. ddate[3] = BCD2UpperCh(month);
  64. ddate[4] = BCD2LowerCh(month);
  65. ddate[5] ='/';
  66. ddate[6] = '2';
  67. ddate[7] = '0';
  68. ddate[8] = BCD2UpperCh(year);
  69. ddate[9] = BCD2LowerCh(year);
  70. ddate[10] = '\0';
  71.  
  72. Lcd_Out(1,6,time);
  73. Lcd_Out(2,6,ddate);
  74. Delay_ms(1000);
  75. }
  76. }
  77.  
  78. unsigned short read_ds1307(unsigned short address)
  79. {
  80. I2C_Start();
  81. I2C_Wr(0xd0); //address 0x68 followed by direction bit (0 for write, 1 for read) 0x68 followed by 0 --> 0xD0
  82. I2C_Wr(address);
  83. I2C_Repeated_Start();
  84. I2C_Wr(0xd1); //0x68 followed by 1 --> 0xD1
  85. data=I2C_Rd(0);
  86. I2C_Stop();
  87. return(data);
  88. }
  89.  
  90. unsigned char BCD2UpperCh(unsigned char bcd)
  91. {
  92. return ((bcd >> 4) + '0');
  93. }
  94.  
  95. unsigned char BCD2LowerCh(unsigned char bcd)
  96. {
  97. return ((bcd & 0x0F) + '0');
  98. }
  99. void write_ds1307(unsigned short address,unsigned short w_data)
  100. {
  101. I2C_Start(); // issue I2C start signal
  102. //address 0x68 followed by direction bit (0 for write, 1 for read) 0x68 followed by 0 --> 0xD0
  103. I2C_Wr(0xD0); // send byte via I2C (device address + W)
  104. I2C_Wr(address); // send byte (address of DS1307 location)
  105. I2C_Wr(w_data); // send data (data to be written)
  106. I2C_Stop(); // issue I2C stop signal
  107. }
(#) röntgen válasza doup hozzászólására (») Nov 12, 2011 /
 
Milyen sűrűn keletkezik most megszakítás, ebben a beállításodban?
(#) doup válasza röntgen hozzászólására (») Nov 12, 2011 /
 
A jelenlegi programom az ez
  1. // LCD beállítás
  2. sbit LCD_RS at RB4_bit;
  3. sbit LCD_EN at RB5_bit;
  4. sbit LCD_D4 at RB0_bit;
  5. sbit LCD_D5 at RB1_bit;
  6. sbit LCD_D6 at RB2_bit;
  7. sbit LCD_D7 at RB3_bit;
  8.  
  9. sbit LCD_RS_Direction at TRISB4_bit;
  10. sbit LCD_EN_Direction at TRISB5_bit;
  11. sbit LCD_D4_Direction at TRISB0_bit;
  12. sbit LCD_D5_Direction at TRISB1_bit;
  13. sbit LCD_D6_Direction at TRISB2_bit;
  14. sbit LCD_D7_Direction at TRISB3_bit;
  15. //~
  16.  
  17. //Változók deklarálásának listája
  18. unsigned short read_ds1307(unsigned short address );
  19. void write_ds1307(unsigned short address,unsigned short w_data);
  20. unsigned short sec;
  21. unsigned short minute;
  22. unsigned short hour;
  23. unsigned short day;
  24. unsigned short date;
  25. unsigned short month;
  26. unsigned short year;
  27. unsigned short dat;
  28. char time[9];
  29. char tim[9] = {'1','8',':','3','0',':','0','0','\0'};
  30. char ddate[11];
  31. const unsigned short TEMP_RESOLUTION = 9;
  32. char *text = " 00.0", text_sign;
  33. unsigned temp;
  34. int homerseklet = 0, k = 0, i = 0, j = 0, gomb = 0;
  35. char text2[12] = {'T','h','e','m','p','e','r','a','t','u','r','e'};
  36. char textsign[2] = {'°', 'C'};
  37.  
  38. unsigned char BCD2UpperCh(unsigned char bcd);
  39. unsigned char BCD2LowerCh(unsigned char bcd);
  40. //~
  41.  
  42. void Display_Temperature(unsigned int temp2write) {
  43.     const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8;
  44.     char temp_whole;
  45.     unsigned int temp_fraction;
  46.  
  47.     //--- Hőmérséklet negatív részének vizsgálata
  48.     if (temp2write & 0x8000) {
  49.         text[0] = '-';
  50.         temp2write = ~temp2write + 1;
  51.     }
  52.     //--- Egész rész
  53.     temp_whole = temp2write >> RES_SHIFT ;
  54.  
  55.     //--- Egész rész karakterré konvertálás
  56.     if (temp_whole/100)
  57.         text[0] = temp_whole/100 + 48;
  58.  
  59.     text[1] = (temp_whole/10)%10 + 48; //--- Tizes digit
  60.     text[2] = temp_whole%10 + 48;      //--- Egyes digit
  61.  
  62.     //--- Előjel nélküli egészre konvertálás
  63.     temp_fraction = temp2write << (4-RES_SHIFT);
  64.     temp_fraction &= 0x000F;
  65.     temp_fraction *= 625;
  66.  
  67.     //--- Konvertálás karakterré
  68.     text[4] = temp_fraction/1000 + 48;     //--- Ezres digit
  69.  
  70.     //--- Hőmérséklet kiírása az LCD-re
  71.     for(k = 0; k < strlen(text); k++)
  72.     {
  73.           Lcd_Chr(2, 5+k, text[k]);
  74.           Delay_ms(150);
  75.     }
  76.     for(k = 0; k < 2; k++)
  77.     {
  78.           Lcd_Chr(2, 10+k, textsign[k]);
  79.           Delay_ms(150);
  80.     }
  81. }
  82.  
  83. void Homerseklet_lekerdezes()
  84. {
  85.      //--- Hőmérséklet értékének kiolvasása
  86.     Ow_Reset(&PORTD, 0);
  87.     Ow_Write(&PORTD, 0, 0xCC);
  88.     Ow_Write(&PORTD, 0, 0x44);
  89.     Delay_ms(1000);
  90.  
  91.     Ow_Reset(&PORTD, 0);
  92.     Ow_Write(&PORTD, 0, 0xCC);
  93.     Ow_Write(&PORTD, 0, 0xBE);
  94.  
  95.     temp =  Ow_Read(&PORTD, 0);
  96.     temp = (Ow_Read(&PORTD, 0) << 8) + temp;
  97.  
  98.     Display_Temperature(temp);
  99. }
  100.  
  101. unsigned short cnt;
  102.  
  103. void main(){
  104.      I2C1_Init(100000);
  105.      PORTB = 0;
  106.      TRISB = 0;
  107.      TRISD = 0;
  108.      PORTD = 0;
  109.      TRISC = 0xFF;
  110.      PORTB.RB2 = 0Xff;     //A PORTB 2. lábát bemenetre állítom
  111.      Lcd_Init();
  112.      Lcd_Cmd(_Lcd_CLEAR);
  113.      Lcd_Cmd(_Lcd_CURSOR_OFF);
  114.      write_ds1307(0,0x80); //Reset second to 0 sec. and stop Oscillator
  115.      write_ds1307(1,0x34); //write min 27
  116.      write_ds1307(2,0x10); //write hour 14
  117.      write_ds1307(3,0x02); //write day of week 2:Monday
  118.      write_ds1307(4,0x12); // write date 17
  119.      write_ds1307(5,0x11); // write month 6 June
  120.      write_ds1307(6,0x11); // write year 8 --> 2008
  121.      write_ds1307(7,0x10); //SQWE output at 1 Hz
  122.      write_ds1307(0,0x00); //Reset second to 0 sec. and start Oscillator
  123.  
  124.      while(1)
  125.      {
  126.              if(PORTB.RB2 == 0)
  127.                 gomb++;
  128.              if(gomb % 2){
  129.              //IDŐ MEGJELENÍTÉSE
  130.              for(i = 0; i <=29; i++)
  131.              {
  132.                    sec=read_ds1307(0); // másodperc kiolvasása
  133.                    minute=read_ds1307(1); // perc kiolvasása
  134.                    hour=read_ds1307(2); // óra kiolvasása
  135.                    day=read_ds1307(3); // nap kiolvasása
  136.                    date=read_ds1307(4); // dátum kiolvasása
  137.                    month=read_ds1307(5); // hónap kiolvasása
  138.                    year=read_ds1307(6); // év kiolvasása
  139.  
  140.                    time[0] = BCD2UpperCh(hour);
  141.                    time[1] = BCD2LowerCh(hour);
  142.                    time[2] = ':';
  143.                    time[3] = BCD2UpperCh(minute);
  144.                    time[4] = BCD2LowerCh(minute);
  145.                    time[5] = ':';
  146.                    time[6] = BCD2UpperCh(sec);
  147.                    time[7] = BCD2LowerCh(sec);
  148.                    time[8] = '\0';
  149.  
  150.                    ddate[0] = '2';
  151.                    ddate[1] = '0';
  152.                    ddate[2] = BCD2UpperCh(year);
  153.                    ddate[3] = BCD2LowerCh(year);
  154.                    ddate[4] ='.';
  155.                    ddate[5] = BCD2UpperCh(month);
  156.                    ddate[6] = BCD2LowerCh(month);
  157.                    ddate[7] ='.';
  158.                    ddate[8] = BCD2UpperCh(date);
  159.                    ddate[9] = BCD2LowerCh(date);
  160.                    ddate[10] = '\0';
  161.                    
  162.                    Lcd_Out(1,5,time);
  163.                    Lcd_Out(2,4,ddate);
  164.                    Delay_ms(1000);
  165.                    if(i == 29)
  166.                    {
  167.                         for(k = 0; k < 13; k++)
  168.                         {
  169.                               Lcd_Cmd(_LCD_SHIFT_RIGHT);
  170.                               Delay_ms(100);
  171.                         }
  172.                         Lcd_Cmd(_LCD_CLEAR);
  173.                    }
  174.               }
  175.               //~
  176.              
  177.               //HŐMÉRSÉKLET MEGJELENÍTÉSE
  178.               for(j = 0; j <= 10; j++)
  179.               {
  180.                     for(k = 0; k < 12; ++k)
  181.                     {
  182.                           Lcd_Chr(1, 3+k, text2[k]);
  183.                           Delay_ms(150);
  184.                     }
  185.                     Homerseklet_lekerdezes();
  186.                     if(j == 10)
  187.                     {
  188.                          for(k = 0; k < 13; k++)
  189.                          {
  190.                                Lcd_Cmd(_LCD_SHIFT_RIGHT);
  191.                                Delay_ms(100);
  192.                          }
  193.                          Lcd_Cmd(_LCD_CLEAR);
  194.                     }
  195.               }
  196.               //~
  197.               }
  198.               else
  199.                   Lcd_Out(1,1,"Setup");
  200.        }
  201. }
  202.  
  203. unsigned short read_ds1307(unsigned short address)
  204. {
  205.          I2C1_Start();
  206.          I2C1_Wr(0xd0);
  207.          I2C1_Wr(address);
  208.          I2C1_Repeated_Start();
  209.          I2C1_Wr(0xd1);
  210.          dat=I2C1_Rd(0);
  211.          I2C1_Stop();
  212.          return(dat);
  213. }
  214.  
  215. unsigned char BCD2UpperCh(unsigned char bcd)
  216. {
  217.          return ((bcd >> 4) + '0');
  218. }
  219.  
  220. unsigned char BCD2LowerCh(unsigned char bcd)
  221. {
  222.          return ((bcd & 0x0F) + '0');
  223. }
  224. void write_ds1307(unsigned short address,unsigned short w_data)
  225. {
  226.          I2C1_Start();
  227.          I2C1_Wr(0xD0);
  228.          I2C1_Wr(address);
  229.          I2C1_Wr(w_data);
  230.          I2C1_Stop();
  231. }

de így nem működik a gombnyomás!
Következő: »»   171 / 1211
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem