Vai al contenuto
PLC Forum


7 Digits Display E Pic16F877A


jqr91

Messaggi consigliati

Salve a tutti, sto cercando di imparare come programmare un microcontrollore, sono partito con gli esempi basilari, sto usando pickit2 e come compilatore hitech c.

Sto provando a implementare questo semplice controllo: quando si clicca su un pulsante, viene incrementato il valore della variabile per far accendere un 7 digits segment.

Questo è il codice, sto facendo per semplicita' accendere solo due pezzetti del mio 7 digits.

#include <htc.h>
#include <stdio.h>
#include <stdlib.h>
#include <pic16f877a.h>
#define _XTAL_FREQ 2000000 
__CONFIG(FOSC_HS & WDTE_OFF & PWRTE_OFF & BOREN_ON & LVP_ON & CPD_OFF & WRT_OFF & CP_OFF);



int main(int argc, char** argv) {

    TRISD=0b00001000;
    TRISB=0b00000000;
    
    
     
    while(1)
    {
     unsigned int conta=0;
           PORTBbits.RB0=0;
            PORTBbits.RB1=0;
     
        
        if(PORTDbits.RD3==1)
        {
               conta++;
          if(conta==1)
          {  
           PORTBbits.RB0=1;
            PORTBbits.RB1=1;
          }
          else if(conta==2){
               PORTBbits.RB0=0;
            PORTBbits.RB1=1;
          }
        }
        else{
            
         PORTBbits.RB0=1;
            PORTBbits.RB1=0;
        }
        
    }
    

    
        
       
    
    return (EXIT_SUCCESS);

}

Dove sbaglio? il codice salta diretto all else..

Link al commento
Condividi su altri siti


Hai verificato se D3 va effettivamente a 1?

Metti un punto di alt sulla linea dello if e verifica lo stato della porta D, poi esegui a step.

Verifica anche il trisd per assicurarti che D3 sia sempre configurato a ingresso.

Link al commento
Condividi su altri siti

Ciao Livio, grazie per la tua risposta.. Sto provando ma non funziona..ti tengo aggiornato, come posso migliorare il mio debug ? Sto programmando con mplab x e in cirtcuit debug simulator ..

Link al commento
Condividi su altri siti

il contatore... sto davvero impazzendo non riesco a capire il perche'.. ti posto il nuovo codice..

/* 
 * File:   blink.c
 * Author: jqr91
 *
 * Created on 10 luglio 2015, 14.12
 */
#include <htc.h>
#include <stdio.h>
#include <stdlib.h>
#include <pic16f877a.h>
#define _XTAL_FREQ 2000000 
__CONFIG(FOSC_HS & WDTE_OFF & PWRTE_OFF & BOREN_ON & LVP_ON & CPD_OFF & WRT_OFF & CP_OFF);

void scrivi_led(int num);

int main(int argc, char** argv) {

    TRISD=0b00001000;
    TRISB=0b00000000;
    
    
     
    while(1)
    {
    
           PORTBbits.RB0=0;
           PORTBbits.RB1=0;
           int conta=0;
   do{
       
       conta++; 
       scrivi_led(conta);
     
        
       
   }  
       while(RD3); 
            
          
            
            
    }
    

    
        
       
    
    return (EXIT_SUCCESS);

}

void scrivi_led(int num){
    
    switch(num)
    {
        case 1:
            PORTBbits.RB0=0;
            PORTBbits.RB1=1;
            break;
        case 2:
            PORTBbits.RB0=1;
            PORTBbits.RB1=1;
            break;
        
    }
    
}
Link al commento
Condividi su altri siti

Se non metti qualche delay è difficile che funzioni. Appena premi il pulsante la variabile conta verrà incrementata centinaia di volte.

E' necessario implementare un codice antirimbalzo per fare le cose per bene.

Ciao.

Link al commento
Condividi su altri siti

ok.

Quello che uso io come antirimbalzo impiega un timer ed buffer quindi è un po' complicato ma su internet trovi vari esempi.

Modificato: da giacomo56
Link al commento
Condividi su altri siti

Appena premi il pulsante la variabile conta verrà incrementata centinaia di volte.

Questo è vero, ma se faceva quello che gli ho scritto nel #2 con il primo codice, cominciava a fare le cose secondo logica.

Invece jqr91 ha fatto la cosa meno logica: ha cambiato programma.

Se si vuole imparare a programmare bisogna imparare, per prima cosa, ad agire secondo logica. Si fa un passo alla volta. Si esegue una sola modifica alla volta e si erifica il risultato.

Se e solo se si laora logicamente si riuscirà a fare programmi decenti, altrimenti si tratta mettere assieme un po' di istruzioni che magari a furia di tentativi riescono anche a far fare al programma quello che ci si era pòrefisso, però è solo un castello di carte che al primo alito di brezza crolla.

Link al commento
Condividi su altri siti

Ciao Livio, io sono stato fino ad ora a provare.. verificando un istruzione alla volta, ma ahime' non sono riuscito a fare incrementare la variabile.. sto un po impazzendo, credevo fosse un pochino piu facile programmare questi microcontrollori..

