Página 1 de 1
UART em 'C'

Enviado:
28 Mai 2007 09:43
por thairone
Alguém por aqui já utilizou comunicação serial no Psoc em 'C'? Como defino que pino do Uc usar? Não quero usar o conector Db9 do kit quero usar diretamento no barramento dos pinos do Uc, pois não se trata de uma conexão entre o kit e um pc, mas enviar dados para um LCD serial, entre outras coisas. O mesmo vale para que eu possa utilizar um giroscópio.

Enviado:
28 Mai 2007 13:06
por mrtabs
vc tem q colocar um bloquinho de UART...ai, dependendo da posicao que vc alocar ele, ha certos pinos que podem ser usados (há uma flexibilidade, mas nao sao todos os pinos que sao disponiveis)...olhe um exemplo que use a serial (DB9)...

Enviado:
29 Mai 2007 11:09
por Ricardo_Franco
Ola Senhores.
Bom Thairone depende o que você quer fazer.
Eu não conheço este LCD, se ele trabalhar com o padrão EIA-RS232, então você precisa sim utilizar um line driver (max232), agora se ele trabalhar com o padrão TLL (o que eu imagino que deva ser), então você pode tirar direto do pino.
Veja este vídeo que eu preparei, onde eu mostro como é feito um projeto inteiro, inclusive a parte de rotear pinos.
O vídeo tem uns 50Mb, mas eu acho que vale a pena.
http://rapidshare.com/files/34056533/Ri ... m.wmv.html
Boa Sorte.

Enviado:
29 Mai 2007 13:20
por marcelo
Ricardo_Franco escreveu:Ola Senhores.
Bom Thairone depende o que você quer fazer.
Eu não conheço este LCD, se ele trabalhar com o padrão EIA-RS232, então você precisa sim utilizar um line driver (max232), agora se ele trabalhar com o padrão TLL (o que eu imagino que deva ser), então você pode tirar direto do pino.
Veja este vídeo que eu preparei, onde eu mostro como é feito um projeto inteiro, inclusive a parte de rotear pinos.
O vídeo tem uns 50Mb, mas eu acho que vale a pena.
http://rapidshare.com/files/34056533/Ri ... m.wmv.htmlBoa Sorte.
Ricardo, como vai?
Qual programa que você utilizou para gravar esta video demostração?
Sds,
Marcelo

Enviado:
29 Mai 2007 13:34
por Ricardo_Franco
Ola Senhores.
Marcelo eu usei o software "ACA Screm Recorder 2.02", e depois o movie maker para edição.
Fica bem caseiro mas é relativamente rapido de montar os videos.
em 'C'

Enviado:
29 Mai 2007 15:11
por thairone
o LCD em questão possui um módulo serial (nível TTL). Na verdade o LCD não nem o caso, ele é só para saber como fazer isso em C, pois minha dúvida é quais e quantos pinso eu posso usar como IO serial? Como setalos? Como ativivar uma interrupção nestes pinos? enviar e receber dados serialmente?
Ainda não vi o video, estou baixando. Mas tenho certeza que deva me ajudar.
Outra coisa, tudo isso em C. e no Designer e não no Express.
Re: em 'C'

Enviado:
29 Mai 2007 15:17
por andre_luis
Para ativar a interrupção, voce deve editar o vetor no arquivo boot.asm
Valeu

Enviado:
29 Mai 2007 15:33
por thairone
Valeu pela ajuda galera.
Descobri.
baixei os arquivo da AN2399
copiei tx8sw.asm, tx8sw.h e tx8sw.inc para o meu projeto
dei um #include "TX8SW.h" no main.c
ai foi só:
void TX8SW_Start(void)
void TX8SW_PutString(char * szRamString)
//– Send NULL terminated string via TX8SWPin.
void TX8SW_CPutString(const char * szRomString)
//– Send NULL terminated constant (ROM) string via TX8SWPin.
void TX8SW_PutChar(CHAR cData)
//– Send character via TX8SWPin.
void TX8SW_Write(char * szRamString, BYTE bCount)
//– Send bCnt bytes from aStr array via TX8SWPin.
void TX8SW_CWrite(const char * szRomString, INT iCount)
//– Send iCnt bytes from constant aStr array via TX8SWPin.
void TX8SW_PutSHexByte(BYTE bValue)
//– Send a two character HEX representation of bValue via TX8SWPin.
void TX8SW_PutSHexInt(INT iValue)
//– Send a four character HEX representation of iValue via TX8SWPin.
void TX8SW_PutCRLF(void)
//– Send a carriage return (0x0D) and a line feed (0x0A) via TX8SWPin.
Aind ana mesma dúvida

Enviado:
01 Jun 2007 14:50
por thairone
Olá pessoal, eu descobrir o primeiro erro. Não sei se o kit de vcs tb é assim, mas o meu possui um jumper que chaveia o VCC do kit ou com 5V ou com 3.3V. e o meu LCD em questão precisa de 5v, dai eu tirei o jamper e parte dos problemas foram resolvidos. Faltou somente uma forma de enviar atraves do mesmo comendo uma sequência de bytes serialmente.
Acho que esta função descrita pela assinatura abaixo pode resolver esse problema, mas alguém já usou isso?
void UART_Write(char * szRamString, BYTE bCount)
O meu intuito é conseguir enviar dados serialmente num único comando e esses dados de preferência serial em código ASCII ou exadeciamais
Ex: send(254,1,3,5,8)
ou send(0x0d,0xef)

