Newsgroup: it.hobby.elettronica.digitale
Titolo: pic16f84a e pin ra4

Ciao,
sto usando un 16f84 per pilotare un 4051.
Per il clock del PIC Ho usato un oscillatore RC.
vedi schema in :
http://tinypic.com/madjeu.gif
Premendo F il PIC accende i led da RB0 a RB5 e
imposta con RA2,RA3,RA4 gli ingressi sul 4051
per abilitare nell'ordine Y7,Y0,Y1,Y2,Y3,Y4
la tavola di verità del 4051 è questa:
EN A2 A1 A0 CHANNEL
L L L L Y0: maschera AND $E3
L L L H Y1: maschera $E7
L L H L Y2: maschera $EB
L L H H Y3: maschera $EF
L H L L Y4: maschera $F3
L H L H Y5: non usato  $FF
L H H L Y6: non usato  $FF
L H H H Y7: non usato  $FF
H X X X None
Per attivare RA2..RA4 forzo prima un
PORTA:=PORTA OR $1C; (e mi porto nello stato Y7)
e quindi un AND con la maschera indicata sopra
Il problema sembra essere con ra4, infatti non riesco
a rendere attiva Y4. Quando arrivo a quello step invece
di avere un livello alto (come da maschera $F3),
ho una tensione di pochi volt (0.16),
mentre la prima volta quando abilito Y7 la tensione su RA4
arriva a circa 3.8V (VCC=5V)
Forse il problema è dovuto al fatto che RA4 condivide
anche T0CKI? Comunque ho impostato il bit 5 del OPTION_REG a
zero (Internal instruction cycle clock (CLKOUT)) ?
O che RA4 sia un "open drain output" ?
Non mi spiego però perchè la prima volta (con l'OR $1C) ho
però un livello alto su RA4...
Come posso risolvere la situazione ?
Allego sorgente in uPascal.
program MioGDF;
{
 Comando multiplexer 4051
         RA2 => A0
         RA3 => A1
         RA4 => A2
         Uscite Y0..Y4
OR $1C
INPUTS ON
INH C B A CHANNEL
L L L L Y0: maschera AND SE3
L L L H Y1: maschera SE7
L L H L Y2: maschera SEB
L L H H Y3: maschera SEF
L H L L Y4: maschera SF3
L H L H Y5: non usato  SFF
L H H L Y6: non usato  SFF
L H H H Y7: non usato  SFF
H X X X None
RB0 (max freq)  RB5 (min freq)
}
Const
     KEY_Freq:Byte=6;
     KEY_Mode:Byte=7;
     Max_Freq:Byte=6;
     Max_Mode:Byte=3;
     MaskFreq:ARRAY[0..6] Of Byte =($FF,$E3,$E7,$EB,$EF,$F3,$00);
     MaskMode:ARRAY[0..3] Of Byte =($02,$00,$01,$00); //sine, square,
triang
Var
   CurrFreq:Byte; absolute $00C;
   CurrMode:Byte; absolute $01C;
//  dbg:Byte; absolute $04F;
Procedure Push_Freq;
Var BtS:Byte;
Begin
      If CurrFreq<Max_Freq
         then CurrFreq:=CurrFreq+1
         Else CurrFreq:=1;
      BtS:=CurrFreq-1;
      PORTA:=PORTA OR $1C;
      PORTA:=PORTA AND MaskFreq[Bts];
      PORTB:=PORTB AND $C0;
      Setbit(PORTB,Bts);
      Nop;
      Nop;
end;
Procedure Push_Mode;
Var BtS:Byte;
Begin
     If CurrMode<Max_Mode
      then CurrMode:=CurrMode+1
      Else CurrMode:=1;
       BtS:=CurrMode-1;
      PORTA:=PORTA AND $FC;
     // dbg:=MaskMode[Bts] ;
      PORTA:=PORTA OR MaskMode[Bts];
     //dbg:=0;
      Nop;
      Nop;
end;
begin
      OPTION_REG.5:=0; //TMR0 Clock Source Select bit
      OPTION_REG.7:=1; //pull up disbled;
      OPTION_REG:=OPTION_REG AND $F8; //prescaler 1:1
      TRISA:=0; //PortA output
      TRISB:=$C0; //PIN7 e 6 input, gli altri output
      CurrFreq:=0;
      CurrMode:=0;
      PORTA:=0;
      PORTB:=0;
      Push_Freq;
      Push_Mode;
      Repeat
            Nop;
            If button(PORTB,KEY_Freq,50,1)
               Then
                Begin
                 While Button(PORTB, KEY_Freq, 1, 1) do nop;
                 Push_Freq;
                end;
            If button(PORTB,KEY_Mode,50,1)
               Then
                Begin
                 While Button(PORTB, KEY_Mode, 1, 1) do nop;
                 Push_Mode;
                end;
            Nop;
      Until false
end.

Ciao,
non ho letto il tuo sorgente perché vado  di fretta però è probabile che 
da qualche parte hai impostato RA4 come input invece che come output.
Potrebbe anche essere successo nel mezzo del programma, se ad es. ti 
trovi su Bank1 invece che Bank0 e cerchi di scrivere su PORTA (in tal 
caso infatti scrivi su TRISA...)
In bocca al lupo
Salva


 ha scritto nel messaggio
news:1137836158.2...@z14g2000cwz.googlegroups.com...


esatto un bel pull up ha risolto...
ma "open drain" cos'è ?

 ma "open drain" cos'è ?
Vedilo come un semplice interruttore che chiude verso massa, quando
l'interruttore e'aperto che livello ha sul terminale non a massa?
Claudio F

merco ha detto questo sabato :

Stai costruendo un generatore d'onda?

si