Jag sitter och försöker skriva kod för att öppna en UART och där man lätt
kan ställa in baudrate osv med hjälp av defines.
Jag skulle vilja kunna definiera upp att jag vill t.ex köra med baudrate 9600 och därefter räknar pre-processorn ut värdet för t.ex BRG registret i min PIC.
Det jag skrivit hittills är:
Kod: Markera allt
#define CLOCK_SPEED 7370000 //7.37Mhz internal RC oscillator
#define BAUD_RATE 9600
#define UART_NR 1//1 or 2 depending on UART
//#define UART_BUFF_INT 1 // enables buffert interrupt
///------------------------------------------
#define BRG_1 (CLOCK_SPEED/BAUD_RATE/16) - 1 // upper, 14.02 = (int)14
#define BRG_2 (CLOCK_SPEED/BAUD_RATE/16) // lower, 13.99 = int(13)
#define TEST_1 CLOCK_SPEED/(16*(BRG_1)+16) // test calculation using BRG_1 value
#define TEST_2 CLOCK_SPEED/(16*(BRG_2) +16) // test calculation of baudrate using BRG_2 value
#if TEST_1 > BAUD_RATE
#if (TEST_1- BAUD_RATE) < 20
#define BRG BRG_1
#endif
#else
#if (BAUD_RATE - TEST_1) < 20
#define BRG (int)BRG_1
#endif
#endif
#if TEST_2 > BAUD_RATE
#if (TEST_2- BAUD_RATE) < 20
#define BRG BRG_2
#endif
#else
#if (BAUD_RATE - TEST_2) < 20
#define BRG BRG_2
#endif
#endif
#ifndef BRG
#error "BRG is not properly calculated"
#endif
Det jag vill göra med ovanstående kod är att beräkna ett värdet (BRG) därefter kontrollea att det uträknade värdet ligger inom vissa gränser, annars skall ett felmeddelande dyka upp vid kompileringen.
Problemet som uppstår är att när jag kontrollräknar så verkar det som att uträkningen av BRG_1 och BRG_2 är flyttal vilket gör att min kontroll-uträkning inte stämmer.
Om jag kör en cast på BRG_1 och 2 så får jag felmeddelanden vid kompileringen.
T.ex om jag skulle skriva:
Kod: Markera allt
#define BRG_1 (int)(CLOCK_SPEED/BAUD_RATE/16) - 1 // upper, 14.02 = (int)14
#define BRG_2 (int)(CLOCK_SPEED/BAUD_RATE/16)
Kod: Markera allt
#define TEST_1 CLOCK_SPEED/(16*(int)(BRG_1)+16)
#define TEST_2 CLOCK_SPEED/(16*(int)(BRG_2) +16)
Kod: Markera allt
pic30-coff-cc1.exe: warning: Options have been disabled due to expired license
printf.c:16:5: error: missing binary operator before token "("
printf.c:21:19: error: missing binary operator before token "("
printf.c:27:5: error: missing binary operator before token "("
printf.c:32:19: error: missing binary operator before token "("
printf.c:39:3: error: #error "BRG is not properly calculated"
printf.c: In function 'vInitUart':
printf.c:63: error: 'BRG' undeclared (first use in this function)
printf.c:63: error: (Each undeclared identifier is reported only once
printf.c:63: error: for each function it appears in.)
Halting build on first failure as requested.
#if TEST_1 > BAUD_RATE
Har ni någon aning om vad detta felet beror på?
Jag känner själv att jag kanske inte är allt för grym på att skriva sådan här "pre-processor kod" och undrar även om ni vet någon bra sida där man kan läsa sig till lite olika tips och knep? T.ex finns det någon ABS funktion som kan anvnädas när man gör jämförelser osv så man slipper alla if satser?
// Daniel