Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 25
  1. #1

    Orologio regolabile in C

    ...in Sistemi Programmabili, a scuola, stiamo programmando un orologio regolabile in C per microcontrollore 16F877.

    Il PIC è addoperato in una scheda che offre la modalità di programmazione e la modalità di collaudo mediante un selettore; in modalità di collaudo si "attivano", diciamo, le porte (port a, b, c, d), la dove applichiamo tramite cavi flat (piatti) le periferiche (basette con serie di led, display, pulsanti, lcd...).

    Ci è stata data consegna, quindi, di realizzare un OROLOGIO REGOLABILE, oltre alla scheda pricipale, va usato:
    - serie di pulsanti, dove utilizzandone 2 bisognerà, attraverso questi, rispettivamente con P1 selezionare le "sezioni" (hh oppure mm) da regolare e con l'altro (P2) incrementare di un valore la "sezione" selezionata; da stato normale dell'orologio, un "click" di P1 seleziona le ore (tenendo spenta la sezione mm), due "click", si seleziona mm tenendo spento hh, tre "click" si ritorna allo stato di visualizzazione normale dell'orologio (i pulsanti si attivano al rilascio, tenendo premuto non succede niente);
    - serie di led, dove scegliedo un led a caso, quando regolo l'orologio dovrà stare acceso, mentre quando è in visualizzazione normale dovrà lampeggiare alla frequenza di un secondo;
    - serie di 4 display, collegati in modalità MUX, per visulizzare ore e minuti dell'ora, i primi due logicamente dovranno visualizzare le ore, i secondi due i minuti (a due cifre), in modalità 24 ore.

    Consecutivamente il codice in C per PIC 16F877; utilizzando come compilatore MikroC, il programma compila senza alcun problema il programma, pertanto come sintassi è corretta, però in pratica, nel collaudo, non funziona, o meglio funziona male in quanto mi conta lui, ma in una maniera assurda difficile anche da spiegare:

    codice:
    unsigned int tempo,mux = 0;
    char minuti_unita = 0;
    char minuti_decine = 0;
    char ore_unita = 0;
    char ore_decine = 0;
    char sec = 0;
    char uti = 0;
    char ore = 0;
    char a,set= 0 ;
    char display [10] = {63, 6, 91, 79, 102, 109, 125, 7, 127, 111};
    char attivo = 0; //1 --> conteggio on, 0 --> conteggio off
    void interrupt(){
      if(INTCON&0x04)
      {
    	     if(attivo == 1) tempo++; //per conteggio time
             mux++; //per scambio display
             INTCON=0x20;
      }
    }
    void main(){
      trisd = 0; //coleggamento dati display
      portd = 0;
      trisc = 0b01100000; // c6,c7 pulsanti input,  co,c1,c2,c3,c4  out seleziona display
      portc = 0;
      portb.F4 = 1; //led acceso perche all'inizio si deve impostare l'ora corrente
    
     //--- Settaggio Timer-----
      OPTION_REG=0x80;
      TMR0=5;
      PIR1=0x00;
      PIE1=0x40;
      INTCON=0xE0;
     //---------------
    
     while(1) //inizio loop infinito
     {
       //pulsante P1*************************************
       if(portc.F5 == 1) //P1
       {
         attivo = 0;
    	 tempo = 0;
    	 porta.F0 = 1;
    	 set++;
    	 delay_ms(5); //ritardo per antirimbalzo
    	 if(set > 2) set = 0,attivo = 1,portb.F4 = 0;
       }
       //************************************************
    
       //pulsante P2*************************************
       if(porta.F1 == 1) //P2
       {
         if(set == 1) //imposta minuti
    	 {
    	   uti++;
    	   minuti_unita ++;
    	   if (minuti_unita > 9)
    	   {
    		  minuti_unita = 0;
    		  minuti_decine ++;
    	   }
    	   if(uti==59)
    	   {
    	     uti = 0;
    		 minuti_unita = 0;
         minuti_decine = 0;
    	   }
    	  delay_ms(100);
    	 }
         if(set == 2) //imposta ore
    	 {
    	     ore++;
    		 ore_unita++;
    	     if (ore_unita > 9)
    	     {
    		  ore_unita = 0;
    		  ore_decine++;
    	     }
    		 if(ore = 24)
    		 {
    		   ore = 0;
    		   ore_unita = 0;
           ore_decine = 0;
    		 }
    		 delay_ms(5);
    	 }
       }
       //************************************************
       if(mux == 100) //ogni 10msec cambia display
       {
         mux = 0;
    	 a++;
    	 if(a > 4) a = 1;
         if(a == 1) //stampa minuti_unita
    	 {
    	   portc.F0 = 0;
           portc.F1 = 0;
    	   portc.F2 = 0;
    	   portc.F3 = 1;
    	   portd = display[minuti_unita];
    	 }
    	 if(a == 2)//stampa minuti_decine
    	 {
    	   portc.F0 = 0;
           portc.F1 = 0;
    	   portc.F2 = 1;
    	   portc.F3 = 0;
    	   portd = display[minuti_decine];
    	 }
    	 if(a == 3)//stampa ore_unita
    	 {
    	   portc.F0 = 0;
           portc.F1 = 1;
    	   portc.F2 = 0;
    	   portc.F3 = 0;
    	   portd = display[ore_unita];
    	 }
    	 if(a == 4)//stampa ore_decine
    	 {
    	   portc.F0 = 1;
           portc.F1 = 0;
    	   portc.F2 = 0;
    	   portc.F3 = 0;
    	   portd = display[ore_decine];
    	 }
    
       }
    
       if(tempo == 10000)   //tempo = 1 sec.
       {
    	 tempo = 0;
    	 sec ++;
    	 portc.F4 = ~ portc.F4; //lampeggio led ad intervallo di 1 secondo
    	 if(sec == 59)
    	 {
    	   sec = 0;
    
    	   uti++;
    	   minuti_unita++;
    	   if (minuti_unita > 9)
    	   {
    		  minuti_unita = 0;
    		  minuti_decine++;
    	   }
    	   if(uti==59)
    	   {
    	     uti = 0;
    		 minuti_unita,minuti_decine = 0;
    
    		 ore++;
    		 ore_unita++;
    	     if (ore_unita > 9)
    	     {
    		  ore_unita = 0;
    		  ore_decine++;
    	     }
    		 if(ore = 24)
    		 {
    		   ore = 0;
    		   ore_unita, ore_decine = 0;
    		 }
    	   }
    	 }
       }
      } //fine loop
    }
    Qualcuno sa qualcosa in materia?
    Qualcuno è disposto ad aiutarmi?
    Se necessario ci si può sentire su msn per una migliore comunicazione.
    Grazie raga!!!

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Non capisco ... ti fornisco dei suggerimenti (a fatica) e dici che farai sapere in

    http://www.p2pforum.it/forum/showthread.php?t=369221

    e poi invece, presenti lo stesso codice con i medesimi problemi, ad esempio

    if(ore = 24)


    Forse non vuoi essere aiutato sul tuo codice ma ne vuoi scritto uno funzionante da zero ...

    Mah ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Io ho accettato quei consigli, ma evidentemente se richiedo anche quì è perchè non c'è stato assolutamente un minimo di miglioramento...
    Ho provato ad "aggiustare" con i consigli li ricevuti ma NON è cambiato niente, certo si compila comunque il programma, ma in pratica non funziona...

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da deluxpc
    Io ho accettato quei consigli, ma evidentemente se richiedo anche quì e perchè non ce stato assolutamente un minimo di miglioramento.
    Potevi dirlo anche in quel forum, dove si attendono novità da te cosi' come avevi detto ...

    Ho provato ad "aggiustare" con i consigli li ricevuti ma NON è cambiato niente, certo si compila comunque il programma, ma in pratica non funziona...
    Se continui a proporre il codice con quella if SBAGLIATA non si arriverà MAI ad un codice funzionante.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Originariamente inviato da oregon
    Potevi dirlo anche in quel forum, dove si attendono novità da te cosi' come avevi detto ...



    Se continui a proporre il codice con quella if SBAGLIATA non si arriverà MAI ad un codice funzionante.
    Si sa già che quello va corretto...a scuola ho il listato corretto con tutte i
    codice:
    ==
    Ora vediamo cosa si potrà fare... Bho! Non so più dove andare a parare per farlo funzionare come deve...

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Devi

    1) modificare il codice COME ti avevo detto nell'altro forum (c'erano piu' if da cambiare ... non c'e' NESSUNA if modificata)

    2) compilare ed eseguire e INDICARE cosa succede.

    3) fai un po' di prove ... elimina tutta la parte di gestione dei tasti e prova ad usare SOLAMENTE la parte di codice che visualizza le cifre. Prova a scrivere SOLO il codice che visualizzi

    12.34

    per capire se il problema e' quando piloti i display.

    Fra l'altro, per capire se ci sono EFFETTIVAMENTE degli errori, BISOGNA avere anche lo schema elettrico del circuito, altrimenti NON si puo' dire, ad esempio, se questo

    char display [10] = {63, 6, 91, 79, 102, 109, 125, 7, 127, 111};

    e' corretto o no ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Martedì sera vi dico tutto...in quanto Martedì aggiusto tutto!! Ok, grazie...

  8. #8
    Quel codice non si riesce a sistemarlo, e il prof mi ha detto di fare una cosa più semplice, semplicissimo, senza interrupt; allora io ho scritto quanto segue, il programma me lo compila ma se qualcuno può darmi qualche consiglio su come poterlo migliorare accetto molto volentieri...
    Manca la parte relativa all'impostanzione dell'ora (con i pulsanti), ma non importa...

    codice:
    void main(){
    char ore, minuti, secondi; //variabili di tipo char contenenti meno di 255 valori.
    unsigned int orologio;//variabile di tipo unsigned int contenente più di 255 valori.
    char display[10]={63,6,91,79,102,109,125,7,127,111};//variabile di tipo char contenente meno di 255 valori.
    char ore_d, ore_u, minuti_d, minuti_u=0;//variabile di tipo char contenente meno di 255 valori.
    char Block=0;//variabile di tipo char contenente meno di 255 valori.
    //***** impostazioni porte *****
    ADCON1=6;
    trisa=255;
    trisc=0;
    trisb=0;
    trisd=0;
    porta=0;
    portd=0;
    portc=0;
    portb=0;
    //*******************************
    start:
    ore=0;
    poro: //etichetta di salto
    minuti=0;
    tato: //etichetta di salto
    secondi=0;
    ocio: //etichetta di salto
    orologio=0;
    End:
    
    //***** pulsanti ***** (SBAGLIATI, DA CORREGGERE)
    pulsante_a:
    if(Block==2){
    if(porta.F1)minuti++;
    if(minuti==60)minuti=0;
    if(porta.F3)Block++;
    if(Block==1){
    if(porta.F1)ore++;
    if(ore==24)ore=0;
    //********************
    
    ore_d=ore/10;
    ore_u=(ore-(ore_d*10));
    portc=4;
    portd=display[ore_u];
    delay_ms(1);
    portc=8;
    portd=display[ore_d];
    delay_ms(1);
    goto pulsante}
    minuti_d=minuti/10;
    minuti_u=(minuti-(minuti_d*10));
    portc=1;
    portd=display[minuti_u];
    delay_ms(1);
    portc=2;
    portd=display[minuti_d];
    delay_ms(1);
    goto pulsante}
    if (Block==3)Block=0;
    portb.F0=~portb.F0;
    if(orologio==124)secondi++;
    if(orologio==124)goto ocio
    portb.F0=~portb.F0;
    if(secondi==1)minuti++;
    if(secondi==1)goto tato
    if(minuti==2)ore++;
    if(minuti==2)goto poro
    if(ore==24)
    goto start
    minuti_d=minuti/10;
    minuti_u=(minuti-(minuti_d*10));
    portc=1;
    portd=display[minuti_u];
    delay_us(1993);
    portc=2;
    portd=display[minuti_d];
    delay_us(1993);
    ore_d=ore/10;
    ore_u=(ore-(ore_d*10));
    portc=4;
    portd=display[ore_u];
    delay_us(1993);
    portc=8;
    portd=display[ore_d];
    delay_us(1993);
    orologio++;
    goto End
    }
    Vorrei andare sul sicuro quindi vorrei consegnare questo tipo di listato più semplice, anche se meno professionale, al prof gli basta che per giovedì funzioni ottimamente il sistema di conteggio (incremento secondi, minuti, ore). I secondi vanno fatti lampeggiare (alla frequenza di un secondo) su un led di una serie di otto di una scheda attaccata ad una porta del PIC (b).
    L'incremento dei minuti e delle ore vanno fatti incrementare su una scheda con 4 display 7 segmenti in MUX nel seguente modo: H H M M.
    Qualcuno mi potrebbe dare qualche consiglio su delle modifiche che posso apportare con tranquillità?
    Grazie mille...
    :master:

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Con questo codice, cosa succede? (anche se non e' semplice, facci capire cosa vedi ...) ...

    Qual e' il circuito (mostra lo schema ... ) ..
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Questo codice l'ho scritto poche ore fa...non ho potuto provarlo perchè non ho a casa il materiale...e prima di giovedì (giorno di consegna) non ne ho la possibilità...

    Il proff. vuole come minimo che per Giovedì consegnamo un listato che per lo meno conti il tempo (hh mm ss). Se riusciamo a inserire la parte di comando con i pulsanti ancora meglio.

    Il circuito è il seguente:



    Come potrei fare il tutto...??


Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.