LusoRobótica - Robótica em Português

Sistemas específicos => PIC => Tópico iniciado por: Dave em 29 de Setembro de 2012, 16:50

Título: MPLAB XC8
Enviado por: Dave em 29 de Setembro de 2012, 16:50
Anda por aqui alguém a usar este compilador?

Eu uso muito o CCS, mas por opção queria começar a utilizar o MPLAB XC8, entre outras coisas por ser da Microchip.

O grande problema é que não encontro informação de "jeito" sobre como iniciar a programação com este compilador.

Precisava de ajuda.


Tenho andado a inventar um pouco. O tipico "hello world" com o led a piscar, está feito, mas agora tentei ler um ADC, mas não estou a ter sucesso...

Estou a usar um PIC16F88.

Código: [Seleccione]
#include <xc.h>
#include "adc.h"

__CONFIG (FOSC_INTOSCIO&WDTE_OFF&PWRTE_OFF&MCLRE_OFF&BOREN_OFF&DEBUG_OFF&LVPDIS);

#define _XTAL_FREQ 4000000


void main()
{
long int adc1;

OSCCON = 0b1101100; //oscilador
PORTA = 1;
TRISA = 1;
PORTB = 0;
TRISB = 0;
ANSELbits.ANS0 = 1;

// ADC configuration

ADCON1bits.VCFG = 0b00;
ADCON1bits.ADCS2 = 0;

ADCON0bits.CHS = 0b000;
ADCON0bits.ADCS = 0b11;
ADCON0bits.ADON = 0b1;

__delay_ms(500);

ADCON0bits.GO_nDONE = 1;

__delay_ms(500);

adc1=ADRESH+ADRESL;                  //a leitura é incorrecta!!!


while(1)
{
RA1 = 1;
__delay_ms(500);
RA1 = 0;
__delay_ms(500);


}
}


Cumps ;)
Título: Re: MPLAB XC8
Enviado por: dimitri9494 em 29 de Setembro de 2012, 18:10
Não tenho a certeza do que vou dizer mas isto : adc1=ADRESH+ADRESL; irá somar valores dos 2 registos e não "concatenar" como possivelmente é o que pretendes...
Título: Re: MPLAB XC8
Enviado por: senso em 29 de Setembro de 2012, 18:19
Pois, terá de ser algo do género:
Código: [Seleccione]
adc1 = ((ADRESH<<8)|(ADRESL));
E o adc1 bastar ser um int, porque o adc desse micro é de 10 bits, não precisas de um long int(32bits) para guardar um valor de 16 bits.
Título: Re: MPLAB XC8
Enviado por: Dave em 29 de Setembro de 2012, 19:23
Pois, terá de ser algo do género:
Código: [Seleccione]
adc1 = ((ADRESH<<8)|(ADRESL));
E o adc1 bastar ser um int, porque o adc desse micro é de 10 bits, não precisas de um long int(32bits) para guardar um valor de 16 bits.

Pois... :(

No CCS havia:
int - 8 bits
int16 - 16 bits
...


Já fiz o que sugeriram, mas após a suposta leitura de ADC, o valor adc1=32704. No caso estava há espera que fosse 512.
Título: Re: MPLAB XC8
Enviado por: Dave em 29 de Setembro de 2012, 19:59
Não sei qual a vossa disponibilidade, mas vamos fazer o seguinte: por volta das 21:30 eu vou aparecer pelo chat e agradecia a vontade de todos em tentar ajudar.

Há algo que me está a escapar, devido há falta de informação e exemplos do XC8.




Agradecia a vossa ajuda.


;)
Título: Re: MPLAB XC8
Enviado por: msr em 29 de Setembro de 2012, 20:36
Usa o header <stdint.h> (C standard)
Aí tens os tipos todos de inteiros: uint8_t, int16_t, etc

