UART em 'C'

Software e Hardware para uC PSoC

Moderadores: andre_luis, 51

UART em 'C'

Mensagempor thairone » 28 Mai 2007 09:43

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.
thairone
Bit
 
Mensagens: 13
Registrado em: 03 Mai 2007 14:07

Mensagempor mrtabs » 28 Mai 2007 13:06

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)...
mrtabs
Nibble
 
Mensagens: 70
Registrado em: 24 Out 2006 09:27
Localização: Santos e/ou Sao Paulo

Mensagempor Ricardo_Franco » 29 Mai 2007 11:09

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.
Ricardo Franco
____________________________________________________________________________________________
web: www.engricardofranco.kit.net
Skype: engricardofranco
Fone Skype: (19) 3119-8162
Ricardo_Franco
Byte
 
Mensagens: 305
Registrado em: 11 Out 2006 20:53
Localização: Campinas - SP

Mensagempor marcelo » 29 Mai 2007 13:20

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.html

Boa Sorte.


Ricardo, como vai?

Qual programa que você utilizou para gravar esta video demostração?

Sds,


Marcelo
marcelo
Bit
 
Mensagens: 42
Registrado em: 11 Out 2006 14:50
Localização: São Paulo

Mensagempor Ricardo_Franco » 29 Mai 2007 13:34

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.
Ricardo Franco
____________________________________________________________________________________________
web: www.engricardofranco.kit.net
Skype: engricardofranco
Fone Skype: (19) 3119-8162
Ricardo_Franco
Byte
 
Mensagens: 305
Registrado em: 11 Out 2006 20:53
Localização: Campinas - SP

em 'C'

Mensagempor thairone » 29 Mai 2007 15:11

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.
thairone
Bit
 
Mensagens: 13
Registrado em: 03 Mai 2007 14:07

Re: em 'C'

Mensagempor andre_luis » 29 Mai 2007 15:17

Para ativar a interrupção, voce deve editar o vetor no arquivo boot.asm
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Valeu

Mensagempor thairone » 29 Mai 2007 15:33

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.
thairone
Bit
 
Mensagens: 13
Registrado em: 03 Mai 2007 14:07

Aind ana mesma dúvida

Mensagempor thairone » 01 Jun 2007 14:50

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)
thairone
Bit
 
Mensagens: 13
Registrado em: 03 Mai 2007 14:07

Mensagempor Ricardo_Franco » 01 Jun 2007 15:24

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
Ricardo Franco
____________________________________________________________________________________________
web: www.engricardofranco.kit.net
Skype: engricardofranco
Fone Skype: (19) 3119-8162
Ricardo_Franco
Byte
 
Mensagens: 305
Registrado em: 11 Out 2006 20:53
Localização: Campinas - SP

o valor ASCII e nãoa reprsentação char do ascii

Mensagempor thairone » 01 Jun 2007 17:34

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.
thairone
Bit
 
Mensagens: 13
Registrado em: 03 Mai 2007 14:07

Mensagempor Ricardo_Franco » 01 Jun 2007 20:17

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
Ricardo Franco
____________________________________________________________________________________________
web: www.engricardofranco.kit.net
Skype: engricardofranco
Fone Skype: (19) 3119-8162
Ricardo_Franco
Byte
 
Mensagens: 305
Registrado em: 11 Out 2006 20:53
Localização: Campinas - SP

legal, quase isso.

Mensagempor thairone » 04 Jun 2007 11:36

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
thairone
Bit
 
Mensagens: 13
Registrado em: 03 Mai 2007 14:07

Mensagempor Ricardo_Franco » 05 Jun 2007 21:54

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 ????
Ricardo Franco
____________________________________________________________________________________________
web: www.engricardofranco.kit.net
Skype: engricardofranco
Fone Skype: (19) 3119-8162
Ricardo_Franco
Byte
 
Mensagens: 305
Registrado em: 11 Out 2006 20:53
Localização: Campinas - SP

Mensagempor thairone » 11 Jun 2007 13:45

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.
thairone
Bit
 
Mensagens: 13
Registrado em: 03 Mai 2007 14:07


Voltar para Cypress

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x