quarta-feira, 11 de julho de 2012

Discadora com ATmega328P


vou demonstrar aqui como fazer uma simples discadora de pulsos,para isso você terá que montar o seguinte circuito :


veja o código fonte:



/*
 *                                                 Discagem por pulsos
 *   Version    : 1.0
 *   microcontrolador : AVR ATMega328
 *   descrição  : como montar uma discadora por pulso
 *   criado: 11/07/2012 
 *   autor: aguivone moretti fogia
 */


#define F_CPU 16000000  // 16 MHz
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <util/delay.h>
#include <string.h>
//#include <avr/eeprom.h>//usado para acessar memoria

//funçoes basicas dos pinos
#define alterna_pino(x,y) x ^= _BV(y)   
#define liga_pino(x,y) x |= _BV(y)
#define desliga_pino(x,y) x &= ~(_BV(y))
#define estado_pino(x,y) ((x & _BV(y)) == _BV(y)) //o pino deve estar como entrada ,testa se está em nivel logico 1

 #define PULSO    PC1  //no rele de discagem deve ser colocado um resistor de 470R para não curto circuitar a linha telefonica 

void numero(int valor)
{
    int xis=0;
     while(xis < valor)
     {
      desliga_pino(PORTC,PULSO);
      _delay_ms(35);
      liga_pino(PORTC,PULSO);
      _delay_ms(65); 
      xis++;
     }
     _delay_ms(400);//espaço necessario entre cada digito
}
 
//////////////////////////////////////////////função principal///////////////////////////////////////////
int main(void)
{
           DDRC = 0XFF;  //inicializa portC como saida;
           
           for(;;)
           {
            // os numeros deve ser de 1 a 9, para o zero use o numero "10"
            //vamos supor que vai ligar para o numero 1234 5670
            liga_pino(PORTC,PULSO);
            _delay_ms(200); //espera para dar linha para discar 
            numero(1);
            numero(2);
            numero(3);
            numero(4);
            numero(5);
            numero(6);
            numero(7);
            numero(10);//zero             
            _delay_ms(10000); //espera para chamar por 10s
            desliga_pino(PORTC,PULSO);
            _delay_ms(10000);//espera 10s e liga denovo

           }
}

Nenhum comentário :

Postar um comentário

olá,digite aqui seu comentário!