LusoRobótica - Robótica em Português
Sistemas específicos => Arduino / AVR => Tópico iniciado por: SJD22 em 02 de Maio de 2012, 00:33
-
Boa noite,
andei aqui a mexer com uns timers no meu atmega1280 e acho que lixei isto... Agora o meu firmware que lia na boa de varias portas USART, passa-se.
Basicamente queria saber se é possivel fazer reset a um atmega 1280 e mete-lo como vem de fabrica.
obg
-
A configuração de todos os periféricos é feita por software, basta meteres um programa limpo que pronto ele deixa de ter o teu código lá dentro.
Mas cheira-me a stack a rebentar..
#include <avr/io.h>
int main(void){
}
Pronto, isto não faz nada a unica coisa que esse código vai ter é os .init e o crt e os vectores de interrupção, devem ser uns 300 bytes de flash usados.
Ou então agarra no programador e faz um erase, ai fica mesmo limpinho, mas não é por limpares a flash e voltar a meter código que não funciona que o código passa magicamente a funcionar.
-
Já fiz erase... e nada...
Eu tenho isto a funcionar de forma estável há uns dias. Hoje andei a testar uns timmers para meter um led a piscar e começou a dar asneira sobretudo quando leio do módulo de GSM e envio para o ecran (entenda-se USART para o PC). Ou lixei o processador (se é que isso é possivel) ou na altura em que andei a mexer nos timmers mexi em qq coisa que agora nao me lembro...
-
Timers e UART não tem nada de nada a ver...
É impossivel estragar um micro ao mexer nos registos, afinal eles estão lá precisamente para fazermos o que queremos deles..
Posta o código se quiseres/puderes que dou uma vista de olhos.
-
Pois, tb acho que não mas então é coincidencia... mas a biblioteca que estou a usar do arduino (HardwareSerial) usa ISR e eu tb usei para "capturar" o fim do timmer e acender ou apagar o LED...
O codigo tem perto de 30 ficheiros/bibliotecas... é muita fruta... vou tentar isolar isto...
-
As ISR's são totalmente isoladas, não têm nada a ver umas com as outras.
-
Então há aqui qq azelhice minha...
-
Agora faz reset sozinho... senso, qual é mesmo a forma de ver a razao do reset? Ha um registo qq que diz isso acho eu...
-
Isso é a stack a rebentar quase quase quase de certeza.
Tens o MCUCR que te dá algumas das origens de reset, mas se for stack a ir ao ar e os endereços de return da chamada de funções estar errado, não é o MCUCR que te ajuda.
Como vai o teu projecto em termos de usagem da secção data, que corresponde á RAM?
-
Em tempos tive um problema identico e era a stack a rebentar... mas aí tinha uns 85% ocupados e agora tenho 59%... mas é como te digo esta merd* sempre funcionou até ha 5horas atras qdo mexi nos timmers...
estou a tentar isolar o problema a ver donde vem o erro...
-
Mas deixa de enviar dados ou passa-se completamente?
Podes ter deixado uma interrupção de um timer ligada que agora não tem ISR o que leva a que entres numa ISR que efectivamente não existe, dai para a frente, ele corre pela flash fora a fazer sabe-se lá o quê até dar a volta ao program counter.
-
Ele está muito bem a enviar dados para o ecran e de repente envia dados todos marados...e umas vezes ate faz reset.
Mas eu ao meter um novo firmware na flash o gajo supostamente nao iria limpar isso tudo e iria deixar de acontecer isso que dizes de ter uma interrupçao de um timer ligada sem ISR?
-
Isto começou a dar asneira quando eu meti este codigo e depois tirei:
No main:
TIMSK1=0x01; // enabled global and timer overflow interrupt;
TCCR1A = 0x00; // normal operation page 148 (mode0);
TCNT1=0x0000; // 16bit counter register
TCCR1B = 0x04; // start timer/ set clock
Fora do main:
ISR(TIMER1_OVF_vect) {
// blah blah
}
-
Isto está cada vez pior... :) Mais uma pista:
Se meter este código
Serial0.println("1");
delay(1000);
Serial0.println("2");
delay(1000);
Serial0.println("3");
delay(1000);
Serial0.println("4");
delay(1000);
Serial0.println("5");
delay(1000);
Serial0.println("6");
delay(1000);
Serial0.println("7");
recebo na boa no PC os numeros....
Mas se tirei os delay não recebo rigorosamente nada.
Eu palpita-me que com o codigo que meti no meu post de cima alterei alguma frequencia qq...
-
Se apagas-te tudo, não tem nada que ter problema..
Até porque isso envolve unicamente o timer e nada mais.
Não será que estás a ligar o terminal depois de ele imprimir isso, abre o terminal e dá um reset ao Arduino..
-
O terminal está sempre ligado. Tenho isto assim ha imensos dias a funcionar... foi desde que andei a brincar com os timmers que isto se lixou... Nao tarda mto lixo com isto! :D
-
E programas via ISP?
Mesmo assim eu dava-lhe um reset.
Podes é ter apagado código que não devias ou tens para ai algo que não devias..
-
Estou a usar um Dragon para programar.
Neste momento tenho uma versao do codigo que tinha feito na vespera e funcionava... agora nao funciona... :)
Dar reset ao processador nao é o mesmo que desligar e voltar a ligar?
-
Sim, é precisamente a mesma coisa.
Ou tens algo mal ligado agora ou o código já tinha problemas...
Alteras-te alguma flag de compilação ou algum dos outros ficheiros que estás a incluir?
Pode ter sido uma modificação noutro sitio e nem te lembras..
Por isso é que mesmo para projectos pessoais um svn no google code vale ouro.
-
Nao alterei nada... acho eu.... as vezes o cansaço prega algumas partidas, mas acho que nao!
Mas espera que isto agora está a dar... Cada vez percebo menos disto... apenas fiz reset e desliguei o cabo do Dragon.... e agora dá....
-
Tens alguma coisa dependente de SPI?
-
Tenho sim. Tenho um cartão SD.
Mas olha que tanto o cartão como o programador estiverem ligados durante dias e dias seguidos sem problemas...