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);
}
}
//----------------------