Link al commento
Condividi su altri siti

Torna al programma di partenza.

Metti un break point sulla prima istruzione "contaocessore su questo punto++". Premendo il pulsante il pickit farà arrestare il processore su questa istruzione.

Se non aviene dei erificare che la porta D3 ada effettiamente a "1" con pulsante premuto.

Stabilito che il pulsante manda ad "1" la porta se ancorra non conta dei verificare che la configurazione del "trisd" preeda effettivamente che RD3 sia un ingresso.

Una olta che sei arrivato a far contare sulla pressione del pulsante, comincia ad escogitare il modo migliore per avere lìincremento solo sul fornte di salita, altrimenti il conteggio aanzerà per milioni di volte.

Per prima cosa bisogna fare un antiribalzo. Questo lo puoi fare in modo barbaro leggendo la porta, poi attendi un tot di ms con un ritardo usando la funzione delay e rileggendo per verificare che sia sempre uguale.

Oppure pui fare le cose più professionalemente creando un interrupt a tempo (io solitamente usi timer1) con clock di 10ms. Ad ogni attiazione di interrupt trasferisci gli ingressi letti in precedenza in una memoria, poi leggi lo stato attuale degli ingressi e erifichi che siano identici. Se lo sono lo stato è stabile.

Se ragion i un attimo capisci anche come fare per far contare solo sul fronte di salita (o di discesa)

Link al commento
Condividi su altri siti

Livio..sembra funzionare..devo fare un poco di prove in piu..ma penso che vada..è il bottone senza antirimbalzo e senza delay che non mi faceva vedere bene quello che stava succedendo..ti ringrazio moltissimo per i suggerimenti, volevo chiederti esiste qualche buon libro per apprendere tutte questo cose, del tipo resistenze di pull up, pull down, dove si usano.. perche si fanno diverse controlli come l antirimbalzo, come iniziare a scrivere una libreria di un generico sensore e tante altre cose.?

Link al commento
Condividi su altri siti

Devi dividere in 2 parti principali le problematiche relative all'uso dei microcontrollori: la parte circuitale e la prate programamzione. Inoltre anche la programmazione va suddivisa in 2 grandi capitoli. Il primo è relativo a tutto quanto riguarda programmazione vera e propria: linguaggi, sintassi, uso del processore e degli strumenti di debug eprogramamzione. Il secondo cpitolo è realitivo alle applicazioni e questo è forse il più difficile perchè esistono pochi testi che lo sviluppino bene.

Io posso solo consigliarti un metodo di apprendimento, basato sulla mia esperienza.

Comincia con il farti una cultura sui pic. Una buona guida è sempre l'ottimo corso di Sergio Tanzilli sui PIC. Lo scarichi gratuitamente e lotrovi facilmente con l'aiuto di google, credo sia "Pic per esempi" o qualche cosa di simile. Fa riferimento al PIC 16F84, ma questo importa poco, le teciniche son sempre eguali.

Per la parte hw, circuitale, puoi fare riferimento a testi di elettronica generale applicata, note applicative dei componenti; trovi molto sulla rete con ricerche mirate. Ad esempio prova a fare una ricerca su "filtri antirimbalzo" e poi affinala dividendo Hw e Sw.

L'ultima parte, le applicazioni. Un tempo c'erano ottimi testi della Jackson, erano Bugbook. Eran basati sui micro Intel però trattavano anche e soprattutto delle applicazioni. Così potevi vedere tutto. C'era, sempre della medesima casa, un altro ottimo testo che, credo, si intitolava "Il PLC nelle automazioni industriali". Anche se usava il PLC come elemento programmabile dava molti esempi e, soprattutto, spiegava come si affrontano determinate problematiche. Oggi c'è un buon libro simile, del bergamaschi, che tratta le medesime problematiche usando un S7-200.

Questa è un po' una specie di cornice entro cui agire per imparare a muovere i primi passi. Ppoi molto lo potrai imparare dai tuoi errori se, e solo se, affronterai i problemi razionalmente.

Ad esempio.

Se scrivi un programma e non riesci a fargli fare quello che desideri non devi subito cambiare programma ma, passo passo, devi arrivare a capire perchè non funziana, dove c'è l'errore, se l'errore è di strategia o se è solo un errore di sintassi.

La strada è lunga ed è irta di difficoltà, non esistono scorciatoie, non si può saltare la fila con qualche trucco, si deve sudare ogni briciolo di conoscienza acquisito; però da moltissime soddisfazioni sempre che il lavoro ti piaccia realmente. :smile:

Link al commento
Condividi su altri siti

Ciao grazie per i consigli preziosissimi che mi stai dando..:) infatti faro così, anche perché ora sto studiando ingegneria delle telecomunicazioni.. E mi piacerebbe prendere questo ramo relativo all automazione industriale e i plc , microcontrollori.

Ho trovato anche dei buoni testi in inglese vedrò di darli una letta , ma ora voglio concentrarmi sopratutto nel leggere bene un datasheet di un pic generico, perché ci sono davvero molte cose da imparare .:) grazie per tutto, a presto Livio !

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...