• Welcome to LusoRobótica - Robótica em Português.
 

Introdução ao avr-gcc usando o AvrStudio [Mais timers/mood light]

Started by senso, 28 de September de 2010, 01:07

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

c3dr1c

O condensador ligado ao pino 1 e ao DTR? Tá ligado, ele faz reset que eu vejo o led 13 a piscar.

Eu quando conseguia fazer upload usava um bootloader que ao fazer auto reset o led do sistema piscava varias vezes . Agora com este bootloader pisca so 3 vezes. Pode ser do bootloader?

"O único modo de descobrir os limites do possivel é aventurarmo-nos um pouco para além deles em direcção ao impossivel."

Uma das Três Leis de Arthur C. Clarke

senso

Que bootloader é?
Se for mais recente o baud-rate é 115200 e não 57600.
Avr fanboy

c3dr1c

Boa senso era mesmo isso  ;D Muito obrigado, agora vou começar o teu tutorial.

Cumps
"O único modo de descobrir os limites do possivel é aventurarmo-nos um pouco para além deles em direcção ao impossivel."

Uma das Três Leis de Arthur C. Clarke

c3dr1c

Boas senso.
Estou aqui com um problema basico. Como posso ver o printf do codigo?
Eu compilei e depois fiz build and run (penso que seja isso), mas acontece isto:

http://i46.tinypic.com/2lly5b7.jpg

Ja agora encontrei um tutorial teu, do Cynary e do Njay na net muito bom!!!

Este teu tutorial bem como o que encontrei na net deviam estar fixos no inicio do subforum "Arduino/AVR" (bem como outros importantes para a malta poder estudar). Ou ter um topico fixo no inicio do subforum com todos os links dos tutoriais. Mas isto é so uma sugestão minha para o forum.
Não tinha reparado no subforum "Tutoriais"  :P

Cumps

"O único modo de descobrir os limites do possivel é aventurarmo-nos um pouco para além deles em direcção ao impossivel."

Uma das Três Leis de Arthur C. Clarke

vdr

Tens de escolher para onde queres que o printf mande o que queres imprimir, podes usar a USART.
Tens aqui um exemplo, http://www.appelsiini.net/2011/simple-usart-with-avr-libc

senso

Eu nunca uso o printf, uso o sprintf, e depois faço o uartPuts para imprimir o buffer.
Avr fanboy

c3dr1c

Vou ver isso.
O que é o uartPuts? Isso faz-se dentro do avrstudio?

Thanks
"O único modo de descobrir os limites do possivel é aventurarmo-nos um pouco para além deles em direcção ao impossivel."

Uma das Três Leis de Arthur C. Clarke

vdr

Quote from: c3dr1c on 20 de January de 2013, 15:42
Vou ver isso.
O que é o uartPuts? Isso faz-se dentro do avrstudio?

Thanks

Penso que o uartPuts que o senso referiu era a função que ele colocou num dos primeiros tutoriais neste tópico "USART_send(unsigned char data)"

Basicamente, fazes a formatação através do sprintf e colocas a string num array de chars, depois é so ir mandando para a USART char a char.

DLM

Se eu estiver a usar o Arduino como ISP, qual opção seleciono no menu "Debug plataform"?
O Atmega em questão é um atmega8A.

migvalsan

Boas :D

tenho estado a seguir este topico e tambem eu quero largar a IDE do arduino. estou na parte do USART fiz aquele desafio do senso e correu bem, agora o que queria tentar fazer era em vez de ligar ou desligar o led com '1' ou '0', queria fazer o mesmo efeito mas por exemplo com palavras do genero ligava o led quando eu enviasse  a palavra 'Ligar' e desligava quando enviava a palavra 'desligar'.
como posso fazer isto?

cumps

Miguel

senso

Isso é manipulação (básica) de strings, idealmente devias passar a usar a UART por interrupção, depois vais metendo os caracteres que recebes num buffer, remover os /n e /r que podem por lá andar e fazer um strcmp entre a palavra ligar/desligar e a string que recebeste pela UART.
Avr fanboy

migvalsan

Quote from: senso on 25 de September de 2014, 23:38
Isso é manipulação (básica) de strings, idealmente devias passar a usar a UART por interrupção, depois vais metendo os caracteres que recebes num buffer, remover os /n e /r que podem por lá andar e fazer um strcmp entre a palavra ligar/desligar e a string que recebeste pela UART.

ok percebi essa parte mas antes disso tenho de criar uma função para chamar cada vez que quero receber uma string, andei a pesquisar na internet e achei esta função:

char * UART_GetString(char *st)

// string is returned when <enter> key is pressed
{
char c;
int count = 0;
while ((c = USART_receive()) != '\r')
{
//UART_Write(c); // echo char back to console
st[count++] = c; // add char to string
}
st[count]='\0'; // add NULL termination
USART_send('c');
return st;
}


eu entendo o que ela faz, não sei é como interagir com ela, por exemplo quero chamar esta função e guardar a string numa variavel na funão que a chamou.
como é que posso fazer isso?

Cumps

jm_araujo

Crias um array de char (em C a única maneira standard de definir uma string) e passas como parâmetro para essa função.
Se queres largar a IDE do Arduino precisas de aprender C no mínimo. Tens muita informação e não é difícil encontrar o Kernighan&Ritchie ("The C Programming Language"), a bíblia do C escrita pelos autores da linguagem.

Essa função tem uma falha grave, culpada da maior parte dos hacks, não está protegida para um buffer overrrun, se tiveres reservado 10 bytes de memória  para a string, e enviares mais para a UART vai continuar a escrever a memória com efeitos nefastos. Devia tem um parâmetro extra com o numero máximo de caracteres a ler, e dentro uma condição para limitar o count a esse valor.

artur36

Basicamente tens de chamar a função "para dentro de uma variável".
Qualquer coisa do género:

Variável= função();

Na função que deste em cima a última linha vai retornar o valor de st para a variável que definiste ao chamar a função.

Ou então usas na função uma variável que declaras-te como geral e depois no restante código podes testar directamente essa variável (funciona mas não é o correcto/ideal).

Isto é C geral, não sei se é exactamente assim que o avr-gcc funciona, mas deve ser minimamente parecido.

Edit: Parece que dei calinada, fica rasurado para não induzir em erro, sigam as indicaçãoes de quem tem mais "calo".

jm_araujo

Quote from: artur36 on 26 de September de 2014, 21:49
Basicamente tens de chamar a função "para dentro de uma variável".
Qualquer coisa do género:

Variável= função();

Na função que deste em cima a última linha vai retornar o valor de st para a variável que definiste ao chamar a função.

Ou então usas na função uma variável que declaras-te como geral e depois no restante código podes testar directamente essa variável (funciona mas não é o correcto/ideal).

Isto é C geral, não sei se é exactamente assim que o avr-gcc funciona, mas deve ser minimamente parecido.
Errado, isso não vai funcionar porque não estás a passar o apontador da string como parâmetro para a função.

Com o código mostrado precisas de ter um array de chars definido:
char s[10];
E para atribuir o valor basta usar o nome do array como parâmetro:
UART_GetString(s);

Trabalhar com apontadores é um bocado diferente, estudem sobre o assunto.