:-) non mi sono dimenticato.. dopo tanto tempo volevo ringraziarvi per l'aiuto che mi avete dato e volevo aggiornarvi su quello che nel frattempo ho fatto.. Certo, non ho utilizzato tutti questi mesi solo per il temporizzatore, ma ci ho pensato parecchio nel tempo libero. Dunque, il circuito di Claudio F. l'ho realizzato su una breadboard e ha funzionato egregiamente. Avevo il solito problema del quarzo e dei condensatori e capire in che modo funzionasse l'accoppiamento, alla fine ho risolto in modo molto pezzente, lo so, usando un oscillatore quarzato di quelli nelle scatolette da 4 pin :-P Risolto questo problema pero' ne ho avuto uno di tipo "estetico": usare 5 chip per fare un lavoro del genere mi pareva davvero eccessivo, soprattutto quando ho usato un 4059 che e' un vero bestione di chip.
Quindi ho provato a buttarmi nel mondo dei PIC e devo dire che ne sono rimasto affascinato. Alla fine ho realizzato la stessa cosa con un 12F675, un quarzo esterno, due condensatori e un paio di resistenze.. davvero un bel progresso! Certo, anche qui ho visto che per avere dei timings precisi ho dovuto sbattere un po' le corna (ricordo che dovevo avere un duty-cycle di 1ms+1ms preciso fino ad almeno 1000 cicli), ma alla fine ho risolto, anche qui in modo pezzente, contando quanti microsecondi passavano tra un ciclo e l'altro... Ma ho letto nel NG che pure Claudio F. ha avuto delle simpatie per il TMR0 :-)
Adesso pero' mi resta ancora un problema che spero di risolvere a breve: tutto questo popo' di circuiteria mi serviva per chiudere un interruttore, o meglio per simulare la chiusura di un pulsante: ----o____o----- Pensavo di collegare questo "clock" di impulsi in uscita dal PIC ad un 4066, ma con dispiacere vedo che tra un mezzo ciclo e l'altro il segnale non e' proprio "1" / "0" ma tende a essere piu' continuo che discreto, cioe' ci sono un po' di uSecondi di caduta. Immagino che questo sia dovuto al fatto che il 4066 sia un Analog Switch, giusto? Esistono dei "digital" switch che mi consentano di avere una chiusura ideale 0/1/0/1? Pensavo di provare ad usare transistor, ma non sono sicuro di poter "simulare" un pulsante che chiuda due contatti (tutti i progetti che ho visto portano in qualche maniera il Vdd a massa)
grazie, alessio
Per intanto, se a qualcuno potesse servire, questo e' quello che ho fatto fin'ora: [FIDOCAD ] MC 45 35 0 0 170 LI 80 40 70 40 LI 70 40 70 35 LI 70 35 55 35 LI 80 45 70 45 RV 130 35 145 50 LI 145 45 155 45 TY 135 40 5 3 0 0 0 * 0 1 TY 135 35 5 3 0 0 0 * 0 1 LI 145 40 150 40 MC 150 25 3 0 010 MC 155 25 3 0 010 LI 150 40 150 25 LI 155 45 155 25 MC 60 35 0 0 980 LI 70 45 55 45 MC 45 45 0 0 170 MC 45 45 1 0 040 MC 45 35 1 0 040 MC 65 60 1 0 080 MC 65 75 1 0 010 MC 100 70 2 0 576 MC 60 60 1 0 750 LI 80 50 65 50 LI 65 50 65 60 LI 65 60 60 60 MC 45 60 1 0 040 LI 65 75 65 70 LI 90 65 90 60 LI 90 60 105 60 LI 105 60 105 50 LI 80 35 75 35 MC 70 25 0 0 040 LI 75 35 75 15 LI 75 15 70 15 LI 70 15 70 25 SA 60 35 SA 60 45 SA 65 60 LI 80 70 80 95 LI 100 70 100 95 TY 85 75 5 3 0 0 0 * 4066 TY 130 30 5 3 0 0 0 * DIP sw TY 120 5 5 3 0 0 0 * +5V da presa USB TY 70 50 5 3 0 0 0 * MCLR TY 105 40 3 3 0 0 0 * IN_0 TY 105 45 3 3 0 0 0 * IN_1 TY 105 50 3 3 0 0 0 * OUT LI 120 45 120 50 MC 120 50 1 0 080 MC 125 60 1 0 080 LI 125 50 125 60 LI 120 60 120 75 LI 125 70 125 75 LI 125 40 125 50 MC 120 75 0 0 040 MC 125 75 0 0 040 MC 120 45 0 0 030 LI 105 45 110 45 LI 120 45 105 45 SA 120 45 LI 105 40 130 40 SA 125 40 TY 60 90 3 3 0 0 0 * terminali da cortocircuitare TY 45 60 4 3 0 0 0 * reset TY 55 45 3 3 90 0 0 * 4Mhz TY 45 30 3 3 0 0 0 * 22pF TY 45 40 3 3 0 0 0 * 22pF TY 90 15 3 3 0 0 0 * 100nF TY 115 60 3 3 90 0 0 * 47k TY 127 70 3 3 90 0 0 * 47k TY 84 33 3 3 0 0 0 * 1 TY 99 33 3 3 0 0 0 * 8 TY 99 39 3 3 0 0 0 * 7 TY 99 45 3 3 0 0 0 * 6 TY 99 48 3 3 0 0 0 * 5 TY 84 48 3 3 0 0 0 * 4 TY 84 45 3 3 0 0 0 * 3 TY 84 39 3 3 0 0 0 * 2 TY 86 50 5 3 90 0 0 * PIC TY 91 50 5 3 90 0 0 * 12F675 MC 80 35 0 0 600 MC 84 21 0 0 170 LI 84 21 78 21 LI 78 21 75 21 SA 75 21 SA 108 21 LI 93 21 108 21 LI 108 10 108 35 MC 108 10 3 0 010 LI 108 35 105 35
e source .asm per il pic (chiedo venia per eventuali errori ma non ho mai programmato in assembler) ;il funzionamento e' semplice, la realizzazione pratica un po' meno.. ; leggere lo status di GPIO_0 e GPIO_1, a seconda del valore binario, 00,
01,10,11 scegliamo una ;delle 4 routine previste per 1+1ms, 2+3, 6+4 e 60+40. ;l'out che ci serve per il 4066 lo preleviamo dall'uscita GPIO_2 impostata come OUT.. ;niente TMR0, interrupt o altro. Ci ho provato ma troppo tempo perso.. list p=12F675 RADIX DEC INCLUDE "P12F675.INC" ERRORLEVEL -302
__config 03F1h
;ORG 0x20 ;impostiamo alcune variabili.. duty_type EQU 0x20 counter EQU 0x21 loop1 EQU 0x22; loop2 EQU 0x23;
ORG 0x00 goto main
ORG 0x04 retfie ;nessun interrupt
main ;impostare i pin a digitale (ANSEL e CMCON) ;impostare il TRISIO per aver i pin a ingresso ;disabilitare interrupt ;togliere le weak pull up ;verificare il CLMR bcf STATUS,RP0 ;banco 0 movlw 07h movwf CMCON ;impostiamo tutti i pin a digitale clrf INTCON ;cancelliamo interrutp
bsf STATUS,RP0 ;banco 1 movlw b'10000000' movwf OPTION_REG ;no weak pullup, tutto il resto di optionreg a 0 ;impostiamo i pin gpio in ingresso e in uscita (il nostro segnale) movlw b'00000011' movwf TRISIO ;impostiamo i pin come digitali e non analogici clrf ANSEL
mainLoop ;adesso verifichiamo il valore di duty_type... a seconda ; del valore vai alla routine prevista bcf STATUS,Z ;azzeriamo il bit di Zero bcf STATUS,RP0 ;banco 0 ;adesso verifichiamo lo status dei GPIO_0 e GPIO_1 movlw b'00000011' ;ecco la maschera e la mettiamo in W andwf GPIO,W ; viedmao se cosi fa AND e lo mette in W movwf duty_type movf duty_type,W sublw 0 btfsc STATUS,Z goto duty_0
movf duty_type,W sublw 1 btfsc STATUS,Z goto duty_1
movf duty_type,W sublw 2 btfsc STATUS,Z goto duty_2
movf duty_type,W sublw 3 btfsc STATUS,Z goto duty_3
duty_0 ;1+1 ms bcf STATUS,RP0 ;\+2 bsf GPIO,GPIO2 ;/ movlw 84 ;\+2 movwf counter ;/ decfsz counter,1 ;\ goto $-1 ;/+3 all'uscita vale +2 84x3 -1 movlw 84 movwf counter decfsz counter,1 goto $-1 movlw 84 movwf counter decfsz counter,1 goto $-1 movlw 79 movwf counter decfsz counter,1 goto $-1 nop
bcf STATUS,RP0 bcf GPIO,GPIO2 movlw 84 movwf counter decfsz counter,1 goto $-1 movlw 84 movwf counter decfsz counter,1 goto $-1 movlw 84 movwf counter decfsz counter,1 goto $-1 movlw 78 movwf counter decfsz counter,1 goto $-1 nop nop goto duty_0 ;il goto vale 2 cicli.. duty_1 ;2+3 ms bcf STATUS,RP0 ;\+2 bsf GPIO,GPIO2 ;/ movlw 2 movwf loop1 repeat2000 call delay_763 movlw 77 movwf counter decfsz counter,1 ; goto $-1 decfsz loop1,1 goto repeat2000 nop bcf STATUS,RP0 bcf GPIO,GPIO2 movlw 3 movwf loop1 repeat3000 call delay_763 movlw 77 movwf counter decfsz counter,1 ; goto $-1 decfsz loop1,1 goto repeat3000 nop goto duty_1
duty_2 ;6+4 bcf STATUS,RP0 ;\+2 bsf GPIO,GPIO2 ;/ movlw 6 movwf loop1 repeat6000 call delay_763 movlw 77 movwf counter decfsz counter,1 ; goto $-1 nop ; nop x 6 decfsz loop1,1 goto repeat6000 nop nop nop bcf STATUS,RP0 bcf GPIO,GPIO2 movlw 4 movwf loop1 repeat4000 call delay_763 movlw 77 movwf counter decfsz counter,1 ; goto $-1 decfsz loop1,1 goto repeat4000 nop nop nop goto duty_2 duty_3; bcf STATUS,RP0 ;\+2 bsf GPIO,GPIO2 ;/ movlw 60 movwf loop1 repeat60000; 4 + [763 +2 +(3x77-1)] x 60 +(3x60-1) = 59883 -> 117 nop =60
- 57 call delay_763 movlw 77 movwf counter decfsz counter,1 ; goto $-1 nop ; nop x 60 decfsz loop1,1 goto repeat60000 nop ; 57 x nop :-P ok fa schifo ma meglio che perdersi a contare le istruzioni di ogni loop e movlw.. nop nop nop nop nop nop nop nop nop; nop nop nop nop nop nop nop nop nop nop; nop nop nop nop nop nop nop nop nop nop; nop nop nop nop nop nop nop nop nop nop; nop nop nop nop nop nop nop nop nop nop; nop nop nop nop nop nop nop; 57 x nop bcf STATUS,RP0 bcf GPIO,GPIO2 movlw 40 movwf loop1 repeat40000 ; 6 + [ 763 +2 + (3x 77 -1)] x 40 + (40x3 -1) =39925 -> 75 nop = 40 +35 call delay_763 movlw 77 movwf counter decfsz counter,1 ; goto $-1 nop ; x 40 decfsz loop1,1 goto repeat40000 nop ; 35 x nop :P poco efficiente ma meglio che perdersi nei loop nop nop nop nop nop nop nop nop nop; 10 nop nop nop nop nop nop nop nop nop nop nop; 20 nop nop nop nop nop nop nop nop nop nop nop; 30 nop nop nop nop nop nop ; 35 nop goto duty_3
delay_763 ;delay di 84*3*3-3*1+2*3+2 +2 della CALL movlw 84 ;\+2 movwf counter ;/ decfsz counter,1 ;\ goto $-1 ;/+3 all'uscita vale +2 84x3 -1 movlw 84 movwf counter decfsz counter,1 goto $-1 movlw 84 movwf counter ; decfsz counter,1 goto $-1 return END