Autor Tópico: Ajuda com PIC  (Lida 8198 vezes)

Description:

0 Membros e 1 Visitante estão vendo este tópico.

Offline Angelo Farinhas

  • Novato
  • *
  • Posts: 75
  • Sexo: Masculino
  • GUIA-CNC
  • Nome:: Angelo Farinhas
  • Profissão: Técnico em eletrônica, técnico em eletromedicina e odonto
Ajuda com PIC
« Online: 13 de Dezembro de 2014, 23:30 »
Boa noite

Meu nome e Ângelo, já fiz uma CNC em madeira a alguns anos atras e postei aqui no fórum algumas fotos, agora estou terminando uma de alumínio com área útil de 400 x 300mm mais para PCI e peças em acrilico e polimeros.

Mas no momento estou abrindo o topico pois tenho algumas  dificuldades com Microcontrolador PIC, sinceramente não entendo nada de programação e peço a ajuda dos amigos do fórum que possam me ajudar.


Procurando na net encontrei uma pessoa que fez o desenho do hardware e o softer, segundo ele fez no Proteus, testei  no Proteus e ate funcionou, mas na hora de gravar no PIC, grava mas não funciona.
Tentei entrar em contato com quem fez mas não tive retorno.

Ja procurei ajuda em outros foruns e na net, mas não encontro quem possa me ajudar, no fórum do clube do hardware, eles responderam alguma duvidas e me deram algumas dicas e orientações, mas não funcionou.

Preciso da ajuda aqui do fórum ou de quem possa me ajudar ja to a quase 8 meses tentando resolver esse problema, estou montando este circuito para um brinquedo to fazendo para umas crianças.

A ideia do circuito e simples para quem entende de programação, e foi feito de forma simples e com poucos componentes .
A ideia e a seguinte.
Um circuito com PIC sem cristal, escolhido o  PIC16F628A,
Utilizando dois botões normalmente abertos pulsado, UP e DOWN ( Frente e Trás)
Alimentado com 4,5 ou 9 v ,
Aciona 10 leds de 1W

Apertando o botão UP acende o led 1
Apertando o botão UP acende o led 2 e apaga o 1
Apertando o botão UP acende o led 3 e apaga o 2 e assim por diante.

Caso eu esteja com o led 7 acesso e quero voltar ao led 4
Aperto o botão DOWN e acende o led 6 apaga o led 7
Aperto o botão DOWN acende o led 5 apaga o led 6
Aperto o botão DOWN acende o led 4 apaga o led 5   e assim por diante.

Em anexo o desenho

Abaixo o programa que foi feito, so tenho isso sei que falta os fuzers e mais algumas coisas mas não sei como fazer.

/*
   Projeto: Leds
   MCU: PIC16F628A
   CLOCK: INTOSC 4MHz
   Compilador: MikroC PRO for PIC

*/


unsigned Saida at PORTA;

sbit Right at PORTA.B0;
sbit Left at PORTA.B1;
char flags = 0;

void main()
{
      CMCON = 7;
      TRISB = 0;
      TRISA = 0;
      TRISA.B0 = 1;
      TRISA.B1 = 1;
      Saida = 0x8000; //Max: 0x8000, Min: 0x0040
     
      while(1)
      {
         if( Left ) flags.B0 = 1;
         if( !Left && flags.B0 )
         {
           flags.B0 = 0;
           if( Saida < 0x8000 )
           {
              Saida <<= 1;
           }
         }
         
         if( Right ) flags.B1 = 1;
         if( !Right && flags.B1 )
         {
            flags.B1 = 0;
            if( Saida > 0x0040 )
            {
               Saida >>= 1;
            }
         }
      }
}


Obrigado pela ajuda

Abraços

Angelo

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderadores
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re:Ajuda com PIC
« Resposta #1 Online: 15 de Dezembro de 2014, 01:05 »
Esse teu programa possui alguns erros, para começar:

(1) Você quer acionar 10 LEDs, mas a variável "Saída" está associada apenas à porta A, que possui 8 bits e portanto, poderia acionar apenas 8 LEDs (um LED associado a cada bit da porta).

(2) Em seu circuito, 8 LEDs estão ligados a porta B e dois LEDs à porta A. Isso está incompatível com seu programa. Em outras palavras, seu programa está incompatível com seu hardware. Não entendi como este programa poderia funcionar no Proteus. Não seria outro programa? Ou outro circuito? ...

(3) Seu programa não dispõe de um artifício de debouncing (evitar os múltiplos acionamentos de um botão), usando por exemplo um temporizador, ...

