Aiuto programma
12 Anni 5 Mesi fa #21
da Lazzaretti 74
Risposta da Lazzaretti 74 al topic Re: Aiuto programma
Grazie a tutti.....Bading,ho caricato il codice ma non vedo nessun miglioramento....i litri si scalano di 2 in due invece che di 1 ad impulso.
Prova a tener premuto il tasto collegato ad RB6(simuli il contaimpulsi con contatto nc) e premere il pulsante di start RB7 e vedrai che la variabile( i )impazzisce.....
Luca
Prova a tener premuto il tasto collegato ad RB6(simuli il contaimpulsi con contatto nc) e premere il pulsante di start RB7 e vedrai che la variabile( i )impazzisce.....
Luca
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 #22
da bading
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.
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
- Elite Member
Riduci
Di più
12 Anni 5 Mesi fa #23
da Lazzaretti 74
Risposta da Lazzaretti 74 al topic Re: Aiuto programma
Finalmente....dopo tante serate passate a crivere e provare....tutto funziona!!!!
Ringrazio Pinna e Bading per i preziosi consigli.....
Tra qualche giorno pubblicherò le foto del progetto finito con relativo codice,sperando che possa essere utile anche ad altri....
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;
unsigned char mio_flag = 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
conteggio=OFF ;
}
// Controllo la pressione di RB5
if (PORTBbits.RB5 == 0) {
// Aumento i litri
litri_impostati++;
}
// Controllo la pressione di RB6
if (PORTBbits.RB6 == 1 && conteggio==ON) {
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
}
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){
}
}
Ringrazio Pinna e Bading per i preziosi consigli.....
Tra qualche giorno pubblicherò le foto del progetto finito con relativo codice,sperando che possa essere utile anche ad altri....
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;
unsigned char mio_flag = 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
conteggio=OFF ;
}
// Controllo la pressione di RB5
if (PORTBbits.RB5 == 0) {
// Aumento i litri
litri_impostati++;
}
// Controllo la pressione di RB6
if (PORTBbits.RB6 == 1 && conteggio==ON) {
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
}
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
- Autore della discussione
- Visitatori
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.
Login
© LaurTec 2006 - 2024