Pois, terá de ser algo do género:
Código: [Seleccione]
adc1 = ((ADRESH<<8)|(ADRESL));
E o adc1 bastar ser um int, porque o adc desse micro é de 10 bits, não precisas de um long int(32bits) para guardar um valor de 16 bits.

Pois... :(

No CCS havia:
int - 8 bits
int16 - 16 bits
...


Já fiz o que sugeriram, mas após a suposta leitura de ADC, o valor adc1=32704. No caso estava há espera que fosse 512.
Título: Re: MPLAB XC8
Enviado por: Dave em 29 de Setembro de 2012, 21:11
Usa o header <stdint.h> (C standard)
Aí tens os tipos todos de inteiros: uint8_t, int16_t, etc



OK, obrigado.


Já agora, para que serve o "adc.h" em include>plib>adc.h?

Título: Re: MPLAB XC8
Enviado por: msr em 29 de Setembro de 2012, 21:34
Usa o header <stdint.h> (C standard)
Aí tens os tipos todos de inteiros: uint8_t, int16_t, etc



OK, obrigado.


Já agora, para que serve o "adc.h" em include>plib>adc.h?

Esse header faz parte da "Peripheral Library". Tens também "uart.h", etc. Se não quiseres configurar os registos dos periféricos manualmente, podes usar essa biblioteca.
Título: Re: MPLAB XC8
Enviado por: Dave em 29 de Setembro de 2012, 21:40
Por agora queria usar algo assim, só para me ir ambientado ao compilador.

Mas não há comentários muito esclarecedores acerca de tudo isso.

Esse header tem várias ADC... "ADC_V1", "ADC_V2", etc. Como é suposto isto tudo funcionar?



Obrigado pela paciência ;)
Título: Re: MPLAB XC8
Enviado por: dimitri9494 em 29 de Setembro de 2012, 23:15
Boas dave,

Tens aqi um hello world a ligar um led e a implementar duty cicle e também compara com o compilador CCS : http://www.gooligum.com.au/tutorials/baseline/PIC_Base_C_1.pdf (http://www.gooligum.com.au/tutorials/baseline/PIC_Base_C_1.pdf)

O mesmo de cima mas a trabalhar com ADC: http://www.gooligum.com.au/tutorials/baseline/PIC_Base_C_7.pdf (http://www.gooligum.com.au/tutorials/baseline/PIC_Base_C_7.pdf)

Para explorar a fundo explica tudo aqui sobre o compilador: http://ww1.microchip.com/downloads/en/DeviceDoc/52053B.pdf (http://ww1.microchip.com/downloads/en/DeviceDoc/52053B.pdf)

Eu nunca li tudo o que aqui apresentei mas quando tenho algumas dúvidas vejo exemplos e ajudam-me a entender melhor... espero que te ajudem também...
Título: Re: MPLAB XC8
Enviado por: Dave em 29 de Setembro de 2012, 23:55
Sim, já conhecia. Aliás até me estava a guiar por um agora.


Eu criei um hábito muito mau que era ir aos header files e ver quase tudo ali. Os fuses, etc... estava lá tudo e agora ... bem agora está lá tudo também, mas sem os coments todos "direitinhos" etc  :o.


Título: Re: MPLAB XC8
Enviado por: Dave em 30 de Setembro de 2012, 00:21
Os problemas continuam...

Eu estou a fazer uns programas de teste com o 16F88.

Na página 130 do datasheet diz que: FOSC = 100 = INTRC oscillator; port I/O function on both RA6/OSC2/CLKO pin and RA7/OSC1/CLKI pin

Mas quando compilo o MPLAB diz que o FOSC está definido como LP oscillator  :o.


Alguma ideia?

Existe algum ficheiro onde possa ir ver os nomes dos "fuses"? Pois possivelmente eles têm outra designação para isto.