(4) Não estou acostumado com esse Mikro C, mas acho que estão faltando parâmetros de inicialização para definir uso do clock interno (RC), entre outros parâmetros do PIC (inibir watchdog, interrupção, ...).

Eu usava mais o "assembly" do PIC com o aplicativo de desenvolvimento (IDE) da Microchip. Atualmente tenho usado o Arduíno.
« Última modificação: 15 de Dezembro de 2014, 01:08 por minilathe »

Offline Angelo Farinhas

  • Novato
  • *
  • Posts: 75
  • Sexo: Masculino
  • GUIA-CNC
  • Nome:: Angelo Farinhas
  • Profissão: Técnico em eletrônica, técnico em eletromedicina e odonto
Re:Ajuda com PIC
« Resposta #2 Online: 15 de Dezembro de 2014, 12:02 »
minilathe

Obrigado pela resposta.
Pelo que descreveu, seria melhor então refazer tudo novamente?
Pode me ajudar?

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderadores
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re:Ajuda com PIC
« Resposta #3 Online: 15 de Dezembro de 2014, 13:59 »
Como o programa é muito simples e o grau de mudanças é elevado (em relação a este programa como é atualmente), resulta em ter que consertar e refazer praticamente tudo e inclusive acrescentar um temporizador em alguns pontos do programa, ....

Dá para tentar consertar, se eu fizer, vai consumir alguns HH e ainda terei de instalar um compilador C, um assembler, simulador do PIC, ... Ou posso ir te ajudando (se é que você sabe o que estará fazendo).

Offline Paulo_lumens

  • Hobby
  • ****
  • Posts: 269
  • Sexo: Masculino
  • GUIA CNC
  • Cidade - UF: Charqueada-SP
Re:Ajuda com PIC
« Resposta #4 Online: 15 de Dezembro de 2014, 16:08 »
Olá Angelob
 Qual a intenção real deste dispositivo?, tem que ser 10 leds? vc poderia usar mais componentes na placa, exemplo instalar um conversor ABCD ou algumas portas AND. quanto a lógica realmente seu código ficou meio complicado usando um carri a esquerda ou a direita. ideal seria uma variável sendo incrementada ou decrementada subindo ou descendo o valor desejado. geralmente uso o MPLAB e PIC CCS. para compilação.

Offline Angelo Farinhas

  • Novato
  • *
  • Posts: 75
  • Sexo: Masculino
  • GUIA-CNC
  • Nome:: Angelo Farinhas
  • Profissão: Técnico em eletrônica, técnico em eletromedicina e odonto
Re:Ajuda com PIC
« Resposta #5 Online: 15 de Dezembro de 2014, 20:55 »
Minilathe.
Se puder me ajudar na parte do programa e circuito eu agradeço já tenho tudo instalado no computador, e a parte eletrônica eu refaço.

Paulo Lumens
Se puder me ajudar, sua ajuda será bem vinda
A idéia e fazer um tipo brinquedo para crianças com deficiência de uma entidade que ajudo.
A idéia inicial era usar 8 leds, mas não lembro o por que foi para 10 leds.
Se for complicado usar 10, pode ser com 8 sem problemas.
Quanto ao programa quem fez foi uma pessoa que conheci na net que se propôs a ajudar e fazer o programa e o circuito, testei ele e montei, mas nada funciona.
Pode ser modificado.
Quanto a colocar mais componentes pode sim sem problemas.

Pelo que vi e melhor começar do ZERO.

Offline Paulo_lumens

  • Hobby
  • ****
  • Posts: 269
  • Sexo: Masculino
  • GUIA CNC
  • Cidade - UF: Charqueada-SP
Re:Ajuda com PIC
« Resposta #6 Online: 16 de Dezembro de 2014, 12:25 »
Olá Angelob

talvez isto te ajude, dei uma modificada em um programa que eu tinha aqui.

Código: [Selecionar]
//**********************************************************************
// programa desenvolvido por Paulo Furlan p/ guia CNC 12/2014
//**********************************************************************
#include <16f628A.h>
#use delay(clock=4000000)
#fuses HS,NOWDT,PUT,NOLVP

