home | area personale         schemi | tutorial | robotica | pic micro | recensioni         forum | chat irc         faq | contatti         store | Ordina PCB
username
password
cerca

 
FORUM: Pic Micro
Tutto quanto riguarda questi microprocessori... progetti, suggerimenti, aiuti, discussioni...ecc


PORTA analogica in PIC16F873A
     
Autore Messaggio opzioni
picmicro675




una ogni 10 livelli


postato il:
14.09.2018, alle ore 09:45
e.ferriani:
Forse sto sbagliando strada ad utilizzare parti di codice esistenti


Secondo un vecchio detto "la pianta si raddrizza, fintanto che è piccola".

Prendiamo il caso di questa routine di servizio interruzioni (ISR).
Ora si sta a vedere se i due ingressi vanno da bassi a alti. Se li hai configurati con le resistenze di pull-down. ALTRIMENTI hai già un difetto, oppure la verifica del programma è inversa.

Per questo fai girare main() vuoto e metti solo un segnale se i due flag cambiano di stato.

void main()
{
    Settaggi();
    INTCONbits.GIE = 1;
    while (1)
    {
        if (avvio_premuto)      // non si puo` riagganciare senza arresto_premuto
        {
            RC6 = 1;            // sondare se hai un risultato
            arresto_premuto = 0;
        }
        if (arresto_premuto)    // non si puo` riagganciare senza avvio_premuto
        {
            RC7 = 1;            // sondare se hai un risultato
            avvio_premuto = 0;
        }
    }
}

Avvenuto questo risultato, passiamo a un livello di interfaccia visiva con l' operatore. Mettiamo l' LCD.

void main()
{
    Settaggi();
    LCD_INIT();
    INTCONbits.GIE = 1;
    while (1)
    {
        // aggiornamento informazioni una volta al secondo, meglio non tartassare
        // il display frequentemente
        if (millisec >= 1000)
        {
            millisec = 0;
            LCD_CLEAR();
            if (avvio_premuto)      // non si puo` riagganciare senza arresto_premuto
            {
                lcd_gotoxy(1,1);
                lcd_puts("ingresso RC6 OK");
                arresto_premuto = 0;
            } else {                // altrimenti non visualizziamo
                lcd_gotoxy(1,1);
                lcd_puts("               ");
            }
            if (arresto_premuto)    // non si puo` riagganciare senza avvio_premuto
            {
                lcd_gotoxy(2,1);
                lcd_puts("ingresso RC7 OK");
                avvio_premuto = 0;
            } else {                // altrimenti non visualizziamo
                lcd_gotoxy(2,1);
                lcd_puts("               ");
            }
        }
    }
}


Verifica queste due fasi. Poi passiamo ad livello successivo
Caldo consiglio :
evitare l' uso dei (delay()). Meglio implementare un metodo diverso.
evitare nomi eccessivamente lunghi. Già con tre di questi in una funzione si
rischia di avere righe troppo larghe.
picmicro675




una ogni 10 livelli


postato il:
14.09.2018, alle ore 10:06
Ah!, c'è un piccolo difetto che una volta che il flag passa, in main() la condizione viene eseguita tutte le volte.
Piccola modifica.

bit avviato = 0;
bit arrestato = 0;

void main()
{
    Settaggi();
    INTCONbits.GIE = 1;
    while (1)
    {
        if ((avvio_premuto) && (avviato = 0))
        {
            RC6 = 1;
            avviato = 1;
            arrestato = 0;
            arresto_premuto = 0;
        }
        if ((arresto_premuto) && (arrestato = 0))
        {
            RC7 = 1;
            arrestato = 1;
            avviato = 0;
            avvio_premuto = 0;
        }
    }
}

In questo caso la verifica avviene solo la prima volta, nel caso del display sarebbe comunque da rivalutare se azzerare la sentenza una sola volta.
agric





postato il:
14.09.2018, alle ore 10:13
@Picmicro. Per il portC intendi dire se ci sono sul circuito le resistenze di pull-down?
Perché non esiste una configurazione di quel tipo per quella porta.



meglio essere un granello di pepe che una cacca d'asino
picmicro675




una ogni 10 livelli


postato il:
14.09.2018, alle ore 11:07
Questa è solo una valutazione nel caso si voglia o meno che l' evento venga preso in considerazione una o più volte. Per esempio potrebbe essere il caso che invece si voglia l' autoritenuta, quindi basta un colpetto. Se invece bisogna tenerlo premuto allora il primo caso potrebbe essere una necessità e una piccola variazione anche nella ISR che determina il cambio di stato. Però per questo caso, direi che diventa inutile passare dalla ISR, meglio leggere il piedino direttamente.


e.ferriani





postato il:
14.09.2018, alle ore 13:08
Per i nomi lunghi, ieri sera non l'ho scritto, sono rimasti quelli che erano, non ero in condizioni di ripensare a tutti i nomi, ma è da fare, mi rendo conto che alcuni siano particolarmente lunghi.

Per i delay vedrai, salvo errori od omissioni, che li ho lasciati solo nella parte di inizializzazione del mail, prima del while. Nel resto del codice non ci dovrebbero essere. Forse nel display che mi ha passato PrimoK, ma non ricordo. dovrei guardarci.

