Forum: Mikrocontroller und Digitale Elektronik ATMEGA32 + rfm12 -> kleines bootloader problem


von sn00py (Gast)


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?

von wb1 (Gast)


Lesenswert?

Einen Softreset erzeugst Du durch senden von FFFF oder FFFE an den 
RFM12.

von sn00py (Gast)


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?

von wb1 (Gast)


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.

von Sn00py (Gast)


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

von wb1 (Gast)


Lesenswert?

Nach hard- und softreset, jedenfalls hatte ich den Effekt, das das RFM 
nach zu kurzem delay nicht vernünftig ansprechbar war,

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.