Página 1 de 1

Programar saída de 4 bits num port de 8 bits?

MensagemEnviado: 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!

MensagemEnviado: 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.

MensagemEnviado: 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!

MensagemEnviado: 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!!!

MensagemEnviado: 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

:)

MensagemEnviado: 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

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

MensagemEnviado: 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.

MensagemEnviado: 07 Dez 2006 21:11
por lpagano
a.rairan,

Desculpe minha ignorância, :lol: 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!

MensagemEnviado: 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,

MensagemEnviado: 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!!!

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

MensagemEnviado: 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.

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

MensagemEnviado: 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