collapse

* Posts Recentes

Dúvida com fonte de alimentação comutada por filjoa
[28 de Outubro de 2024, 21:57]


Motoserra Stihl 120C por dropes
[26 de Outubro de 2024, 19:01]


Shelly em jeito de watchdog por SerraCabo
[24 de Outubro de 2024, 19:24]


Meu novo robô por josecarlos
[06 de Outubro de 2024, 13:33]


Sirene NOVA maluca por dropes
[01 de Outubro de 2024, 18:26]


Transmissão de energia sem fios por dropes
[21 de Setembro de 2024, 16:50]


Spot Welder - O que acham? por jm_araujo
[20 de Setembro de 2024, 09:34]


Fita Isoladora - Tipos ou Qualidades diferentes? por dropes
[21 de Agosto de 2024, 15:53]


Cabo/Tubo? para passar ligação sensores - horta por SerraCabo
[21 de Agosto de 2024, 12:14]


Impressora - Valerá a pena? por dropes
[16 de Agosto de 2024, 17:09]

Autor Tópico: Módulo gsm  (Lida 33429 vezes)

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

Offline jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.979
  • NERD!
Re: Módulo gsm
« Responder #60 em: 13 de Novembro de 2016, 23:12 »
O que dizes aqui:
ISR (USART_RX_vect)  diz-me  cmd_ok= TRUE; quer dizer que ja recebi tudo o que tinha a receber e que posso processar os dados.
E o que tens aqui:
Citar
Código: [Seleccione]
ISR (USART_RX_vect)
{
data_in[posicao] = UDR0;
if (data_in[posicao] != '\0' ){
posicao++;
}
if (data_in[posicao +1] == '\0'){
cmd_ok= TRUE;
}
}

São muito diferentes entre si.

Se o data_in for inicializado a 00s no reset, mal receba um carater liga logo o cmd_ok.
E não tens qualquer controlo de limites do "posição", é um buffer overflow à espera de acontecer.

( e o "led_on" apesar de em essencia não estar errado, é código muito feio. Pelo menos tira o ";" do define e mete-o na utilização, para que no código seja mais legível)
« Última modificação: 13 de Novembro de 2016, 23:18 por jm_araujo »

Offline dio123

  • Mini Robot
  • *
  • Mensagens: 1.034
Re: Módulo gsm
« Responder #61 em: 17 de Novembro de 2016, 19:15 »
E como posso saber que o ISR (USART_RX_vect)  terminou a recepção de dados? Porque o módulo nao tem uma terminação fixa, havia de ser o  \r\n , mas este aparece entre 2 a 4 vezes dependendo do comando.

Quanto ao buffer a ideia seria se ISR (USART_RX_vect)  acabou de receber tudo ou buffer size ==110  mandar a posicao = 0, seria algo assim.

Offline beirao

  • Mini Robot
  • *
  • Mensagens: 1.531
Re: Módulo gsm
« Responder #62 em: 18 de Novembro de 2016, 11:14 »
E como posso saber que o ISR (USART_RX_vect)  terminou a recepção de dados? Porque o módulo nao tem uma terminação fixa, havia de ser o  \r\n , mas este aparece entre 2 a 4 vezes dependendo do comando.

Quanto ao buffer a ideia seria se ISR (USART_RX_vect)  acabou de receber tudo ou buffer size ==110  mandar a posicao = 0, seria algo assim.

Vou responder tendo em conta que só li o tópico na diagonal.
Se a terminação pode variar com esses comandos repetidos: uma possível solução seria quando recebe o \n verifica o tamanho do buffer, se o buffer tiver dados recebidos termina a recepção e processa os dados; se o buffer estiver vazio (ou neste caso só com \r) termina a recepção mas não processa os dados. Assim de repente parece-me a melhor solução.
"O único lugar onde o sucesso vem antes do trabalho, é no dicionário" - Albert Einstein

Offline dio123

  • Mini Robot
  • *
  • Mensagens: 1.034
Re: Módulo gsm
« Responder #63 em: 30 de Novembro de 2016, 11:48 »
Encontrei um PDF, da própria Atmel com um exemplo umas funções "extras" para a comunicação uart entre elas serial.avaible que resolve o meu grande problema que tinha até agora.

