Aiuto programma

12 Anni 5 Mesi fa #16 da bading
Risposta da bading al topic Re: Aiuto programma
Grazie Pinna......si vede che sono un novello........ :oops:


http:\www.d2l.it

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 #17 da Lazzaretti 74
Risposta da Lazzaretti 74 al topic Re: Aiuto programma
Grazie Pinna e grazie Dario....
ho modificato il codice come indicato....ma perchè quando do inizio al conteggio con RB7 e tengo premuto RB6(simulo che il contalitri risulti eccitato per un breve periodo iniziale),i litri scalano di 2 in 2litri? e non di 1 litro ad impulso?
Luca

Ps:Il manuale sono riuscito a trovarlo e devo stamparlo.....


#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 = 0;
#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) {
litri_impostati--; // Diminuisco i litri
i++; // conto i litri
}


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 #18 da Lazzaretti 74
Risposta da Lazzaretti 74 al topic Re: Aiuto programma
Nessun consiglio? Mi devo arrendere? :(

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

  • Lazzaretti 74
  • Visitatori
  • Visitatori
12 Anni 5 Mesi fa - 12 Anni 5 Mesi fa #19 da Pinna
Risposta da Pinna al topic Re: Aiuto programma
Ciao, non ti prometto niente, perchè in questo momento sto lavorando a qualcosa di mio, ma se avrò un pò di tempo, questo fine settimana, prendo la freedom II e provo il codice che hai allegato. Comunque, nel frattempo, metti un ulteriore delay in questa istruzione:


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

delay_(100);

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

conteggio=ON ;
}

Così facendo inserisci un ulteriore filtro antirimbalzo.


Poi fai questa prova: sostituisci conteggio ==ON con LATCbits.LATC0 = 0x01

// Controllo la pressione di RB6
if(PORTBbits.RB6 == 0 && LATCbits.LATC0 = 0x01 {
litri_impostati--; // Diminuisco i litri
i++; // conto i litri
}

La variabile conteggio non mi convince tanto, non vorrei che il suo valore ON, (che è 1), venga conteggiato nei calcoli



Infine, questa istruzione:

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

conteggio=OFF ;
}

non vorrei dire fesserie ma mi lascia perplesso. Tu, se ho ben capito, vorresti che i tuoi litri impostati, supponiamo 10 litri, diminuiscano fino a raggiungere zero. Viceversa, la tua variabile i, che parte da zero deve raggiungere 10 litri. Ora guarda questa tabella:

litri imp. variabile i
10
0
9
1
8
2
7
3
6
4
5
5

Qui mi fermo perchè è abbastanza evidente, stando a come è scritto il codice, cosa succederebbe quando si raggiunge la condizione i=litri impostati. Secondo me, il valore di partenza deve essere memorizzato a parte e la variabile i deve riferirsi a questo valore. Però ti ripeto, devo usare la freedom perchè solo così riuscirò (forse) a trovare la soluzione che cerchi.

Chi vola vale, chi vale vola, chi non vola è un vile
Ultima Modifica 12 Anni 5 Mesi fa da Pinna.

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

  • Pinna
  • Avatar di Pinna
  • Moderator
  • Moderator
Di più
12 Anni 5 Mesi fa - 12 Anni 5 Mesi fa #20 da bading
Risposta da bading al topic Re: Aiuto programma
Ho caricato il tutto in FREEDOM II, ho fatto un po di prove e corretto il codice che ora dovrebbe andare bene.

Purtoppo è tutto senza formattazione perchè ho fatto copia ed incolla.
Facci sapere!

File allegato:

Nome del file: main.txt
Dimensione del file:5 KB


http:\www.d2l.it
Allegati:
Ultima Modifica 12 Anni 5 Mesi fa da bading.

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

  • bading
  • Avatar di bading
  • Elite Member
  • Elite Member
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