Il TIMER0
  Il TIMER0
  è il classico contatore/timer presente in tutti i PIC,  del tutto analoghi a quanto implementato
  nei Baseline e Midrange.
  
   
  
  
  TIMER0 è a 8 bit, sempre attivo.  
  
  
  L' ingresso di conteggio del TIMER0 può essere: 
  
    - il clock interno Fosc/4
 
    - l' ingresso esterno T0CKI
 
    - l' uscita del comparatore
 
   
  
  
  
  L' overflow non genera alcuna azione, per cui l' esaurimento del conteggio del
  timer va verificato in polling. Così pure un determinato valore di
  conteggio.  
  Ad esempio, con il clock fisso a 4MHz, un ciclo di istruzione è FOSC/4 = 1
  MHz, ovvero un periodo di 1us. Una attesa di 16 ms è determinata da un
  conteggio di 250 impulsi con un prescaler 1:64 
  Come è comune nei Baseline e MidRange, il prescaler è in condivisione tra
  TIMER0 e WDT, per cui può essere assegnato
      solo all' uno o all' altro. 
  Occorre non dimenticare che se abilita  WDT (scelta da fare nel CONFIG), occorre
  inserire
  nel programma la periodica ricarica del suo contatore. 
  WDT allo scadere del conteggio non genera un interrupt, ma un
          reset, di cui va individuata la sorgente.
  Lo scadere del WDT risveglia in micro dallo sleep. In questo caso non
  occorre alcuna azione di cancellazione di flag in quanto è cancellato
  automaticamente al momento del wakeup. Questo accade qualunque sia la causa
  del wakeup. 
   
  Una trattazione completa del TIMER0 la trovate qui. 
  
   
  La gestione di TIMER0
  
  Il TIMER0 non dispone di un registro di
  controllo proprio, ma fa capo ad un registro generale detto OPTION
  o OPTION_REG che contiene anche altre
  funzioni. La sua  struttura è la seguente: 
  
    
      
        | 
           OPTION 
         | 
        
           bit 
         | 
        7 | 
        6 | 
        5 | 
        4 | 
        3 | 
        2 | 
        1 | 
        0 | 
       
      
        | 
           nome 
         | 
        
           !GPWU 
         | 
        
           !GPPU 
         | 
        
        
           T0CS 
         | 
        
           T0SE 
         | 
        
           PSA 
         | 
        
           PS2 
         | 
        
           PS1 
         | 
        
           PSO 
         | 
         
        
          | 
             funzione 
           | 
          R/W | 
          R/W | 
          R/W | 
          R/W | 
          R/W | 
          R/W | 
          R/W | 
          R/W | 
         
        
          | 
             default 
           | 
          1 | 
          1 | 
          1 | 
          1 | 
          1 | 
          1 | 
          1 | 
          1 | 
         
       
     
    !GPWU
        : Enable Wake-up on Pin Change bit (GP0, GP1, GP3) 
                    
        1 = disabilitato 
                    
        0 = abilitato
  
      
      
        bit 6  !GPPU :
        Enable Weak Pull-ups bit (GP0, GP1, GP3) 
                    
        1 = disabilitato 
                    
        0 = abilitato 
      
        bit 5   
        T0CS:
        Timer0 Clock Source Select bit 
               
            1 =
        Transizione sul pin T0CKI (overrides la selezione del TRIS) 
                    0 =
        Transizione sul clock interno, FOSC/4 
        
          
        bit 4   
          T0SE
          : Timer0 Source Edge Select bit 
                      se
          T0CS= 0,
  T0SE è
          ignorato 
                      se T0CS
          = 1 
          
     1
        = transizione livello basso -> alto (rising) sul pin T0CKI 
                    0 = transizione
        livello alto -> basso (falling) sul pin T0CKI 
        
          bit 3   
          PSA :
        Prescaler Assignment bit 
                    1 = 
        prescaler assegnato al WDT 
                    0 = 
        prescaler assegnato al timer 
      
        bit 2:0 
        PS2:0:
        Prescaler Rate Select bits 
                      
        TIMER0         WDT 
                    
        000 =  1:2      000 =  1:1 
                    
        001 =  1:4      000 =  1:2 
                    
        010 =  1:8      000 =  1:4 
                    
        011 =  1:16     000 =  1:8 
                    
        100 =  1:32     000 =  1:16 
                    
        101 =  1:64     000 =  1:32 
                    
        110 =  1:128    000 =  1:64 
                    
        111 =  1:256    000 =  1:128 
    
  In particolare: 
  
    
      
        | T1CON | 
        bit | 
        Funzione | 
          
          
  
      
        Valore
          
           | 
       
  
      
  
      
        | T0CS | 
        5 | 
        Questo bit seleziona la sorgente del clock di conteggio. 
          Da notare che la selezione del clock esterno sovra scrive una
          eventuale selezione diversa effettuata sul TRIS del pin T0CKI. | 
        
          
            - 1   segnale dal pin T0CKI
              (default)
 
            - 0    Fosc/4
 
           
         | 
       
      
        | T0SE | 
        4 | 
        Questo bit seleziona il fronte di commutazione del clock sul quale
          il contatore incrementa. 
          E' valido solamente per il clock esterno. | 
        
          
            - 0 falling edge
 
            - 1 rising edge (default)
 
           
         | 
       
      
        | PSA | 
        3 | 
        Questo bit seleziona l' assegnazione del prescaler | 
        
          
            - 0  al WDT (default)
 
            - 1  al timer
 
           
         | 
       
          
      
        | PS2:0 | 
        2:0 | 
        Questi tre bit definiscono il fattore di pre divisione.
           Da notare che i valori impostati, a parità dei bit PS,
          sono diversi nel caso di prescaler applicato al WDT o al timer.  | 
        
          
            
               | 
              TIMER0 | 
              WDT | 
             
            
              | 000 | 
              1:2  | 
              1:1 | 
             
            
              | 001 | 
              1:4 | 
              1:2 | 
             
            
              | 010 | 
              1:8 | 
              1:4 | 
             
            
              | 011 | 
              1:16 | 
              1:8 | 
             
            
              | 100 | 
              1:32 | 
              1:16 | 
             
            
              | 101 | 
              1:64 | 
              1:32 | 
             
            
              | 110 | 
              1:128 | 
              1:64 | 
             
            
              | 111 | 
              1:256 | 
              1:128 | 
             
           
            | 
       
     
   
   
  Una trattazione completa di TIMER0 la trovate qui. 
          
  
      
  
  La funzione di Timer0 è quella, se alimentato dal clock interno o da un
  clock esterno, di determinare intervalli di tempo (timer) per generazione di
  forme d'onda, ritardi, applicazioni RTC, debounce, ecc. 
  Se viene alimentato da un segnale esterno, può svolgere la funzione di
  conteggio degli impulsi (counter) in arrivo per misure di tempo, frequenza,
  ecc. 
  
  
    
      
        
  
   
  
  Va ricordato che
  
  
  impostando  T0CS (OPTION_REG, 5)  a 1, questa selezione sovrascrive quanto
  designato nel registro TRIS  per GP2.  
  
  Siccome al reset tutti i bit di OPTION_REG  sono di default a 1, per usare
  GP2  occorre ricordarsi di impostare T0CS = 0.
  
       | 
     
   
   
  Mancando una gestione interrupt nei PIC Baseline, anche
  l' overflow di Timer0 non genera interrupt. 
   
 |