Mas a minha dúvida é nos fuses do avr, que coloquei o standard.  lfuse:w:0xFF:m -U hfuse:w:0xDE:m -U efuse:w:0x05  e um atmega328p tqfp.
A minha dúvida é que atmega tem um arranque estranho.
só tenho no código dentro main ligar led 1. e no while blink led2 . Ao ligar atmega o led 1 pisca 3 vezes. E depois comeca o blink led 2. Não devia só ligar e ficar assim, e que parece que só arranca a  3 vez.  E só reparei porque noutro código a mensagem no lcd pisca 3 vezes.

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Módulo gsm
« Responder #64 em: 30 de Novembro de 2016, 12:48 »
É o bootloader do Arduino que pisca o led..
Avr fanboy

Offline dio123

  • Mini Robot
  • *
  • Mensagens: 1.034
Re: Módulo gsm
« Responder #65 em: 30 de Novembro de 2016, 13:39 »
Mas eu não instalei o bootloader do Arduino, ou que me lembre. Eu Programo pelo bitbang e faço sempre erease burn verificy. E não uso software Arduino.

Offline dio123

  • Mini Robot
  • *
  • Mensagens: 1.034
Re: Módulo gsm
« Responder #66 em: 04 de Dezembro de 2016, 23:06 »
É o ftdi que me provoca os 3 resets ao atmega.

Venho aqui deixar o link que me ajudou a resolver o meu problema uart,
http://ebook.pldworld.com/_Semiconductors/Atmel/Databook%20CDROM/Atmel/acrobat/doc1451.pdf

Apenas acrescentei isto

Código: [Seleccione]
int uart_available(void)
{
return (UART_RX_BUFFER_MASK + posicao - UART_RxTail) % UART_RX_BUFFER_MASK;
}

Offline dio123

  • Mini Robot
  • *
  • Mensagens: 1.034
Re: Módulo gsm
« Responder #67 em: 24 de Dezembro de 2016, 10:48 »
Bom dia,
Criei aqui um problema estranho, criei um if (currentMillis - previousMillis >= 8000) {} para que de 8 em 8 segundos o gajo vai me ler as coordenadas e ver se ha novas sms.

O que acontece é que se tiver memcpy (tlf -23 , data1 ,110); o  gajo passa-se e fica em loop no subprograma readsms(); e nao percebo porque pois no outro if que tinha if ((strcmp(data1, "+CMTI: \"SM\",1\r") == 0)) funcionava bem.
Nao sei se terá haver com o millis();

Código: [Seleccione]
while (1){
currentMillis = millis();
if (estado == ON){
if (currentMillis - previousMillis >= 8000) {
readsms(); // le mensagem
limpa(); //limpa variaveis
blink(); // pisca os 2 leds
previousMillis = currentMillis;
}
}
}
}

//******************************************
//  sub pragramas completares
//*********************************************
void readsms(void){
lcd_msg("lendo sms");
USART_putstring("AT+CMGR=1\r\n");
_delay_ms(100);
memcpy (tlf -23 , data1 ,110);

}
}

Offline jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.979
  • NERD!
Re: Módulo gsm
« Responder #68 em: 24 de Dezembro de 2016, 12:15 »
Os problemas que tenho visto que tens é por não conheceres muito bem a linguagem. Tens de aprofundar primeiro os teus conhecimentos de C e de apontadores. Lê o K&R de fio a pavio (é pequeno), e de certeza que muitos dos teus problemas se resolvem sozinhos ;)


Para o teu problema especifico, explica-me por palavras tuas o que achas que esta função faz:
memcpy (tlf -23 , data1 ,110);

Offline dio123

  • Mini Robot
  • *
  • Mensagens: 1.034
Re: Módulo gsm
« Responder #69 em: 24 de Dezembro de 2016, 17:08 »
Ora bem esta funcao memcpy (tlf -23 , data1 ,110);  copia as 110 posicoes  da variavel data1 para tlf anulando  as primeiras 23 posições.
Agora o 110, deveria ser 9 (que e os 9 numeros do tlf), mas a variavel tlf, fica em branco.

Offline jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.979
  • NERD!
Re: Módulo gsm
« Responder #70 em: 24 de Dezembro de 2016, 18:18 »
Ora bem esta funcao memcpy (tlf -23 , data1 ,110);  copia as 110 posicoes  da variavel data1 para tlf anulando  as primeiras 23 posições.
Agora o 110, deveria ser 9 (que e os 9 numeros do tlf), mas a variavel tlf, fica em branco.
Ora aí está.
Isso é o qu e queres, o que faz é copiar 110 bytes do data1 para a posição de memória 23 bytes antes de começar o tlf, que só tem reservados 10. Vais escrever os 23 bytes antes do tlf, e os 77 que estão depois (110=23+10+77). Ao escrever em memória  assim à toa é para encravar qq programa.