|
Autore |
Messaggio |
opzioni |
pippodue
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
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
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
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
postato il: 27.08.2019, alle ore 20:56 |
Niente da fare, il listato non riesco a postarlo. |
|
piero55
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
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
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
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
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..... |
|
|