www.FiserTek.it

forum di supporto al sito
Oggi è 09/09/2010, 8:16

Tutti gli orari sono UTC +1 ora [ ora legale ]




Apri un nuovo argomento Rispondi all’argomento  [ 63 messaggi ]  Vai alla pagina Precedente  1 ... 3, 4, 5, 6, 7  Prossimo
Autore Messaggio
 Oggetto del messaggio: Re: Gestione display 7 segmenti
MessaggioInviato: 29/07/2010, 20:43 
Non connesso

Iscritto il: 25/07/2009, 20:30
Messaggi: 75
ok ce l'ho tolto ed ora è andato, però quel delay mi serviva per l'antirimbalzo, infatti ora basta che premo una volta e mi va avanti nn so quante ore, ora provo a mettere il multiplex nell'interrupt e i controlli su pulsanti e variabili nel main...


Top
 Profilo  
 
 Oggetto del messaggio: Re: Gestione display 7 segmenti
MessaggioInviato: 29/07/2010, 20:59 
Non connesso
Avatar utente

Iscritto il: 21/10/2009, 18:07
Messaggi: 440
Località: Caserta
ahi ahi ahi!! ma allora quelle lezioni sul mio blog le sto mettendo a vuoto.... Un delay nella routine di interrupt?? Scusa, questa routine di interrupt ogni quanto scatta? 1ms... e in una routine che scatta ogni millisecondo ci vai a mettere un ritardo di 200ms?!? è ovvio che appena parte il delay la routine si blocca in quel punto perchè 1ms dopo scatta un altro interrupt e ricomincia daccapo!

_________________
http://www.settorezero.com
Immagine


Top
 Profilo  
 
 Oggetto del messaggio: Re: Gestione display 7 segmenti
MessaggioInviato: 29/07/2010, 21:13 
Non connesso

Iscritto il: 25/07/2009, 20:30
Messaggi: 75
eh gia, nn ci avevo prp pensato :oops: le tue guide sono sempre le più chiare :D errore da novellino ^^


Top
 Profilo  
 
 Oggetto del messaggio: Re: Gestione display 7 segmenti
MessaggioInviato: 30/07/2010, 12:47 
Non connesso

Iscritto il: 25/07/2009, 20:30
Messaggi: 75
raga ho inserito il multiplex nell'interrupt, e funziona, però non so per quale arcano motivo, ora ho perso il contatore che mi incrementa secondi minuti e ore... eppure ho aggiunto solo il multiplex, ora v posto il codice saprete dirmi sicuramente se c'è qualcosa che non va :D
Codice:
#include <pic.h>
#include <delay.c>
unsigned char DISPLAY[10] = {192, 249, 164, 176, 153, 146, 130, 248, 128, 144}; //array con i numeri
unsigned char bjt, sec=0, min, ore, uniM, decM, uniO, decO;  // unita',decine, variabile
unsigned int count=0;

void main()
{
  TRISA=0b10000; //setto da RA0 a RA3 come uscite e RA4 come entrata
  TRISB=0; //setto tutte le porte RB come uscite
  bjt=0;

// Fosc           :4MHz
// Timer0 preload :8
// Prescaler      :4
// Interrupt time :1,0000mS

// OPTION
// bit 0 -> PS0    Prescaler Rate Select bit 0
// bit 1 -> PS1    Prescaler Rate Select bit 1
// bit 2 -> PS2    Prescaler Rate Select bit 2
// bit 3 -> PSA    Prescaler assegnato a Timer0 (1=Watchdog Timer)
// bit 4 -> T0SE   Timer0 Signal Edge: 0=low->high 1=high->low
// bit 5 -> T0CS   Timer0 Clock Select: internal clock (1=T0CKI transition)
// bit 6 -> INTEDG INTerrupt Edge (1=raise 0=fall)
// bit 7 -> RBPU   PortB PullUp (0=off 1=on)

OPTION=0b00000001;

// INTCON
// bit 0 -> RBIF   PortB Interrupt Flag
// bit 1 -> INTF   RB0/INT Interrupt Flag
// bit 2 -> T0IF   Timer0 Interrupt Flag
// bit 3 -> RBIE   PortB Interrupt Enable (off)
// bit 4 -> INTE   INT Interrupt Enable (off)
// bit 5 -> TMR0IE Timer0 Interrupt Enable (on)
// bit 6 -> PEIE   PEripheral Interrupt Enable (off)
// bit 7 -> GIE    Global Interrupt Enable (on)

INTCON=0b10100000;

// Preload Timer0
TMR0=8;

while(1)
        {
if(RA4==0) //se il pulsante su RA4 viene premuto aumenta i minuti
{
DelayMs(50); // antirimbalzo
if(RA4==0)
{
min++;
if(min>=60) // e se i minuti arrivano a 60 li azzera e incrementa le ore
     {
      min=0;
      ore++;
      if(ore==24)ore=0; // se le ore arrivano a 24 le azzera
     }
}
}
}

}
// INTERRUPT SERVICE ROUTINE
void interrupt isr(void)
   {
   // questo interrupt si verifica ogni millisecondo come da impostazioni
   if (T0IF)
        {
       // Ricarico subito il Timer0
      TMR0=8;

         //calcolo valori da visualizzare
         uniM=min%10;
         decM=(min/10)%10;
         uniO=ore%10;
         decO=(ore/10)%10;

         if(bjt==4)bjt=0; //azzera bjt in caso arrivi a 4 per nn andare oltre
         bjt++; //variabile di supporto per multiplex
         count++; // incremento il contatore per incremento secondi (siccome l'interrupt è ogni ms dopo 1000ms
                       incremento il secondo

   if (count==1000) //ovvero questo
      {
      count=0; // azzero il contatore
      sec++; //incremento i secondi
      if(sec>=60){ //se i secondi sono arrivati a 60
      sec=0; //li azzero
      min++;// e incremento i minuti
      if(min>=60){//se i minuti sono arrivati a 60
      min=0;//li azzero
      ore++;//e incremento le ore
      if(ore>=24){//se le ore arrivano a 24
      ore=0;//è arrivata mezzanotte e azzero XD
      }
    }
  }
}
//quì inizia il blocco multiplex, ogni ms la variabile bjt viene incrementata e ogni ms viene visualizzato un display diverso
if(bjt==1)
    {
         // unità minuti
         PORTB=0;
         PORTA=0b01110;
         PORTB=DISPLAY[uniM];
    }
if(bjt==2)
    {
         // decine minuti
         PORTB=0;
         PORTA=0b01101;
         PORTB=DISPLAY[decM];
    }
if(bjt==3)
    {
         // unità ore
         PORTB=0;
         PORTA=0b01011;
         PORTB=DISPLAY[uniO];
    }
if(bjt==4)
    {
         PORTB=0;
         PORTA=0b00111;
         PORTB=DISPLAY[decO];
    }

   T0IF=0;// Reset flag interrupt su timer 0
   } // End T0IF
} // End ISR


