Hur tilldela värden till PIC-filregister i C?
- Jens Gunnarsson
- Inlägg: 17
- Blev medlem: 30 januari 2009, 09:40:07
- Ort: Solna
Hur tilldela värden till PIC-filregister i C?
Jag håller på att lära mig att programmera en PIC processor i C. Jag får kompieringsfel för följande som jag skriver utanför (innan) huvudalgoritmen main():
#pragma TRISC = 0; // Configure I/O, all available PORTC pins as outputs
men också för:
TRISC = 0; // Configure I/O, all available PORTC pins as outputs
I vanlig ordning ger kompilatorn inte riktigt den där ledtråden jag behöver. Kanske någon här kan det?
#pragma TRISC = 0; // Configure I/O, all available PORTC pins as outputs
men också för:
TRISC = 0; // Configure I/O, all available PORTC pins as outputs
I vanlig ordning ger kompilatorn inte riktigt den där ledtråden jag behöver. Kanske någon här kan det?
Re: Hur tilldela värden till PIC-filregister i C?
Just detta är helt kompilatorberoende.
Du får läsa på i kompilatorns dokumentation hur portar och register är definerade.
Detta pga att C-Standarden inte definerar nån form av hårdvara.
Du får läsa på i kompilatorns dokumentation hur portar och register är definerade.
Detta pga att C-Standarden inte definerar nån form av hårdvara.
Re: Hur tilldela värden till PIC-filregister i C?
> som jag skriver utanför (innan) huvudalgoritmen main():
Hur kan du skriva *kod* utanför main() ? Och varför ?
Ligger det i en funktionsdefinition ?
EDIT: Borde ligga under "Mikroprocessorer"...
Hur kan du skriva *kod* utanför main() ? Och varför ?
Ligger det i en funktionsdefinition ?
EDIT: Borde ligga under "Mikroprocessorer"...
Senast redigerad av sodjan 30 januari 2009, 12:08:54, redigerad totalt 1 gång.
Re: Hur tilldela värden till PIC-filregister i C?
All inititiering skall normalt ske i koden, dvs i main.
Du kan normalt sett inte göra detta utanför (undantag för config) som är nått helt annat.
så du skall skriva:
Du kan normalt sett inte göra detta utanför (undantag för config) som är nått helt annat.
så du skall skriva:
Kod: Markera allt
void main()
{
/* kod för initiering av alla register och portar */
while (1)
{
/* din program kod */
}
}Re: Hur tilldela värden till PIC-filregister i C?
Klistra in hela källkoden + kompilatorfelet i sin helhet.
Re: Hur tilldela värden till PIC-filregister i C?
#pragma är till specifika kompilerdirektiver och knappast något man använder som nybörjare.
Och precis som de andra skriver börjar koden exekveras i main och ingen annanstans.
Oftast ser main ut som följer:
Och precis som de andra skriver börjar koden exekveras i main och ingen annanstans.
Oftast ser main ut som följer:
Kod: Markera allt
void main(void)
{
// Här körs initiering osv, alltså grejer som bara ska köras vid uppstart och då en enda gång.
while(1)
{
// Här kör "huvudprogrammet" och det kör en evig loop
}
// Hit ska programmet aldrig komma, gör det så är det något allvarligt fel.
}
- Jens Gunnarsson
- Inlägg: 17
- Blev medlem: 30 januari 2009, 09:40:07
- Ort: Solna
Re: Hur tilldela värden till PIC-filregister i C?
Nu har jag flyttat initieringen i main. Låt oss fokusera på tilldelningen "ANSEL = 0" nedan:
Kompolatorn svarar
Att plocka bort #pragma och istället skriva:
ger följande kompileringsfel:
Kod: Markera allt
void main()
{
/* Introduktion */
#define ON 1
#define OFF 0
#define femtio PORTA.0
#define sextio PORTA.1
#define frekvens femtio,sextio
#define Hcount100Hz 0b00100111; // 0b0010011100010000=10000
#define Lcount100Hz 0b00010000;
#define Hcount120Hz 0b00100000; // 0b0010000010001101=8333
#define Lcount120Hz 0b10001101;
#pragma ANSEL = 0; // Clear ANSEL file registry
#pragma ANSEL.ANS2 1; // Configure AN2 as analog I/O
#pragma TRISA = 0b00000111; // Configure AN0, AN1 and AN2 as inputs, the rest as outputs.
// Bit TRISA<3> is a read only input pin, for MCLR (active low) input.
#pragma TRISB = 0x00; // Configure I/O, all available PORTB pins as outputs
#pragma TRISC = 0; // Configure I/O, all available PORTC pins as outputs
#pragma CCPR1H = 0; // Clear both Timer 1 holding registers
#pragma CCPR1L = 0;
#pragma TMR1L = 0; // Clear both Timer 1 holding registers
#pragma TMR1H = 0;
#pragma PIE1.CCP1IE = 1; // Enable CCP1 interrupt flag
#pragma PIR1.CCP1IF = 0; // Clear CCP1 interrupt flag
#pragma PIE2.OSFIE = 1; // Enable oscillator interrupt flag
#pragma OSCCON = 0b01100001; // Configure internal oscillator (HFINTOSC) to 4 MHz and to start oscillating.
#pragma T2CON = 0b00100001; // Set TMR2 prescaler 4, postscaler 5
#pragma ADCON0.ADFM = 0; // (ADFM=0) ADC "delay" look at ADRESH 8 most significant bits */
#pragma CCP1CON=0b00001011; // Configure CCP1CON to trigger a special event on TMR1=CCPR match
while(always){
if (Port A.0)
while (I1)
/* Operation XOR */
else
while (I2)
/* Operation XOR */
/* A/D conversion */
/* Delay */
}//while always
}//mainWarning[1] ~\synth5060Hz.c 18 : Unrecognized pragma directive 'ANSEL'
(The #pragma directive is not recognized and therefore ignored)
Att plocka bort #pragma och istället skriva:
Kod: Markera allt
void main()
{
/* Introduktion */
#define ON 1
#define OFF 0
#define femtio PORTA.0
#define sextio PORTA.1
#define frekvens femtio,sextio
#define Hcount100Hz 0b00100111; // 0b0010011100010000=10000
#define Lcount100Hz 0b00010000;
#define Hcount120Hz 0b00100000; // 0b0010000010001101=8333
#define Lcount120Hz 0b10001101;
ANSEL = 0; // Clear ANSEL file registry
ANSEL.ANS2=1; // Configure AN2 as analog I/O
TRISA = 0b00000111; // Configure AN0, AN1 and AN2 as inputs, the rest as outputs.
// Bit TRISA<3> is a read only input pin, for MCLR (active low) input.
TRISB = 0x00; // Configure I/O, all available PORTB pins as outputs
TRISC = 0; // Configure I/O, all available PORTC pins as outputs
CCPR1H = 0; // Clear both Timer 1 holding registers
CCPR1L = 0;
TMR1L = 0; // Clear both Timer 1 holding registers
TMR1H = 0;
PIE1.CCP1IE = 1; // Enable CCP1 interrupt flag
PIR1.CCP1IF = 0; // Clear CCP1 interrupt flag
PIE2.OSFIE = 1; // Enable oscillator interrupt flag
OSCCON = 0b01100001; // Configure internal oscillator (HFINTOSC) to 4 MHz and to start oscillating.
T2CON = 0b00100001; // Set TMR2 prescaler 4, postscaler 5
ADCON0.ADFM = 0; // (ADFM=0) ADC "delay" look at ADRESH 8 most significant bits */
CCP1CON=0b00001011; // Configure CCP1CON to trigger a special event on TMR1=CCPR match
while(always){
if (Port A.0)
while (I1)
/* Operation XOR */
else
while (I2)
/* Operation XOR */
/* A/D conversion */
/* Delay */
}//while always
}//mainger följande kompileringsfel:
Jag är fortsatt tacksam för alla tips.synth5060Hz.c:
ANSEL = 0; // Clear ANSEL file registry
ANSEL.ANS2=1; // Configure AN2 as analog I/O
^------
Error[1] C:\Program Files\PK2proj\Work\synth5060Hz.c 19 : Syntax error
(The expression must be corrected. The marker ^------ shows
the approximate position where CC5X gives up. The documentation
should be checked if the cause is not obvious)
Senast redigerad av Jens Gunnarsson 30 januari 2009, 13:42:17, redigerad totalt 3 gånger.
Re: Hur tilldela värden till PIC-filregister i C?
Du kan INTE använda pragma, varför i jösse namn gör du det????
Alla "Pragman" går utanför koden, först i filen, sedan kommer koden.
LÄS MANUALEN till kompilatorn, LÄS om C.
Det är inte konstigt alls att du får felmeddelanden.
Hur du sedan kommer åt register och portar beror helt och hållet på din kompilator, olika kompilatorer gör det på olika sätt.
RTFM
I MC18 använder du exempelvis följande för att sätta en portpinne som ingång:
TRISXbits.n=1; där X är porten och n pinnens nummer (0-7)
I en annan kompilator, WIZ-C skriver man istället så här:
bTRX.n=1; där ånyo X är porten och n är pinnen.
man kan också skriva:
MC18:
_asm
bsf TRISX,n
_endasm
eller
WIZ-C:
#asmline bsf TRISX,n
Som du ser finns det ingen gemensam standard alls för detta, utan det står i din dokumentation för kompilatorn.
Alla "Pragman" går utanför koden, först i filen, sedan kommer koden.
LÄS MANUALEN till kompilatorn, LÄS om C.
Kod: Markera allt
/* I mc18 gör man så här*/
#include "filen.h" /* de filinkluderingar man vill göra*/
#pragma /*specifika direktiv till preprocessorn till exempel:*/
#pragma NODEBUG
/* dina macron*/
#define BOOL unsigned char
/*lokala typedefar, doch bör typedefar ligga i .h-filen*/
/* lokala structar och liknande*/
/* sedan kommer alla dina variabel definitioner*/
char minvariabel;
/*eventuella funktionsdefinitioner, vilka iofs helst skall ligga i .h-filen*/
void myfunc(void);
void main()
{
TRISC=0x7; /*konfigurera pinne 0-2 som ingångar, resten utgångar*/
/*osv*/
Hur du sedan kommer åt register och portar beror helt och hållet på din kompilator, olika kompilatorer gör det på olika sätt.
RTFM
I MC18 använder du exempelvis följande för att sätta en portpinne som ingång:
TRISXbits.n=1; där X är porten och n pinnens nummer (0-7)
I en annan kompilator, WIZ-C skriver man istället så här:
bTRX.n=1; där ånyo X är porten och n är pinnen.
man kan också skriva:
MC18:
_asm
bsf TRISX,n
_endasm
eller
WIZ-C:
#asmline bsf TRISX,n
Som du ser finns det ingen gemensam standard alls för detta, utan det står i din dokumentation för kompilatorn.
Senast redigerad av TomasL 30 januari 2009, 13:43:33, redigerad totalt 1 gång.
Re: Hur tilldela värden till PIC-filregister i C?
Du kan helt skippa alla #pragma. Sedan får du vända dig till kompilatorns handbok om hur man sätter de olika registren. Det verkar ju gå bra så länge du inte sätter enstaka bitar som t.ex. "ANSEL.ANS2 = 1;".
Om provar kommentera ut alla såna där du använder punkt, kompilerar det igenom då?
Om provar kommentera ut alla såna där du använder punkt, kompilerar det igenom då?
Re: Hur tilldela värden till PIC-filregister i C?
> Jag håller på att lära mig att programmera en PIC processor i C.
Det ser mer ut som om du håller på att lära dig C...
Det bara *MÅSTE* finnas några enkla exempel i dokumentationen
för din C kompilator. Eller ett "tutorial" kapitel eller liknande...
Det ser mer ut som om du håller på att lära dig C...
Det bara *MÅSTE* finnas några enkla exempel i dokumentationen
för din C kompilator. Eller ett "tutorial" kapitel eller liknande...
Re: Hur tilldela värden till PIC-filregister i C?
Jens: LÄSER du ens de svar du har fått???
"Att bara skriva ANSEL = 0 (istället för #pragma ANSEL = 0) ger samma kompileringsfel."
Skitsnack!!! Kanske fortfarande fel med definitivt inte samma eller hur???
Har du inkluderat rätt definitionsfil för den PIC du har vald?
Tips: den kan heta t.ex. "P12C671.c" (MikroC) och kan inkluderas vid att skriva:
#include <P12C671.c>
Oftast har de dock ett namn som sluter med ".h" men då du ju inte vill uppge vilken kompiler, PIC osv du använder är det ju ganska svårt att komma längre på den väg.
"Att bara skriva ANSEL = 0 (istället för #pragma ANSEL = 0) ger samma kompileringsfel."
Skitsnack!!! Kanske fortfarande fel med definitivt inte samma eller hur???
Har du inkluderat rätt definitionsfil för den PIC du har vald?
Tips: den kan heta t.ex. "P12C671.c" (MikroC) och kan inkluderas vid att skriva:
#include <P12C671.c>
Oftast har de dock ett namn som sluter med ".h" men då du ju inte vill uppge vilken kompiler, PIC osv du använder är det ju ganska svårt att komma längre på den väg.
Re: Hur tilldela värden till PIC-filregister i C?
Lugna ner er. Han har ju ändrat sitt inlägg till något betydligt mer utförligt.
- Jens Gunnarsson
- Inlägg: 17
- Blev medlem: 30 januari 2009, 09:40:07
- Ort: Solna
Re: Hur tilldela värden till PIC-filregister i C?
Visst jag håller på att lära mig bäggedera, men hur svårt skall det vara att nollställa ett filregister?
