Página 1 de 1

TEM COMO FAZER STRUCT COM PINOS DO uC?

MensagemEnviado: 22 Set 2011 09:09
por daniel.sloczynski
Buenas senhores!!!

Preciso da ajuda de vocês novamente... Já antecipo desde já agradecimentos.


Como podem ver, o código abaixo é a definição dos pinos de um display gráfico.
O que acontece é o seguinte:

O DATA_PORT foi configurado como sendo o porte. Oito pinos são os dados, E0 à E7.

Mas neste port tem mais dois pinos que eu uso para outras funções (interrupt externa).

Então como na função eu digo que dados = porte ela manda dados para todos os pinos, inclusive os pinos da interrupt.

Tentei fazer um struct com os pinos, para dizer que de somente de E0 à E7 são dados, mas não obtive sucesso;


Alguém tem uma sugestão?

E antes que me perguntem, eu tô usando o PIC32, e sim, ele tem porte com 10 pinos xP



Código: Selecionar todos

#define DATA_PORT PORTB       
#define TRIS_DATA_PORT  TRISB

#define RW_PIN   LATDbits.LATD6       
#define TRIS_RW  TRISDbits.TRISD6             

#define E_PIN    LATDbits.LATD7       
#define TRIS_E   TRISDbits.TRISD7 

#define DI_PIN LATDbits.LATD5
#define TRIS_DI TRISDbits.TRISD5     

#define CS1_PIN LATDbits.LATD4
#define TRIS_CS1 TRISDbits.TRISD4

#define CS2_PIN LATDbits.LATD3
#define TRIS_CS2 TRISDbits.TRISD3

#define RST_PIN PORTDbits.RD2
#define TRIS_RST TRIDbits.TRISD2


[/code]

MensagemEnviado: 22 Set 2011 10:54
por Karllao99
Pode sim, mas vc deve informar o endereço que essa struct vai ocupar. A instrução que faz isso depende do compilador, no caso do mikroC é "absolute". Ex:
struct SPORTA
{
short int RA0 : 1;
short int RA1 : 1;
short int RA2 : 1;
short int RA3 : 1;
short int RA4 : 1;
short int RA5 : 1;

}Reg_PORTA absolute 0x05;

MensagemEnviado: 23 Set 2011 08:00
por ze
não conheço o pic32 mas vou xutar. Ao enviar 10 bits para o port, sendo que 2 são entrada, ele não deveria ignorar? como ele está jogando nivel numa entrada? Bom mas digamos que isto ocorre só no zero e esteja incomodando a interrupção, então voce pode fazer
PORTE=dado | 0b1100000000; e para ler dado=PORTE & 0b0011111111;
abç

MensagemEnviado: 24 Set 2011 10:18
por daniel.sloczynski
Buena galera!!!

Consegui solucionar o problema, jogando o que eu quero escrever no PORT através da variável "valor".

Antes eu jogava diretamento como valor = PORTE e pelo que simulei ele tentava dividir o valor em 10 bits, mesmo os dois últimos sendo configurados como entrada.


Código: Selecionar todos
extern void recebe_dados (unsigned char valor)
{
char aux[10]={valor,valor>>1,valor>>2,valor>>3,valor>>4,valor>>5,valor>>6,valor>>7,valor>>8};
D0_PIN=aux[0];
D1_PIN=aux[1];
D2_PIN=aux[2];
D3_PIN=aux[3];
D4_PIN=aux[4];
D5_PIN=aux[5];
D6_PIN=aux[6];
D7_PIN=aux[7];
}



D0 a D7 são respectivamente os pinos 0 a 7 do PORTE;

Funcionou legal assim, talvez tenha um jeito mais "bonito", mas enfim, funcionou.

Agora falta fazer a parte de ler um valor, creio que seja o processo inverso, mas aí vou ter configurar o tris como entrada....

Alguém tem uma sugestão?


Obrigado pela ajuda pessoal.

Abraço![/code]

MensagemEnviado: 26 Set 2011 09:54
por ze
pelo "galera" vi que seu nível é superior. Mesmo assim permita-me opinar sobre um miniotimazação do seu cod. Não precisa da variável char[10] dentro da função. look:
extern void recebe_dados (unsigned char valor)
{
D0_PIN=valor>>0;//(!)
D1_PIN=valor>>1;
...
}
Mas isso é valido quando quer distribuir bits entre ports DIFERENTES ou de forma aleatória no mesmo port. Quando no mesmo e sequencial, creio que deve considerar o post anterior e verificar a parte prática. Nela a teoria é outra. (se já o fez, desconsidere). Quanto a remontar o byte... bom espere alguma contribuição da "galera".
boa sorte

MensagemEnviado: 27 Set 2011 18:15
por daniel.sloczynski
Ok, obrigado pela ajuda, mesmo.


Não entendi sua colocação de meu "nível ser superior".

Desculpa se lhe ofendi por ter falado "galera", e o senhor se ofender. Não foi com a intenção de chamar de "piá de m****", como dizem aqui no sul.

Simplesmente só achei que não necessitava de tanta formalidades...


Enfim, eu sei muito pouco, perto do que os outros sabem... Mas tento aprender e repassar.

Um abraço!