(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fi473.photobucket.com%2Falbums%2Frr100%2Fdaviddmmartins%2Fprob.png&hash=b6b976504ab7edd6be02f683f64601aeab02165a)
Título: Re: MPLAB XC8
Enviado por: Dave em 30 de Setembro de 2012, 00:28
Já troquei por FOSC=INTOSCIO e agora já aparece bem.

Mas onde está esta nomenclatura toda escrita? Estou a achar isto muito estranho e difícil de trabalhar, pois não existe nenhum documento de jeito com isto...


Nem parece da microchip! Eles que por cada MCU fazem datasheets com 250 paginas e o user guide do XC8 está muito incompleto....
Título: Re: MPLAB XC8
Enviado por: senso em 30 de Setembro de 2012, 02:19
Provavelmente está tudo no datasheet da familia que descreve tudo a fundo e com muito texto e exemplo e o datasheet de 250 é uma versão muito resumida que só fala no que o micro tem, mas não fala em como usar e assim.
Título: Re: MPLAB XC8
Enviado por: Dave em 30 de Setembro de 2012, 02:35
Desconheço... já estive a fazer uma pesquisa pela net  mas não encontro nenhum pdf sobre a família PIC16FXXX   :-\


Entretanto já estive a estudar mais um pouco e já consegui ler a ADC em condições.

Código: [Seleccione]
#include <xc.h>

#pragma config CP=1, DEBUG=1, LVP=0, BOREN=0, MCLRE=0, PWRTE=1, WDTE=0, FOSC=INTOSCIO

#define _XTAL_FREQ 4000000


void main()
{
int adc1, adc2, adc3;

//portos
TRISA = 0b00000001; //RA0 como entrada
TRISB = 0b00000000;
PORTA = 0;
PORTB = 0;

//oscilador
OSCCONbits.IRCF = 0b110;
OSCCONbits.OSTS = 1;
OSCCONbits.IOFS = 1;
OSCCONbits.SCS  = 0b00;

//ADC config
ANSEL = 0b0000001;

ADCON1bits.ADFM  = 1;
ADCON1bits.ADCS2 = 0;
ADCON1bits.VCFG  = 0b00;

ADCON0bits.ADCS = 0b11;
ADCON0bits.CHS  = 0b000;
ADCON0bits.ADON = 1;



//programa leitura
ADCON0bits.GO_nDONE = 1;
__delay_ms(10);
adc1=ADRESH;
adc2=ADRESL;
adc3=((ADRESH<<8)+(ADRESL)); //pag 119
__delay_ms(100);


while(1)
{
RA1 = 1;
__delay_ms(500);
RA1 = 0;
__delay_ms(500);
}
}
Título: Re: MPLAB XC8
Enviado por: Dave em 05 de Outubro de 2012, 22:36
Boas.

Tenho continuado a evoluir aos poucos com o XC8, mas agora cheguei a um grande problema.

Como escrever num lcd 16x2? Antes chamava a biblioteca, alterava os pinos e era só enviar "Hello world" para o LCD.
Agora não encontro nenhuma biblioteca que funcione com PIC16F, quer dizer isso que tenho de fazer a minha própria biblioteca para o PIC que estou a utilizar?


Cumps ;)
Título: Re: MPLAB XC8
Enviado por: senso em 05 de Outubro de 2012, 22:37
Isso é universal.
A unica coisa especifica dessas bibliotecas é como aceder aos pinos e provavelmente uma função de delay, de resto é tudo a mesma coisa.
Título: Re: MPLAB XC8
Enviado por: Dave em 05 de Outubro de 2012, 22:58
Isso é universal.
A unica coisa especifica dessas bibliotecas é como aceder aos pinos e provavelmente uma função de delay, de resto é tudo a mesma coisa.

Então pego numa biblioteca, altero as rotinas (neste caso de "delay_ms" para "__delay_ms") e mais alguma coisa que seja necessário e fica tudo na mesma?


Abraço
Título: Re: MPLAB XC8
Enviado por: Dave em 06 de Outubro de 2012, 18:33
http://www.microchip.com/forums/m679800.aspx (http://www.microchip.com/forums/m679800.aspx)