signed long int t0_conta,leds;
char tcl;
static boolean led;
static int conta;
boolean tecla_pres;
//*****************************************************************
#int_timer0
void trata_t0 ()
{

// reinicia o timer 0 em 131 menos a contagem que já passou
set_timer0(131-get_timer0());
conta++;
// se já ocorreram 125 interrupções
if (conta == 125)
{
conta=0;
led = !led;  // inverte o led
output_bit (pin_a4,led);//RA4 LED TIMER

}

}
/*
********Entradas*******************
PIN_A0***Botão S1
PIN_A1***Botão S2
*********Saidas*******************
PIN_B0***led1
PIN_B1***led2
PIN_B2***led3
PIN_B3***led4
PIN_B4***led5
PIN_B5***led6
PIN_B6***led7
PIN_B7***led8
*/
//*********************************************************************
char varre_teclas (void)
// verifica se alguma tecla está pressionada
{
if (!input(pin_a0)) return('1'); // verifica a tecla S1 Incrementa
if (!input(pin_a1)) return('2'); // verifica a tecla S2 Decrementa
// se nenhuma tecla está pressionada, desliga o flag
// tecla_pres e retorna o valor 0
tecla_pres = 0;

return (0);
}
//******************************************************************************
char teclas (void)
// Rotina principal de verificação do teclado
// Verifica se é uma nova tecla e filtra ruídos
{
int t;
t = varre_teclas(); // verifica se há tecla
if ((t) && (!tecla_pres))
// se há tecla e o flag está apagado
{
tecla_pres = 1; // ativa o flag
if (t != tcl)
// se a tecla atual é diferente da tecla
// anterior
{
// filtra o ruido de contato
delay_ms (50); // aguarda 50ms
// lê novamente as tecla e verifica
// se a mesma tecla ainda está pressionada
// caso positivo, retorna a tecla
if (varre_teclas() == t) return (t);
}
}

return (0); // se não há tecla, retorna 0
}
//*************************************************


main()
{

SET_TRIS_A(0x03);
SET_TRIS_B(0x00);
output_B(0x00);
t0_conta = 2500;
setup_timer_0 ( RTCC_INTERNAL | RTCC_DIV_64 );
set_timer0(131); // inicia o timer 0 em 131
enable_interrupts (global | int_timer0);
tcl = 0; // limpa a tecla atual
tecla_pres = 0; // desliga o flag de tecla pressionada

while(true) // espera interrupção
{
tcl=teclas(); // verifica se há tecla pressionada
if (tecla_pres)
// caso exista tecla pressionada*********************************************************************
{
// verifica se é a tecla é maior que 0****************************************************************

switch (tcl)  // verifica a tecla
{
case '1' : if(leds<8)
{
leds=leds+1; //incrementa variavel
}
else
{
leds=leds;
}

break;

case '2' : if(leds>0)
{
leds=leds-1;//decrementa variavel
}
else
{
leds=leds;
}

break;

default  :
break;

}
}
delay_ms(10);

switch (leds)  // converte binario para seguencial na saída
{
case 0x00 :
output_b(0x00); //saída

break;

case 0x01 :
output_b(0x01); //saída 1

break;
case 0x02 :
output_b(0x03); //saída 2

break;
case 0x03 :
output_b(0x07); //saída 3

break;
case 0x04 :
output_b(0x0F); //saída 4

break;
case 0x05 :
output_b(0x1F); //saída 5

break;
case 0x06 :
output_b(0x3F); //saída 6

break;
case 0x07 :
output_b(0x7F); //saída 7

break;
case 0x08 :
output_b(0xFF); //saída 8

break;
default  :
break;

}
}
}


Estou enviando um arquivo do Proteus para simulação, o programa fou compilado no MPLAB e PIC CCS, qualquer duvida fala ai

Offline Angelo Farinhas

  • Novato
  • *
  • Posts: 75
  • Sexo: Masculino
  • GUIA-CNC
  • Nome:: Angelo Farinhas
  • Profissão: Técnico em eletrônica, técnico em eletromedicina e odonto
Re:Ajuda com PIC
« Resposta #7 Online: 16 de Dezembro de 2014, 21:32 »
Paulo

Obrigado pela ajuda, vou testar no Proteus e depois no MPlab.

Você tem o programa  em arquivo

Abraços

Angelo

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderadores
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re:Ajuda com PIC
« Resposta #8 Online: 17 de Dezembro de 2014, 00:11 »
Fiz uma versão um pouco mais compacta, o circuito é o proposto inicialmente, com 10 Leds e entradas em PA_0 e PA_1

Código: [Selecionar]
/*
 * File:   main.c
 * Author: Gil Pinheiro
 *
 * Created on 16 de Dezembro de 2014, 22:54
 */
#include <xc.h>
#include <stdio.h>
#include <stdlib.h>

typedef unsigned int uint16;
typedef unsigned char uint8;

uint16 Contador=1;

#define Direita     RA0
#define Esquerda    RA1

void temporiza(void);

/*
 *
 */
