PIC 24FJ64GA002 problem a AD prevodnikom

No, dokázal jsi mě namotivovat abych konečně nějakej ten PIC24 vytáhnul, když už je tu léta mám v šuplíku :smiley: takže zkouším zkouším - C30 jsem si nainstaloval už včera, teď zrovna jsem ve stádiu hledání nějakého vhodného potenciometru, jinak to mám zapojený a připravený už komplet.

Když už jsme u zapojování, tak jen tak pro jistotu - ten 10 μF kondík na VCAP/VDDCORE máš nějakej schopnější? Měl by totiž být LowESR, takže nějaká obyčejná čína by nemusela stačit ( má mít ESR < 5 Ω). Ten vnitřní měnič napájí celý jádro MCU, takže když nepojede pořádně tohle, tak ti nepojede nic :exclamation:

ano mam zapojeny kondik. myslim si ze spravny, skusal som ich par. kamo som fakt zvedavy ci to pojde tebe.

caute, nevidim tam nikde zapnuti ADC ?

ahoj. skusal som

AD1CON1bits.ADON = 1;
a

AD1CON1bits.SAMP = 1;

ale nic…

preruseni funguje ?

skus nastavit pevnou hodnotu misto z ADC, skus vice hodnot jestly to funguje …

Přerušení funguje, na debug ledce jsem viděl že to tím úsekem proběhlo. Zrovna si s tím takhle taky hraju (to měnění hodnot ručně; jinak abych někoho nezmátl - debug ledku jsem si přidal sám, na RB6).

ADC - měl jsem zato, že je zapnutý tím IEC0bits.AD1IE = 1, ale jak tak na to koukám tak nejspíš ne, asi máš pravdu. Co jsem ale zjistil já je, že onen T3, který se na začátku nastavuje, nemá žádný interrupt handler jestli dobře vidím. Ten časovač je tam zbytečně, tedy pokud se bavíme jen o změně rychlosti blikání led. Jinak hodnoty z ADC v long, čekačky ovšem v int, přepočet prapodivnej :confused: (hlavně teda u tý “delay_us”). Jinak nejsem žádnej velkej Céčkař, ale vidím dobře, že se někdo snaží nacpat 1000 DEC do Int proměnný?

Diallix: Místo bitu SAMP zapnout spíš hned vedle bit ASAM, což? Jak to vidíš? Nepíšeš, do jaký části programu jsi to vkládal…

IE → interrupt enable

ADC ma zdroj hodin z taktu procesoru , jestly jsem to dobre pochopil takze T3 je k nicemu

