Hur tilldela värden till PIC-filregister i C?

Elektronikrelaterade (på komponentnivå) frågor och funderingar.
Användarvisningsbild
Jens Gunnarsson
Inlägg: 17
Blev medlem: 30 januari 2009, 09:40:07
Ort: Solna

Hur tilldela värden till PIC-filregister i C?

Inlägg av Jens Gunnarsson »

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?
Användarvisningsbild
007sweden
Inlägg: 3500
Blev medlem: 3 mars 2005, 20:18:12
Skype: oo7sweden

Re: Hur tilldela värden till PIC-filregister i C?

Inlägg av 007sweden »

Vad säger den är fel? Alla includes rätt?
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 47688
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Hur tilldela värden till PIC-filregister i C?

Inlägg av TomasL »

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.
sodjan
EF Sponsor
Inlägg: 43288
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hur tilldela värden till PIC-filregister i C?

Inlägg av sodjan »

> 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"...
Senast redigerad av sodjan 30 januari 2009, 12:08:54, redigerad totalt 1 gång.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 47688
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Hur tilldela värden till PIC-filregister i C?

Inlägg av TomasL »

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:

Kod: Markera allt

void main()
{
  /* kod för initiering av alla register och portar */

   while (1)
    {
           /* din program kod */
    }
}
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Re: Hur tilldela värden till PIC-filregister i C?

Inlägg av speakman »

Klistra in hela källkoden + kompilatorfelet i sin helhet.
Användarvisningsbild
Icecap
Inlägg: 26781
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Hur tilldela värden till PIC-filregister i C?

Inlägg av Icecap »

#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:

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.
  }
Användarvisningsbild
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?

Inlägg av Jens Gunnarsson »

Nu har jag flyttat initieringen i main. Låt oss fokusera på tilldelningen "ANSEL = 0" nedan:

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
}//main
Kompolatorn svarar

Warning[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
}//main

ger följande kompileringsfel:
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)
Jag är fortsatt tacksam för alla tips.
Senast redigerad av Jens Gunnarsson 30 januari 2009, 13:42:17, redigerad totalt 3 gånger.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 47688
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Hur tilldela värden till PIC-filregister i C?

Inlägg av TomasL »

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.

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*/


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.
Senast redigerad av TomasL 30 januari 2009, 13:43:33, redigerad totalt 1 gång.
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Re: Hur tilldela värden till PIC-filregister i C?

Inlägg av speakman »

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å?
sodjan
EF Sponsor
Inlägg: 43288
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hur tilldela värden till PIC-filregister i C?

Inlägg av sodjan »

> 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...
Användarvisningsbild
Icecap
Inlägg: 26781
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Hur tilldela värden till PIC-filregister i C?

Inlägg av Icecap »

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.
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Re: Hur tilldela värden till PIC-filregister i C?

Inlägg av speakman »

Lugna ner er. Han har ju ändrat sitt inlägg till något betydligt mer utförligt.
Användarvisningsbild
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?

Inlägg av Jens Gunnarsson »

Visst jag håller på att lära mig bäggedera, men hur svårt skall det vara att nollställa ett filregister?
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 47688
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Hur tilldela värden till PIC-filregister i C?

Inlägg av TomasL »

Det skedde ju efter/undertiden vi svarade.
Skriv svar