Ir ao conteúdo
  • Cadastre-se

Programação PIC16F887


Posts recomendados

Prezados,

 

Comprei recentemente um PLC, com microcontrolador PIC, onde o mesmo pode ser programado em diversas linguagens, uma delas e a que menos tenho dificuldade é em C.

Como não sou do ramo da Mecatrônica nem Informática, estou com muita dificuldade por se tratar de portas analógicas.

Estou usando o programa "CCS C - Demo", o fabricante da placa enviou esses comandos como exemplo de programação.

Em anexo elaborei um fluxograma de como o programa deve comportar, mas ta osso iniciar a elaboração dos comandos.

 

Alguém ai pode dar um help? Principalmente em declarar as entradas analógicas e atribuir a uma variável?

Esse fluxograma é complicado e fazer em C ?

 

 

#include <Flexis PLUS CCS.h>
#include <stdlib.h>
 
// Define os nomes dos pinos de saída
#define Y1 PIN_B0   
#define Y2 PIN_B1   
#define Y3 PIN_B2   
#define Y4 PIN_B3   
#define Y5 PIN_B4   
#define Y6 PIN_B5   
#define Y7 PIN_B6
#define Y8 PIN_B7
#define Y9 PIN_E0
#define Y10 PIN_E1
#define Y11 PIN_E2
#define Y12 PIN_C0
 
 
// Define os nomes dos pinos de entrada
#define IN1 PIN_D0   
#define IN2 PIN_D1   
#define IN3 PIN_D2   
#define IN4 PIN_D3   
#define IN5 PIN_D4   
#define IN6 PIN_D5
#define IN7 PIN_D6
#define IN8 PIN_D7
#define IN9 PIN_A2
#define IN10 PIN_A3
#define IN11 PIN_A4
#define IN12 PIN_A5
 
 
int16 AN0;
char ANx[8];
 
void Board_init ()  //função que faz as configurações do PIC
{
setup_adc_ports(sAN0|sAN1);         //configura os pinos A0 e A1 como canais analógicos
   setup_adc(ADC_CLOCK_INTERNAL);
 
 
 
}
 
void YandX ()           //função que ativa as saídas conforme o acionamento da entrada
{
     if (input(IN1))
        output_high(Y1);
     else
         output_low (Y1);
   
   delay_us(100);
   
     if (input(IN2))
        output_high(Y2);
     else
        output_low (Y2);
        
   delay_us(100);
   
     if (input(IN3))
        output_high(Y3);
     else
        output_low (Y3);
        
   delay_us(100);
   
     if (input(IN4))
        output_high(Y4);
     else
        output_low (Y4);
        
   delay_us(100);
   
     if (input(IN5))
        output_high(Y5);
     else
        output_low (Y5);
        
   delay_us(100);
   
     if (input(IN6))
        output_high(Y6);
     else
        output_low (Y6);
        
   delay_us(100);
   
     if (input(IN7))
        output_high(Y7);
     else
        output_low (Y7);
   delay_us(100);
   
     if (input(IN8))
        output_high(Y8);
     else
        output_low (Y8);
        
   delay_us(100);
   
     if (input(IN9))
        output_high(Y9);
     else
        output_low (Y9);
        
   delay_us(100);
   
     if (input(IN10))
        output_high(Y10);
     else
        output_low (Y10);
        
   delay_us(100);
   
     if (input(IN11))
        output_high(Y11);
     else
        output_low (Y11);
        
   delay_us(100);
   
     if (input (IN12))
        output_high (Y12);
      else
        output_low (Y12);
        
   delay_us(100);
   
}
 
void main()
{
 
Board_init ();         //chama a função que faz as configurações iniciais do PIC
 
 
 
 
   while(TRUE)
   {
   
   
    YandX ();     // chamada da função que ativa as saídas conforme o acionamento da entrada
    
    
      
set_adc_channel(0);        // seleciona o canal analógico A0
delay_ms (10);
 
AN0 = read_adc();       // Lê o canal Analogico e coloca o valor na variavel AN0
 
delay_us(100);
 
itoa (AN0,10,ANx);      // Transforma a variavel int16 (AN3) em uma char (ANx)
 
  
   }
 
}

post-731646-0-23365400-1431545781_thumb.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Amigo a sugestão que dou é ... não se prenda ao compilador. Dê uma olhadinha no datasheet do mc. Isso deve te iluminar mais. P.ex. um controle do conversor ad...

adcon.jpg

Por este ângulo, não é tão difícil entender. Após isso, prefira compilador que te dê acesso fácil ao hw do mc

abç

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Amigo,

Para iniciantes a linguagem C e complicada por ter muitas sintaxe

Passe para a linguagem BASIC, Baixe o compilador MikroBasic da Mikroelektronica, E vá ser Feliz!

Em Basic eu posso te ajudar!

 