int main(int argc, char** argv) {
   
    TRISB = 0x0;    // Todos os bits da porta B são saídas
    TRISA = 0x3F;   // Os bits 6 e 7 da porta A são saídas e de 0 a 5 entradas
    PORTA = 0x3F;   // Habilita resistores de pull-up nas entradas

    for(;;)         // Loop eterno
    {
        if (Direita==0)
        {
            temporiza();
            while (Direita==0);
            if (Contador > 1) Contador >>= 1;
        }

        if (Esquerda==0)
        {
            temporiza();
            while (Esquerda==0);
            if (Contador < 0x100) Contador <<= 1;
        }
        PORTB = (uint8)Contador;
        PORTA = (uint8)(Contador >> 2) || 0x03F;
    }

    return (0);
}

void temporiza(void)
{
    uint16 a,b;
    for(a=0;a<0xffff;a++)
        for(b=0;b<0xff;b++);
}
« Última modificação: 17 de Dezembro de 2014, 00:46 por minilathe »

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderadores
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re:Ajuda com PIC
« Resposta #9 Online: 17 de Dezembro de 2014, 00:33 »
Segue programa no formato .hex (roda no Proteus).

Código: [Selecionar]
:02000000FA2FD5
:100F300001340034F001F101FF307106031DA22FCE
:100F4000FF30700603190800F201F301003073024C
:100F5000FF30031972020318BA2F0130F207031889
:100F6000F30A0030F30700307302FF3003197202F6
:100F7000031CAD2F0130F0070318F10A0030F10710
:100F80009C2F8316031386013F3085003F30831268
:100F9000031385000518DF2F9A2783120313051CFE
:100FA000CD2F00307A02023003197902031CDF2FA3
:100FB00001300310FA0CF90CFF3E031DD92F8518E0
:100FC000F42F9A2783120313851CE22F01307A0233
:100FD0000030031979020318F42F01300310F90DC2
:100FE000FA0DFF3E031DEE2F79088600F801F80A7E
:100FF0007808C92F9827F9009927FA008301C12F93
:00000001FF
« Última modificação: 17 de Dezembro de 2014, 00:47 por minilathe »

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderadores
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re:Ajuda com PIC
« Resposta #10 Online: 17 de Dezembro de 2014, 08:14 »
Melhorei um pouco a temporização para facilitar o manuseio por crianças (temporização mais lenta para melhor interação).

Código: [Selecionar]
/*
 * File:   main.c
 * Author: Gil Pinheiro
 * IDE/Compiler: MPLAB-X / XC8 (Microchip)
 * Created on 16 de Dezembro de 2014, 22:54
 */
#include <xc.h>
#include <stdio.h>
#include <stdlib.h>

typedef unsigned int uint16;
typedef unsigned char uint8;

uint16 Contador=1;

#define Direita     RA0
#define Esquerda    RA1

void temporiza( uint16 );

/*
 *
 */
void main( void ) {
   
    TRISB = 0x0;    // Todos os bits da porta B são saídas
    TRISA = 0x3F;   // Os bits 6 e 7 da porta A são saídas e de 0 a 5 entradas
    PORTA = 0x3F;   // Habilita resistores de pull-up nas entradas

    for(;;)         // Loop eterno
    {
        if (Direita == 0)
        {
            temporiza( 0x1 ); // Temporiza para evitar bouncing
            if(Direita == 0)
            {
                while (Direita == 0);
                if (Contador > 1) Contador >>= 1;
            }
        }

        if (Esquerda == 0)
        {
            temporiza( 0x1 ); // Temporiza para evitar bouncing
            if(Esquerda == 0)
            {
                while (Esquerda == 0);
                if (Contador < 0x100) Contador <<= 1;
            }
        }

        PORTB = (uint8)Contador;
        PORTA = (uint8)(Contador >> 2) || 0x03F;
        temporiza( 0xFF ); // Temporiza para tornar interface mais amigável
     
    }
}

void temporiza( uint16 i )
{
    uint16 a,b;
    for(a = 0; a < 0xffff; a++)
        for(b = i; b > 0; b--);
}

Formato HEX:
Código: [Selecionar]
:02000000FA2FD5
:100F0C0001340034F201F301FF307306031D902FFE
:100F1C00FF307206031908007108F501F507700817
:100F2C00F401F407750874040319A62F0130F402B8
:100F3C000030031CF503F50275087404031D9C2F87
:100F4C000130F2070318F30A0030F3078A2F8316D7
:100F5C00031386013F3085003F3083120313850055
:100F6C00831203130518D32F0130F0000030F10069
:100F7C008827831203130518D32F051CC32F0030A9
:100F8C007802023003197702031CD32F01300310AF
:100F9C00F80CF70CFF3E031DCD2F8518EE2F0130FA
:100FAC00F0000030F1008827831203138518EE2F10
:100FBC00851CDE2F013078020030031977020318EC
:100FCC00EE2F01300310F70DF80DFF3E031DE82F37
:100FDC0077088600F601F60A76088500FF30F000E7
:100FEC000030F1008827B62F8627F7008727F800F6
:040FFC008301AD2F91
:00000001FF

