home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / magazine / drdobbs / 1991 / 10 / embedcp / test / async2.c < prev    next >
C/C++ Source or Header  |  1991-03-30  |  3KB  |  144 lines

  1. /* MIO Async test program #2
  2.  * -------------------------
  3.  *
  4.  * Written : March 17th, 1991
  5.  * By      : Stuart G. Phillips
  6.  *
  7.  * Sets SCC2 Channel B up in Async mode at 9600 bps and echos any characters
  8.  * received. This test program is very similar to ASYNC1 except it uses
  9.  * interrupts rather than polling.
  10.  *
  11.  */
  12.  
  13.  
  14. #include "mio.h"
  15. #include "8530.h"
  16.  
  17. /* Communication region used to deposit status information about the
  18.  * programs progress etc in the shared memory window.
  19.  */
  20.  
  21. struct comm_region {    unsigned short status;
  22.                         unsigned short scc_status;
  23.                         unsigned short scc_special;
  24.                         unsigned short int_cnt;
  25.                         unsigned short rx_cnt;
  26.                         unsigned short tx_cnt;
  27.                         unsigned char  command;
  28.                    };
  29.  
  30. static void interrupt scc_int();
  31. static void update_nwait(unsigned short);
  32.  
  33. struct comm_region *creg = (struct comm_region *)0x80;
  34.  
  35. extern unsigned _stklen = 8192U;
  36.  
  37. void main()
  38. {
  39.     unsigned char data,val;
  40.     unsigned short i;
  41.  
  42.     disable();
  43.  
  44.     creg->status = 0;
  45.     creg->scc_status = 0;
  46.     creg->scc_special = 0;
  47.     creg->int_cnt = 0;
  48.     creg->rx_cnt = 0;
  49.     creg->tx_cnt = 0;
  50.     creg->command = 0xff;
  51.  
  52.     /* Enable ICU in the V40 peripheral select register */
  53.  
  54.     data = inportb(OPSEL);
  55.     outportb(OPSEL,data|ICU);
  56.     data = inportb(OPSEL);
  57.     creg->status = data;
  58.  
  59.     /* Initialize the ICU */
  60.  
  61.     outportb(IULA,ICUBASE);                        /* Set base address */
  62.     outportb(IMDW,IIW1|IIW4NR|IEM|IET);            /* No IIW4, extended mode,
  63.                                                  * edge triggered
  64.                                                  */
  65.     outportb(IMDW,IVEC);                        /* Set vector base for PIC */
  66.     outportb(IMDW,SI7);                            /* IRQ7 is slave */
  67.  
  68.     /* Set up SCC - this takes a while ! */
  69.  
  70.     scc_write(SCC2|CHANB|CMD,R9,FHWRES);        /* Reset the SCC */
  71.  
  72.     /* Loop a while to let reset complete */
  73.  
  74.     for (i=0; i<256; i++) ;
  75.  
  76.     /* Set SCC interrupt handler */
  77.  
  78.     setvect(0x40,scc_int);
  79.  
  80.     /* Set SCC interupt vector and enables */
  81.  
  82.     scc_write(SCC2|CHANB|CMD,R2,0x40);
  83.     scc_write(SCC2|CHANB|CMD,R9,MIE);
  84.  
  85.     scc_write(SCC2|CHANB|CMD,R1,INT_ALL_Rx);
  86.  
  87.     /* Set Async mode, 8 bits Tx/Rx, 1 stop bit, No parity */
  88.  
  89.     scc_write(SCC2|CHANB|CMD,R4,X16CLK|SB1);
  90.     scc_write(SCC2|CHANB|CMD,R5,DTR|Tx8|TxENAB|RTS);
  91.     scc_write(SCC2|CHANB|CMD,R3,Rx8|RxENABLE);
  92.  
  93.     /* Set Baud rate generator constant */
  94.  
  95.     scc_write(SCC2|CHANB|CMD,R12,24);
  96.     scc_write(SCC2|CHANB|CMD,R13,0);
  97.  
  98.     /* Set Baud rate generator source and enable */
  99.  
  100.     scc_write(SCC2|CHANB|CMD,R11,RCBR|TCBR);
  101.     scc_write(SCC2|CHANB|CMD,R14,SSBR|BRSRC|BRENABL);
  102.  
  103.     /* Enable 'slave' interupts */
  104.  
  105.     outportb(IMKW,IRQ7);
  106.  
  107.     enable();
  108.     while (1){
  109.         creg->status++;
  110.         /* Loop - All processing done in the interrupt routine */
  111.     }
  112. }
  113.  
  114.  
  115. static void interrupt scc_int()
  116. {
  117.     unsigned char status,spl,data;
  118.     struct comm_region *creg = (struct comm_region *)0x80;
  119.  
  120.     creg->int_cnt++;
  121.     status = scc_read(SCC2|CHANB|CMD,R0);
  122.     spl = scc_read(SCC2|CHANB|CMD,R1);
  123.     creg->scc_special = spl;
  124.  
  125.     scc_write(SCC2|CHANB|CMD,R0,ERR_RES);
  126.  
  127.     if (status & Rx_CH_AV){
  128.         data = scc_rdata(SCC2|CHANB|DATA);
  129.         creg->rx_cnt++;
  130.         creg->scc_status = status;
  131.         scc_wdata(SCC2|CHANB|DATA,data);
  132.         creg->tx_cnt++;
  133.     }
  134.  
  135.     outportb(IMDW,ISEOI|IRQ7);
  136. }
  137.  
  138. static void update_nwait(unsigned short status)
  139. {
  140.     creg->status = status;
  141.     creg->command = 0;
  142.     while (creg->command == 0) ;
  143.     creg->command = 0;
  144. }