Version:0.9 StartHTML:0000000105 EndHTML:0000082347 StartFragment:0000001499 EndFragment:0000082331
#define Version "01-05-2015"
//#define With_UART // enlever le commentaire pour avoir le resultat ADC sur la sortie UART
// rajout fonction unsigned long HexacarToLong( unsigned char *P)
// MikroC 6.50
// Test UART Hardware 19200bds at Q=8MHz
// Project '18F2550_test_ADC_Hardw_UART_Rx_IT.mcppi'
// Source : C:\_MikroC\_MesProjets_MikroC\_18F2550_StartUSB\18F2550_test_UART_IT_ADC.c
// hardware :
// platine StartUSB 18F2550 de MikroE
// RA0 analog input <- Potar 0 à 5V
// Led RA1
// UART sur RC6 -> Tx et RC7 Rx<--
//documents
//ac:StartUSB_schema
//ac:Datashette_18F2550
//
//ac:StartUSB_docu
#define PROCESSOR 18F2550
#define POWER_SUPPLY_5V
// NE PAS OUBLIER DE MODIFIER Projet Config FOSC
//#define FOSC_Interne_8MHz
//#define FOSC_Quartz_8MHz
//#define FOSC_Interne_1MHz
//#define FOSC 8.0 // MHz
#define BAUD 19200 // UART1
#define CLS 12
#define CR 13
#define LF 10
#define TAB 9
#define BACK 8
#define Separator 0x20 // space
/*
//avec FOSC interne 8MHZ
// voir P18F2550_Fosc_Interne_8MHz_19200bds.cfgsch
CONFIG1L : $300000 : 0x0021
CONFIG1H : $300001 : 0x0008
CONFIG2L : $300002 : 0x0019
CONFIG2H : $300003 : 0x001E
CONFIG3H : $300005 : 0x0083
CONFIG4L : $300006 : 0x0081
CONFIG5L : $300008 : 0x000F
CONFIG5H : $300009 : 0x00C0
CONFIG6L : $30000A : 0x000F
CONFIG6H : $30000B : 0x00E0
CONFIG7L : $30000C : 0x000F
CONFIG7H : $30000D : 0x0040
*/
sbit LED_Sup at LATA1_bit;
sbit LED_Inf at LATB1_bit;
unsigned char readbuff[128] absolute 0x500; // Buffers should be in USB RAM, please consult datasheet
unsigned char writebuff[128] absolute 0x580;
unsigned int i,j,k;
char error;
char TEXTE[64];
char * txt;
char CRam1[18];
const unsigned long Poids [8]={268435456,16777216,1048576,65536,4096,256,16,1}; // 4 294 967 296
unsigned char Receive[9]="0000FFFF";
unsigned long Result;
float ff1;
unsigned char Buffer1[64];
volatile int Flag_Buffer1;
volatile unsigned char c1;
volatile unsigned int i1;
volatile int Index1;
volatile unsigned int CptErr1;
volatile unsigned int Count1;
volatile int Flag_Timer1;
volatile unsigned int Count2;
volatile int Flag_Timer2;
unsigned char *p1;
void Interrupts() iv 0x0008 ics ICS_AUTO
{
if ( (RCIE_bit) && ( RCIF_bit))
{
// traitement separe des erreurs de COM
if (RCSTA.OERR==1) // voir parag 16.1.26 p273
{
RCSTA.CREN = 0 ;
c1 = RCREG;
RCSTA.CREN = 1 ;
CptErr1++;
}
if(RCSTA.FERR==1 )
{
RCSTA.SPEN = 0 ;
RCSTA.SPEN= 1 ;
CptErr1++;
c1 = RCREG;
}
c1 = RCREG;
if (c1==CR)
{
Flag_Buffer1=1;
//PIE1.RCIE=0 ; //interdit IT Reception UART
Buffer1[i1]=0;
Index1=i1;
i1=0;
c1=0;
}
else
{
Flag_Buffer1=0;
Buffer1[i1]=c1;
Index1=i1;
i1++;
}
}
// ------ timer 1 ----------------
if ( (TMR1IE_bit==1) && ( TMR1IF_bit==1))
{ // Test "Peripheral Interrupt Request Register 1" for Timer1 Flag
Count1++;
if (Count1>=8) // 8x125 ms= 1 seconde et init timer1 à 3035 et prescaler=1/8
{
Count1=0;
Flag_Timer1=1;
TMR1IE_bit=0;
}
TMR1H= 0x0B; // Hi (3035);
TMR1L= 0xDB; // Lo (3035);
PIR1.TMR1IF=0;
}
/*
// ------ timer 2 ----------------
if( ((TMR2IE_bit==1)&& TMR2IF_bit==1))
{ // Test "Peripheral Interrupt Request Register 1" for Timer1 Flag
Count2++;
if (Count2>=NbCycles_T2) // 8x125 ms= 1 seconde et init timer1 à 3035 et prescaler=1/8
{
Count2=0;
Flag_Timer2=1;
}
TMR2= 60;
PIR1.TMR2IF=0;
}
*/
}
void Init_Timer1(void)
{
T1CON=0;
T1CKPS1_bit=1; //prescal select=11 => 1/8
T1CKPS0_bit=1;
// T1GCON=0;
TMR1H= 0x0B; // Hi (3035);
TMR1L= 0xDB; // Lo (3035);
// TMR1H= NbCycles_T1>>8;
// TMR1L= NbCycles_T1 & 0x00FF;
Count1=0;
Flag_Timer1=0;
PIR1.TMR1IF=0; // Reset Timer1 Flag
PIE1.TMR1IE=0; //Enable interrupt TMR1
TMR1ON_bit=0;
}
void Init_Timer2(void)
{
T2CON=0;
TOUTPS0_bit=1; // postscaleer =1/16
TOUTPS1_bit=1;
TOUTPS2_bit=1;
TOUTPS3_bit=1;
T2CKPS1_bit=1; //prescaler select=11 => 1/64
T2CKPS0_bit=1;
TMR2= 60; // 49.92mS @ 16MHz
Count2=0;
Flag_Timer2=0;
TMR2IF_bit=0; // Reset Timer1 Flag
TMR2IE_bit=0; //Enable interrupt TMR1
TMR2ON_bit=0;
}
void Float2Ascii (float x, unsigned char *str,char precision)
{
/* converts a floating point number to an ascii string */
/* x is stored into str, which should be at least 30 chars long */
int ie, i, k, ndig;
double y;
ndig = ( precision<=0) ? 7 : (precision > 22 ? 23 : precision+1);
ie = 0;
/* if x negative, write minus and reverse */
if ( x < 0)
{
*str++ = '-';
x = -x;
}
/* put x in range 1 <= x < 10 */
if (x > 0.0) while (x < 1.0)
{
x *= 10.0; // a la place de =*
ie--;
}
while (x >= 10.0)
{
x = x/10.0;
ie++;
}
// in f format, number of digits is related to size
ndig += ie; // a la place de =+
//round. x is between 1 and 10 and ndig will be printed to
// right of decimal point so rounding is ...
for (y = i = 1; i < ndig; i++)
y = y/10.;
x += y/2.;
if (x >= 10.0) {x = 1.0; ie++;}
if (ie<0)
{
*str++ = '0'; *str++ = '.';
if (ndig < 0) ie = ie-ndig;
for (i = -1; i > ie; i--) *str++ = '0';
}
for (i=0; i < ndig; i++)
{
k = x;
*str++ = k + '0';
if (i == ie ) *str++ = '.';
x -= (y=k);
x *= 10.0;
}
*str = '\0';
}
void CRLF()
{
UART1_Write(CR);
UART1_Write(LF);
}
void UART1_Write_CText(const char *T)
{
while (*T)
UART1_Write(*T++);
}
unsigned long HexacarToLong( unsigned char *P)
{ unsigned char c;
int i,k ;
unsigned long L=0;
k=strlen(P);
if (k !=8)
{ UART1_Write_CText("\r\n Hexa sur 8 digits ! \r\n");
return(0);
}
for(i=7;i>=0;i--)
{
c= toupper(*(P+i));
// check if c belong to Hexadecimal car
if ((c>=65) && (c<=70))
c=( c-65)+10;
else
{
if ((c>=48) && (c<=57) )
{
c=c-48;
}
else
{
L=0;
UART1_Write_CText("\r\nError sur Hexa \r\n");
break;
}
}
L= L + (Poids[i]* (unsigned long) c);
}
return L;
}
void Raz_Buffer1()
{
Buffer1[0]=0;
c1=0;
i1=0;
Index1=0;
Flag_Buffer1 =0;
RCIF_bit=0;
RCIE_bit = 1;
}
void main()
{
// Configurer la fréquence 8MHZ pour 9600 bauds
OSCTUNE =0; //=> com OK at 19200
// OSCTUNE = 0b00001000; // => very bad com at 19200
//OSCCON = 0b01111110;
// System Clock Select bits
OSCCON.SCS1=1; //Internal oscillator
OSCCON.SCS0=0;
//IRCF2:IRCF0: Internal Oscillator Frequency Select bits = 111 8Mhz
OSCCON.IRCF2=1;
OSCCON.IRCF1=1;
OSCCON.IRCF0=1;
Delay_ms(200);
TRISA=0xFF;
TRISA1_bit=0; // output to led
TRISB=0xFF;
TRISB1_bit=0; // output to led
TRISC=0xFF; Delay_ms(200);
Delay_ms(200);
LED_Sup=0;
LED_Inf=0;
// Désactiver le comparateur sur RA0 à RA3
CMCON = 0x07; // Disable comparators
TEXTE[0]=0;
txt=&TEXTE[0];
Delay_ms(1000);
// UART1_Init(9600); // initialize UART1 HARDWARE module at 1Mhz
UART1_Init(19200); // initialize UART1 HARDWARE module
Delay_ms(100);
UART_Set_Active(&UART1_Read, &UART1_Write, &UART1_Data_Ready, &UART1_Tx_Idle); // set UART1 active
while (UART_Tx_Idle() == 0); UART1_Write(65);
while (UART1_Tx_Idle() == 0);UART1_Write(66);
while (UART1_Tx_Idle() == 0);UART1_Write(67);
while (UART1_Tx_Idle() == 0);UART1_Write(13);
while (UART1_Tx_Idle() == 0);UART1_Write(10);
UART1_Write_CText("initialisation Pointeur sur zone TEXTE\r\n");
Delay_ms(1000);
UART1_Write_CText("StartUSB 18F2550 Init UART HARDW 19200 with FOSC Interne 8MHZ\r\n");
//UART1_Write_CText("StartUSB 18F2550 Init UART HARDW 9600 with FOSC Interne 1MHZ\r\n");
//UART1_Write_CText("StartUSB 18F2550 Init UART HARDW 19200 with Q=8MHZ\r\n");
ADCON0 = 0x00;// select channel 0 (AN0)
ADCON1 = 0b00001110;//VSS,VDD ref. AN0 analog only
ADCON1.VCFG1=0; // VREF- = VSS=0V
ADCON1.VCFG0=0; // VREF+ = VDD=+5V
ADCON1.PCFG3=1;
ADCON1.PCFG2=1;
ADCON1.PCFG1=1;
ADCON1.PCFG0=0;
//ADCON2 setup: Right justified, Tacq=16Tad, Tad=2*Tosc (or Fosc/2)
ADCON2.ADFM=1; // right justified
ADCON2.ACQT2=1; // 110 => 12 Tad
ADCON2.ACQT1=0;
ADCON2.ACQT0=1;
ADCON2.ADCS2=1; // FOSC /64
ADCON2.ADCS2=0;
ADCON2.ADCS2=1;
ADCON0.ADON = 1;//Enable A/D module
Delay_ms(1);
Init_Timer1();
Raz_Buffer1();
RCIE_bit=1;
PEIE_bit=1;
GIE_bit=1;
while(1)
{
ADCON0.GO_DONE = 1;//Start A/D Conversion
while(ADCON0.GO_DONE != 0);//Loop here until A/D conversion completes
k = (ADRESH<<8) | ADRESL ;//Set the delay
ff1=(float)k * 5.00/1024.0;
// UART1_Write_CText("Results ");
Float2Ascii(ff1,CRam1,2);
sprintf(txt,"ADC Results k=% 5u Pts k=%04X soit %s Volts \r\n",k,k,CRam1);
UART1_Write_Text(txt);
if (k >522) LED_Sup=1; else LED_Sup=0;
if (k <502) LED_Inf=1; else LED_Inf=0;
if (Flag_Buffer1==1)
{
Result=HexacarToLong(&Buffer1[0]);
LongWordToStrWithZeros (Result,CRam1);
sprintf(txt,"Recu buffer1= %s, convertit en %s soit %lu ",Buffer1,CRam1,Result);
UART1_Write_Text(txt);
CRLF();
Raz_Buffer1();
}
Delay_ms(200);
}
}
/*
16:52:44.828> ABC
16:52:44.828> initialisation Pointeur sur zone TEXTE
16:52:45.828> StartUSB 18F2550 Init UART HARDW 19200 with FOSC Interne 8MHZ
16:52:48.453> ADC Results k= 15 Pts k=000F soit 0.07 Volts
16:52:50.140> ADC Results k= 211 Pts k=00D3 soit 1.03 Volts
16:52:50.578> ADC Results k= 287 Pts k=011F soit 1.40 Volts
16:52:51.328> ADC Results k= 496 Pts k=01F0 soit 2.42 Volts
16:52:51.515> ADC Results k= 568 Pts k=0238 soit 2.77 Volts
16:52:51.765> ADC Results k= 638 Pts k=027E soit 3.12 Volts
16:52:52.265> ADC Results k= 812 Pts k=032C soit 3.96 Volts
16:52:54.640> ADC Results k= 912 Pts k=0390 soit 4.45 Volts
16:52:56.765> ADC Results k= 703 Pts k=02BF soit 3.43 Volts
16:52:57.453> ADC Results k= 513 Pts k=0201 soit 2.50 Volts
16:52:57.953> ADC Results k= 375 Pts k=0177 soit 1.83 Volts
16:52:58.453> ADC Results k= 233 Pts k=00E9 soit 1.14 Volts
16:52:58.640> ADC Results k= 150 Pts k=0096 soit 0.73 Volts
16:52:58.890> ADC Results k= 85 Pts k=0055 soit 0.42 Volts
16:52:59.140> ADC Results k= 16 Pts k=0010 soit 0.08 Volts
16:53:30.578> Recu buffer1= 010000FF, convertit en 0016777471 soit 16777471
16:53:30.765> ADC Results k= 13 Pts k=000D soit 0.06 Volts
16:53:44.203> Recu buffer1= 000000F0, convertit en 0000000240 soit 240
16:53:44.390> ADC Results k= 12 Pts k=000C soit 0.06 Volts
****************
0 1 mikroCPIC1618.exe -MSF -DBG -pP18F2550 -RA -C -O00001114 -fo8 -N"C:\_MikroC\_MesProjets_MikroC\_18F2550_StartUSB\18F2550_test_ADC_Hardw_UART_Rx_IT.mcppi" -SP"C:\_MikroC\mikroC PRO for PIC\defs\" -SP"C:\_MikroC\mikroC PRO for PIC\uses\P18\" -SP"C:\_MikroC\_MesProjets_MikroC\_18F2550_StartUSB\" "18F2550_test_UART_IT_ADC.c" "__Lib_Math.mcl" "__Lib_MathDouble.mcl" "__Lib_System.mcl" "__Lib_Delays.mcl" "__Lib_CType.mcl" "__Lib_CString.mcl" "__Lib_CStdlib.mcl" "__Lib_Conversions.mcl" "__Lib_Sprintf.mcl" "__Lib_ADC_A_D.mcl" "__Lib_EEPROM_256.mcl" "__Lib_UART_c67.mcl"
0 1139 Available RAM: 2027 [bytes], Available ROM: 32768 [bytes]
0 122 Compilation Started P18F2550.c
1411 123 Compiled Successfully P18F2550.c
0 122 Compilation Started __Lib_Delays.c
172 123 Compiled Successfully __Lib_Delays.c
0 122 Compilation Started 18F2550_test_UART_IT_ADC.c
0 1004 interrupt handler (Interrupts at 0x0008) 18F2550_test_UART_IT_ADC.c
343 1509 Generated baud rate is 19231 bps (error = 0.16 percent) 18F2550_test_UART_IT_ADC.c
416 123 Compiled Successfully 18F2550_test_UART_IT_ADC.c
265 1164 Variable 'k' has been eliminated by optimizer 18F2550_test_UART_IT_ADC.c
0 127 All files Compiled in 47 ms
0 1144 Used RAM (bytes): 518 (26%) Free RAM (bytes): 1509 (74%) Used RAM (bytes): 518 (26%) Free RAM (bytes): 1509 (74%)
0 1144 Used ROM (bytes): 19643 (60%) Free ROM (bytes): 13125 (40%) Used ROM (bytes): 19643 (60%) Free ROM (bytes): 13125 (40%)
0 125 Project Linked Successfully 18F2550_test_ADC_Hardw_UART_Rx_IT.mcppi
0 128 Linked in 47 ms
0 129 Project '18F2550_test_ADC_Hardw_UART_Rx_IT.mcppi' completed: 203 ms
0 103 Finished successfully: 02 mai 2015, 19:10:36 18F2550_test_ADC_Hardw_UART_Rx_IT.mcppi
*/