Enviado:
01 Jun 2007 15:24
por Ricardo_Franco
se forem constantes ..
UART_CPutString ("Transmissão de até 32 bytes"); // Esse esta em ASCII
Para variaveis..
UART_PutString(Variavel); // Também em ASC mas esta em uma variavel .. até 32 bytes.
Para um unico Byte.
UART_SendData(Variavel); // Declarar varaivel do tipo BYTE
Para BYTE em Hexadecimal
UART_PutSHexByte(Variavel); // Envia valor em Hexadecimal...
Boa Sorte..
Ricardo Franco
o valor ASCII e nãoa reprsentação char do ascii

Enviado:
01 Jun 2007 17:34
por thairone
Ricardo, obrigado pela dica, mas não é bem isso que eu quero.
No meu caso o LCD, trabalha com comandos em ascii (código ascii)
Vou simplicar, esqueça o asccii, o lcd trabalha com alguns comandos em modo texto, para isso ele espera um comando como prefixo para entender que o proximo dado será o comando.
Por exemplo: <254><1> se eu enviar o caracter ascii 254 seguido do caracter ascii 1 ele limpra a tela. o 254 é o caracter de prefixo. Mas eu posso enviar o valor dele hexadecimal, não tem problema. A questão é q pra isso funcionar o lcd recebe pela serial e guarda num buffer e lê byte a byte e excuta o que precisa.
Para isso, no caso de um comando, eu preciso usar um byte para o caracter 254+1byte para o caracter 1.
A sua dica com a string já faz isso, já q uma string será enviada como uma sequência de caracteres, cada um com um byte. até blz, mas eu não posso enviar nada alem de caracteres que o tipo string suporte. e como fazer isso, lembra do exemplo acima? o 1 enviado não foi o caracter ('1'), mas sim o código ascii 1 que representa um caracter não imprimivel.
o UART_write poderia fazer isso, pois eu enviaria uma sequência de bytes e no parametro que determina a quantidade de bytes eu informaria 2 e usuaria um byte inteiro para escrever o 254 e um byte inteito para escrever o 1.

Enviado:
01 Jun 2007 20:17
por Ricardo_Franco
Ola Senhores
Amigo Thairone, dexe-me ver se entendi, se for o caso a gente tenta de novo, você precisa enviar o byte de caracteres e um ultimo de controle, este ultimo de controle é um caractere não imprimível em ASCII por isso fica difícil envia-lo pelas funções normais da serial certo?
Bom se for isso eu preparei uma rotina que deve resolver seu problema, ela utiliza ponteiro para imprimir o caractere não imprimível na string, preparei com um vetor de 16 caracteres, mas você pode alterar se precisar de menos..
Veja se esta rotina ajuda, qualquer problema post novamente que tentarei ser mais claro.
void Mensagem(void)
{
char *ptoPonteiro;
char strString[16]; // neste caso monte sua string com o tamanho que quiser.
// esta string é para 16 caracter + 1 contagem de 0 a 16 total 17 caracteres
*ptoPonteiro = 1; // valor DECIMAL para o ponteiro.
cstrcpy(strString, "Frase até 16 chr"); //
strcat(strString, ptoPonteiro); // concatena o valor do ponteiro na ultima posição da string
UART_PutString(strString); // Envia toda a string + o valor do ponteiro
}
Ricardo Franco
legal, quase isso.

Enviado:
04 Jun 2007 11:36
por thairone
Ricardo, obirgado mais uma vez. Isso também funciona, mas com string.
o que eu queria era algo como este código aqui:
Dim bytSequence() As Byte = {&H83, &H45, &H33, &H88}
SendBytes(bytSequence)
Public Sub SendBytes(ByVal data() As Byte)
SerialPort1.Write(data, 0, data.Length)
End Sub
mas em C

Enviado:
05 Jun 2007 21:54
por Ricardo_Franco
Ola Thairone.
Desculpe a demora para a resposta mas final de semestre é foquete, tenho que começar a garantir o semestre que vem (heheh)
Bom eu não entendo muito de basic, mas a primeira parte eu entendi a segunda não.
Depois de mais um tiro na água, vamos ver se posso te ajudar.
Próximo tiro ...
//----------------------------------------------------------------------------
// C main line
//----------------------------------------------------------------------------
#include <m8c.h> // Biblioteca do nucleo do PSoC
#include "PSoCAPI.h" // Habilita todas as API's do PSoC
#include "Ports.h" // Port pino a pino
#include <UART.h> // Funções da Uart
#include <string.h> // Biblioteca de manipulação de strings
void main() // programa principal
{
BYTE bytSequence[3]; // vetor com 4 posições
BYTE i; // indice do laço for
bytSequence[0] = 0x83; //Valores para cada posição do vetor
bytSequence[1] = 0x45; //
bytSequence[2] = 0x33; //
bytSequence[3] = 0x88; //
for(i=0; i<=3; i++) // laço que envia os dados pela serial em HEXADECIMAL.
{
UART_PutSHexByte(bytSequence[i])
}
}
Então pelo menos a primeira parte..
pequei ao menos a asa de um hidro-avião ????

Enviado:
11 Jun 2007 13:45
por thairone
Legal, mas ainda é a mesma coisa. Esse comando envia um byte de controle no final da transmissão. Não serve.
o omando é o uart_write mesmo
ele envia uma sequencia d ebytes e vc usa o último parametro para indicar qts bytes foram.
Mas valeu assim mesmo.