aqui esta o link

http://www.mikroe.com/mikrobasic/pic/

E uma versão demo que suporta ate 2K de programação, que e o suficiente para escrever belos programinhas.

 

Qualquer coisa Pergunte

 

Abraço.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Eu recomendo o XC8, mesmo não tendo bibliotecas facilitadas igual a do miKroC, porém, você aprende mais o uC e sem falar que ele é oficial do fabricante do chip.

 

Recomendo também o Livro do Wagner Zanco: Microcontroladores PIC18 com linguagem C, uma bordagem pratica e objetiva.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Amigo como você já tem um pouco de familiaridade com o C, permita-me orienta-lo a manter-se nele. Não conheço compiladores basic pra outros mc´s caso algum dia queira expandir seus horizontes. Há vida além do pic sabia? (leia o meu livro... A vida além do pic: uma história de superação) (kk)

Uma coisa te digo: qualquer linguagem que escolher, não vai poder fugir muito da responsabilidade de entender um pouco dos circuitos lógicos do mc: portas, registros, timers, conversores, interfaces, hexas, binários e etc. Diferentemente da de alto nível, aqui em baixo tal conhecimento se torna muito necessário. Se se negar a isso poderá estar fadado ao insucesso. Ou pelo menos vai ficar andando igual a um zumbi meio cego com muleta.

 

Já ouviu falar do 'pisca led'? Supere-o e domine o mundo.

 

Mas não vá por mim não! Como disse, é um ponto de vista pessoal. Faça sua escolha. Afinal o que é a vida além de uma série de mini escolhas?

 

abç

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Galera, 

Consegui fazer o programa, porém não sei se funciona. Tem algum programa que consigo testar e ir inserindo as entradas e tal?

Alguém poderia me dizer se esta correto essa programação? Ela está baseada no fluxograma da postagem acima.

Estou usando o CCS C compiler.

 

#include <Flexis PLUS CCS.h>
#include <stdlib.h>
 
// Define os nomes dos pinos de saída
#define Y1 PIN_B0   
#define Y2 PIN_B1   
#define Y3 PIN_B2   
#define Y4 PIN_B3   
#define Y5 PIN_B4   
#define Y6 PIN_B5   
#define Y7 PIN_B6
#define Y8 PIN_B7
#define Y9 PIN_E0
#define Y10 PIN_E1
#define Y11 PIN_E2
#define Y12 PIN_C0
 
 
// Define os nomes dos pinos de entrada
#define IN1 PIN_D0   
#define IN2 PIN_D1   
#define IN3 PIN_D2   
#define IN4 PIN_D3   
#define IN5 PIN_D4   
#define IN6 PIN_D5
#define IN7 PIN_D6
#define IN8 PIN_D7
#define IN9 PIN_A2
#define IN10 PIN_A3
#define IN11 PIN_A4
#define IN12 PIN_A5
 
 
int16 AN0;
int16 AN1;
int16 AN2;
 
char TempMax[8];
char TempMin[8];
char tensão[8];
 
 
void Board_init ()  //função que faz as configurações do PIC
{
setup_adc_ports(sAN0|sAN1);         //configura os pinos A0 e A1 como canais analógicos
   setup_adc(ADC_CLOCK_INTERNAL); 
}
 
