We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
Long Integer Multiple Error. Sample Program: Target Setting: MCU is C8051F120F, Use On-chip Arithmetic Accelerator.
Source:
#include <C8051F120.H> #include <stdio.h> unsigned long Freq; void DetectFreq() { unsigned long N; unsigned char M; SFRPAGE = CONFIG_PAGE; M= PLL0MUL; switch (CLKSEL&0x03) { case 00: //Internal XTAL case 03: Freq=25690112;//24.5L*1024L*1024L switch(OSCICN&0x03){ case 0x00: Freq/=8; break; case 0x01: Freq/=4; break; case 0x02: Freq/=2; break; } break; case 01: // External XTAL Freq=25L*1024L*1024L; switch (OSCXCN&0x70) { case 0x03: case 0x05: case 0x07: Freq=Freq/2; break; } break; case 02: //PLL if (PLL0CN&0x04) { // External XTAL Freq=26214400L; //25L*1024L*1024L N=Freq; Freq*=PLL0MUL; Freq/=PLL0DIV; switch (OSCXCN&0x70) { case 0x03: case 0x05: case 0x07: Freq=Freq/2; break; } } else{ //Freq=25690112L; Freq=24500000L;//25690112L; N=Freq; Freq*=PLL0MUL; //FreqMul(PLL0MUL); Freq/=PLL0DIV; switch(OSCICN&0x03){ case 0x00: Freq/=8; break; case 0x01: Freq/=4; break; case 0x02: Freq/=2; break; } } break; } SFRPAGE = LEGACY_PAGE; printf("%lu * %u = ", N, M); printf("%lu\n", Freq); Freq=25690112L; printf("%lu * %u = ", Freq, 4); Freq*=4; printf("%lu\n", Freq); } void InitSerial() { SFRPAGE =LEGACY_PAGE; SCON0 = 0x50; /* SCON: mode 1, 8-bit UART, enable rcvr */ TMOD |= 0x20; /* TMOD: timer 1, mode 2, 8-bit reload */ TH1 = 221; /* TH1: reload value for 1200 baud @ 16MHz */ TR1 = 1; /* TR1: timer 1 run */ TI0 = 1; /* TI: set TI to send first char of UART */ } // Peripheral specific initialization functions, // Called from the Init_Device() function void Reset_Sources_Init() { WDTCN = 0xDE; WDTCN = 0xAD; } void EMI_Init() { SFRPAGE = EMI0_PAGE; EMI0CF = 0x1F; //EMI0TC = 0x4F; EMI0TC = 0xCF; } void Port_IO_Init() { SFRPAGE = CONFIG_PAGE; P4MDOUT = 0xFF; P5MDOUT = 0xFF; P6MDOUT = 0xFF; P7MDOUT = 0xFF; XBR0 = 0x07; XBR1 = 0x94; XBR2 = 0x40; } void Oscillator_Init() { data int i = 0; SFRPAGE = CONFIG_PAGE; CCH0CN &= ~0x20; SFRPAGE = LEGACY_PAGE; FLSCL = 0xB0; SFRPAGE = CONFIG_PAGE; CCH0CN |= 0x20; PLL0CN |= 0x01; PLL0DIV = 0x01; PLL0FLT = 0x01; PLL0MUL = 0x04; for (i = 0; i < 15; i++); // Wait 5us for initialization PLL0CN |= 0x02; //while ((PLL0CN & 0x10) == 0); CLKSEL = 0x02; OSCICN = 0x83; } // Initialization function for device, // Call Init_Device() from your main program void Init_Device(void) { Reset_Sources_Init(); EMI_Init(); Port_IO_Init(); Oscillator_Init(); } void main() { Init_Device(); InitSerial(); printf ("Hello World\n"); /* Print "Hello World" */ DetectFreq(); printf("%lu", Freq); while(1); }
======================end of source========================= Run Result:
Hello World 24500000 * 1024 = 4294926936 25690112 * 1024 = 1568 1568
conclusion:
1.There are mistake of Long Integer Mutiple where open the on-chip arithmetic accelerator. 2.printf also make a mistake of Printing a one-byte-integer.
Think you. I modified my source :
printf("%lu * %bu = ", N, M); printf("%lu\n", Freq); Freq=25690112L; printf("%lu * %bu = ", Freq, 4); Freq*=4; printf("%lu\n", Freq);
It work correctly. but the Long Integer Multiple fault also.
Run Result: 24500000 * 4 = 4294926936 25690112 * 4 = 1568