pokud zadas hodnotu rucne blika ledka na RA0 ? stabilne podle zadanych ms ? void __attribute__((interrupt,auto_psv)) _ADC1Interrupt(void) { IFS0bits.AD1IF = 0; // ADCValue = ADC1BUF0; ADCValue = 500; }

Example 17-1: A/D Initialization Code Example AD1PCFG = 0; // Configure A/D port // all input pins are analog AD1CON1 = 0x2208; // 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 = 0; // 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 = 0; // Configure A/D conversion clock as Tcy/2 AD1CHS = 0; // Configure input channels, // CH0+ input is AN0, // CH0- input is Vr- (AVss). AD1CSSL = 0; // No inputs are scanned. IFS0bits.AD1IF = 0; // Clear A/D conversion interrupt. // Configure A/D interrupt priority bits (AD1IP<2:0>) here, if // required. Default priority level is 4. IEC0bits.AD1IE = 1; // Enable A/D conversion interrupt AD1CON1bits.ADON = 1; // Turn on A/D AD1CON1bits.SAMP = 1; // Start sampling the input Delay(); // Ensure the correct sampling time has elapsed // before starting conversion. AD1CON1bits.SAMP = 0; // End A/D sampling and start conversion // Example code for A/D ISR: void __attribute__ ((__interrupt__)) _ADC1Interrupt(void) { IFS0bits.AD1IF = 0; }
zalezi na prekladaci jak to ma

Jj, to už mi došlo. Mě to s tím AD1CON1bits.ADON a ASAM = 1 funguje jak má, jen je třeba se pořádně podívat na ty čekačky a jak se to tam (debilně) vkládá a počítá. Když mám poťák skoro u země (asi 1mm běžcem na dráze od kraje, odhadem na ruce a osce), tak mi to bliká asi v dvacetisekundovým intervalu. Když zvednu, trvá to věky => upravit typy proměnných a přepočet.

Edit: Aha, no vida, to jsem si neověřil, přiznávám (ten Int). Já jdu od osmibitů, měl jsem zato že je osmibitovej :smiley: Nicméně platí co píšu, jede to, je třeba si upravit počty.

Edit2: Ještě teda radši celej kód, ať zas nejsou zmatky:

Edit3: Kód jsem zase odebral, po obědě a úpravě hodnot zjištěno, že sice už čteme periodicky z ADC, ale nějaký hausnumero bůhvíodkud a ne hodnotu z poťáku (na kterej to nereaguje, proto to trvá tak dlouho). Bez debuggeru i serial portu se fakt blbě ladí :confused:

hodil som to pred while. ak ti to ide mozes tu hodit tvoj upraveny kod?

No to můžu, ale byl bych radši kdyby ten kód napřed pořádně fungoval. Dej mi ještě nějakej čas, nemám jak debuggovat a musím si nějak poradit, value z ADC se fakt blbě zobrazuje na jedný ledce a tenhle typ ADC je pro mě novinka, musím si to nějak ošahat.

dobre v pohode kamo. uvidime co z toho nakoniec zkvete.

jeste nez jsem se dostal k mcu udelal jsem si citac , 2x nakej IO + 3x 7segment, 2 vstupy,signal/reset, no a pak pozdeji jsem si podle toho zobrazoval data z IR ovladace pomoci mcu,
takze si tam bud rozjet uart nebo pripoj 8/10 ledek nebo jinej mcu s lcd ovladanej pomoci 2 dratu … treba

Jj, v klidu, tohle nebude ten problém. Ten problém je, že jsem už asi třetí noc po sobě spal jen 4 až 6 hodin nekvalitního spánku, takže se mi aktálně zoufale moc nechce nic drátovat - ale asi budu muset. Jak jsem psal, nějak si poradím, jen to nebude úplně “na lusknutí prsty”. Ten UART asi vyhraje.

Edit 18:27: Už to chodí. Ještě si kdyžtak odmaž/te tu konfiguraci remappable pinů, tu jsem nějak zapomněl smazat a nechce se mi to dělat ve zdejším editoru zpráv. Jinak se skutečně se musí číst z bufferu 0, takže celý nějak takhle:

#include "p24FJ64GA002.h"
#define CLOCK 16

_CONFIG1(JTAGEN_OFF & GCP_OFF & GWRP_OFF & BKBUG_OFF
   & COE_OFF & ICS_PGx1 & FWDTEN_OFF)

_CONFIG2(IESO_OFF & FNOSC_FRCPLL & FCKSM_CSDCMD
   & OSCIOFNC_OFF & IOL1WAY_OFF & I2C1SEL_PRI & POSCMOD_NONE)

void delay_us(int usec);
void delay_ms(int msec);

unsigned long ADCValue = 0;

//----------------------

int main(void)
{
   CLKDIV = 0;                  // 
   AD1PCFG = 0xFFEF;            // AN4(RB2) - analog inputs
   TRISA = 0xFFFE;              // RA0
   TRISB = 0xFFBF;              // 0xFFBF; 0xFFFF puvodne

   //50msec, 1/256,FOSC=16MHz
   T3CON=0b1000000000110000;
   PR3 = 3124;                  // 50000 ·((1/16) —256)-1 = 3124

	//----------
	// Remappable pins config for UART TX (PC RX)
	// Configure Output Function

	// Unlock Registers
	__builtin_write_OSCCONL(OSCCON & 0xBF);

	RPOR1bits.RP3R = 3;			// Assign U1TX func. to pin RP3

	// Lock registers
	__builtin_write_OSCCONL(OSCCON | 0x40);
	//----------

	// UART1 transmit config



   // ADC config
   AD1CON1 = 0x8044;            // AD1CON1:A/D1
   AD1CON2 = 0x0400;            // AD1CON2:A/D2; 31Tad   3.0Tcy
   AD1CON3 = 0x1F05;            // AD1CON3:A/D3; AN4 MUX A
   AD1CSSL = 0x0010;            // AD1CSSL:A/D
   AD1CHS  = 0x0004;            // AD1CHS:A/D // 0x0000 puvodne

	IEC0bits.AD1IE = 1;          // A/D
	AD1CON1bits.ADON = 1;
	AD1CON1bits.ASAM = 1;	// if this is on, do not need to turn SAMP
	// AD1CON1bits.SAMP = 1;

	delay_us(50);

	// LATBbits.LATB6 = 1;	// DEBUG LED on RB6

   while(1)
   {
	delay_ms(ADCValue);
      	LATAbits.LATA0 = !LATAbits.LATA0;
   }

   return 0;
}

//----------------------

void __attribute__((interrupt,auto_psv)) _ADC1Interrupt(void)
{
	ADCValue = ADC1BUF0;
	IFS0bits.AD1IF = 0;   
}

//----------------------

void delay_us(int usec)
{
   usec=(int)(CLOCK*usec)/10;
   while(usec)
   {
      asm("NOP");
      asm("NOP");
      asm("NOP");
      asm("NOP");
      asm("NOP");
      asm("NOP");
      usec--;
   }
}

//----------------------

void delay_ms(int msec)
{
   int i;
   for(i = 0; i < msec; i++)
   {
      delay_us(1000); 
   }
}

//----------------------

Ω

Este raz diky.

Skusal som dat namiesto trimra joistick analogovy a dioda hapruje.S trimrom to ide super. Joistick by mal ist tiez nie?

V pohodě, nemáš zač :wink: Joystick by měl jít také, je v něm také potenciometr, ale je tam pár úskalí: Jednak záleží co je to přesně za joystick, ale obecně je to většinou tak, že se v joysticku nevyužívá celá dráha potenciometru, ale jen její část. S tím zřejmě souvisí druhý problém - ta část dráhy v potenciometru se rychleji opotřebuje a pak běžec s dráhou ztratí kontakt či má jen náhodný (tj. “chrastí” - u zesilovačů má stejná závada na potenciometru hlasitosti projev podobný chrastění) - tohle bude zřejmě i tvůj problém.

Jinak nedíval jsem se u tohoto typu MCU, ale další věc je, že microchipí ADC obvykle nemají moc velký vstupní odpor (2,5 - 5 kΩ). Pokud máš v joysticku potenciometr s velkou hodnotou (bývají tam obvykle “stokilové”, ale není to pravidlo), tak by to chtělo hodnotu snížit, když ho stejně budeš měnit pro poruchu - platí samozřejmě jen v případě, že joystick předěláváš a původnímu účelu už sloužit nebude (nebo bude, ale s novou elektronikou - zkrátka a dobře prostě nevím, co s ním máš dál za úmysly). Já měl teď na poli poťák pětikilový.

Teď jsem naštěstí neměl potřebu ani zapínat delší dobu PC a je fajn, že jste to rozchodili.
Microcrochip má nízký vnitřní odpor A/D, ale jen když A/D připojí sample kýbl ke vstupu ná pár stovek ns než se nabije, jinak to má impedanci/ odpor jak jakýkoli jiný CMOS vstup. Běžně mám 3x 330k a dole 5k6 dělič na 400VDC. 330k a 44k na 12VDC… a bez jediného problému už tak 10 let. Na vstupu ještě je pověšenej kond 100n.

Ad ty vstupy: Takok moc se se s tím nedrbal, zabil jsem tím asi 2 dny a docela to chodilo.
Takhle mám nastavený A/D na P24FJ64GA306, který má stejný A/D

// <nastavení A/D>
	AD1CON1 = 0b0000010000000000;	// 12b
	AD1CON2 = 0b0000100000000000;
	AD1CON3 = 0b0000010000001001;	//OSC /8
	AD1CON4 = 0;					//DMA OFF
	AD1CON5 = 0b0000000000000000;
	
	IPC3bits.AD1IP = 2;				//Interrupt priority = 2
	IEC0bits.AD1IE = 1;				//Povolení přerušení od A/D převodníku

	AD1CON1bits.ADON = 1;
// </nastavení A/D>

Při přerušení od ADC1 si pak vyberu data v konkrétním AD1BUFxx

Převod se spouští

void ADC_start (unsigned char Kanal) { unsigned char t; AD1CHSbits.CH0SB = Kanal; //Nastavení kanálu AD1CHSbits.CH0SA = Kanal; AD1CON1bits.SAMP = 1; //Spustit vzorkování for (t=0;t<14;t++); //Počkat na přepnutí AD1CON1bits.SAMP = 0; //Spustit převod }

Dík za info, to se hodí.

Nicméně teď řeším jiný problém, a to se serial portem - a myslím, že zrovna ty bys mohl vědět. Jde o to, že mám framing error při vysílání (viz obrázek) a už nevím co s tím, nic mě nenapadá - zkoušel jsem všechna možná nastavení portu včetně BRGH=1 atd, a chyba se pořád drží. Díval jsem se i do errata sheetu, povídání okolo serial portu je tam “velmi veselé”, nicméně o tomto problému jsem tam nenašel zmínku - nesetkal ses s tím někdy, nevíš co s tím?

Je mi jasný že ten analyzér komunikace není kdovíco, ale tady prostě “něco chybí” už na první pohled…

Brouk je pořád 24FJ64GA002, fosc = 16 MHz (FRC + PLL), komunikace je naprostá klasika (9600, 8N1, nejnižší bit znaku “jde první”)
serial-analyzer.png

S tím jsem nikdy neměl problém. Používám teda jen PIC24FJ64GA306, ale to je v podstatě to stejné.
Mám rozchozené 2 UARTy a přes přerušení po obou sypu data na 57600 Baud, 8N1… fosc 16 MHz - FRC + PLL

On se v podstatě nedá ani ten UART nastavit blbě aby nefungoval :slight_smile:

Tohle mám nastaveno já:

// < UART 2>
	U2MODE = 0b0010000000001000;	//High speed mode - RS485
	U2STA = 0b0010010000000000;	
	U2BRG = 34;						// 57600 Baud +-
	U2MODEbits.UARTEN = 1;			// Povolit UART
	U2STAbits.UTXEN = 1;			//Povolit odesílání

	IPC7bits.U2TXIP = 2;			//Priorita přerušení 2
	IPC7bits.U2RXIP = 2;			//Priorita přerušení 2
// </UART 2>

Co to máš za analyzátor?

No, to je právě ten problém, že to v podstatě blbě nastavit nejde, ale přesto to v mém případě blbě funguje. Myslel jsem jestli to nemá souvislost s něčím o čem třeba nevím, proto jsem se tě jako zkušenějšího s těmito typy radši zeptal. GA306 a podobné nové nedám, jedu jen typy co umí Pickit2 z Linuxu z konzole pomocí pk2cmd utility, a těch tedy popravdě moc není (protože Pickit 3 je useless sám o sobě a navíc k němu taková utilita ani není, zařízli to, a k tomu navíc “jako bonus” k PK3 ani pořádně nefunguje ta standalone programmer app pod Win, kterou jsem používal pod Windows ve virtuálu - nejedu totiž většinou to jejich obludné IDE, Kate je v Linuxu skvělý lightweight editor který mám už celkem v malíku a jsem v něm produktivnější, ovšem Microchip se na Linux zkrátka vykašlal, tedy kromě té jejich javové šílenosti, která nejde spustit jinak než s admin právy. V pasti ze všech stran).

No, asi si budu si muset nějak poradit, zkusím ještě změnit na nějaký jiný alternate pin a vyzkouším i ten druhý serial port, a jinak pak už nebudu vědět když to nepomůže. Jsem trochu zklamán, už se mi ten brouk začínal pomalu líbit, a v tom zas nějaká jejich obvyklá “microchipóza” (už jednou jsem měl prakticky stejný problém na osmibitovém PICu, tam však pomohlo zapnout BRGH bit, errata sheet o tom problému věděl).

Každopádně díky za ochotu, dám vědět když na něco přijdu, když už jsem vás s tím teda “otravoval” (doufám, že ne moc…)