Tecnicamente dovrebbe andare, perchè prima che inserissi il multiplex il blocco per l'orologio mi andava, ora che l'ho inserito l'orologio nn va più ma il multiplex funziona...


Top
 Profilo  
 
 Oggetto del messaggio: Re: Gestione display 7 segmenti
MessaggioInviato: 30/07/2010, 13:15 
Non connesso

Iscritto il: 25/07/2009, 20:30
Messaggi: 75
EDIT. Ho scoperto ke i minuti li incrementa però tipo per far passare 1 minuto mi ci sn voluti 5 minuti. Eppure è strano, xkè la variabile count viene incrementata ogni Ms, dopo che è stata incrementata 1000 volte vuol dire che è passato 1 secondo e quindi incremento la variabile secondo poi quella minuti ecc... e il tutto è fatto con l'interrupt e non col delay quindi dovrebbe essere preciso


Top
 Profilo  
 
 Oggetto del messaggio: Re: Gestione display 7 segmenti
MessaggioInviato: 30/07/2010, 13:54 
Non connesso

Iscritto il: 25/07/2009, 20:30
Messaggi: 75
si raga penso sia proprio il blocco del multiplex che da problemi, infatti l'ho tolto dall'interrupt e rimesso nel ciclo while e ora l'orologio va tranquillo. Il problema è che devo per forza realizzare il multiplex e il timer per l'orologio nella routine dell'interrupt altrimenti non posso inserire il blocco dei tasti che deve andare per forza nel while dato che devo metterci l'antirimbalzo di almeno 5ms. Potrei mettere il blocco dell'orologio nel while, però non so per quale motivo non va ci ho gia provato.... e cmq preferisco realizzarlo con l'interrupt visto che il delay non è preciso. Idee?


Top
 Profilo  
 
 Oggetto del messaggio: Re: Gestione display 7 segmenti
MessaggioInviato: 31/07/2010, 17:06 
Non connesso

