Advertisement
Guest User

Untitled

a guest
May 21st, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // Experiencia 07 - Exemplo: Cronometro e Teste de Interrupçoes
  2. // Para executar no simulador IDE68k
  3. // Autor: Carlos E. Cugnasca
  4. // I5: start/stop; I6: zera; I7: sai do programa
  5. // I1, I2, I3: mostra no LED o estado da chave
  6. // I4: le valor do slider e o envia ao terminal
  7. // Cada interrupçao envia uma mensagem ao terminal
  8. //
  9. // Interrupçoes - autovetores
  10. void *int1vec = 0x0064; // int 1
  11. void *int2vec = 0x0068; // int 2
  12. void *int3vec = 0x006C; // int 3
  13. void *int4vec = 0x0070; // int 4
  14. void *int5vec = 0x0074; // int 5
  15. void *int6vec = 0x0078; // int 6
  16. void *int7vec = 0x007C; // int 7
  17.  
  18. // Ponteiros para os dispositivos de E/S
  19. unsigned short *const display = (unsigned short *) 0xE010; // display[0]: digito + a esquerda
  20. unsigned long *const timer = (unsigned long *) 0xE040; // timer
  21. // padrao de bits para o display de 7 segmentos: 0 - 9
  22. unsigned short const bitpat[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
  23.  
  24. unsigned char *leds     = 0xE003; // end. do array de LEDs
  25. unsigned char *bar      = 0xE007; // end. do display de barra
  26. unsigned char *switches = 0xE001; // endereço das chaves
  27. unsigned char *slider   = 0xE005; // endereço das chaves
  28. unsigned char chaveaux, estadochaves, conta, para, zera;
  29. unsigned long counter = 0;
  30. unsigned long aux, aux1, posslider, save;
  31. int chave;
  32.     char CPWD[4]; // variaveis que armazenam digitos da senha
  33.     int i;
  34.  
  35. char mens [] = "Ocorreu interrupcao ";
  36. char mens4 [] = " Valor do Slider: ";
  37. char mens5 [] = " Inicia/Para";
  38. char mens6 [] = " Zera";
  39. char mens7 [] = " Aborta o Programa";
  40. char mens8 [] = " TESTE";
  41. char mens9 [] = "Digite o numero de 2 digitos que ao ser atingido, libera uma mensagem secreta";
  42. char mens10 [] = "Thanos will return";
  43. char mensCRLF [] = "\r\n";
  44.  
  45. // SR so' pode ser alterado no modo supervisor:
  46. // nivel da mascara de interrupcoes deve ser
  47. // colocado antes da execucao do programa
  48. // $2000: habilita todas ... $2600: apenas I7 (nao masc.)
  49.  
  50. void delay(void){ //atraso
  51.    int i = 0;
  52.    do {++i;}
  53.    while (i < 30000);}
  54.  
  55. void showslider(void){ // mostra slider
  56.    _trap(15);
  57.    _word(33);}
  58.  
  59. void show7seg(void){ // mostra display 7-seg
  60.    _trap(15);
  61.    _word(35);}
  62.  
  63. void showleds(void){ // mostra LEDs
  64.    _trap(15);
  65.    _word(31);}
  66.  
  67. void showswitches(void){ // mostra chaves
  68.    _trap(15);
  69.    _word(32);}
  70.  
  71. void showbar(void){ // mostra bar
  72.    _trap(15);
  73.    _word(34);}
  74.  
  75. void clear7seg(void){ // limpa display 7-seg
  76.    int i;
  77.    for (i = 0; i < 3; i++) display[i] = 0; // limpa 1os. 3 dig.
  78.        display[3] = bitpat[0];} // ultimo dig.= '0'
  79.  
  80. void write7seg(long n, int i){ // escreve no display 7-seg (recursiva)
  81.    if (n > 9) write7seg(n / 10, i - 1);
  82.        display[i] = bitpat[n % 10];}
  83.  
  84. void contar (void){ // realiza contagem
  85.    long cntr = *timer / 10;
  86.    (*bar)++; // incrementa display BAR
  87.    delay(); // temporiza
  88.    if (counter != cntr){ // timer mudou
  89.        counter = cntr;
  90.        write7seg(counter, 3);}}
  91.  
  92. void CRLF (void){ // envia CR e LF ao terminal
  93.    _A0 = mensCRLF; // A0: ponteiro para a string
  94.    _trap(15);
  95.    _word(7);} // system call PRTSTR
  96.  
  97. void print (long num){ // envia numero ao terminal
  98.    _D0 = num; // D0: numero com sinal para imprimir
  99.    _trap(15);
  100.    _word(5);} // system call PRTNUM
  101.  
  102. void envmen (long ender){ // envia mensagem
  103.    _A0 = ender; // A0: ponteiro para a string
  104.    _trap(15);
  105.    _word(7);} // system call PRTSTR
  106.  
  107. interrupt void int1proc(void){ // le/atualiza so estado chave 1
  108.    chaveaux = *switches & 0x02;
  109.    estadochaves = ((estadochaves & 0xFD)|chaveaux);
  110.    envmen (mens);
  111.    print (1);
  112.    CRLF ();}
  113.  
  114. interrupt void int2proc(void){ // le/atualiza so estado chave 2
  115.    chaveaux = *switches & 0x04;
  116.    estadochaves = ((estadochaves & 0xFB)|chaveaux);
  117.    envmen (mens);
  118.    print (2);
  119.    CRLF ();} // CR e LF
  120.  
  121. interrupt void int3proc(void){ // le/atualiza so estado chave 3
  122.    chaveaux = *switches & 0x08;
  123.    estadochaves = ((estadochaves & 0xF7)|chaveaux);
  124.    envmen (mens);
  125.    print (3);
  126.    CRLF ();} // CR e LF
  127.  
  128. interrupt void int4proc(void){ // envia valor slider ao terminal
  129.    envmen (mens);
  130.    print (4);
  131.    envmen (mens4);
  132.    posslider = *slider;
  133.    _D0 = posslider; // D0: numero com sinal para imprimir
  134.    _trap(15);
  135.    _word(5); // system call PRTNUM
  136.    CRLF ();} // CR e LF
  137.  
  138. interrupt void int5proc(void){ // inicia/para/continua contagem
  139.    envmen (mens);
  140.    print (5);
  141.    envmen (mens5);
  142.    CRLF (); // CR e LF
  143.  
  144.        if (conta == 0){ // esta parado, pedido de contagem
  145.            conta = 1;}
  146.        if (conta == 2){ // contando, pedido de parada
  147.            conta = 3;}
  148.        if (conta == 4){ // contando, pedido de parada
  149.            conta = 1;}
  150. }
  151.  
  152. interrupt void int6proc(void){ // zera contagem
  153.    envmen (mens);
  154.    print (6);
  155.    envmen (mens6);
  156.    CRLF (); // CR e LF
  157.    zera = 1;}
  158.  
  159. interrupt void int7proc(void){ // termina o programa
  160.    envmen (mens);
  161.    print (7);
  162.    envmen (mens7);
  163.    CRLF ();
  164.    _trap(15); // aborta o Programa
  165.    _word(0);} // system call EXIT
  166.  
  167. // Programa Principal
  168.  
  169. void main(void){
  170. // carrega enderecos das sub-rotinas de trat. int. no vetor
  171.    *int1vec = int1proc;
  172.    *int2vec = int2proc;
  173.    *int3vec = int3proc;
  174.    *int4vec = int4proc;
  175.    *int5vec = int5proc;
  176.    *int6vec = int6proc;
  177.    *int7vec = int7proc;
  178.  
  179.    showslider(); // mostra slider
  180.    showleds(); // mostra LEDs
  181.    showswitches(); // mostra chaves
  182.    showbar(); // mostra bar
  183.    show7seg(); // mostra display 7-seg
  184.    clear7seg(); // limpa display 7-seg
  185.  
  186.    conta = 1; // estado do contador
  187.    zera = 0; // zerar contador
  188.    *timer = 0; // inicializa timer
  189.    counter = 0; // valor do coontador
  190.    aux, aux1 = 0; // variaveis auxiliares
  191.  
  192.  
  193.    envmen (mens9);
  194.    CRLF ();
  195.    for (i = 0; i <= 1;++i)  // pega 2 digitos da senha
  196.        {_trap(15);
  197.        _word(2); // system call GETCH
  198.        CPWD[i] = _D0 - 48;
  199.    }
  200.  
  201.    save =  CPWD[0]*10 +  CPWD[1];
  202.    i = 0;
  203.  
  204.  
  205.  
  206.  
  207.  
  208.  
  209.    for (;;){
  210.        *leds = estadochaves; // atualiza estado das chaves
  211.  
  212.        chaveaux = *switches & 0x01;
  213.        estadochaves = ((estadochaves & 0xFE)|chaveaux);
  214.  
  215.        if (estadochaves == 1){
  216.            conta = 2;}
  217.        if (estadochaves == 0){
  218.            conta = 4;}
  219.  
  220.        if (zera == 1){ // pedido para zerar:
  221.            zera = 0; // limpa pedido de zerar
  222.            *timer = 0; // zera timer
  223.            counter = 0; // zera contador
  224.            aux = 0;
  225.            aux1 = 0;
  226.            write7seg(counter, 3); // atualiza display com 0s
  227.            clear7seg();} // limpa display
  228.        else{
  229.            if (conta == 1){ // inicio de parada
  230.                conta = 2; // estado = parado
  231.                aux = *timer; // salva valor do timer
  232.                aux1 = counter;} // salva valor do contador
  233.            if (conta == 2){ // parado
  234.            } // nada faz
  235.            if (conta == 3){ // voltando a contar contar
  236.                conta = 4; // estado = contado
  237.                *timer = aux; // restaura valor do timer
  238.                counter = aux1; // restaura valor do contador
  239.                contar();} // contar
  240.            if (conta == 4){ // contando
  241.                contar();
  242.                if (counter == save && i == 0) {
  243.                    CRLF ();
  244.                    envmen (mens10);
  245.                    CRLF ();
  246.                    i++;
  247.                }
  248.                } // contar
  249.            }
  250.        if (counter == 10000) break; // para apos contar ate 9999
  251.    }
  252. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement