LusoRobótica - Robótica em Português

Sistemas específicos => PIC => Tópico iniciado por: iyahdub em 12 de Julho de 2012, 23:19

Título: HITECH com PIC16F887
Enviado por: iyahdub em 12 de Julho de 2012, 23:19
Ja referi que so faz pouco tempo ganhei coragem para comecar a enterrar o cabecorro na arquitectura dos PIC.
Tenho andado com Assembly( que afinal nao e nenhum bicho de 7 cabecas) e agora tb ando a mexer devagarinho com C, ja que e onde me sinto mais a vontade.
DUVIDA:
PIC16F887 em HITECH lite version
Porque so me aceita os delays depois de inserir o #define _XTAL_FREQ ?!?!
Outra coisa- Pq que quando acaba o loop, faz o reset automatico a porta, nao sendo preciso definir o bit clear para 0 3 led ?!?
Código: [Seleccione]
#include<htc.h>
#include<pic.h>
#define _XTAL_FREQ 4000000

//__CONFIG(FOSC_HS|WDTE_OFF|PWRTE_ON|LVP_OFF|DEBUG_OFF);
__CONFIG(FOSC_HS|WDTE_OFF|PWRTE_ON|BOREN_OFF|LVP_OFF|CPD_OFF|WRT_OFF|DEBUG_OFF|CP_OFF);

void main(void)
{
TRISD=0;

while(1)
{
PORTD=0x01;   //turn on LED at RD0.
            __delay_ms(100);
            PORTD=0x00;   //turn off LED at RD.
PORTD=0x02;   //turn on LED at RD1. 
            __delay_ms(100);
PORTD=0x00;   //turn off LED at RD.
PORTD=0x04;   //turn on LED at RD2.
__delay_ms(100);
}
}
Título: Re: HITECH com PIC16F887
Enviado por: beirao em 12 de Julho de 2012, 23:28
não percebi a pergunta de fazer reset automatico ao porto... isso acende o led0, depois acende só o 2 e depois só o 3. Já agora, para fazer esse ciclo de acender três leds, um de cada vez, pode fazer só:

                PORTD=0x01;   //turn on LED at RD0.
               __delay_ms(100);
      PORTD=0x02;   //turn on LED at RD1. 
               __delay_ms(100);
      PORTD=0x04;   //turn on LED at RD2.
      __delay_ms(100);
Título: Re: HITECH com PIC16F887
Enviado por: senso em 12 de Julho de 2012, 23:30
Só te aceita delays depois de definires a frequencia do cristal, porque sem ela o compilador não tem maneira de saber quantos nops/instruções tem de fazer para passar X tempo.
Título: Re: HITECH com PIC16F887
Enviado por: beirao em 12 de Julho de 2012, 23:31
Acho que já percebi a questão do reset.. tá a dizer que ao recomeçar o loop ele apaga o led3 e acende o led1 ? Está certo, porque ao fazer PORTD = 0x01, (que é igual a 0b00000001) tá a dizer que todos os leds são 0 excepto o primeiro. Se quiser apenas mexer num dos leds, e não no porto todo ao mesmo tempo, é fazer PORTDbits.RD1 = 1;. Neste caso iria colocar a "1" a saída do pin RD1 sem mexer no resto do porto
Título: Re: HITECH com PIC16F887
Enviado por: iyahdub em 12 de Julho de 2012, 23:44
Tens razao, beirao...Esqueco-me cnstantemente q estou em hexadecimal, traduzindo para binario E NAO DECIMAL lol lol
E obrigado senso...Ja faz sentido !
Título: Re: HITECH com PIC16F887
Enviado por: Sérgio_Sena em 13 de Julho de 2012, 14:42
Acho que já percebi a questão do reset.. tá a dizer que ao recomeçar o loop ele apaga o led3 e acende o led1 ? Está certo, porque ao fazer PORTD = 0x01, (que é igual a 0b00000001) tá a dizer que todos os leds são 0 excepto o primeiro. Se quiser apenas mexer num dos leds, e não no porto todo ao mesmo tempo, é fazer PORTDbits.RD1 = 1;. Neste caso iria colocar a "1" a saída do pin RD1 sem mexer no resto do porto


Sendo bastante conveniente usar as opções de comutar pinos no formato (PORTxbits.Rx0 = 1 ou 0), o mesmo não é aconselhado devido à estrutura interna de como é feita esta comutação no micro. Ler sobre isto no datasheet :: " read-modify-write"

Para comutar pinos, o melhor é usar um OR ou AND lógicos :::

SET RB0::  PORTB |= 0b00000001;

CLEAR RB0:: PORTB &= 0b11111110;


Vejam o ASM de saída do compilador, para ver como é feito em assembler, possivelmente algo como isto ::

SET RB0:
MOVLW b'00000001'
IORWF PORTB, F       ;destino da operação de volta para PORTB

CLEAR RB0:
MOVLW b'11111110'
ANDWF PORTB, F      ;destino da operação de volta para PORTB
Título: Re: HITECH com PIC16F887
Enviado por: iyahdub em 13 de Julho de 2012, 18:55
Sena, ja agora, tendo o meu pequeno codigo como exemplo, como farias ?!?
E ja agora, posso assumir que o teu conselho tem a ver com a arquitectira do PIC, somente, correcto ?!
E que estou a verificar a parte da datasheet, mas como ainda estou aprender tudo o que tenha a ver com low level, nao me faz muito sentido.
Outra pergunta- o Debug configurado no s configurations bits, e para in line debugging...Como tenho o PickIt 2, poderia usar ele tb em vez do pick it?!? Ou quando escolho debugging no Mplab, ele activa autiomaticamente o pickIt2 debugging ?!? Ou e apenas o do software ?!?
Eu sei que algumas destas respostas poderia encontrar na documentacao, mas e tao complicado encontrar algo por vezes( sobre os PICS) que sempre foi algo que me manteve afastado deles ate agora...Por isso e sempre bom ter alguem com bastante experiencia como voces a quem perguntar...

Obrigado em avanco !
Título: Re: HITECH com PIC16F887
Enviado por: Sérgio_Sena em 13 de Julho de 2012, 23:18
Sena, ja agora, tendo o meu pequeno codigo como exemplo, como farias ?!?


     TRISA=0;
     TRISB=0;
     TRISC=0;
     TRISD=0;
     TRISE=0;



E ja agora, posso assumir que o teu conselho tem a ver com a arquitectira do PIC, somente, correcto ?!

Com qualquer arquitectura. Embora hoje os micros já automaticamente activem os pull-ups internos, de propósito, quando o pino está como entrada.
Um pino de entrada digital, é um circuito de alta-impedância. Logo, é como se fosse uma antena no ar: capta todo o tipo de ruidos. Às vezes basta aproximar a mão do circuito, sem lhe tocar, para que haja todo o tipo de comportamentos estranhos, nomeadamente oscilações nas entradas e subsequentes oscilações na linha de MCLR interno.

Não estou a afirmar que poderá ser agora o problema, mas...




Outra pergunta- o Debug configurado no s configurations bits, e para in line debugging...Como tenho o PickIt 2, poderia usar ele tb em vez do pick it?!? Ou quando escolho debugging no Mplab, ele activa autiomaticamente o pickIt2 debugging ?!? Ou e apenas o do software ?!?

Quando escolhes o Debbuging, de entre vários, podes escolher o MPLAB SIM ou o PICKIT2.
O SIM é para simular o código no MPLAB. O PICKIT2 é para programar e fazer debbug em "tempo-real" no hardware.





Eu sei que algumas destas respostas poderia encontrar na documentacao, mas e tao complicado encontrar algo por vezes( sobre os PICS) que sempre foi algo que me manteve afastado deles ate agora...Por isso e sempre bom ter alguem com bastante experiencia como voces a quem perguntar...

Não é complicado. Até há muita muita informação na internet. É questão é de saber o que se procura.
Até há bem pouco tempo, encontrar informação PIC era extremamente mais facil do que AVR. Agora, com o advento do Arduino, está perfeitamente equiparado.
Título: Re: HITECH com PIC16F887
Enviado por: iyahdub em 13 de Julho de 2012, 23:40
Obrigado.
Dou bastante valor ajuda de membros como tu, o Senso, e outros( desculpem so neomear alghuyns lol), que torna foruns como este algo importantissimos.
Acho que ja tinha dito, mas talvez devesses ajudar com a tal revista com uns artigos de introducao aos PICS( ja que e a tua area) e o Senso e o Dropes com AVR ?!? Tenho a certeza que muita gente os usaria como incentivo a enterrarem mais o cabecorro nas questoes mais tecnicas, tal como tu me incentivaste a nao ter medo do assembly e dos PIC(que ate a altura, me assustavam)
Título: Re: HITECH com PIC16F887
Enviado por: Sérgio_Sena em 13 de Julho de 2012, 23:42
Obrigado.
Dou bastante valor ajuda de membros como tu, o Senso, e outros( desculpem so neomear alghuyns lol), que torna foruns como este algo importantissimos.
Acho que ja tinha dito, mas talvez devesses ajudar com a tal revista com uns artigos de introducao aos PICS( ja que e a tua area) e o Senso e o Dropes com AVR ?!? Tenho a certeza que muita gente os usaria como incentivo a enterrarem mais o cabecorro nas questoes mais tecnicas, tal como tu me incentivaste a nao ter medo do assembly e dos PIC(que ate a altura, me assustavam)


Obrigado pelas palavras, ajudarei sempre no que possivel.
:)