Aiuto per codice in c un pulsante per una frequenz

13 Anni 2 Mesi fa #1 da Guido
Un caloroso grazie a Mauro Laurenti che non mi ha mai sbattuto la porta in faccia per le mie assidue domande.


Salve, ho pochissima esperienza nella programmazione dei Pic, ho scritto queto codice che dovrebbe al premare del pulsante far uscire una frequenza. MPLAB non mi seglala nessun errore di compilazione, putroppo non posso ancora provarlo mi dite se può funzionare, neglio se non va me lo correggete in modo che io possa imparare. Per cortesia commentatemi gli sbagli questo è oro per me.
Grazie.


#include <p18f4550.h>
#include <portb.h>
#include <delays.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 Disabilitato il Watchdog Timer
//LVT = OFF Disabilitato programmazione LVT
//PBADEN = OFF Disabilitato gli ingrassi analogici


void main ( void )

{

unsigned int i;



i; //variabile usata per creare un conteggio fittizio


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


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

//Imposto PORTC tutti ingressi ed RC1 come uscita
LATC = 0x00;
TRISC = 0b11111101;

// Imposto PORTD tutti ingressi
LATD = 0x00;
TRISD = 0xff;

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

EnablePullups (); //Abilito resistori di pullups



// Ciclo infinito
for (;;) {


if ( PORTAbits.RA0 ==0) { // Se il 1 pulsante è premuto
for ( i=0; i<25000; i++) { // pausa che filtra gli spike
}
Delay10TCYx(200);
LATCbits.LATC1 = 1;
Delay10TCYx(200);
LATCbits.LATC1 = 0;


}


else {
LATCbits.LATC1 = 0xF0;


} //Fine If

} //end for


} // end main

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

  • Guido
  • Platinum Member
  • Platinum Member
Di più
13 Anni 2 Mesi fa #2 da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: Aiuto per codice in c un pulsante per una frequenz
Ciao,

ho dato un'occhiata al codice, ma non conoscendo l'hardware non posso dire con certezza l'esattezza o meno dello stesso.

In ogni modo ho delle note:

1) Sembra che usi gli ingressi della PORTA. questi per poter essere usati, devono essere propriamente impostati come I/O, infatti di Default sono impostati come ingressi analogici. Non basta dunque il registro TRISA.

2) I resistori di pullup vengono abilitati sulla PORTB e non sulla PORTA, ma sembra che tu legga la PORTA e non la PORTB.

3) Il filtro per gli spike del pulsante non funziona correttamente. Quello che hai scritto e' solo una pausa, e dunque quello che seguira' verra' eseguito in ogni modo. Il filtro degli spike viene fatto leggendo il pulsante, se e' premuto si aspetta e si ricontrolla. Se il pulsante e' ancora premuto allora svolgi quello che deve essere associato alla pressione del pulsante. Ci sono anche altri metodi di filtraggio per mezzo di contatori ma credo che quello che ho spiegato sia il piu' semplice.

Saluti,

Mauro Laurenti

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

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • Moderator
  • Moderator
Di più
13 Anni 2 Mesi fa #3 da Guido
Purtroppo sono molto inesperto, mi serve che mi scriviate un semplice codice che mi aiuti a capire come scrivere (in futuro) i filtri per gli spike.
Per quanto riguarda l'abilitare le resistenze all'interno del Pic, ho intenzione di mettere una ventina di pulsanti, quindi per più porte, queste resistenze sono solo per PORTB?
Grazie.

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

  • Guido
  • Platinum Member
  • Platinum Member
Di più
13 Anni 2 Mesi fa #4 da Gianni
Quando hai la necessità di collegare un elevato numero di pulsanti, generalmente si ricorre al collegamento a matrice. Con 8 I/O, ad esempio, puoi gestire fino a 16 pulsanti. 4 I/O vengono usati per le righe e 4 per le colonne, quindi il pullup ti serve solo per 4 I/O in questo caso. Gestirli a matrice è sicuramente più laborioso in termini di codice ma bisogna abituarsi a ragionare in questo senso. Mi è difatti capitata ultimamente la necessità di dover collegare ben 64 pulsanti... Quando hai un numero cosi elevato come fai ? La soluzione è quella di usare una matrice 8x8 magari da gestire tramite un I/O expander o tramite un altro pic che comunica col principale in vari modi.

Sono tutti bravi ad essere "open" con il "source" degli altri.
Un amico è colui che ti dice sempre quando stai sbagliando. Il mio miglior amico è il parser.
SettoreZero

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

  • Gianni
  • Avatar di Gianni
  • Elite Member
  • Elite Member
Di più
13 Anni 2 Mesi fa #5 da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: Aiuto per codice in c un pulsante per una frequenz
Ciao Guido,

a pagina 120-121 del testo C18 Step by Step trovi degli esempi di lettura dei pulsanti con relativo filtro.

Ti consiglio però di leggere l'intero testo che precede.

Procedi per piccoli passi, altrimenti incontrerai sempre problemi più grossi di quanto non siano in realtà e potrai desistere nel progetto.

Saluti,

Mauro Laurenti

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

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • 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