- Messaggi: 2
- Ringraziamenti ricevuti 0
Confusione col compilatore
10 Anni 7 Mesi fa #1
da enzocavallaro
Confusione col compilatore è stato creato da enzocavallaro
Ciao a tutti,
tvolevo chiedere una cosa circa il blink led:
Sto provando a far lampeggiare un led (il tuo progetto) però con un pic18F ma quando provo a compilare (PICC18 9.80) mi da errore sulle righe _asm e _endasm e non compila.
l’errore è:
main.c:100 warning: unknown pragma "code"
main.c:103: error: expression syntax
main.c:106: error: ";" expected
mettendo in rosso _asm e _endasm
Guardando sul manuale del compilatore ho visto che devo usare la sintassi:
#asm
goto interrupt_priorita_alta
#endasm
ma cosa ancora piu strana mi da errore su : goto interrupt_priorita_alta (Unable to resolve identifier goto interrupt_priorita_alta) ma ciò nonostante compila ma non rileva l’interrupt.
Allora sempre sul manuale del compilatore ho trovato la sintassi:
asm(“goto interrupt_priorita_alta”);
questa volta compila senza errori ma non rileva l’interrupt.
Cosa sto sbagliando?
Per favore mi potreste dare una mano
Grazie
Enzo
Questo è il codice
#define XTAL_FREQ 20MHZ
#include <p18f4620.h>
//__CONFIG (FOSC_HS & WDTE_OFF & PWRTE_ON & BOREN_OFF & LVP_OFF & CPD_ON & PWRTE_ON & DEBUG_OFF & CP_ON);
#pragma config OSC = HS
#pragma config WDT = OFF
#pragma config PWRT = ON
#pragma config BOREN = OFF
#pragma config LVP = OFF
#pragma config CPD = ON
#pragma config PWRT = ON
#pragma config DEBUG = OFF
//#pragma config CP0 = ON // Code protection not used
//#pragma config CP1 = ON // Code protection not used
//#pragma config CP2 = ON // Code protection not used
//#pragma config CP3 = ON // Code protection not used
//#pragma CPD = ON //Data EEPROM code-protected.
#define TEMPOLED 250
unsigned char TimerLed=0;
void settings(void)
{
PORTA=0;
TRISA=0b00100000;
PORTB=0;
TRISB=0b10000000; // RB7-RB4 pulsanti
PORTC=0;
TRISC=0b11100000; // RC7 e RC6 pin di ricetrasmissione seriale; RC5 per stato RDFI
PORTD=0;
TRISD=0b00000000;
PORTE=0;
TRISE=0b00000111;
nRBPU=0; // attivo le resistenze di pullup su porta B
// Impostazione del registro OPTION (pag.55 del datasheet)
T0CON=0b00000100;
// bit 0 -> Prescaler Rate Select bit 0
// bit 1 -> Prescaler Rate Select bit 0
// bit 2 -> Prescaler Rate Select bit 0 (1:32)
// bit 3 -> Prescaler assegnato al Timer0
// bit 4 -> Non importa
// bit 5 -> Clock per Timer0 derivato da ciclo di clock interno
// bit 6 -> Non importa
// bit 7 -> Resistenze di pull-up su porta B attivate
GIE=1; // gestione globale interrupt attiva
PEIE=1; // interrupt di periferica attivati
RCIE=1; // interrupt di ricezione su seriale attivato
TMR0IE=1;//Interrupt su Timer0 attivato
TMR0=100; // Imposto Timer0 a 100
CMCON = 7;
ADCON1 = 7;
}
void main(void) {
settings();
while (1) {
//DelayMs(500);
//LATB4 = ~LATB4;
}
} // main
void interrupt_priorita_alta(void);
#pragma code vettore_alta_priorita = 0x08
void ISRH(void)
{
_asm
goto interrupt_priorita_alta
_endasm
}
#pragma code
#pragma interrupt interrupt_priorita_alta
void interrupt_priorita_alta(void)
{
if (T0IF) // L'interrupt è stato causato da un overflow del timer0 ?
{
TMR0 = 100; // Reimposto Timer0
TimerLed++; // Incremento il Timer per il lampeggio del led
if (TimerLed >= TEMPOLED) // Se il tempo è passato
{
LATB4=LATB4^1; // Inverto lo stato del led per farlo lampeggiare
TimerLed=0; // Ricarico il timer del led per ricominciare daccapo
}
T0IF=0; // Resetto il flag interrupt su timer 0,
} // fine che interrupt verificatosi su timer0
}
Ps per far funzionare l'interrupt devo usare
void interrupt isr(void)
{
/* ... */
}
tvolevo chiedere una cosa circa il blink led:
Sto provando a far lampeggiare un led (il tuo progetto) però con un pic18F ma quando provo a compilare (PICC18 9.80) mi da errore sulle righe _asm e _endasm e non compila.
l’errore è:
main.c:100 warning: unknown pragma "code"
main.c:103: error: expression syntax
main.c:106: error: ";" expected
mettendo in rosso _asm e _endasm
Guardando sul manuale del compilatore ho visto che devo usare la sintassi:
#asm
goto interrupt_priorita_alta
#endasm
ma cosa ancora piu strana mi da errore su : goto interrupt_priorita_alta (Unable to resolve identifier goto interrupt_priorita_alta) ma ciò nonostante compila ma non rileva l’interrupt.
Allora sempre sul manuale del compilatore ho trovato la sintassi:
asm(“goto interrupt_priorita_alta”);
questa volta compila senza errori ma non rileva l’interrupt.
Cosa sto sbagliando?
Per favore mi potreste dare una mano
Grazie
Enzo
Questo è il codice
#define XTAL_FREQ 20MHZ
#include <p18f4620.h>
//__CONFIG (FOSC_HS & WDTE_OFF & PWRTE_ON & BOREN_OFF & LVP_OFF & CPD_ON & PWRTE_ON & DEBUG_OFF & CP_ON);
#pragma config OSC = HS
#pragma config WDT = OFF
#pragma config PWRT = ON
#pragma config BOREN = OFF
#pragma config LVP = OFF
#pragma config CPD = ON
#pragma config PWRT = ON
#pragma config DEBUG = OFF
//#pragma config CP0 = ON // Code protection not used
//#pragma config CP1 = ON // Code protection not used
//#pragma config CP2 = ON // Code protection not used
//#pragma config CP3 = ON // Code protection not used
//#pragma CPD = ON //Data EEPROM code-protected.
#define TEMPOLED 250
unsigned char TimerLed=0;
void settings(void)
{
PORTA=0;
TRISA=0b00100000;
PORTB=0;
TRISB=0b10000000; // RB7-RB4 pulsanti
PORTC=0;
TRISC=0b11100000; // RC7 e RC6 pin di ricetrasmissione seriale; RC5 per stato RDFI
PORTD=0;
TRISD=0b00000000;
PORTE=0;
TRISE=0b00000111;
nRBPU=0; // attivo le resistenze di pullup su porta B
// Impostazione del registro OPTION (pag.55 del datasheet)
T0CON=0b00000100;
// bit 0 -> Prescaler Rate Select bit 0
// bit 1 -> Prescaler Rate Select bit 0
// bit 2 -> Prescaler Rate Select bit 0 (1:32)
// bit 3 -> Prescaler assegnato al Timer0
// bit 4 -> Non importa
// bit 5 -> Clock per Timer0 derivato da ciclo di clock interno
// bit 6 -> Non importa
// bit 7 -> Resistenze di pull-up su porta B attivate
GIE=1; // gestione globale interrupt attiva
PEIE=1; // interrupt di periferica attivati
RCIE=1; // interrupt di ricezione su seriale attivato
TMR0IE=1;//Interrupt su Timer0 attivato
TMR0=100; // Imposto Timer0 a 100
CMCON = 7;
ADCON1 = 7;
}
void main(void) {
settings();
while (1) {
//DelayMs(500);
//LATB4 = ~LATB4;
}
} // main
void interrupt_priorita_alta(void);
#pragma code vettore_alta_priorita = 0x08
void ISRH(void)
{
_asm
goto interrupt_priorita_alta
_endasm
}
#pragma code
#pragma interrupt interrupt_priorita_alta
void interrupt_priorita_alta(void)
{
if (T0IF) // L'interrupt è stato causato da un overflow del timer0 ?
{
TMR0 = 100; // Reimposto Timer0
TimerLed++; // Incremento il Timer per il lampeggio del led
if (TimerLed >= TEMPOLED) // Se il tempo è passato
{
LATB4=LATB4^1; // Inverto lo stato del led per farlo lampeggiare
TimerLed=0; // Ricarico il timer del led per ricominciare daccapo
}
T0IF=0; // Resetto il flag interrupt su timer 0,
} // fine che interrupt verificatosi su timer0
}
Ps per far funzionare l'interrupt devo usare
void interrupt isr(void)
{
/* ... */
}
Si prega Accedi o Crea un account a partecipare alla conversazione.
- enzocavallaro
- Autore della discussione
- New Member
Riduci
Di più
10 Anni 7 Mesi fa #2
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Confusione col compilatore
Ciao Enzo,
credo tu abbia installato la versione del compilatore C associato al vecchio Hitech e non il compilatore C18.
Saluti,
Mauro
credo tu abbia installato la versione del compilatore C associato al vecchio Hitech e non il compilatore C18.
Saluti,
Mauro
Si prega Accedi o Crea un account a partecipare alla conversazione.
Moderatori: Mauro Laurenti, StefA, Matteo Garia
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.