collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[27 de Março de 2024, 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: MPLAB XC8  (Lida 19394 vezes)

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

Offline Dave

  • Mini Robot
  • *
  • Mensagens: 368
    • "O Engenhocas"
MPLAB XC8
« 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 ;)
David Martins
Eng. Electrotécnica e de Computadores, UBI

Offline dimitri9494

  • Mini Robot
  • *
  • Mensagens: 22
Re: MPLAB XC8
« Responder #1 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...

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: MPLAB XC8
« Responder #2 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.
Avr fanboy

Offline Dave

  • Mini Robot
  • *
  • Mensagens: 368
    • "O Engenhocas"
Re: MPLAB XC8
« Responder #3 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.
David Martins
Eng. Electrotécnica e de Computadores, UBI

Offline Dave

  • Mini Robot
  • *
  • Mensagens: 368
    • "O Engenhocas"
Re: MPLAB XC8
« Responder #4 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.


;)
David Martins
Eng. Electrotécnica e de Computadores, UBI

Offline msr

  • Mini Robot
  • *
  • Mensagens: 798
Re: MPLAB XC8
« Responder #5 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.

Offline Dave

  • Mini Robot
  • *
  • Mensagens: 368
    • "O Engenhocas"
Re: MPLAB XC8
« Responder #6 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?

David Martins
Eng. Electrotécnica e de Computadores, UBI

Offline msr

  • Mini Robot
  • *
  • Mensagens: 798
Re: MPLAB XC8
« Responder #7 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.

Offline Dave

  • Mini Robot
  • *
  • Mensagens: 368
    • "O Engenhocas"
Re: MPLAB XC8
« Responder #8 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 ;)
David Martins
Eng. Electrotécnica e de Computadores, UBI

Offline dimitri9494

  • Mini Robot
  • *
  • Mensagens: 22
Re: MPLAB XC8
« Responder #9 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

O mesmo de cima mas a trabalhar com ADC: 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

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...

Offline Dave

  • Mini Robot
  • *
  • Mensagens: 368
    • "O Engenhocas"
Re: MPLAB XC8
« Responder #10 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.


David Martins
Eng. Electrotécnica e de Computadores, UBI

Offline Dave

  • Mini Robot
  • *
  • Mensagens: 368
    • "O Engenhocas"
Re: MPLAB XC8
« Responder #11 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.

David Martins
Eng. Electrotécnica e de Computadores, UBI

Offline Dave

  • Mini Robot
  • *
  • Mensagens: 368
    • "O Engenhocas"
Re: MPLAB XC8
« Responder #12 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....
David Martins
Eng. Electrotécnica e de Computadores, UBI

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: MPLAB XC8
« Responder #13 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.
Avr fanboy

Offline Dave

  • Mini Robot
  • *
  • Mensagens: 368
    • "O Engenhocas"
Re: MPLAB XC8
« Responder #14 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);
}
}
David Martins
Eng. Electrotécnica e de Computadores, UBI