Aiuto programma
12 Anni 5 Mesi fa #16
da bading
http:\www.d2l.it
Risposta da bading al topic Re: Aiuto programma
Grazie Pinna......si vede che sono un novello........
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 #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){
}
}
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
- Autore della discussione
- 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
- Autore della discussione
- Visitatori
12 Anni 5 Mesi fa - 12 Anni 5 Mesi fa #19
da Pinna
Chi vola vale, chi vale vola, chi non vola è un vile
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.
// 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
- Moderator
Riduci
Di più
- Messaggi: 1010
- Ringraziamenti ricevuti 107
12 Anni 5 Mesi fa - 12 Anni 5 Mesi fa #20
da bading
http:\www.d2l.it
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!
Purtoppo è tutto senza formattazione perchè ho fatto copia ed incolla.
Facci sapere!
http:\www.d2l.it
Ultima Modifica 12 Anni 5 Mesi fa da bading.
Si prega Accedi o Crea un account a partecipare alla conversazione.
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.