Offline Paulo_lumens

  • Hobby
  • ****
  • Posts: 269
  • Sexo: Masculino
  • GUIA CNC
  • Cidade - UF: Charqueada-SP
Re:Ajuda com PIC
« Resposta #11 Online: 17 de Dezembro de 2014, 10:21 »
Mestre é mestre, código compacto com deslocamento esq. dir. é isso ai mestre Minilathe, vou vivendo e aprendendo..

Offline Angelo Farinhas

  • Novato
  • *
  • Posts: 75
  • Sexo: Masculino
  • GUIA-CNC
  • Nome:: Angelo Farinhas
  • Profissão: Técnico em eletrônica, técnico em eletromedicina e odonto
Re:Ajuda com PIC
« Resposta #12 Online: 17 de Dezembro de 2014, 21:00 »

Minilathe

Obrigado pela ajuda, vou simular no proteus, uma pergunta  quanto aos fuses, pode me informar como colocar eles.

Obrigado.

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderadores
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re:Ajuda com PIC
« Resposta #13 Online: 17 de Dezembro de 2014, 21:09 »
Sua intenção é que seja um produto para comercialização?

Offline Angelo Farinhas

  • Novato
  • *
  • Posts: 75
  • Sexo: Masculino
  • GUIA-CNC
  • Nome:: Angelo Farinhas
  • Profissão: Técnico em eletrônica, técnico em eletromedicina e odonto
Re:Ajuda com PIC
« Resposta #14 Online: 17 de Dezembro de 2014, 22:28 »
Olá

Não tenho intenção de comercializar ou vender,  é só para as crianças com paralisia  cerebral brincar com algo diferente nada mais, já fiz outras coisas inclusive recortes de dinos na cnc que tinha feito, para montarem, (alguns ate montão e são bem inteligentes) entre outras coisa usando som e lus.
Também fiz dinos para montar, para crianças com câncer de uma entidade que ajuda a as famílias e as crianças, ai era muitos........dinos, mas e tudo valido,  recortei 100 chapas de mdf 3mm e gastei 200 fresas e 3 tupias em um pouco mais de dois anos.
Tudo em um quarto do meu apartamento que transformei em minha oficina, a patroa que ficava brava com o pó.............Mas parei concordo não da para fazer isso em um apartamento e muita sujeira. Então to fazendo coisas mais simples e com pouca sujeira.

Minha intensão e fazer 5 peças ja fiz uma parte na cnc,  tinha feito antes 5, mas usando CI  4017, mas dava muito problemas pois quando queriam voltar a cor, tinha ir ate chegar nela e alguns abandonavam e ate jogaram no chão e acabava quebrando, alem de ter uma forma um pouco pesada e meio desajeitada esta que estou fazendo e mais pratica. Ela e circular menor e feita em mdf de 3 mm, com espessura final de 30 mm e diâmetro de 200 mm com bordas lixadas e arredondadas, e mais fácil de segurar menos peso e roda, a parte eletrônica vou proteger envolvida em silicone e a parte do mdf sera pintada e protegida vai mergulhar na água, e tem que durar pelo menos de 3 a 6 meses. os outros nem chegaram durar 1 mês.... se for bem aceita e durar faço mais 5. Mas se não for aprovado, volto para a prancheta e crio outra coisa.

Conversando com alguns amigos chegamos a conclusão que se for para frente e para trás  eles gostem mais, pois de alguma forma isso prende a atenção deles, (cada um tem seu gosto para cor, uma ou mais depende da cada um), de alguma forma parece trazer certas mudanças de comportamento, uma certa alegria incomum, não sei explicar.

Eu que banco todo gasto com material fresas eletrônica etc, por isso demora um pouco a ser concretizado e prefiro assim pois faço de coração e por que eu quero, conto com a ajuda intelectual de amigos, sem nada de dinheiro só o meu, pois sei que quando entra dinheiro em algo deste tipo, só da problemas.
Se algum amigo quer ajudar financeiramente, peço que procure uma entidade e ajude diretamente, so quero ajuda intelectual.

Pelo menos  é uma ajuda e contribuição que eu posso dar a quem precisa de tão pouco,  mesmo que seja pequena já é alguma coisa.

 

/** * */