Pelos vistos o MPLABX tem muitas falhas... uma delas é a de não poder alterar as bibliotecas no próprio programa.... ele não as deixa gravar  :o.


Assim estou a tentar entender qual será a vantagem de usar o MPLAB XC8 ou continuar com o CCS, mas recorrendo a configurações (OPTION_REG, etc..) em assembly.


Alguém me pode ajudar neste dilema?
Título: Re: MPLAB XC8
Enviado por: senso em 06 de Outubro de 2012, 18:36
Perfeitamente normal, os ficheiros que estão na pasta program files não podem ser alterados á sorte pelos programas, e tem todo o sentido que não possas editar o original das bibliotecas, eu tenho várias bibliotecas feitas por mim, e se as quero utilizar, faço uma cópia local para cada projecto e na pasta do projecto é que faço as alterações necessárias.
Título: Re: MPLAB XC8
Enviado por: Dave em 06 de Outubro de 2012, 18:47
Já tentei fazer isso, mas ele só me deixa adicionar bibliotecas que estejam na pasta "lib".

Quando escrevo "#include <>", ele abre uma janela para eu clicar nas pastas e dizer o "caminho" até à biblioteca, o problema é que já me permite navegar dentro da pasta "lib".

Já tentei fazer algo do tipo #include <lcd.h>, este ficheiro estava na pasta do projecto, adicionei o ficheiro ao projecto, mas ele dizia que não encontrava  :o.


A microchip está a falhar um bocado a meu ver...
Esperava algo diferente.
Título: Re: MPLAB XC8
Enviado por: senso em 06 de Outubro de 2012, 18:48
Se está na tua pasta pessoal é com "" e não com <>, e algures na configuração de includes tens de dizer ao IDE para procurar tambem na tua pasta pessoal.

Acho que o que está a falhar, e não leves a mal, é algum conhecimento de programação em C, e conhecimento para utilizar o MPLab, já experimentas-te ir ver o manual do IDE?
Título: Re: MPLAB XC8
Enviado por: Dave em 06 de Outubro de 2012, 18:58
Senso, não posso levar a mal...

Eu estava habituado a outras coisas e não a isto.

Eu já li o manual do IDE, mas para o fabricante que cada micro tem um datasheet de mais de 200páginas, achei muito fraco.

Aqui o principal problema, agora, são as bibliotecas. Eu ainda não entendi o xlcd.h, pois além de não haver comentários muito esclarecedores, navego um pouco pela internet e é como se ninguém utilizasse o MPLAB, ou pelo menos ninguém tivesse ligado a um lcd16x2.

Por exemplo, para fazer o init_lcd, deverei fazer como?
Código: [Seleccione]
OpenXLCD();ou
Código: [Seleccione]
OpenXLCD(FOUR_BIT && LINE_5X7)
Vê-se pouco e aquilo que se vê vai variando de site para site...  :-\


