Advertisement
paulogp

ATmega128: T1B - LEDs com temporização

Jul 13th, 2011
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.09 KB | None | 0 0
  1. /* Partindo da situação em que os LEDs (D1 ... D8) se encontram apagados, pretende-se que, ao accionar SW1, seja feito o sequenciamento dos 8 LEDs D1, D2, ..., D8 (um LED activo de cada vez). Depois de D8 ser activado a sequência deve recomeçar com D1. A activação dos diferentes LEDs deve ser feita de 500 em 500 ms. A activação de SW6 permite colocar o sistema na situação inicial (LEDs todos apagados). */
  2.  
  3. /*
  4. Tc - tempo ciclo
  5. 1Tc = 1 / f = 1 / 16MHz = 62.5ns
  6.  
  7. P -> for (i)
  8. M -> for (j)
  9. N -> for (k)
  10.  
  11. P*[M*[(N*x*tc)+y*Tc]+z*Tc]
  12.  
  13. ciclo for (6 ciclos):
  14. ldi ...  (1 ciclo)
  15. inc ...  (1 ciclo)
  16. cpi ...  (2 ciclos)
  17. brne ... (2 ciclos)
  18.  
  19. */
  20. #include "C:\Program Files\WinAVR-20080610\avr\include\avr\io.h"
  21.  
  22.  
  23. int main(void) {
  24.     /* inicializacao das variaveis */
  25.     unsigned char sw;
  26.  
  27.     /* PORTA entrada */
  28.     DDRA = 0x00;
  29.     PORTA = 0x00;
  30.  
  31.     /* PORTC saida */
  32.     DDRC = 0xFF;
  33.     PORTC = 0xFF;
  34.  
  35.     /* vars */
  36.     int the_led = 0;
  37.     int flag = 0;
  38.  
  39.  
  40.     /* rotina */
  41.     while(1) {
  42.         flag = 0;
  43.         PORTC = 0xFF; // leds apagados
  44.  
  45.         /* switch 1 activo */
  46.         sw = PINA;
  47.         if (sw == 0xFE) {
  48.             /* */
  49.             while (flag == 0) {
  50.                 /* ciclo led */
  51.                 for (the_led = 1; the_led <= 9; the_led++) {
  52.  
  53.                     /* 500ms with 8bits */
  54.                     /* P*[M*[(N*x*tc)+y*Tc]+z*Tc] */
  55.  
  56.                     /* simula uma limitacao de 8 bits */
  57.                     /* P = 5 ciclos */
  58.                     for (int i = 0; i <= 20; i++) {
  59.                         /* M = 5 ciclos */
  60.                         for (int j = 0; j <= 255; j++) {
  61.                             /* N = 5 ciclos + 6 ciclos */
  62.                             for (int k = 0; k <= 255; k++) {
  63.                                 /* reset */
  64.                                 /* 1 ciclo */
  65.                                 sw = PINA;
  66.                                 /* 2 ciclos */
  67.                                 if (sw == 0xDF) {
  68.                                     /* 1 ciclo */
  69.                                     flag = 1;
  70.                                     /* 2 ciclos */
  71.                                     goto goto_point;
  72.                                 }
  73.                             }
  74.                         }
  75.                     }
  76.  
  77.                     goto_point:
  78.                     /* after 500ms */
  79.                     switch(the_led) {
  80.                         case 1: PORTC = 0xFF;break; // 0b11111111
  81.                         case 2: PORTC = 0x7F;break; // 0b01111111
  82.                         case 3: PORTC = 0xBF;break; // 0b10111111
  83.                         case 4: PORTC = 0xDF;break; // 0b11011111
  84.                         case 5: PORTC = 0xEF;break; // 0b11101111
  85.                         case 6: PORTC = 0xF7;break; // 0b11110111
  86.                         case 7: PORTC = 0xFB;break; // 0b11111011
  87.                         case 8: PORTC = 0xFD;break; // 0b11111101
  88.                         case 9: PORTC = 0xFE;break; // 0b11111110
  89.                     }
  90.                 }
  91.             }
  92.         }
  93.     }
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement