Fórum témák

» Több friss téma
Cikkek » Kapunyitás gombnyomásra avagy Szezam_tarulj!
Kapunyitás gombnyomásra avagy Szezam_tarulj!
Szerző: Bonca, idő: Aug 16, 2011, Olvasva: 30010, Oldal olvasási idő: kb. 2 perc
Lapozás: OK   5 / 6

A vevő oldalon szintén az előző oszcillográfra hivatkoznék. Érdekességként említeném meg, hogy a vevő az adás befejezése után még kb. 80 ms-ig logikai 1-ben hagyja a kimenetét, és teljesen magától állítja 0-ba. Erről sincs semmiféle adat a gyári leírásban.

Mint említettem, a vevő az UART modulját használja a beérkező jelek fogadására. Az UART modul olvasásához mégsem a MikroC parancsait használom, hanem a mikrovezérlő RCREG regiszter "megtelését" figyelem az RCIF bit változásával. Amint beérkezik a 8 adatbit (az elküldött ASCII karakter), megszakítást generál (RCIF), és máris megkezdődik az beérkezett karakter összehasonlítása a kulcséval. Ha stimmel, és nem telt le az egy karakter fogadására adott idő, megvizsgálja a következő beérkező karaktert. Az egyirányú kommunikáció miatt itt csak a vétel oldal (Rx) van a vevő kimenetére kötve (mikrovezérlő 18-as lába).

Az egy karakter beérkezésére adott időt a mikrovezérlő Timer0 moduljával 16 bites módban időzíti. Ilyenkor 0-tól 65535-ig képes elszámolni a Timer0. Az egy karakter átvitelére szükséges idő 2400 Baud sebesség esetén kb. (1+8+1)*417µs=4170 µs. Ezt a start bit, az adatbitek és a stop bit összegének a bit idővel való szorzata adja meg. A mikrovezérlő 8 MHz-es belső órajele 0,5 µs alatt növeli a Timer0 értékét eggyel. Ha a Timer0 kezdőértékét 57000-re vesszük (DEA8h), akkor kb. 4300 µs idő van egy karakter fogadására (pontosan 4267,5 µs). Az ezen túl eltelt időnél túlcsordul a Timer0 (65535-ből átfordul 0-ba), megszakítást generál (TMR0IF), és a vevő oldali mikrovezérlő a kulcsot az első karaktertől várja újra.

A megszakítás függvény (interrupt) a lehető legrövidebbre lett megírva. Azaz, nem végez hosszadalmas számításokat, csak egy jelzőt és egy számlálót állít be  (rx_flag, key_cnt), és ezeket a változókat figyeljük a fő függvényben (main). A fő program nem csinál mást, csak az rx_flag értékét vizsgálja újra meg újra. Ez a megszakítás-vizsgálati módszer azért jó, mert a rövid interrupt függvény miatt nem lesz elhagyott adat az átvitel során. Ha az rx_flag  1, akkor az UART-on beérkezett bájtot összehasonlítja az általunk megadott kulcs következő elemével. Növeli a kulcs számlálójának értékét eggyel (key_cnt), hogy a következő UART-on érkezett bájtot összehasonlíthassa a kulcs következő elemével. Ha az összes karakter egyezik a kulcs összes karakterével, nyitja a kaput. Jelen esetben a B port 0. kivezetését (18F2520 21-es lábát) egy másodpercre logikai 1-re állítja. Ez meghúzza a relét, ami összezárja a kapunyitó vezérlőjének két kivezetését.

A legegyszerűbb kapunyitó motorvezérlőknél a motor mozgását két pont összezárása indítja be. Ezt a két pontot zárja össze a relé.

  1. /*******************************************************************************
  2.  18F2520
  3.  CONFIG1H: 0x0008
  4.  CONFIG2L: 0x001F
  5.  CONFIG2H: 0x001E
  6.  CONFIG3H: 0x0003
  7.  CONFIG4L: 0x0081
  8.  CONFIG5L: 0x000F
  9.  CONFIG5H: 0x00C0
  10.  CONFIG6L: 0x000F
  11.  CONFIG6H: 0x00E0
  12.  CONFIG7L: 0x000F
  13.  CONFIG7H: 0x0040
  14. *******************************************************************************/
  15.  
  16. const char key[] = "Szezam_tarulj!"; // a kulcs változója
  17. char key_cnt = 0;                    // kulcs elemeinek számlálója
  18. char uart_buffer;                    // az UART-on fogadott bájtok változója
  19. char rx_flag = 0;                    // rx buffer full flag
  20.  
  21. void interrupt (){
  22.   if (INTCON.TMR0IF){         // időtúllépés-figyelés
  23.     key_cnt = 0;
  24.     INTCON.TMR0IF = 0;
  25.   }
  26.   if (PIR1.RCIF){
  27.     uart_buffer = RCREG;      // törli az RCIF-et, nem kell PIR1.RCIF=0
  28.     rx_flag = 1;
  29.   }
  30. }
  31.  
  32. void main (){
  33.   OSCCON = 0x72;              // pdf 32.
  34.   ADCON1 = 0x0F;              // pdf 226.
  35.   CMCON = 0x07;               // pdf 235.
  36.   TRISA = 0;
  37.   LATA = 0;
  38.   TRISB = 0;
  39.   LATB = 0;
  40.   TRISC = 0b10000000;         // Rx-Tx
  41.   LATC = 0;
  42.   PIE1.RCIE = 1;              // pdf 100.
  43.   INTCON = 0b11100000;        // pdf 95.
  44.   T0CON = 0b10001000;         // pdf 125.
  45.  
  46.   UART1_Init(2400);
  47.   delay_ms(100);
  48.  
  49.   while (1){
  50.     if (rx_flag == 1){
  51.       rx_flag = 0;
  52.       if (key[key_cnt] == uart_buffer){
  53.         TMR0H = 0xDE;         // 65535-8535=57000 (DEA8h)
  54.         TMR0L = 0xA8;         // egy bájt és az időtúllépése, kb. 100 µs
  55.         key_cnt++;
  56.       }
  57.       else {key_cnt == 0;}
  58.       if (key_cnt == sizeof(key)-1){ // nyitás
  59.         LATB.B0 = 1;
  60.         delay_ms(1000);
  61.         LATB.B0 = 0;
  62.         key_cnt = 0;
  63.       }
  64.     }
  65.   }
  66. }


A cikk még nem ért véget, lapozz!
Következő: »»   5 / 6
Értékeléshez bejelentkezés szükséges!
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