domingo, 16 de junho de 2013

Timer Utilizando o PIC16F628A

Timer Utilizando o PIC16F628A

VERSÃO COM DISPLAY DE 7 SEGMENTOS

Nesse projeto como em outro anterior, é utilizado para uma contagem regressiva de tempo. A diferença está na utilização do PIC16F628A. Este PIC é muito limitado, o pino RA4 não funcionam como saída, pois é do tipo dreno aberto(drena a corrente). Para isso pode-se utilizar um transistor do tipo PNP, pois aterrando sua base poderemos obter uma corrente elétrica sobre o  buzzer.

Possui três botões de funções: ajuste, seleção de ajuste( minutos ou segundos) e um botão deSTART/STOP, além do botão RESET que foi ligado no pino de RESET(MCLR). Foi utilizado também dois display de 7 segmentos CC (Catodo Comum). Na hora da montagem do circuito, conecte os pinos (A,...,G) do display num resistor de 470 Ohm.

O botão de seleção de ajuste é usado tanto para ajustar os segundos/minutos como para visualizar o tempo dos minutos, caso mantenha-o pressionado.

Observação: Configure o PIC para utilizar o Oscilador Interno( 4 MHz ). Se você estiver utilizando oMikroC PRO for PIC, vá no menu PROJECT , Edit Project... e seleciona o modo oscilador como:INTOSC Oscillator: I/O function on RA6/..., I/O function on RA7/....

DOWNLOAD:
Firmware: Timer16F628A.hex;
Arquivo de simulação do Proteus: Timer16F628A.DSN;

CóDIGO-FONTE:

  1. //VARIAVEIS
  2. int cnt;
  3. short minutos,segundos;
  4. char m1,m2,s1,s2;
  5. bit start,oldstate1,oldstate2;
  6. char numeros[10] = {63,6,91,79,102,109,125,7,127,111};//7 segmentos CC
  7. //ROTINA DE INTERRPÇÃO
  8. void interrupt(){
  9. TMR0 = 155;
  10. cnt++;
  11. INTCON.T0IF=0; //flag de interrpção
  12. }
  13. void main() {
  14. //CONFIGURAÇÃO DOS REGISTROS
  15. CMCON = 0b11111111;//desliga comparador analogico
  16. OPTION_REG=0b00000001; //configura timer0
  17. INTCON.GIE=1; //habilita interrupcap global
  18. INTCON.T0IE=1; //habilita interrupcao do timer0
  19. TMR0=155;
  20. TRISB=0b00000000;
  21. TRISA=0b00011111;//pino RA4 definido como entrada.
  22. //DEFINIÇÃO DE VALOR DAS VARIÁVEIS
  23. segundos=0;
  24. minutos=0;
  25. //BIT DE STATUS
  26. start=0;
  27. oldstate1=0;
  28. oldstate2=0;
  29. while(1){
  30. if(cnt>=2500){
  31. cnt=0;
  32. if(start){
  33. segundos--;
  34. if(segundos<0){
  35. segundos=59;
  36. minutos--;
  37. if(minutos<0){
  38. TRISA.F4=0; //define pino RA4 como saída
  39. PORTA.F4=1; //tanto faz o valor, o q queremos e //aterrar a base do transistor.
  40. minutos=0;
  41. segundos=0;
  42. start=0;
  43. }
  44. }
  45. }
  46. }
  47. //........AJUSTE DOS SEGUNDOS/MINUTOS..............
  48. if(!PORTA.F1){//.........SEGUNDOS...........
  49. if(PORTA.F0){
  50. oldstate1=1;
  51. }
  52. if(!PORTA.F0 && oldstate1){
  53. oldstate1=0;
  54. segundos++;
  55. if(segundos==60) segundos=0;
  56. }
  57. }else{//.................MINUTOS............
  58. if(PORTA.F0){
  59. oldstate1=1;
  60. }
  61. if(!PORTA.F0 && oldstate1){
  62. oldstate1=0;
  63. minutos++;
  64. if(minutos==60) minutos=0;
  65. }
  66. }
  67. //..........START/PAUSE............
  68. if(PORTA.F2){
  69. oldstate2=1;
  70. }
  71. if(!PORTA.F2 && oldstate2){
  72. oldstate2=0;
  73. start = ~start;
  74. }
  75. //DIGITOS
  76. m1 = minutos/10;
  77. m2 = minutos%10;
  78. s1 = segundos/10;
  79. s2 = segundos%10;
  80. //DISPLAY DE 7 SEGMENTOS
  81. if(PORTA.F1==0){
  82. PORTA=0b01000000;
  83. PORTB=numeros[s2];
  84. delay_ms(1);
  85. PORTA=0b10000000;
  86. PORTB=numeros[s1];
  87. delay_ms(1);
  88. }else{
  89. PORTA=0b01000000;
  90. PORTB=numeros[m2];
  91. delay_ms(1);
  92. PORTA=0b10000000;
  93. PORTB=numeros[m1];
  94. delay_ms(1);
  95. }
  96. }
  97. }