Senso, obrigado pela paciência.
Título: Re: MPLAB XC8
Enviado por: patinhofeio em 28 de Novembro de 2012, 02:19
Boas.
Vou usar este topico para colocar uma questão que tem algo a ver com este compilador:
Até agora, apenas fiz alguns códigos em assembly, coisas simples. Já tentei programar em C mas como andava a usar o mikroC a linguagem éum pouco diferente da C#.
Decidi deixar o mikroC e passar para MPLab e no site vi este compilador. Agora em buscas por informação do mesmo dei com este tópico e parece que talvez ainda tenha muitos bugs.
A minha questão de fundo é: Qual o melhor compilador, de preferência de C nativo, que cubra mais séries de PIC? Provavelmente o HI-TECH, mas pelo que li esse só vai até à série 16F, o que implica mudar de compilador quando precisar de usar um 18F.
Eu tinha ideia de usar este porque o mesmo compilador faz toda a gama desde 10 a 18.
Sugestões sobre o melhor compilador(e já agora mais fácil de manobrar) são bem vindas. Já sei que terei algumas dificuldades a entrar no C, pois já programei em Visual Basic .NET e a sintaxe é um bocado diferente, mas nada que não aprenda ao aplicar-me  :D
Título: Re: MPLAB XC8
Enviado por: senso em 28 de Novembro de 2012, 04:04
Basicamente usas os da Microchip, fazes o download do MPLAB, 8 ou X, conforme o gosto e depois fazes download dos compiladores de 8, 16 e 32 bits da Microchip e o MPLAB, pelo menos o X integra tudo de maneira mais ou menos bonita, até porque a Microchip comprou praticamente toda a concorrência de compiladores.
Título: Re: MPLAB XC8
Enviado por: patinhofeio em 28 de Novembro de 2012, 11:53
... e depois fazes download dos compiladores de 8, 16 e 32 bits da Microchip e o MPLAB, pelo menos o X integra tudo de maneira mais ou menos bonita, até porque a Microchip comprou praticamente toda a concorrência de compiladores.
Boas.
A minha duvida é mesmo essa. Não há um compilador que sirva para todas as séries de PIC?
Em tempos alterei alguns exemplos em CCS C, outros em HITECH, mas há certas coisas que variam conforme o compilador. Por isso, como queria dedicar a aprender, preferia ser num compilador que pudesse ser mais "versátil" e abrangente.
Provavelmente, irei apenas até aos PIC18, por isso ter visto este compilador XC8, mas ao ler este tópico parece que tem alguns bugs.
Título: Re: MPLAB XC8
Enviado por: Dave em 03 de Dezembro de 2012, 15:18
Aproveitando o tópico, alguém me sabe explicar porque raio isto acontece?

Eu antes, com o MPLAB 8 e o hi-tech compilava, tirava o ficheiro COF, abria no proteus e corria o programa lado a lado, uma espécie de "debugger" virtual.

Agora com o MPLABX não consigo fazer aparecer o programa... ficando o PROTEUS sem utilidade, visto que  eu posso ver as variáveis, mas não controlo quando as quero ver...


(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fi473.photobucket.com%2Falbums%2Frr100%2Fdaviddmmartins%2F2-8.png&hash=c77012456183c3bb552f2ea0b9f56c57e1901e3a)


Obrigado
Título: Re: MPLAB XC8
Enviado por: senso em 03 de Dezembro de 2012, 17:37
... e depois fazes download dos compiladores de 8, 16 e 32 bits da Microchip e o MPLAB, pelo menos o X integra tudo de maneira mais ou menos bonita, até porque a Microchip comprou praticamente toda a concorrência de compiladores.
Boas.
A minha duvida é mesmo essa. Não há um compilador que sirva para todas as séries de PIC?
Em tempos alterei alguns exemplos em CCS C, outros em HITECH, mas há certas coisas que variam conforme o compilador. Por isso, como queria dedicar a aprender, preferia ser num compilador que pudesse ser mais "versátil" e abrangente.
Provavelmente, irei apenas até aos PIC18, por isso ter visto este compilador XC8, mas ao ler este tópico parece que tem alguns bugs.


São todos iguais...
Os includes têm todos o mesmo nome(tirando o que tem o nome do micro), os pragmas, fuses e bla bla bla é tudo o mesmo, não percebo qual é a coisa..
Título: Re: MPLAB XC8
Enviado por: Dave em 03 de Dezembro de 2012, 20:10
Emparelhei o XC8 compiler com o MPLAB 8.85 e funciona na perfeição.

Será que o PROTEUS 7.9 não vem preparado para os ficheiros COF do MPLABX ?


(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fi473.photobucket.com%2Falbums%2Frr100%2Fdaviddmmartins%2Fteste-2.png&hash=20d30083dd274b86b9865797299ee8dcd3120d73)