ATMEGA32 + rfm12 -> kleines bootloader problem

Gast #2136050
Lesenswert?

Hallo

Ich habe ien klines problem mit einem bootloader.
Wenn ich den ATMEGA32 + rfm12 Modul einschalte, dann startet der 
Bootloader, wartet bis zu 3 sekunden, wenn er da ein paket bekommt, dann 
flasht er die neue Firmware -> das funktioniert ohne probleme.

Wenn ich aber nur den ATMEGA32 resete, dann startet der bootloader, 
bekommt aber keine Pakete und nach 3 sekunden wird die applikation 
(Ethersex gestartet)

Wenn ich den ATMEGA32 resetet, während dem reset, das rfm12 modul die 
versorgugnsspannung nehme und wieder gebe, dann den resettaster 
auslasse, dann funktioniert der bootloader auch.

-> Daher ist meine vermutung, das irgendeine initialisierung vom e6 
nicht mehr zurückgenommen wird.
Allerdings konnte ich keine Commands finden, die ein rfm12 Modul Reseten 
...

Hier meine init funktionen
1
  for (i=0; i<15; i++)
2
    _delay_ms(10);
3

4
  rfm12_trans (0xC0E0);    /* AVR CLK: 10MHz */
5
  //  rfm12_trans (0x80D7);    /* Enable FIFO */
6
  rfm12_trans (0x80E7);    /* Enable FIFO */
7
  rfm12_trans (0xC2AB);    /* Data Filter: internal */
8
  rfm12_trans (0xCA81);    /* Set FIFO mode */
9
  rfm12_trans (0xE000);    /* disable wakeuptimer */
10
  rfm12_trans (0xC800);    /* disable low duty cycle */
11
  rfm12_trans (0xC4F7);          /* autotuning: -10kHz...+7,5kHz */
12
  rfm12_trans (0x0000);
13

14
  //rfm12_trans (0xa620);    /* rfm12_setfreq(RFM12FREQ(433.92)) */
15
  rfm12_trans (0xa7c1);    /* rfm12_setfreq(RFM12FREQ(869.925)) */
16
  rfm12_trans (0x94ac);    /* rfm12_setbandwidth(5, 1, 4); */
17
  rfm12_trans (0xc610);    /* rfm12_setbaud(19200); */
18
  rfm12_trans (0x9820);    /* rfm12_setpower(0, 2); */

beim warten auf das erste paket dann
1
static void funkloader_rx () {
2
  rfm12_trans(0x82C8);    /* RX on */
3
  rfm12_trans(0xCA81);    /* set FIFO mode */
4
  rfm12_trans(0xCA83);    /* enable FIFO */
5
  
6
  if (rfm12_wait_read () != 0) goto out;      /* Discard (upper) length byte */

die rfm12_wait_read .... wartet dann das der PD3 (INT1) auf Lowlevel 
geht, also wird nicht per Interrupt gemacht sondern einfach ein warten 
...

beim starten des bootloaders mache ich ein
1
    ldi  r28, lo8(RAMEND)    
2
  ldi  r29, hi8(RAMEND)    
3
  out  SPH, r29        
4
  out  SPL, r28        
5

6
  eor  r1, r1
7
  out  SREG, r1
8
  ldi  r16, _BV (IVCE)
9
  out  GICR, r16  ; enable change reset vector
10
  ldi  r16, _BV (IVSEL)
11
  out  GICR, r16  ; change reset vector to application
daher sollte ja auch kein interrupt aktiv sein, und dazwischen funken, 
vermute ich mal

Aber irgendwas übersehe ich da noch ....
Hat da wer noch eine idee dazu?
Gast #2136074
Lesenswert?

1
  for (i=0; i<15; i++)
2
    _delay_ms(10);
3

4
  rfm12_trans (0xFFFF);    /* Reset 1 */
5
  rfm12_trans (0xFFFE);    /* Reset 2 */
6

7
  for (i=0; i<15; i++)
8
    _delay_ms(10);
9

10
  rfm12_trans (0xC0E0);    /* AVR CLK: 10MHz */

hätte es mal so probiert, bringt aber auch nichts ....
150ms gewartet, nach dem reset sollte reichen?
Gast #2136546
Lesenswert?

Eventuell kann jemand etwas zu einem Reset durch den Reseteingang sagen. 
Vorstellbar wäre, das ein RFM-Interrupt anhängig ist, beim Reset das 
globale interruptflag gesetzt bleibt. Schließlich ist der Reset über den 
Reseteingang nicht vergleichbar mit einem power-on-reset (oder doch?).
Ich kämpfte auch mit dem RFM. Bin der Ansicht, daß unterschiedliche 
Chips verbaut sind. Du solltest den INT1 auf Interrupt bei fallender 
Flanke stellen. Weiterhin solltest du in der Initialisierung den INT1 
ausschalten, den TX-FIFO füllen und dann erst INT1 zulassen. Ich hab das 
mal in ASM für vollen Interruptbetrieb (SPI-INT und INT1) geschrieben, 
hier mal die Befehlsreihenfolge für initialisieren
.db 
0,0,0xc0,0xe0,0x80,0xe7,0xc2,0xac,0xa6,0x86,0xc6,0x11,0x94,0xa1,0xc4,0x8 
3
.db 0x98,0x50,0xc8,0,0xe0,0,0xca,0x81,0x82,0x00,0xb8,0xaa--- jetzt geht 
nirq auf high ---,0xb8,0xaa
.db 0x82,0x39
.db 0,0

Umgesetzt auf C sieht es so aus
rfm12_trans (0x0000);
rfm12_trans (0xC0E0);
rfm12_trans (0x80E7); .... und so weiter

Ach ja, bei reset bei 500 msec delay.
Gast #2136557
Lesenswert?

Oh danke für die Info ...

Ich schalte den Interrupt im bootloader ja total aus also das GICR, und 
es wird direkt auf den PIN PD3 gewartet.

Wo meinst du 500ms Delay , beim erseht mit 0xffff auf rfm Modul??

Ich werde auf jedenfalls morgen gleich mal deine initialisierungs 
commands mit meinen vergleichen, vielleicht passt da die Reihenfolge 
nicht, oder ich habe einen übersehen .... Oder oder

Danke auf jedenfall schon mal

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren