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


16F876 TMR0 e Pickit3
     
Autore Messaggio opzioni
pippodue




una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli


postato il:
27.08.2019, alle ore 09:19
Se un pickit3 funziona in collegamento diretto, secondo me deve funzionare anche con la piattina. E' una piattina a 6 fili o 5 ?


anche i grandi uomini, come gli uomini comuni, possono talvolta cadere in errore (Voltaire)
marsram




una ogni 100 livelli
una ogni 10 livelli


postato il:
27.08.2019, alle ore 12:08
La struttura hardware di interrupt è questa:

- all'evento della periferica, ad esempio overflow del timer, IN OGNI CASO viene portato a 1 il flag IF relativo, indipendentemente dallo stato di IE.
Questo consente in polling il test della periferica senza usare interruzione.

- se è stato posto a 1 anche il flag IE (oltre agli switch generali generali GIE/PEIE) quando IF va a 1, viene chiamato l'interrupt.

Se si setta IE è possibile che IF sia già a 1; di conseguenza, immediatamente, si passa all'interrupt.
IF per la maggior parte dei casi NON si resetta da solo, ma permane fino a quando non viene cancellato da programma. Da qui la necessità di cancellare IF prima di abilitare IE.

Ovvero: usare l'interrupt è banale, ma occorre avere ben chiaro il meccanismo, sopratutto se si ha a che fare con varie sorgenti di interruzione attivate.

Penso che nel caso in questione la linea proposta da agric sia quello che manca.

La capacità di driving dei PICKIT dipende da come sono realizzati. Siccome si tratta di una comunicazione sincrona ad alta velocità, fan out del tool e capacità del carico sono rilevanti, dato che le forme d'onda deformate non permettono più una comunicazione intelleggibile.
20cm possono essere troppi se quanto collegato non è ideale. E' da verificare questo aspetto, oltre alle tensioni.
piero55




una ogni 10 livelli


postato il:
27.08.2019, alle ore 18:21
errore inserimento su GRIX....

errore resINS: Column count doesn't match value count at row 1

sono dieci volte che provo a rispondere ma non riesco.... prima erano le doppie virgolette ora questo...
piero55




una ogni 10 livelli


postato il:
27.08.2019, alle ore 20:51
MAH!

Eccomi qua.... appoggiato il pennello (sto pitturando le persiane....meglio i pic) Ho fatto diverse prove: spostato il led sulla porta B idem.... poi ho modificato con 'if (T0IF) & (T0IE)' non conta più...... poi ho pensato, il led lo facciamo lampeggiare solo se T0IE e' abilitato quindi:

  if (timer2=50) and (INTCON.5=1) then   'passato mezzo secondo e interr abilitato
         LED=not(LED)
        end if 


Il led lampeggia solo quando deve cioe' quando T0IE=1 altrimenti e' spento.
Non ho capito ancora perche' si comporti cosi', ma.... funziona.
piero55




una ogni 10 livelli


postato il:
27.08.2019, alle ore 20:56
Niente da fare, il listato non riesco a postarlo.
piero55




una ogni 10 livelli


postato il:
27.08.2019, alle ore 20:57
Per il pickit3, il cavetto è a 6 fili ma il filo 6 non lo utilizzo: sul pickit2 clone autocostruito funzione....bisogna approfondire....
picmicro675




una ogni 10 livelli


postato il:
27.08.2019, alle ore 21:01
lo metti in uno zip e ci metti il link.


Anno nuovo, forum nuovo.
Mi sa che lascio.
piero55




una ogni 10 livelli


postato il:
27.08.2019, alle ore 21:06
 program FAN_PC_16F876_16x2
'******************************************************************************

symbol bt1 = portb.4     'Pulsante manuale
symbol bt2 = portb.5     'Pulsante 
symbol bt3 = portb.6     'Pulsante AUTO/MANUALE
symbol bt4 = portb.7     'Pulsante STOP TEMPORIZZATO
symbol USBPC = porta.2     'USBPC
symbol led_temp = portb.2 'LED lettura temperatura
symbol led_tens = portb.3 'LED lettura tensione

symbol OUT = portc.2 ' OUT PWM 50Hz
symbol POWER = portc.7   'attiva rele
symbol LED = portb.1     'lampeggio timer

'******************************************************************************
' Declarations section

'Quarzo 20MHz

'Lcd module connections
dim LCD_RS as sbit at RC0_bit
    LCD_EN as sbit at RC1_bit
    LCD_D4 as sbit at RC3_bit
    LCD_D5 as sbit at RC4_bit
    LCD_D6 as sbit at RC5_bit
    LCD_D7 as sbit at RC6_bit

    LCD_RS_Direction as sbit at TRISC0_bit
    LCD_EN_Direction as sbit at TRISC1_bit
    LCD_D4_Direction as sbit at TRISC3_bit
    LCD_D5_Direction as sbit at TRISC4_bit
    LCD_D6_Direction as sbit at TRISC5_bit
    LCD_D7_Direction as sbit at TRISC6_bit
' End Lcd module connections

'Definizione variabili
dim v_batt as word
dim tlong as longword
dim v_adc1 as word              'Utilizzata per ADC
dim current_duty as byte
dim text as string[10]
dim temperatura as integer
dim temperatura_old as integer
dim ventole_off as bit
dim manuale as bit
dim var1 as byte
dim secondi as byte
dim minuti as byte
dim spegni as bit
dim sec1 as byte
dim min1 as byte
dim incrementa_colonna as byte
dim v_out as byte
dim tensione_out as word
dim differenza as byte
dim mezzosecondo as bit

dim duty as byte
dim timer as byte
dim aa as byte
dim delta as byte
dim timer2 as word
dim tempo_totale as word