Passiamo alle verifiche.

I pulsanti funzionano entrambi. Non ricordo se c'è un pull-up o pull-down, ma se ne rilevo lo stato se è alto presumo ci siano dei pull-down, ed il pulsante chiuda al V+.
Ad ogni modo funzionano..

Sai però quando non sai più se è questione di quello che hai scritto e ti vengono dei dubbi a volte anche infondati?
Ho provato a caricare il vecchio codice quello senza gli interrupt ne TMR0, e funziona tutto perfettamente, con i vizi che aveva quel codice, ma funziona, quindi è una questione di compatibilità tra quanto scritto nella parte riguardante I2c e quelle relativa al TMR0.



Enea Ferriani
e.ferriani@alice.it
picmicro675




una ogni 10 livelli


postato il:
14.09.2018, alle ore 13:57
Caro Enea, ho speso un paio d' ore per la tesi di questo progetto . Tanto ho il tempo per farlo.
Vedi qui http://www.grix.it/UserFiles/picmicro675/File/TransitFiles/m…
Magari si potrà confrontare quello che penso io e quello che pensi di fare.

Per quanto riguarda i tuoi metodi, non escludo l' impossibilità di funzionare. Hai solo la differenza che le operazioni seguono un ciclo irregolare. Hai la probabilità che se uno slave non risponde, sei bloccato ad aspettare e tutto il traffico ferroviario perde il controllo.
Tale ciclo, visto il sorgente, legge i 5 slave e fa le operazioni di aggiornamento della console operatore. Ci sta anche che si risolve in 5 millisecondi.
Lo potresti anche vedere se metti un segnale in fondo al while da vedere all' oscilloscopio.

Se va bene quello, allora hai risolto come l' hai voluto. Magari se interessa capire altri metodi allora sono disposto a dare altri aiuti.

[quote="agric"]:Perché non esiste una configurazione di quel tipo per quella porta[/quote]

Infatti non esiste internamente il pull-down (per la maggior. parte degli integrati Microchip) Solo che la routine rileva uno stato alto. Quindi significa che normalmente deve stare basso.
e.ferriani





postato il:
14.09.2018, alle ore 19:19
Tutto corretto, tranne per i tempi che hai ipotizzato. Sono ancora un po' scarso, non mi permetto e non saprei se e come correggerti.

Per il resto mi scrivi, nel messaggio precedente a questo, che il master sta comunicando con 5 slave.
Qui ti correggo.
Come da codice inserito in precedenza, il mio ultimo della pagina 17, vedi che il master lo sto facendo comunicare SOLO con lo slave 1, all'indirizzo "I2C_Master_Write(0b00000010);", e gli passo una istruzione anonima "I2C_Master_Write(0b00110011);" tanto per vedere se sul bus entra qualcosa.

Come detto, se attivo I2C con interrupt sul bus non ci finisce niente. Se disattivo l'iterrupt funziona.
Proprio ora sto riguardandoci e ti confermo quanto ho scritto.

La comunicazione con questo unico dura circa 500uS, qualcosa meno



Enea Ferriani
e.ferriani@alice.it
e.ferriani





postato il:
14.09.2018, alle ore 21:17
e.ferriani:

...
La comunicazione con questo unico dura circa 500uS, qualcosa meno


Mi correggo, 300uS esatti.




Enea Ferriani
e.ferriani@alice.it
picmicro675




una ogni 10 livelli


postato il:
15.09.2018, alle ore 03:10
Per l' invio di un solo byte ?
Direi che è elevato. Secondo il mio ragionamento si dovrebbe poter inviare 16 bytes in circa 200 uS. Sempre che sia impostata la trasmissione tramite interrupt. Un calcolo del solo periodo che lo slave conclude la ricezione.

Per ora col simulatore, non sono riuscito a scoprire perché si blocca alla ricezione del primo byte. Forse manca il segnale di ACK dello slave.

Poi se si blocca nella ISR è perché hai una situazione bloccante e quindi appena si libera ci ritorna subito perché il timer è già in overflow. Ovvero nella ISR deve starci meno della durata del TMR0. altrimenti dovresti azzerare il timer quando esci dalla ISR (sebbene potrebbe esserci il rischio che il timer abbia comunque fatto il giro).
Per tanto rivedi il metodo, perché quello che usi in ISR non va bene. Se gli interrupt durano un millisecondo, le funzioni in ISR devono durare molto meno. Altrimenti il carico di lavoro dentro l' ISR diventa maggiore di quello del ciclo principale.
agric





postato il:
15.09.2018, alle ore 06:30
Attenzione penso che l"interrupt vada disattivato, se tutta la routine è via software, altrimenti cè una continua chiamata all"int senza che questo flag(?) che non ricordo venga azzerato.


meglio essere un granello di pepe che una cacca d'asino
segui questo thread con grixFC, per questa funzione devi aver installato il software grixFC

torna su
     

Come utente anonimo puoi leggere il contenuto di questo forum ma per aprire una discussione
o per partecipare ad una discussione esistente devi essere registrato ed accedere al sito




 

 
 
indietro | homepage | torna su copyright © 2004/2018 GRIX.IT - La community dell'elettronica Amatoriale