collapse

* Links de Robótica

* Posts Recentes

Feira de electricidade e eletrónica por artur36
[Ontem às 23:07]


Power_OK Enermax por almamater
[Ontem às 12:10]


Recomendação de um opamp para um DAC r2r por jm_araujo
[23 de Novembro de 2017, 10:48]


RN42 e TP-Link MR3020 por doiga
[22 de Novembro de 2017, 19:22]


Ajuda Projecto IR / RF por senso
[22 de Novembro de 2017, 13:15]


Ideias para construir um quadrúpede simples por dropes
[21 de Novembro de 2017, 22:43]


Ajuda com TRIAC por senso
[17 de Novembro de 2017, 18:00]


TV LG White Screen por almamater
[15 de Novembro de 2017, 08:37]


Pergunta sobre prototipagem ( Pesquisa ) por luisjustin
[14 de Novembro de 2017, 23:22]


Medir Agua que está no Poço por Njay
[14 de Novembro de 2017, 13:28]

Autor Tópico: AVR - UART Receive  (Lida 2689 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline SJD22

  • Mini Robot
  • *
  • Mensagens: 660
AVR - UART Receive
« em: 14 de Setembro de 2011, 01:32 »
Boas.

Estou de volta da programação do meu atmega1280 mas saltando por cima do Arduino. Estou a trabalhar directamente no AVR Studio, embora com um editor externo... Adiante...

Estou a tentar fazer um método para receber dados pela UART. Estou a usar um módulo GM862 e consigo enviar os dados na boa, mas receber as coisas sao mais complicadas. So consigo receber 3 caracteres e depois não recebo mais nada. A ideia é fazer um metodo amigável tipo o Serial.Read() que existe na plataforma do Arduino.

O código para receber que estou a usar é este:

Código: [Seleccione]
uint8_t USART_vReceiveByte() {
while((UCSR1A&(1<<RXC1)) == 0) {
};
return UDR1;
}

Ajudas?

Obg.
« Última modificação: 14 de Setembro de 2011, 01:38 por SJD22 »

Offline CBX

  • Mini Robot
  • *
  • Mensagens: 1.315
Re: AVR - UART Receive
« Responder #1 em: 14 de Setembro de 2011, 01:53 »
esse excerto de código só está a retornar 1 caracter, precisas de um buffer para armazenar temporariamente o que estás a receber

Offline xiserre

  • Mini Robot
  • *
  • Mensagens: 277
Re: AVR - UART Receive
« Responder #2 em: 14 de Setembro de 2011, 01:54 »
ja experimentaste utilizar a interrupção que e gerada quando a usart recebe um byte?? lol
Tipo, quando a interrupçao acontece, les o byte e ta feito.. Nao te bloqueia o codigo..

Offline SJD22

  • Mini Robot
  • *
  • Mensagens: 660
Re: AVR - UART Receive
« Responder #3 em: 14 de Setembro de 2011, 02:02 »
CBX: isso mesmo. O que eu faço é executar esse codigo infinitamente ate encontrar o terminador de linha.... mas ele so recebe 3 caracters :( Como faço isso do buffer?
xiserre: como faço isso? :) Mas por acaso eu quero que bloqueie o codigo ate encontrar o caracter termiandor de linha...

Estas programações de baixo nivel trocam-me todo... :)

Obg.

Offline xiserre

  • Mini Robot
  • *
  • Mensagens: 277
Re: AVR - UART Receive
« Responder #4 em: 14 de Setembro de 2011, 02:13 »
nao precisas de bloquear enquanto nao recebes o carry... Quando recebes tudo, activas uma flag... Configuras a usart para activar a  interrupçao de rx complete, e trabalhas dentro dessa rotina..

Offline SJD22

  • Mini Robot
  • *
  • Mensagens: 660
Re: AVR - UART Receive
« Responder #5 em: 14 de Setembro de 2011, 23:52 »
Isto está a tornar-se doloroso... sem código de exemplo não chego lá.
 :(
Ninguém tem exemplos concretos?

Obg

Offline CBX

  • Mini Robot
  • *
  • Mensagens: 1.315
Re: AVR - UART Receive
« Responder #6 em: 15 de Setembro de 2011, 00:37 »
1º precisas de criar um array para armazenar a palavra que recebes:

Código: [Seleccione]
char buffer[10];
depois precisas de uma variável que receba o caracter do registo UDR:

Código: [Seleccione]
X = UDR1;
e de outra que diga qual a posição no array, Y

depois basta mandar os caracteres 1 a 1 para o array:

Código: [Seleccione]
buffer[Y] = X; //copia o valor do UDR1 para a posição Y do array
Y++;
}

não sei se me fiz entender, alguma duvida diz...
« Última modificação: 15 de Setembro de 2011, 00:38 por CBX »

Offline SJD22

  • Mini Robot
  • *
  • Mensagens: 660
Re: AVR - UART Receive
« Responder #7 em: 15 de Setembro de 2011, 01:23 »
Percebi tudo CBX, obrigado,  mas eu se calhar não me expliquei bem logo ao inicio.

É assim:

1) envio um comando AT na boa para o módulo
2) estou a usar esta função:
Código: [Seleccione]
uint8_t USART_vReceiveByte() {
while((UCSR1A&(1<<RXC1)) == 0) {};
return UDR1;
}

3) Essa função de cima é chamada dentro de um ciclo while. Dentro desse ciclo while eu mostro no ecran (neste caso envio para a porta de serie que está ligada ao computador) o que recebi atraves dessa função.

Ou seja, neste caso nao preciso de acumular nada num array porque envio para o ecran.

