Aiuto programma
12 Anni 6 Mesi fa #1
da Lazzaretti 74
Aiuto programma è stato creato da Lazzaretti 74
Ciao a tutti,ho sviluppato questo semplice programma per una apparechiatura che mi conta,attraverso un misuratore,i litri passati.
Io imposto i litri ,premo il pulsante di start e una volta che sono passati i litri impostati il relè che mi apre il flusso si chiude.
Problema :
Il misuratore funziona con un contatto che si chiude al passaggio di ogni litro e rimane chiuso quando il relè blocca il flusso per il raggiungimento del set impostato creandomi così una lettura in negativo...-1,-2,-3 ecc.
Ho provato a crivere nel programma che quando i litri impostati sono =0 il conteggio anche se l'ingresso rimane chiuso,deve finire ma non trovo il metodo.....
Mi date una mano...Grazie infinite!
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;
//************************************************************
// 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;
}
// Controllo la pressione di RB5
if (PORTBbits.RB5 == 0) {
// Aumento i litri
litri_impostati++;
}
// Controllo la pressione di RB6
if (PORTBbits.RB6 == 0) {
// Diminuisco i litri
litri_impostati--;
}
if (litri_impostati == 0){
litri_impostati=0x00;
}
// Controllo la pressione di RB7
if (PORTBbits.RB7 == 0) {
LATCbits.LATC0 = 0x01 ; //Accendo il relè
}
if (litri_impostati == 0){
LATCbits.LATC0 = 0x00 ;
}
// LATCbits.LATC0 = 1;
// Pilotaggio relè....
// } else {
// LATCbits.LATC0 = 0;
// }
OpenLCD(20);
BacklightLCD (TURN_ON);
WriteStringLCD ("Litri impos.:");
ShiftCursorLCD(RIGHT,1);
WriteIntLCD(litri_impostati,2);
// Seconda linea LCD non usata
// Line2LCD();
// WriteStringLCD ("Litri cont. :");
// ShiftCursorLCD(RIGHT,1);
// WriteIntLCD(litri_conteggiati,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){
}
}
Io imposto i litri ,premo il pulsante di start e una volta che sono passati i litri impostati il relè che mi apre il flusso si chiude.
Problema :
Il misuratore funziona con un contatto che si chiude al passaggio di ogni litro e rimane chiuso quando il relè blocca il flusso per il raggiungimento del set impostato creandomi così una lettura in negativo...-1,-2,-3 ecc.
Ho provato a crivere nel programma che quando i litri impostati sono =0 il conteggio anche se l'ingresso rimane chiuso,deve finire ma non trovo il metodo.....
Mi date una mano...Grazie infinite!
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;
//************************************************************
// 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;
}
// Controllo la pressione di RB5
if (PORTBbits.RB5 == 0) {
// Aumento i litri
litri_impostati++;
}
// Controllo la pressione di RB6
if (PORTBbits.RB6 == 0) {
// Diminuisco i litri
litri_impostati--;
}
if (litri_impostati == 0){
litri_impostati=0x00;
}
// Controllo la pressione di RB7
if (PORTBbits.RB7 == 0) {
LATCbits.LATC0 = 0x01 ; //Accendo il relè
}
if (litri_impostati == 0){
LATCbits.LATC0 = 0x00 ;
}
// LATCbits.LATC0 = 1;
// Pilotaggio relè....
// } else {
// LATCbits.LATC0 = 0;
// }
OpenLCD(20);
BacklightLCD (TURN_ON);
WriteStringLCD ("Litri impos.:");
ShiftCursorLCD(RIGHT,1);
WriteIntLCD(litri_impostati,2);
// Seconda linea LCD non usata
// Line2LCD();
// WriteStringLCD ("Litri cont. :");
// ShiftCursorLCD(RIGHT,1);
// WriteIntLCD(litri_conteggiati,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
- Autore della discussione
- Visitatori
12 Anni 5 Mesi fa - 12 Anni 5 Mesi fa #2
da Lazzaretti 74
Risposta da Lazzaretti 74 al topic Re: Aiuto programma
Nessuno che ha qualche idea?
Grazie.
Grazie.
Ultima Modifica 12 Anni 5 Mesi fa da Lazzaretti 74.
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Lazzaretti 74
- Autore della discussione
- Visitatori
12 Anni 5 Mesi fa #3
da bading
http:\www.d2l.it
Risposta da bading al topic Re: Aiuto programma
Ciao Luca.
Non mi è ben chiaro il funzionamento di questo contalitri e qual'è il tuo problema.
Imposti i litri, dai lo start, ecciti relay e incominci a contare i litri fino al valore impostato.
Non capisco questi numeri negativi.
Magari estrapola dal codice esclusivamente la parte che vorresti cambiare o che non funziona.
Ciao,
Dario
Non mi è ben chiaro il funzionamento di questo contalitri e qual'è il tuo problema.
Imposti i litri, dai lo start, ecciti relay e incominci a contare i litri fino al valore impostato.
Non capisco questi numeri negativi.
Magari estrapola dal codice esclusivamente la parte che vorresti cambiare o che non funziona.
Ciao,
Dario
http:\www.d2l.it
Si prega Accedi o Crea un account a partecipare alla conversazione.
- bading
- Elite Member
Riduci
Di più
12 Anni 5 Mesi fa #4
da Lazzaretti 74
Risposta da Lazzaretti 74 al topic Re: Aiuto programma
Ciao Dario,
il problema sta nel fatto che quando i litri letti raggiungono i litri impostati,il contatore rimane eccitato(nc)e questo mi crea confusione nel programma al punto che i litri da impostare vanno in negativo......avevo pensato di dire al programma di non leggere l'ingresso RB6 fino a quando il relè di apertutra valvola non risulti eccitato(tramite il pulsante di start) e quindi il misuratore si sblocchi per iniziare a leggere i litri passati,solo che non so come fare....
Grazie.
Luca
/ Controllo la pressione di RB4
if (PORTBbits.RB4 == 0) {
// Azzero i litri
litri_impostati=0x00;
}
// Controllo la pressione di RB5
if (PORTBbits.RB5 == 0) {
// Aumento i litri
litri_impostati++;
}
// Controllo la pressione di RB6
if (PORTBbits.RB6 == 0) {
// Diminuisco i litri
litri_impostati--;
}
if (litri_impostati == 0){
litri_impostati=0x00;
}
// Controllo la pressione di RB7
if (PORTBbits.RB7 == 0) {
LATCbits.LATC0 = 0x01 ; //Accendo il relè
}
if (litri_impostati == 0){
LATCbits.LATC0 = 0x00 ;
}
// LATCbits.LATC0 = 1;
// Pilotaggio relè....
// } else {
// LATCbits.LATC0 = 0;
// }
il problema sta nel fatto che quando i litri letti raggiungono i litri impostati,il contatore rimane eccitato(nc)e questo mi crea confusione nel programma al punto che i litri da impostare vanno in negativo......avevo pensato di dire al programma di non leggere l'ingresso RB6 fino a quando il relè di apertutra valvola non risulti eccitato(tramite il pulsante di start) e quindi il misuratore si sblocchi per iniziare a leggere i litri passati,solo che non so come fare....
Grazie.
Luca
/ Controllo la pressione di RB4
if (PORTBbits.RB4 == 0) {
// Azzero i litri
litri_impostati=0x00;
}
// Controllo la pressione di RB5
if (PORTBbits.RB5 == 0) {
// Aumento i litri
litri_impostati++;
}
// Controllo la pressione di RB6
if (PORTBbits.RB6 == 0) {
// Diminuisco i litri
litri_impostati--;
}
if (litri_impostati == 0){
litri_impostati=0x00;
}
// Controllo la pressione di RB7
if (PORTBbits.RB7 == 0) {
LATCbits.LATC0 = 0x01 ; //Accendo il relè
}
if (litri_impostati == 0){
LATCbits.LATC0 = 0x00 ;
}
// LATCbits.LATC0 = 1;
// Pilotaggio relè....
// } else {
// LATCbits.LATC0 = 0;
// }
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Lazzaretti 74
- Autore della discussione
- Visitatori
12 Anni 5 Mesi fa #5
da Pinna
Chi vola vale, chi vale vola, chi non vola è un vile
Risposta da Pinna al topic Re: Aiuto programma
Ciao, se ho ben capito tu imposti i litri, supponiamo 10, dai lo start, il relè si eccita ed inizia a contarli a ritroso, da 10 a 0, ma poichè continua a restare eccitato prosegue il conteggio in negativo. Se è così, (da provare), potresti inserire un ciclo for che, al contrario, contando da zero al numero dei litri impostati, ti ecciti il relè fino al termine del ciclo stesso. In questo modo non dovresti avere numeri negativi ma, ti ripeto, è tutto da sperimentare...
Chi vola vale, chi vale vola, chi non vola è un vile
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Pinna
- Moderator
Riduci
Di più
- Messaggi: 1010
- Ringraziamenti ricevuti 107
Moderatori: Mauro Laurenti, Pinna, StefA, Matteo Garia
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.