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

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

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

Mensagempor lpagano » 02 Dez 2006 19:21

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!
lpagano
Byte
 
Mensagens: 393
Registrado em: 06 Nov 2006 14:23

Mensagempor a.rairan » 03 Dez 2006 18:22

faz uma máscara...

PORTA |= (variavel_x & 0x0F);

vai pegar só a parte baixa da variável.
André "Away" Rairan
a.rairan
Byte
 
Mensagens: 192
Registrado em: 11 Out 2006 18:53
Localização: São Caetano do Sul - SP - Brasil

Mensagempor lpagano » 03 Dez 2006 18:53

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!
lpagano
Byte
 
Mensagens: 393
Registrado em: 06 Nov 2006 14:23

Mensagempor Fernando Guimarães Aguiar » 03 Dez 2006 19:16

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!!!
Avatar do usuário
Fernando Guimarães Aguiar
Nibble
 
Mensagens: 53
Registrado em: 21 Out 2006 10:54
Localização: São Carlos

Mensagempor tpfslima » 03 Dez 2006 21:21

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

:)
Thiago P. F. S. Lima
Engenheiro Eletronico
São Paulo - SP
tpfslima
Bit
 
Mensagens: 40
Registrado em: 01 Dez 2006 09:01

Mensagempor leoabubauru » 04 Dez 2006 10:55

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
Tento, tento e tento...
Me arrebento!
Também bato!
Ô negocim bunitim essa tal eletrônica de barco!
leoabubauru
Byte
 
Mensagens: 227
Registrado em: 21 Nov 2006 19:08
Localização: São Paulo

Mensagempor lpagano » 04 Dez 2006 13:52

Valeu a força pessoal!!!
lpagano
Byte
 
Mensagens: 393
Registrado em: 06 Nov 2006 14:23

Mensagempor zielpunkt » 05 Dez 2006 10:57

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.
"Talento é mais barato que sal. O que separa a pessoa talentosa da bem-sucedida é muito trabalho duro." [ Stephen King ]
zielpunkt
Byte
 
Mensagens: 376
Registrado em: 12 Out 2006 11:36
Localização: Sao Paulo - SP

Mensagempor lpagano » 07 Dez 2006 21:11

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!
lpagano
Byte
 
Mensagens: 393
Registrado em: 06 Nov 2006 14:23

Mensagempor pbernardi » 08 Dez 2006 08:25

Bom, no CCS isso é definido na biblioteca do PIC em questão. (16F877A.h no seu caso, se não me engano).

Sds,
But to us there is but one God, plus or minus one - Corinthians 8:6±2. (xkcd.com)
pbernardi
Word
 
Mensagens: 707
Registrado em: 12 Out 2006 19:01
Localização: Curitiba-PR

Mensagempor lpagano » 11 Dez 2006 10:00

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!!!
lpagano
Byte
 
Mensagens: 393
Registrado em: 06 Nov 2006 14:23

Mensagempor shhadowzone » 12 Dez 2006 07:53

Xará toma cuidado que, se eu não me engano, o RA4 é somente saída
shhadowzone
Bit
 
Mensagens: 23
Registrado em: 24 Out 2006 07:19

Mensagempor zielpunkt » 12 Dez 2006 09:01

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.
"Talento é mais barato que sal. O que separa a pessoa talentosa da bem-sucedida é muito trabalho duro." [ Stephen King ]
zielpunkt
Byte
 
Mensagens: 376
Registrado em: 12 Out 2006 11:36
Localização: Sao Paulo - SP

Mensagempor shhadowzone » 14 Dez 2006 08:15

Ops, desculpe estou confundindo com o 12F625 e um de seus pinos.
shhadowzone
Bit
 
Mensagens: 23
Registrado em: 24 Out 2006 07:19

Mensagempor a.rairan » 15 Dez 2006 21:36

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
André "Away" Rairan
a.rairan
Byte
 
Mensagens: 192
Registrado em: 11 Out 2006 18:53
Localização: São Caetano do Sul - SP - Brasil


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Bing [Bot] e 1 visitante

x