Página 1 de 1
Programar saída de 4 bits num port de 8 bits?

Enviado:
02 Dez 2006 19:21
por lpagano
Galera,
Tô com um probleminha aqui.
Fiz um programa em C para o PIC 16F877A. O que eu preciso é gerar 4 bits como saída no portA (de RA0 até RA3), por exemplo, e deixar de RA4 até RA7 para entrada de outros bits.
Nesse caso eu utilizei o comando output_A(x) que é uma saída de 8 bits.
Como posso fazer para que, com o valor da variável x em 4 bits, eu possa utilizar as outras portas do portA sem interferir nos 4 bits de saída?
Valeu!

Enviado:
03 Dez 2006 18:22
por a.rairan
faz uma máscara...
PORTA |= (variavel_x & 0x0F);
vai pegar só a parte baixa da variável.

Enviado:
03 Dez 2006 18:53
por lpagano
a.rairan
Valeu pela dica.
Logo depois que eu postei a minha pergunta eu pensei numa coisa: já que estou declarando no TRISA como sendo '0xF0' acho que não teria problema em usar simplesmente o comando output_A(x), já que de RA4 a RA7 serão bits de entrada. O que acha?
Valeu!

Enviado:
03 Dez 2006 19:16
por Fernando Guimarães Aguiar
Ipagano,
Caso esteja usando CCS, aconselho usar a porta Aporta A como fast_io.
No mais acho que rola fazer o que vc comentou anteriormente!!!

Enviado:
03 Dez 2006 21:21
por tpfslima
Ipagano, voce esta correto.
Programando apenas como saida os bits de 0 a 3, pode colocar direto os valores.
Mas isso nao é legal pois algum dia voce pode modificar o programa ou hardware e se esquecer destes detalhes,ou pior... Outra pessoa pode pegar este projeto e nao entender porque do mal funcionamento em detereminadas circunstancias
:)

Enviado:
04 Dez 2006 10:55
por leoabubauru
Experimente usar isso.
union
{
byte _PORTA;
struct
{
byte PTA0 :1; /* Port A Data Bit 0 */
byte PTA1 :1; /* Port A Data Bit 1 */
byte PTA2 :1; /* Port A Data Bit 2 */
byte PTA3 :1; /* Port A Data Bit 3 */
byte PTA4 :1; /* Port A Data Bit 4 */
byte PTA5 :1; /* Port A Data Bit 5 */
byte PTA6 :1; /* Port A Data Bit 6 */
byte PTA7 :1; /* Port A Data Bit 7 */
} _BITS;
struct
{
byte _SAIDAS :4; // bits de 0 a 3
byte _ENTRADAS :4; // bits de 4 a 7
} _IO;
} _PTA;
#define PORTA _PTA._PORTA // Com "_PORTA" vc acessa os 8 bits num único comando
#define PTA0 _PTA._BITS.PTA0 // Com "_BITS" vc acessa cada bit do PORTA um a um
#define PTA1 _PTA._BITS.PTA1
#define PTA2 _PTA._BITS.PTA2
#define PTA3 _PTA._BITS.PTA3
#define PTA4 _PTA._BITS.PTA4
#define PTA5 _PTA._BITS.PTA5
#define PTA6 _PTA._BITS.PTA6
#define PTA7 _PTA._BITS.PTA7
#define ENTRADA_PTA _PTA._IO._ENTRADAS //bits de 4 a 7
#define SAIDA_PTA _PTA._IO._SAIDAS // bits de 0 a 3
Você poderá usar por exemplo:
VARIAVEL_A = ENTRADA_PTA; // recebe os 4 bits do PORTA referentes à entrada
SAIDA_PTA = 0b1010 // as saidas de 0 a 3 receberão esse valor

Enviado:
04 Dez 2006 13:52
por lpagano
Valeu a força pessoal!!!

Enviado:
05 Dez 2006 10:57
por zielpunkt
Faz a máscara que o a.rairan falou, que te poupa problemas de entendimento e/ou modificações do software/hardware no futuro. Ai não vai importar se usar os outros pinos pra outras finalidades, sem precisar ficar reescrevendo o software.
É isso.

Enviado:
07 Dez 2006 21:11
por lpagano
a.rairan,
Desculpe minha ignorância,

mas poderia me dar mais detalhes sobre como construir a máscara sugerida
PORTA |= (variavel_x & 0x0F); como: de onde vem essa expressão "PORTA" pois não há nos comandos do CCS? Tem que ser declarada aonde?
É que coloquei exatamente isso no compilador e deu erro. Só substituí o "variavel_x" pela minha variável que estou usando aqui.
Obrigado!

Enviado:
08 Dez 2006 08:25
por pbernardi
Bom, no CCS isso é definido na biblioteca do PIC em questão. (16F877A.h no seu caso, se não me engano).
Sds,

Enviado:
11 Dez 2006 10:00
por lpagano
Consegui!!! Foi do jeito que o a.rairan disse:
output_B(x & 0x0F);
Deu certinho e também fiz sair no RB4 outro bit independente.
Valeu!!!

Enviado:
12 Dez 2006 07:53
por shhadowzone
Xará toma cuidado que, se eu não me engano, o RA4 é somente saída

Enviado:
12 Dez 2006 09:01
por zielpunkt
Negativo, shadowzone.
RA4 é sim um I/O. A diferença entre RA4 e demais pinos do PORTA é que ele é do tipo "OPEN DRAIN" (dreno aberto), quando configurado como saída. Nesse caso, para obter nivel "1" a partir dele, necessita "pendurar" uma carga para VDD (PULL-UP). Quando utilizado como entrada, diferentemente dos demais pinos (níveis TTL), RA4 possui características de "Schmitt Trigger"
É isso.

Enviado:
14 Dez 2006 08:15
por shhadowzone
Ops, desculpe estou confundindo com o 12F625 e um de seus pinos.

Enviado:
15 Dez 2006 21:36
por a.rairan
RA5 se naum me engano eh soh entrada, compartilha com o MCLR...
amigo deste jeito funciona se os outros 4 bits forem entrada, mas se forem saídas o bom seria fazer o "IOR" no port, para não afetar os outros 4 bits