while (1)
      {
      output_high(Y4);            // Liga Relé para leitura do sensor Frio do pistão
      delay_ms (10);
      set_adc_channel(0);        // seleciona o canal analógico A0
      delay_ms (10);
      AN0 = read_adc();       // Lê o canal Analogico e coloca o valor na variavel AN0 (TEMPERATURA MINIMA)
      delay_us(100);
      itoa (AN0,10,TempMim);      // Transforma a variavel int16 (AN0) em uma char (TempMim)
      output_low (Y4);         // Desliga o rele 
      
      set_adc_channel(0);        // seleciona o canal analógico A0
      delay_ms (10);
      AN1 = read_adc();       // Lê o canal Analogico e coloca o valor na variavel AN1 (Temperatura Maxima)
      delay_us(100);
      itoa (AN1,10,TempMax);      // Transforma a variavel int16 (AN1) em uma char (TempMax)
      
      
      set_adc_channel(1);        // seleciona o canal analógico A1
      delay_ms (10);
      AN3 = read_adc();       // Lê o canal Analogico e coloca o valor na variavel AN3 (Tensão gerada pelo motor)
      delay_us(100);
      itoa (AN3,10,tensão);      // Transforma a variavel int16 (AN3) em uma char (tensão)
 
         while ( tensão = 0)
         {
 
      
               
                while (TempMax < 1500);    // Se a temperatura for maior que 150°C equivalente a 1500mA - Saia do While de sinal de aquicimento.
                {
                 
                     output_high (Y1)         // Liga Led solicitando aquecimento.
                      
                     output_high(Y4);            // Liga Relé para leitura do sensor Frio do pistão
      
                     set_adc_channel(0);        // seleciona o canal analógico A0
                     delay_ms (10);
                  
                     AN0 = read_adc();       // Lê o canal Analogico e coloca o valor na variavel AN0 (TEMPERATURA MINIMA)
                  
                     delay_us(100);
                  
                     itoa (AN0,10,TempMim);      // Transforma a variavel int16 (AN0) em uma char (TempMim)
                     
                     output_low (Y4);         // Desliga o rele do sensor ístao frio
                  
                     set_adc_channel(0);        // seleciona o canal analógico A0
                     delay_ms (10);
                     
                     AN1 = read_adc();       // Lê o canal Analogico e coloca o valor na variavel AN1 (Temperatura Maxima)
                     
                     delay_us(100);
                     
                     itoa (AN1,10,TempMax);      // Transforma a variavel int16 (AN1) em uma char (TempMax)
                }     
                      
         output_low (Y1);         // desliga Led solicitando aquecimento.  
         output_high(Y2);         // Liga rele de acionamento do motor como arranque
         output_high(Y3);          //Liga motor de arranque
         delay_ms (5000);         // Mantem o motor de arranque ligado por 20 segundos
         output_low(Y2);         // Desliga rele de acionamento do motor como arranque
         output_low(Y3);          //desliga motor de arranque
         delay_ms (5000);        // Aguarda 5 segundos para gerar energia
         
         set_adc_channel(1);        // seleciona o canal analógico A1
         delay_ms (10);
         AN3 = read_adc();       // Lê o canal Analogico e coloca o valor na variavel AN3 (Tensão gerada pelo motor)
         delay_us(100);
         itoa (AN3,10,tensão);      // Transforma a variavel int16 (AN3) em uma char (tensão)
         
         } 
         
      
   }
Link para o comentário
Compartilhar em outros sites

 Galera,

Alguém que conhece desse tipo de programação, poderia me ajudar verificando os comandos se estão corretos? Uma duvida minha são os comandos de chamar a entrada e adicionar o valor a um char.

Ta correto isso? Chamar a entrada para depois fazer a leitura da mesma... não da pra fazer a leitura direto ?

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

este compilador tolhe um pouco a essência do c. Se migrares para hitech ou até mesmo mikroc E entenderes um pouco dos circuitos, portas se abrirão

De fato você não "chama uma entrada" você "seleciona" ou abre uma

Faço um sacrifício monumental ao digitar a sugestão abaixo pra você "fazer a leitura direto". você pode criar uma função pra isso

 

unsigned int le_entrada(unsigned char en){set_adc_channel(en);        // seleciona o canal analógico "en"delay_ms (10);return read_adc();       // Lê o canal Analogico e retorna seu valor}

 

AN3=le_entrada(1);//p.ex.

 

abç

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

@Isadora Ferraz

Até eu que não entendo e não gosto de C...

entendi!!!!

Mas 10mS não é muito tempo?

Só 100 leituras por segundo  mesmo?

Amigo,

Para iniciantes a linguagem C e complicada por ter muitas sintaxe

Passe para a linguagem BASIC, Baixe o compilador MikroBasic da Mikroelektronica, E vá ser Feliz!

Em Basic eu posso te ajudar!

 

aqui esta o link

http://www.mikroe.com/mikrobasic/pic/

E uma versão demo que suporta ate 2K de programação, que e o suficiente para escrever belos programinhas.

 

Qualquer coisa Pergunte

 

Abraço.

Não só você pode ajudar, mas o BASIC para embargados está voltando com tudo.

Já testou o BASCOM, amigo?

Uma simples linha de comando seria...

var = GETADC(channel [,offset])

var: de a a 1023 = 10 bits no mínimo

channel: 0 a 7, geralmente.

13 - 260 µs Conversion Time

Onde o [offset] , opcional, determina até o ganho.

Simplifica tudo!

 

ah.. Estes são os AVRs mais antigos.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@GuilhermeMart,

Eu trabalhei alguns anos com eletrônica industrial, se voce ficar olhando essa placa apenas como um PLC, com aquelas sintaxes básicas, vai te tolher bastante as possibilidades. Mas também tenho certeza que existe um comando na linguagem do seu PLC que faz essa leitura analógica. Procure exemplos de programa para esse seu PLC.

Paulo

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Também brincando

@_xyko_ foi proposital. No fundo é tudo a "lesma lerda". Se escrevo shiit com um i só, o corretor do forum alopra com ***** . É algum tipo de blindagem anti dercy gonçalves ou máscara contra gases do forum. Mas concordo com o meu erro. Isso pode confundir os novatos. Vou me corrigindo.. aos poucos... 'Divagar'... se vai ao longe...

post 'de segunda'... já viu né....

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!