PIC 24FJ64GA002 problem a AD prevodnikom

Jak říkáš, jak je člověk placen od práce a a nemá to jen pro zábavu, tak je to pak jiná.
Používám MPLABX 3.50 a 4.05 a nezaznamenal jsem větší problém, rozhodně to nepoadá, ale potřebuje to občas až 1GB paměti, což s 3GB v Opeře je dost zapeklitý problém :smiley: Občas to přemýšlí jestli to co jsem napsal označit hned za chybu nebo až za 5s, ale nakonec se v tom dá i dělat. Sice 8.92 bylo mnohem lepší a jelo i na 1,6GHz jednojádrovým 32b Atomu s 2GB RAM a vše tam chodilo bleskově.

Nejhorří jsou starty, pak přijde část “Parsing project” ta trvá několik minut v případě mých projektů a pak už to tak nějak šlape. BEz větších komplikací. Nicméně simulátor, tak jak jsem ho hodně používal v 8.92 je tady strašně pomalý a krkolomný, takže už nepožívám a raději to nahraju do brouka + Saleae Logic! (Mám origo Logic 8 PRO a je to pecka jak hovado)

Vzpoměl jsem si, že v Logicu občas blbne Autobaud detect, je potřeba nastavit rychlost nějakou podobnou, potom se to chytá bez problémů. Pak to hodí rychlost nějakou a pak chodí ty rozbitý znaky.

Mám doma několik kitý NXP Kinetis a jeden Nucleo 64. Ale pro moje potěšení jsem zatím nebyl schopen rozumně rozchodit prostředí. Pro mě je super, že stáhnu MPLAB X, k tomu odpovídající XC a nic dalšího neřeší, kdežto pro ARM je prostředí 4 prd…ele a zatím jsem se nedobral ani k blikání LEDky. No pravda moc času jsem tomu nepověnoval, ale u toho uChipu je to celý takový dost intuitivní, tady mi to nepřijde.
Teď mám stáhnuté Atollic cosi, tak snad někdy.

Nakonec mi u uChipu nepřijde ani ten kompilátor tak špatnej, používám verzi Free a neřeším to. Vše funguje v pohodě. Ale ceníková cena za PRO verzi je vážně úsměvná. Kdyby to dali za 150 USD, tak je to snesitelný, ale 852 EUR :smiley:

Poslední dobou mě začalo ale dost bavit ESP8266 a Arduino IDE

ADC kody som trocha poupravil a nasadil na LCD display. Zariadenie meria napätie na trimru + zobrazuje hodnotu ADC1BUF0

Kod:

[code]#include “config_diall.h” // http://www.diallix.net/headers
#include “config_words.h” // http://www.diallix.net/headers
#include “LCD_D.h” // http://www.diallix.net/el/145-lcdcontroll

char *PageSys(void)
{
return “0x21”;
}

struct attribute ((packed)) {
float voltage;
float number;
char results_voltage[32];
char results_number[32];
}ADC_Results;

unsigned long ADCValue = 0;

void ADC_Init(void)
{
CLKDIV = 0;
//Init_Port(PORTA, 1, “analog”); /* Set AN1 as analog /
AD_Set_Analog(AN1); /
Set AN1 as analog /
Set_ADC_port(AN1); /
Set AN1 port for scanning /
Config_OUT(TRISA,0); /
Set RA0 for detect LED /
T3CON=0b1000000000110000; /
50msec, 1/256,FOSC=16MH, Current time clock /
PR3 = 3124; /
50000 ·((1/16) —256)-1 = 3124 */

AD1CON1 = 0x8044; /* AD1CON1:A/D1 Configure sample clock source
and conversion trigger mode.
Unsigned Fraction format (FORM<1:0>=10),
Manual conversion trigger (SSRC<3:0>=000),
Manual start of sampling (ASAM=0),
No operation in Idle mode (ADSIDL=1) */

AD1CON2 = 0x0400; /* AD1CON2:A/D2; 31Tad 3.0Tcy
Configure A/D voltage reference
and buffer fill modes.Vr+ and Vr- from
AVdd and AVss (VCFG<2:0>=000),
Inputs are not scanned,
Interrupt after every sample */

AD1CON3 = 0x0000; /* AD1CON3:A/D3; MUX A
Configure A/D conversion clock as Tcy/2 */

AD1CHS = 0x0000; /* AD1CHS:A/D
Configure input channels */

IEC0bits.AD1IE = 1; /* Enable A/D conversion interrupt /
AD1CON1bits.ADON = 1; /
Turn on A/D /
AD1CON1bits.ASAM = 1; /
Sampling begins immediately after the last conversion /
AD1CON1bits.SAMP = 1; /
Start sampling the input */
}

void Display_Init(void)
{
OSCTUN = 0;
RCONbits.SWDTEN = 0;
This.Detect.Debug = FALSE;

LCD.Direct.Port = uintptr &PORTA;
LCD.Data.Port = uintptr &PORTB;
LCD.Direct.RS = 2;
LCD.Direct.RW = 3;
LCD.Direct.EN = 4;

//LedStatus.Port = uintptr &PORTB;
//LedStatus.Led = 0;
LCD_Init();
}