Iscritto il: 25/07/2009, 20:30
Messaggi: 75
nessuno? :(


Top
 Profilo  
 
 Oggetto del messaggio: Re: Gestione display 7 segmenti
MessaggioInviato: 01/08/2010, 22:03 
Non connesso

Iscritto il: 09/04/2010, 12:00
Messaggi: 57
Località: Roma
oggi, dato che ho avuto molto tempo libero, ho cercato di risolverti il problema e diciamo che sono riuscito a risolverlo quasi del tutto. Nel senso che l' orologio va per i fatti suoi e che i minuti e le ore si possono impostare con due pulsanti, uno collegato a RA4 e l'altro a RB7. L'unico neo è che quando fai avanzare i minuti o le ore, tra un avanzamento e l'altro si spengono i display. Certamente è un grosso difetto ma, poichè anch'io sto imparando, non sono riuscito a fare di meglio, anche se mi accontento. Per questo sono gradite le critiche e consigli vari. Tieni presente che ho usato un 16F84, che i miei display sono a catodo comune e che, poichè con 5 mS e con 3 mS sfarfallavano che era una bellezza, ho usato un delay di 1 mS per gestire il multiplex. Quindi devi adattare il tutto ai tuoi (array e delay). Nel main ho messo il multiplex e la gestione pulsanti, l'ISR è isolata. l'orologio non può essere preciso per il quarzo usato e per il valore del TMR0 ma come palestra di allenamento per il C va più che bene. Eccoti il codice:


#define XTAL_FREQ 4MHZ
#include <pic.h>
__CONFIG (XT & WDTDIS & PWRTDIS & UNPROTECT);
#include <delay.c>
#define abilita PORTA
const unsigned char DISPLAY[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
unsigned char secondi, minuti, ore, U_min, D_min, U_ore, D_ore;
unsigned short int count=0;

void main()
{
PORTA=0;
PORTB=0;
TRISA=0x10;
TRISB=0x80;
OPTION=0b00000001;
INTCON=0b10100000;
TMR0=8;

/****************************************** ROUTINE MULTIPLEX ********************************************/
for(;;)
{

U_min=minuti%10;
D_min=(minuti/10)%10;
U_ore=ore%10;
D_ore=(ore/10)%10;

PORTB=0;
abilita=0x01;
PORTB=DISPLAY[U_min];
DelayMs(1);
abilita=0x00;

PORTB=0;
abilita=0x02;
PORTB=DISPLAY[D_min];
DelayMs(1);
abilita=0x00;

PORTB=0;
abilita=0x04;
PORTB=DISPLAY[U_ore];
DelayMs(1);
abilita=0x00;

PORTB=0;
abilita=0x08;
PORTB=DISPLAY[D_ore];
DelayMs(1);
abilita=0x00;

/*************************************** ROUTINE GESTIONE PULSANTI ***************************************/
if (RA4==1) // PULSANTE MINUTI
{ DelayMs(50);

if (RA4==1)
{ PORTB=0;
U_min=0;
D_min=0;
U_ore=0;
D_ore=0;
count=0;
count++;
minuti++;
DelayMs(50);

if (minuti>59)
{ minuti=0;

while(RA4==1)
continue;

}

}

}


if (RB7==1) //PULSANTE ORE
{ DelayMs(50);

if (RB7==1)
{ PORTB=0;
U_min=0;
D_min=0;
U_ore=0;
D_ore=0;
count=0;
count++;
ore++;
DelayMs(50);

if (ore>23)
{ ore=0;

while(RB7==1)
continue;

}

}

}

}

}


/************************************** INTERRUPT SERVICE ROUTINE ****************************************/
void interrupt isr(void)
{

if (T0IF)
{ TMR0=8;
count++;

if (count==1000)
{ count=0;
secondi++;

if (secondi>59)
{ secondi=0;
minuti++;

if (minuti>59)
{ minuti=0;
ore++;

if (ore>23)
{ ore=0;

}

}

}

}
T0IF=0;
}
}


Il pezzo superiore del codice l'ho formattato manualmente perchè quando l'ho copiato da Notepad lo allineava male. Dovrebbe esserci tutto (dal controllo che ho fatto mi sembra OK).
Fammi sapere. Ciao


Top
 Profilo  
 
 Oggetto del messaggio: Re: Gestione display 7 segmenti
MessaggioInviato: 06/08/2010, 19:01 
Non connesso

Iscritto il: 25/07/2009, 20:30
Messaggi: 75
grazie mille dell'aiuto marpin, però anche negli svariati tentativi provato questa soluzione, ma l'ho scartata prp perchè alla pressione dei pulsante il multiplex si perdeva, questo può andar bene per testare, ma magari volevo farci prp un bell'orologietto da mettere in una piccola scatoletta di plastica, e qundi vorrei che venisse senza questi piccoli difetti


Top
 Profilo  
 
 Oggetto del messaggio: Re: Gestione display 7 segmenti
MessaggioInviato: 09/08/2010, 10:27 
Non connesso

Iscritto il: 09/04/2010, 12:00
Messaggi: 57
Località: Roma
appena avrò un pò di tempo mi rimetterò al lavoro e cercherò di ovviare a questo inconveniente della perdita del multiplex che, ad essere sinceri, da fastidio pure a me.


Top
 Profilo  
 
Visualizza ultimi messaggi:  Ordina per  
Apri un nuovo argomento Rispondi all’argomento  [ 63 messaggi ]  Vai alla pagina Precedente  1 ... 3, 4, 5, 6, 7  Prossimo

Tutti gli orari sono UTC +1 ora [ ora legale ]


Chi c’è in linea

Visitano il forum: Google [Bot] e 1 ospite


Non puoi aprire nuovi argomenti
Non puoi rispondere negli argomenti
Non puoi modificare i tuoi messaggi
Non puoi cancellare i tuoi messaggi
Non puoi inviare allegati

Vai a:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traduzione Italiana phpBB.it