Acontece que so recebo meia duzia de caracteres e nao a totalidade do que deveria receber... :(

« Última modificação: 15 de Setembro de 2011, 01:25 por SJD22 »

Offline zordlyon

  • Mini Robot
  • *
  • Mensagens: 1.708
Re: AVR - UART Receive
« Responder #8 em: 15 de Setembro de 2011, 08:25 »
isso é simples, é devido ao Return...

O return é a mesma coisa que um "break" num case... ele acaba-te essa função assim que faz return..

Agora não percebo é como ele até manda 3 caracteres, porque com esta logica so mandaria 1 e acabava..

Isso de estar dentro de um while infinito não interessa, quando fazer return, ele sai da função, voltando para o proximo passo no main..

Cumprimentos,
André Carcalho.

Offline SJD22

  • Mini Robot
  • *
  • Mensagens: 660
Re: AVR - UART Receive
« Responder #9 em: 15 de Setembro de 2011, 09:47 »
Não percebeste o que eu disse. Essa função faz return e retorna-me o caracter. Mas a chamada a essa função está dentro de outro ciclo WHILE. Ou seja, a função está infinitamente a ser chamada.

Isto está assim:

Código: [Seleccione]
uint8_t u8Data;
while(true) {
    u8Data = USART_vReceiveByte();
    // Nesta linha mostra o caracter recebido no computador.
}

Ou seja, isso deveria mostrar-me tudo o que é recebido... certo?

Offline zordlyon

  • Mini Robot
  • *
  • Mensagens: 1.708
Re: AVR - UART Receive
« Responder #10 em: 15 de Setembro de 2011, 11:40 »
Certo, mas quando ele não recebe nada fica ali em ciclo infinito, e não será por estar bastante tempo em ciclo infinito e como não tens grande poder de processamento, ele não crasha?

Eu sou da opinião de que, se usasses um array era muito mais simples..

Sempre que mandavas um caracter ou mensagem criavas um array dinamico com o tamanho do caracter e depois bastava ler o array..
Para teres o tamanho da mensagem, bastava ao escreveres a mensagem, chamavas uma função lenght() em que te percorria a mensagem e via o tamanho..depois fazias um concat() e adicionavas ao fim da mensagem o tamanho da mensagem.
Ao ler, percorrias o array até ao fim, e depois fazias um malloc() com o tamanho da mensagem..


Cumprimentos,
André Carvalho.

Offline terran

  • Mini Robot
  • *
  • Mensagens: 47
Re: AVR - UART Receive
« Responder #11 em: 15 de Setembro de 2011, 17:20 »
Viva, porque não fazes uma trama quando envias? Tipo, fazes bloco de mensagem fixa e as que tiverem pouco, acrescenta com "bolas de ar".  Tipo SDH (não sei se sabes o que é)

Deste género |# | 1 | 2 | 3 |  em que sabes que sempre que recebes um #, é o início da informação, assim, sempre que vais recebendo fazes como já foi dito (a operação do array). Quando receberes um novo "#" sabes que tens de preencher um novo array. Pegas no que já recebeste e mandas processar, e por aí a fora ....

PS: Se encontrar esse código que fiz em tempos, eu depois mando-te (se até lá não conseguires resolver o problema).

Offline zordlyon

  • Mini Robot
  • *
  • Mensagens: 1.708
Re: AVR - UART Receive
« Responder #12 em: 15 de Setembro de 2011, 17:25 »
Viva, porque não fazes uma trama quando envias? Tipo, fazes bloco de mensagem fixa e as que tiverem pouco, acrescenta com "bolas de ar".  Tipo SDH (não sei se sabes o que é)

Deste género |# | 1 | 2 | 3 |  em que sabes que sempre que recebes um #, é o início da informação, assim, sempre que vais recebendo fazes como já foi dito (a operação do array). Quando receberes um novo "#" sabes que tens de preencher um novo array. Pegas no que já recebeste e mandas processar, e por aí a fora ....

PS: Se encontrar esse código que fiz em tempos, eu depois mando-te (se até lá não conseguires resolver o problema).

Isso so tem o problema de ter memória desperdiçada, isso é um array fixo, com ou sem bolas de ar não interessa..ta lá o espaço ocupado..daí o malloc ter a sua vantagem, aloca aquilo que é necessário...mas não discordo da sua opinião, além de válida se for para uma coisa simples só para testes ou assim é mais que válida..  ;)

Cumprimentos,
André Carvalho.

Offline CBX

  • Mini Robot
  • *
  • Mensagens: 1.315
Re: AVR - UART Receive
« Responder #13 em: 15 de Setembro de 2011, 18:21 »
não precisa de saber quando começa, apenas quando acaba, um simples if (UDR == 0x0D) {"contador" = 0} para reiniciar o contador quando tens uma break line serve (se não me engano o 0X0D é igual a /n)

@ SJD22 é mais fácil se mostrar o código inteiro...

Offline terran

  • Mini Robot
  • *
  • Mensagens: 47
Re: AVR - UART Receive
« Responder #14 em: 15 de Setembro de 2011, 19:06 »

Isso so tem o problema de ter memória desperdiçada, isso é um array fixo, com ou sem bolas de ar não interessa..ta lá o espaço ocupado..daí o malloc ter a sua vantagem, aloca aquilo que é necessário...mas não discordo da sua opinião, além de válida se for para uma coisa simples só para testes ou assim é mais que válida..  ;)

Cumprimentos,
André Carvalho.

Yeap, tem toda a razão... quando usei tinha tamanho de tramas fixas, daí ter falado nas "bolas de ar" pois como tinha CRC, e essa fórmula era fixa nos n cálculos, tinha de usar dessa maneira... Mas claro que é muito mais vantajoso ter um array dinâmico, só a memória que se poupa..... (já nem me lembrava do mallcoc :S).

Um aparte, podes colocar aí um exemplo do malloc? :D