'*************************************************************************
sub procedure interrupt
  if (TMR1IF_bit) then        'interrupt ogni 200uS   TIMER1
    TMR1IF_bit = 0
    TMR1H         = 0xFC      '64535
    TMR1L         = 0x17
    TMR0IE_bit = 0
    inc(timer)
    
    if timer<duty then
       OUT=1
      else
       OUT=0
    end if
    
    if timer=100 then
       timer=0
    end if
    INTCON.5=0           'ferma TIMER0

  end if


    if INTCON.2=1 then          'Interrupt per TIMER0
      INTCON.2=0
      TMR0 = 60   'precarico 60 su TMR0 per interrupt a 10mS circa

      inc(timer2)

      if (timer2=50) and (INTCON.5=1) then   'passato mezzo secondo e interr abilitato
         LED=not(LED)
      end if
      if timer2=100 then       'passato un secondo.....
         dec(secondi)
         dec(tempo_totale)      'tempo_totale= (minuti*60)+secondi
         if secondi=0 then
            secondi=60
            dec(minuti)
         end if
         if tempo_totale=0 then   '(minuti=0) and (secondi=0)then
            INTCON.5=0            'ferma TIMER0
            Delay_ms(2)
            INTCON.2=0
            LED=0                 'OUT per il LED =0
         end if
         timer2=0
      end if

    end if

end sub 
piero55




una ogni 10 livelli


postato il:
27.08.2019, alle ore 21:12
 sub procedure spegnimento
                         'IMPOSTA TIMER0   10mS
                         'Prescaler 1:256;
                         'TMR0 Preload = 60;
                         'Actual Interrupt Time : 9,984 us
          lcd_cmd(_LCD_CLEAR)
          TMR1IE_bit=0          'ferma interrupt TIMER1
          T1CON.0=0
          
          INTCON.2=0
          INTCON = %11100000

           TMR0 = 60
           OUT=1                 'uscita  fissa al max tensione
           delta=(temperatura div 3)
           minuti=1  '0+delta
           secondi=60
           tempo_totale=(minuti*60)+secondi

           
           while tempo_totale > 0   '=(secondi>=0) and (minuti>=0)
              visualizza_ora
              leggi_adc_t
           wend
           
            tempo_totale=0
           
           if (USBPC=0) then   'Se PC spento USB=0V
                 portc.2=0
                 POWER=0              'spegni il dispositivo
                 pausa_ms(1000)
                 while true
                 wend
                else                  'altrimenti
                 asm
                   call 0x0000       'RESTART
                 end asm

           end if
end sub
'*****************************************************************

sub procedure init

 trisa=%01011111
 trisb=%11110001
 trisc=%00000000
 porta=%00000100
 portb=%11110001
 portc=%00000000

 adcon0=%10000001
 adcon1=%10000100
 
  T1CON         = %00000001        'TIMER1
  TMR1IF_bit    = 0
  TMR1H         = 0xFC
  TMR1L         = 0x17
  TMR1IE_bit    = 1



   lcd_init()
   lcd_cmd(_lcd_clear)
   lcd_cmd(_lcd_cursor_off)
   
   CustomChar
   
   delay_ms(50)
      OPTION_REG = %00000111      'prescaler tmr0=256
      TMR0=60
      INTCON=%11100000
      
  temperatura=0
  'ventole_off=0
  'manuale=0
  'var1=0
  secondi=60
  minuti=0
  'sec1=0
  'min1=0
  'spegni=0
  'incrementa_colonna=0
  'mezzosecondo=0

  duty=0
  timer=0
  delta=0
  POWER=1              'attiva alimentazione 16V
  INTCON.2=0           'T0IF=0

  INTCON.5=0           'T0IE=0  ferma interrupt TIMER0

  LED=0
  tempo_totale=0

end sub
'************************************************************************
'************************************************************************
'************************************************************************
'************************************************************************
'************************************************************************


main:
'   Main program 
init

  Lcd_Out(1,1,'PC POWER FAN 1.0')
  pausa_ms(2000)
  lcd_cmd(_LCD_CLEAR)

  INTCON.2=0
  INTCON.5=0           'ferma interrupt TIMER0
  tmr0=60
  
  while true            'INIZIO programma

   leggi_adc_t          'legge temperatura
   pausa_ms(50)
   
   if temperatura>20 then
      if temperatura<=24 then
         duty=temperatura
       else
         duty=(temperatura*1.5)
         if duty>100 then
            duty=100
         end if
      end if

      visualizza_duty
      leggi_adc_van0
      pausa_ms(100)
      leggi_adc_t
      pausa_ms(1000)
   else                    'temperatura <20°
      duty=0
      leggi_adc_t          'legge temperatura
      pausa_ms(50)
      Lcd_Out(2,1,'AUTO: T>20')
      lcd_chr_cp(223)         'Carattere Â°
      lcd_chr_cp(67)          'C
      Lcd_Out_CP('   ')
   end if
   
   if bt1=0 then              'Pulsante avvio manuale
      pausa_ms(20)
      if bt1=0 then
          INTCON.2=0
          tmr0= 60
          INTCON.5=1           'abilita interrupt TIMER0
          
         spegnimento

      end if
   end if
      
   if USBPC=0 then             'se PC spento: USB=0
   
        spegnimento

           POWER=0
   end if
   
      
   
  wend
  
end. 
piero55




una ogni 10 livelli


postato il:
27.08.2019, alle ore 21:14
non riesco a postare la parte centrale ma ci sono solo le letture ADC di una tensione, della temperatura.....
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/2024 GRIX.IT - La community dell'elettronica Amatoriale