int main(void)
{
ADC_Init();
Display_Init();

Delay_us(50);

while(1)
{
//Delay_ms(ADCValue);
//Bit_Toogle(LATA, 0);
LCD_Send_(1,LCD.position_1,null);
LCD_Send_(0,null, ADC_Results.results_voltage);
LCD_Send_(1,LCD.position_2,null);
LCD_Send_(0,null, ADC_Results.results_number);
}

return 0;
}

void attribute((interrupt,auto_psv)) _ADC1Interrupt(void) /* interrupt thread /
{
ADCValue = ADC1BUF0; /
Get data from buffer0 */

ADC_Results.voltage = ((float)ADC1BUF0 * 3.3f)/1024.0f;
sprintf(ADC_Results.results_voltage, "Voltage: %3.2f ",ADC_Results.voltage);

ADC_Results.number = ((float)ADC1BUF0);
sprintf(ADC_Results.results_number, "Number: %3.2f ",ADC_Results.number);

IFS0bits.AD1IF = 0; /* ADC flag set 0 */
}[/code]

video: www.youtube.com/watch?v=M402vAYV5ws

cely clanok : diallix.net/el/199-adc-prevodnik-2

Pocuj, ako to je s nastavovanim kanalu? Chcel by som dat AN0 , AN1 ako vstupne regulacie trimrov no neviem ako na to.

Koukni do Application notes do sekce na A/D převodník. Je to tam popsáno jak pro dementy. Z toho to pochopíš nejlíp, ten první okamžik je nejhorší, pak je to pohoda.

Prisiel som na to.

Moj kod:

[code]#include “config_diall.h” // http://www.diallix.net/headers
#include “config_words.h” // http://www.diallix.net/headers
#include “LCD_D.h” // http://www.diallix.net/el/145-lcdcontroll
char *PageSys(void)
{
return “0x21”;
}
struct attribute ((packed)) {
float voltage;
float number;
char results_voltage[32];
char results_number[32];
unsigned long ADCValue1, ADCValue2;
}ADC_Results;

void ADC_Init(void)
{
ADC_Results.ADCValue1=0;
ADC_Results.ADCValue2=0;
CLKDIV = 0;
//Init_Port2(&PORTA, 0, “analog”); /* Set AN0 as analog /
//Init_Port2(&PORTA, 1, “analog”); /
Set AN1 as analog /
AD_Set_Analog(AN0); /
Set AN0 as analog /
AD_Set_Analog(AN1); /
Set AN1 as analog /
Set_ADC_port(AN0); /
Set AN0 as input /
Set_ADC_port(AN1); /
Set AN1 as input /
Scan_ADC_port(AN0); /
Set AN0 for scanning /
Scan_ADC_port(AN1); /
Set AN1 for scanning /
//Config_OUT(TRISA,0); /
Set RA0 for detect LED /
T3CON=0b1000000000110000; /
50msec, 1/256,FOSC=16MH, Current time clock /
PR3 = 3124; /
50000 ·((1/16) —256)-1 = 3124 /
AD1CON1 = 0x8044; /
AD1CON1:A/D1 Configure sample clock source
and conversion trigger mode.
Unsigned Fraction format (FORM<1:0>=10),
Manual conversion trigger (SSRC<3:0>=000),
Manual start of sampling (ASAM=0),
No operation in Idle mode (ADSIDL=1) /
AD1CON2 = 0x0400; /
AD1CON2:A/D2; 31Tad 3.0Tcy
Configure A/D voltage reference
and buffer fill modes.Vr+ and Vr- from
AVdd and AVss (VCFG<2:0>=000),
Inputs are not scanned,
Interrupt after every sample /
AD1CON3 = 0x0000; /
AD1CON3:A/D3; MUX A
Configure A/D conversion clock as Tcy/2 /
AD1CHS = 0x0000; /
AD1CHS:A/D
Configure input channels /
//AD1CON2bits.CSCNA = 1; /
Scan inputs /
AD1CON2bits.SMPI0 = 1; /
Interrupt after 2 sequences /
//AD1CSSLbits.CSSL0 = 1; /
Scan 2 channels /
IEC0bits.AD1IE = 1; /
Enable A/D conversion interrupt /
AD1CON1bits.ADON = 1; /
Turn on A/D /
AD1CON1bits.ASAM = 1; /
Sampling begins immediately after the last conversion /
AD1CON1bits.SAMP = 1; /
Start sampling the input */
}

int main(void)
{
ADC_Init();
Display_Init();
Delay_us(50);
while(1)
{
}
return 0;
}
void attribute((interrupt,auto_psv)) _ADC1Interrupt(void) /* interrupt thread /
{
AD1CON1bits.ASAM = 1; // Start automatic sampling and conversion
while (IFS0bits.AD1IF == 0);
ADC_Results.ADCValue1 = ADC1BUF0; /
Get data from buffer0 /
ADC_Results.ADCValue2 = ADC1BUF1; /
Get data from buffer1 /
IFS0bits.AD1IF = 0; /
ADC flag set 0 */
}[/code]

Pre cely kod s displajom navstivte moj web “http://www.diallix.net/el/200-adc-we-display-the-voltages-of-two-channels-on-the-lcd