Aiuto programma

12 Anni 5 Mesi fa #11 da bading
Risposta da bading al topic Re: Aiuto programma

Rendering Error in layout Message/Item: array_keys(): Argument #1 ($array) must be of type array, null given. Please enable debug mode for more information.

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • bading
  • Avatar di bading
  • Elite Member
  • Elite Member
Di più
12 Anni 5 Mesi fa #12 da Lazzaretti 74
Risposta da Lazzaretti 74 al topic Re: Aiuto programma
Ciao Dario,
ho provato ad apportare le modifiche che mi hai scritto ma mi continua a dare errore di sintassi....
Secondo me è questa parte che non gli piace....

// Controllo la pressione di RB6
if (PORTBbits.RB6 == 0 & conteggio=ON) {
litri_impostati--; // Diminuisco i litri
i++; // conto i litri
}
Comunque ti mando tutto il programma completo...
io non ne vado a capo.... :(
Grazie.
Luca


#include <p18f4550.h>
#include <portb.h>
#include "delay.h"
#define LCD_DEFAULT
#include "LCD_44780.h"


#pragma config FOSC = HS
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config PBADEN = OFF

//OSC = HS Impostato per lavorare ad alta frequenza
//WDT = OFF Disabilito il watchdog timer
//LVP = OFF Disabilito programmazione LVP
//PBADEN = OFF Disabilito gli ingressi analogici

unsigned int litri_impostati = 0;
unsigned int litri_conteggiati = 0;
unsigned char i = 0;
unsigned char conteggio=OFF;
#define ON 1
#define OFF 0

//************************************************************
// Dichiarazione Prototipi di funzione
//************************************************************

// Prototipo di funzione per bassa priorita'
void Low_Int_Event (void);

// Prototipo di funzione per alta priorita'
void High_Int_Event (void);


//************************************************************
// Impostazione e Gestione priorita' alta
//************************************************************

#pragma code high_vector = 0x08

void high_interrupt (void) {

// Salto per la gestione dell'interrupt ad alta priorita'
_asm GOTO High_Int_Event _endasm
}

#pragma code

#pragma interrupt High_Int_Event

// Funzione per la gestione dell'interruzione ad alta priorita'
void High_Int_Event (void) {


// Controllo che l'interrupt sia stato generato da PORTB
if (INTCONbits.RBIF == 1 ) {

delay_ms(100);

// Controllo la pressione di RB4
if (PORTBbits.RB4 == 0) {
// Azzero i litri
litri_impostati=0x00;
}

if (PORTBbits.RB4 == 0) {
// Azzero i litri
i=0;
}

// Controllo la pressione di RB5
if (PORTBbits.RB5 == 0) {
// Aumento i litri
litri_impostati++;
}



// Controllo la pressione di RB6
if (PORTBbits.RB6 == 0 & conteggio=ON) {
litri_impostati--; // Diminuisco i litri
i++; // conto i litri
}





// Controllo la pressione di RB7if (PORTBbits.RB7 == 0)
{
LATCbits.LATC0 = 0x01 ; //Accendo il relè

conteggio=ON ;
}

if ( LATCbits.LATC0 == 0x00){
i=0; //Fino a quando il relè è spento tengo a 0 il conteggio
}


if ( i == litri_impostati )
{
LATCbits.LATC0 = 0x00 ; //Spengo il relè

conteggio=OFF ;
}







OpenLCD(20);
BacklightLCD (TURN_ON);
WriteStringLCD ("Litri impos.:");
ShiftCursorLCD(RIGHT,1);
WriteIntLCD(litri_impostati,2);

Line2LCD();
WriteStringLCD ("i :"); //Visualizzo il conteggio del contalitri collegato all'ingresso RB6
ShiftCursorLCD(RIGHT,1);
WriteIntLCD(i,2);

// Resetto il flag d'interrupt per permettere nuove interruzioni
INTCONbits.RBIF = 0;

}
}

//************************************************************
// Impostazione e Gestione priorita' bassa
//************************************************************

#pragma code low_vector = 0x18

void low_interrupt (void) {

// Salto per la gestione dell'interrupt a bassa priorita'
_asm GOTO Low_Int_Event _endasm
}

#pragma code

#pragma interruptlow Low_Int_Event

// Funzione per la gestione dell'interruzione ad alta priorita'
void Low_Int_Event (void) {

// Controllo che l'interrupt sia stato generato da Timer0
if (INTCONbits.TMR0IF == 1 ) {

// UTILIZZABILE PER ALTRA FUNZIONE

// Resetto il flag d'interrupt per permettere nuove interruzioni
INTCONbits.TMR0IF = 0;
}
}

//************************************************************
// Inizio programma principale
//************************************************************

void main (void){

// Imposto PORTA tutti ingressi
LATA = 0x00;
TRISA = 0xFF;

// Imposto PORTB tutti ingressi
LATB = 0x00;
TRISB = 0xFF;


//Imposto PORTC tutti ingressi ad RC0 come uscita
PORTC = 0x00;
LATC = 0;
TRISC = 0b11111110;


// Imposto PORTD tutte uscite
LATD = 0x00;
TRISD = 0x00;

// Imposto PORTE tutti ingressi
LATE = 0x00;
TRISE = 0xFF;


//************************************************************
// Abilito i pulsanti per le interruzioni ad alta priorita'
//************************************************************

// Abilita i resistori di pull-up sulla PORTB
EnablePullups();

// Abilito le interruzioni su PORTB
INTCONbits.RBIE = 1;

// Abilito le interruzioni su PORTB come alta priorita'
INTCON2bits.RBIP = 1;

//************************************************************
// Abilito il Timer0 per funzionare a bassa priorita'
//************************************************************

// Modalita' a 16 bit
T0CONbits.T08BIT = 0;

// Clock interno
T0CONbits.T0CS = 0;

// Abilito Prescaler
T0CONbits.PSA = 0;

// Prescaler 32
T0CONbits.T0PS0 = 0;
T0CONbits.T0PS1 = 0;
T0CONbits.T0PS2 = 1;

// Abilito le interruzioni del Timer0
INTCONbits.TMR0IE = 1;

// Abilito le interruzioni del Timer0 come bassa priorita'
INTCON2bits.TMR0IP = 0;

// Abilito il Timer0
T0CONbits.TMR0ON = 1;


//************************************************************
// Abilito le interruzioni
//************************************************************

// Abilito modalita' interruzione a due livelli alta e bassa
RCONbits.IPEN = 1;

// Abilito gli interrupt ad alta priorita'
INTCONbits.GIEH = 1;

// Abilito gli interrupt a bassa priorita'
INTCONbits.GIEL = 1 ;

// Ciclo infinito
while (1){

}
}

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Lazzaretti 74
  • Visitatori
  • Visitatori
12 Anni 5 Mesi fa #13 da bading
Risposta da bading al topic Re: Aiuto programma

Rendering Error in layout Message/Item: array_keys(): Argument #1 ($array) must be of type array, null given. Please enable debug mode for more information.

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • bading
  • Avatar di bading
  • Elite Member
  • Elite Member
Di più
12 Anni 5 Mesi fa #14 da Lazzaretti 74
Risposta da Lazzaretti 74 al topic Re: Aiuto programma
Ho aggiustato il codice come hai detto,ma l'unico modo pechè il programma non mi dia errori di sintassi e quello riportato in seguito....scrivendo così mi conteggia due impulsi allo start(RB7) che in realtà non ci sono e che comunque non dovrebbe vedere perchè fisicamente ho tenuto il pulsante premuto(RB6) per essere sicuro che non ci siano rimbalzi strani.....IL programma lo testo con la Freedom II per essere sicuro che il difetto non dipenda dall'hardware.
AIUTOOOO.



#include <p18f4550.h>
#include <portb.h>
#include "delay.h"
#define LCD_DEFAULT
#include "LCD_44780.h"


#pragma config FOSC = HS
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config PBADEN = OFF

//OSC = HS Impostato per lavorare ad alta frequenza
//WDT = OFF Disabilito il watchdog timer
//LVP = OFF Disabilito programmazione LVP
//PBADEN = OFF Disabilito gli ingressi analogici

unsigned int litri_impostati = 0;
unsigned int litri_conteggiati = 0;
unsigned char i = 0;
unsigned char conteggio;
#define ON 1
#define OFF 0

//************************************************************
// Dichiarazione Prototipi di funzione
//************************************************************

// Prototipo di funzione per bassa priorita'
void Low_Int_Event (void);

// Prototipo di funzione per alta priorita'
void High_Int_Event (void);


//************************************************************
// Impostazione e Gestione priorita' alta
//************************************************************

#pragma code high_vector = 0x08

void high_interrupt (void) {

// Salto per la gestione dell'interrupt ad alta priorita'
_asm GOTO High_Int_Event _endasm
}

#pragma code

#pragma interrupt High_Int_Event

// Funzione per la gestione dell'interruzione ad alta priorita'
void High_Int_Event (void) {


// Controllo che l'interrupt sia stato generato da PORTB
if (INTCONbits.RBIF == 1 ) {

delay_ms(100);

// Controllo la pressione di RB4
if (PORTBbits.RB4 == 0) {
// Azzero i litri
litri_impostati=0x00;
}

if (PORTBbits.RB4 == 0) {
// Azzero i litri
i=0;
}

// Controllo la pressione di RB5
if (PORTBbits.RB5 == 0) {
// Aumento i litri
litri_impostati++;
}


// Controllo la pressione di RB7
if (PORTBbits.RB7 == 0) {

LATCbits.LATC0 = 0x01 ; //Accendo il relè

conteggio=ON ;
}


if ( LATCbits.LATC0 == 0x00 ){
i=0; //Fino a quando il relè è spento tengo a 0 il conteggio
}



// Controllo la pressione di RB6
if (PORTBbits.RB6 == 0 & conteggio == ON) {

i++;// conto i litri
litri_impostati-- ;// Diminuisco i litri
}






if ( litri_impostati == 0 )
{
LATCbits.LATC0 = 0x00 ; //Spengo il relè

conteggio=OFF ;
}







OpenLCD(20);
BacklightLCD (TURN_ON);
WriteStringLCD ("Litri impos.:");
ShiftCursorLCD(RIGHT,1);
WriteIntLCD(litri_impostati,2);

Line2LCD();
WriteStringLCD ("i :"); //Visualizzo il conteggio del contalitri collegato all'ingresso RB6
ShiftCursorLCD(RIGHT,1);
WriteIntLCD(i,2);

// Resetto il flag d'interrupt per permettere nuove interruzioni
INTCONbits.RBIF = 0;

}
}

//************************************************************
// Impostazione e Gestione priorita' bassa
//************************************************************

#pragma code low_vector = 0x18

void low_interrupt (void) {

// Salto per la gestione dell'interrupt a bassa priorita'
_asm GOTO Low_Int_Event _endasm
}

#pragma code

#pragma interruptlow Low_Int_Event

// Funzione per la gestione dell'interruzione ad alta priorita'
void Low_Int_Event (void) {

// Controllo che l'interrupt sia stato generato da Timer0
if (INTCONbits.TMR0IF == 1 ) {

// UTILIZZABILE PER ALTRA FUNZIONE

// Resetto il flag d'interrupt per permettere nuove interruzioni
INTCONbits.TMR0IF = 0;
}
}

//************************************************************
// Inizio programma principale
//************************************************************

void main (void){

// Imposto PORTA tutti ingressi
LATA = 0x00;
TRISA = 0xFF;

// Imposto PORTB tutti ingressi
LATB = 0x00;
TRISB = 0xFF;


//Imposto PORTC tutti ingressi ad RC0 come uscita
PORTC = 0x00;
LATC = 0;
TRISC = 0b11111110;


// Imposto PORTD tutte uscite
LATD = 0x00;
TRISD = 0x00;

// Imposto PORTE tutti ingressi
LATE = 0x00;
TRISE = 0xFF;


//************************************************************
// Abilito i pulsanti per le interruzioni ad alta priorita'
//************************************************************

// Abilita i resistori di pull-up sulla PORTB
EnablePullups();

// Abilito le interruzioni su PORTB
INTCONbits.RBIE = 1;

// Abilito le interruzioni su PORTB come alta priorita'
INTCON2bits.RBIP = 1;

//************************************************************
// Abilito il Timer0 per funzionare a bassa priorita'
//************************************************************

// Modalita' a 16 bit
T0CONbits.T08BIT = 0;

// Clock interno
T0CONbits.T0CS = 0;

// Abilito Prescaler
T0CONbits.PSA = 0;

// Prescaler 32
T0CONbits.T0PS0 = 0;
T0CONbits.T0PS1 = 0;
T0CONbits.T0PS2 = 1;

// Abilito le interruzioni del Timer0
INTCONbits.TMR0IE = 1;

// Abilito le interruzioni del Timer0 come bassa priorita'
INTCON2bits.TMR0IP = 0;

// Abilito il Timer0
T0CONbits.TMR0ON = 1;


//************************************************************
// Abilito le interruzioni
//************************************************************

// Abilito modalita' interruzione a due livelli alta e bassa
RCONbits.IPEN = 1;

// Abilito gli interrupt ad alta priorita'
INTCONbits.GIEH = 1;

// Abilito gli interrupt a bassa priorita'
INTCONbits.GIEL = 1 ;

// Ciclo infinito
while (1){

}
}

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Lazzaretti 74
  • Visitatori
  • Visitatori
12 Anni 5 Mesi fa #15 da Pinna
Risposta da Pinna al topic Re: Aiuto programma
Ciao, riprendo questa per un attimo:


// Controllo la pressione di RB6
if (PORTBbits.RB6 == 0 & conteggio==ON) {
litri_impostati--; // Diminuisco i litri
i++; // conto i litri
}

L'errore di sintassi che ti evidenzia il compilatore avviene perchè hai messo un solo operatore "&". Così facendo non stai facendo una verifica di due condizioni ma un AND su bit. Devi metterne due affinchè tu possa verificare il risultato della tua condizione If:


// Controllo la pressione di RB6
if (PORTBbits.RB6 == 0 && conteggio==ON) {
litri_impostati--; // Diminuisco i litri
i++; // conto i litri
}


Così dovrebbe andare, in ogni caso questo è un estratto della famosa bibbia del linguaggio C, ovvero il TricKy, che trovi gratuitamente in rete:


"Gli operatori logici normalmente usati per collegare i risultati di due o più confronti sono due: si tratta del prodotto logico ("&&", o and) e della somma logica ("||", o or).

(a < b && c == d) // AND: vera se entrambe sono VERE
(a < b || c == d) // OR: vera se ALMENO UNA e' VERA" (pag.70-71)

Chi vola vale, chi vale vola, chi non vola è un vile

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Pinna
  • Avatar di Pinna
  • Moderator
  • Moderator
Di più
Moderatori: Mauro LaurentiPinnaStefAMatteo Garia

Registrati al sito

Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.

Registrati al sito LaurTec.

Login