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

"RESET" a um ATMega1280

Started by SJD22, 02 de May de 2012, 00:33

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

SJD22

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

senso

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.
Avr fanboy

SJD22

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

senso

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.
Avr fanboy

SJD22

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

senso

As ISR's são totalmente isoladas, não têm nada a ver umas com as outras.
Avr fanboy

SJD22

Então há aqui qq azelhice minha...

SJD22

Agora faz reset sozinho... senso, qual é mesmo a forma de ver a razao do reset? Ha um registo qq que diz isso acho eu...

senso

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?
Avr fanboy

SJD22

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

senso

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.
Avr fanboy

SJD22

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?

SJD22

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
}

SJD22

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

senso

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..
Avr fanboy