VERSÃO COM DISPLAY LCD 16X2

Eu fiz essa segundo versão, a pedido do meu amigo Florisvaldo, utilizando um display LCD 16x2. Vantagens: Você pode escrever textos, simbolos, números à vontade e utiliza um número menor de pinos com relação ao circuito anterior;

Possui o mesmo funcionamento da versão anterior.

Na saída para o buzzer utilizei um relê ligado em paralelo com o diodo. Não se esqueça disso caso você utilize o relê, a função desse diodo é proteger o microcontrolador da tensão reversa. Essa tensão reversa pode ter valores muito altos.

DOWNLOAD:
Firmware: TimerV2.hex;
Arquivo de simulação do Proteus: TimerV2.DSN;

CóDIGO-FONTE:
  1. // pinos do LCD
  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. sbit LCD_RS_Direction at TRISB4_bit;
  9. sbit LCD_EN_Direction at TRISB5_bit;
  10. sbit LCD_D4_Direction at TRISB0_bit;
  11. sbit LCD_D5_Direction at TRISB1_bit;
  12. sbit LCD_D6_Direction at TRISB2_bit;
  13. sbit LCD_D7_Direction at TRISB3_bit;
  14. //VARIAVEIS
  15. int cnt;
  16. short minutos,segundos;
  17. char digito;
  18. bit start,oldstate1,oldstate2;
  19. //ROTINA DE INTERRPÇÃO
  20. void interrupt(){
  21. TMR0 = 155;// carrrega TMR0 com o valor 155
  22. cnt++;
  23. INTCON.T0IF=0;//limpa a flag de interrupção
  24. }
  25. void main() {
  26. //CONFIGURAÇÃO DOS REGISTROS
  27. CMCON = 0b11111111;//desliga comparador analogico
  28. OPTION_REG=0b00000001; //configura timer0
  29. INTCON.GIE=1; //habilita interrupcap global
  30. INTCON.T0IE=1; //habilita interrupcao do timer0
  31. TMR0=155;//carrega TMR0 com o valor 155
  32. TRISB=0b00000000;//deifine todas os pinos da portA como saidas
  33. TRISA=0b11111111;//deifine todas os pinos da portb como entradas
  34. PORTB.F6=0;//define valor baixo para pino RB6
  35. //DEFINIÇÃO DE VALOR DAS VARIÁVEIS
  36. segundos=0;
  37. minutos=0;
  38. //BITS DE STATUS
  39. start=0;
  40. oldstate1=0;
  41. oldstate2=0;
  42. Lcd_Init();
  43. Lcd_Cmd(_LCD_CLEAR);
  44. Lcd_Cmd(_LCD_CURSOR_OFF);
  45. delay_ms(100);
  46. while(1){
  47. if(cnt>=2500){
  48. cnt=0;
  49. if(start){
  50. segundos--;
  51. if(segundos<0){
  52. segundos=59;
  53. minutos--;
  54. if(minutos<0){
  55. PORTB.F6=1;
  56. minutos=0;
  57. segundos=0;
  58. start=0;
  59. }
  60. }
  61. }
  62. }
  63. //........AJUSTE DOS SEGUNDOS E MINUTOS........
  64. if(!PORTA.F2){
  65. if(PORTA.F0){
  66. oldstate1=1;
  67. }
  68. if(!PORTA.F0 && oldstate1){
  69. oldstate1=0;
  70. segundos++;
  71. if(segundos==60) segundos=0;
  72. }
  73. }else{
  74. if(PORTA.F0){
  75. oldstate1=1;
  76. }
  77. if(!PORTA.F0 && oldstate1){
  78. oldstate1=0;
  79. minutos++;
  80. if(minutos==60) minutos=0;
  81. }
  82. }
  83. //..........START/PAUSE............
  84. if(PORTA.F1){
  85. oldstate2=1;
  86. }
  87. if(!PORTA.F1 && oldstate2){
  88. oldstate2=0;
  89. start = ~start;
  90. }
  91. Lcd_Out(1,6,"Timer");//Escreve no LCD
  92. digito = minutos/10;//recupera o algarismo mais significativo
  93. Lcd_Chr(2,6,digito+48);//converte o algarismo em caracter e escreve
  94. digito = minutos%10;//recupera o algarismo menos significativo
  95. Lcd_Chr_CP(digito+48);//converte o algarismo em caracter e escreve
  96. Lcd_Out_CP(":");
  97. digito = segundos/10;//recupera o algarismo mais significativo
  98. Lcd_Chr_CP(digito+48);//converte o algarismo em caracter e escreve
  99. digito = segundos%10;//recupera o algarismo menos significativo
  100. Lcd_Chr_CP(digito+48);//converte o algarismo em caracter e escreve
  101. delay_ms(10);
  102. }
  103. }

1 comentários:

  1. Bom dia amigo. O atalho para download do arquivo .HEX do V1 não funciona. Vc poderia verificar, por favor.
    Obrigado.

    ResponderExcluir