Forum: Mikrocontroller und Digitale Elektronik chip45boot2 Hex wird nicht richtig geflasht


von Chris T. (chris0086)


Lesenswert?

Hallo Leute,
ich wollte meinen Atmega 162 mit einem Bootloader ausstatten und hab den 
Chip45boot2 gefunden als einfach zu nutzender Bootloader.
Also das richtige Hexfile heruntergeladen Atmega 162 uart0_v2.9
dann geflasht und gefreut das ich mit dem Gui Programm den Bootloader 
ansprechen kann. Dann das Hexfile ausgewählt und geschrieben.
Auf den ersten Blick sah alles gut aus, aber der Watchdog funktioniert 
nichtmehr und das Programm als solches auch nicht.
1
ISR(TIMER1_OVF_vect)
2
{
3
  wert_anfordern = 1;
4
  wdt_enable(7);
5
}
6
.
7
.
8
.
9
int main(void)
10
{
11
   if(MCUCSR & (1<<WDRF))
12
    {
13
      LED_PORT |= (1<<LED1);
14
    }
15
//uint8_t i =0;
16
while(1)
17
{
18
  if(wert_anfordern == 1)
19
  {
20
    Temp_anfordern(wertadressen[0][wertnr],10);
21
    wert_anfordern = 0;
22
    wertnr++;
23
    if(wertnr == wertadressen[0][0]+1)
24
    {
25
      wertnr = 1;
26
    }
27
28
  }
29
30
  if(receive_complete != 0)
31
  {
32
    USART_Transmit(receive_complete); //K
33
    //USART_Transmit(wertadressen[1][receive_complete]);
34
35
36
    wdt_disable();
37
    wdt_reset();
38
    receive_complete = 0;
39
    LED_PORT &= ~(1<<LED1);
40
41
  }

falls ich nicht innerhalb von ca. 2 Sekunden ein Telegramm auf der 
seriellen Schnittstelle beantworte, schlägt der Watchdog zu und das wird 
mir mit LED1 signalisiert.
Wenn ich das Programm direkt flashe ohne Bootloader dann funktioniert 
alles wie es soll.
Wenn ich es den Bootloader schreiben lassen passiert garnichts. Die LED 
bleibt immer aus. Er sendet zwar was auf der Schnittstelle, wenn ich 
aber antworte hängt sich das Programm auf und er reagiert nicht mehr.
Mein Build aus Eclipse meldet mir für mein Programm:
AVR Memory Usage
----------------
Device: atmega162

Program:    3068 bytes (18.7% Full)
(.text + .data + .bootloader)

Data:        483 bytes (47.2% Full)
(.data + .bss + .noinit)

Der Atmega sollte also nicht voll sein.
Die Fuses sind auf 1024 words für den bootloader gesetzt und Bootreset 
Vektor ist auch gesetzt.
Watchdog ist nicht per fuse aktiviert.

Auch das Problem mit fragmented Hexfiles hab ich schon probiert:
Aus der Doku:
If you observe problems with downloading your program, please check your 
hexfile for such steps. If you find one,
you can convert your hexfile to a hexfile without such step with the 
following command line tool:
srec_cat.exe test.hex -Intel -Output test_new.hex -Intel -Line_Length 44
screc_cat normally converts between different output formats, but can be 
used to convert a hexfile into a hexfile
with fixed 44 characters per line, which means 16 data bytes per line.

Trotzdem funktioniert das Programm mit Bootloader nicht so wie 
gewünscht. Hat jemand eine Idee?

von Moby (Gast)


Lesenswert?

Idee hab ich hier keine, kann nur sagen daß der Bootloader einen 168er 
Mega bei mir bislang immer problemlos programmierte. Ist kompakt und 
stellt sich auf die verwendete Baudrate ein.

von Moby (Gast)


Lesenswert?

Bei chip45 gibts öfter neue Updates, die diverse Probleme beheben. Evt. 
schadet auch eine Mail/Anruf dort nicht, der Support war bislang immer 
hervorragend.

von Chris T. (chris0086)


Lesenswert?

So hab mal mit dem Serviceteam gesprochen: Hier die Antwort:
die beiden Hexfiles 1. und 3. sind vom Inhalt her völlig identisch. Ihr
Programm wurde also vom Bootloader korrekt programmiert.

Warum verwenden Sie den Watchdog in dieser Form? Normalerweise sollte
ein Watchdog ja kontinuierlich aktiv sein, um ein Programm zu überwachen
und wird nicht erst durch ein Ereignis aktiviert und später wieder
deaktiviert. Die Watchdog Bits sind persistent, d.h. sie überdauern
einen Reset per Reset Taster und bleiben ggf. auch gesetzt, wenn der
Bootloader die Applikation startet. Eventuell gehen die avr-libc
Funktionen wde_enable() u.ä. von den Reset Defaults (im Sinne eines
Power Up) aus, die in Ihrem Fall nach Start durch den Bootloader nicht
erfüllt sind. Schauen Sie ggf. mal in den Code von wde_xxx() hinein und
kopieren Sie ggf. den Code direkt in Ihr Prorgamm und stellen Sie
sicher, dass die Zugriffe nicht von Reset Defaults ausgehen.

Ich habe keine weitere Erklärung dazu. Der Bootloader versucht zu Beginn
den Watchdog zu deaktivieren:

 MCUCSR &= ~(1<<WDRF); // disable the WDRF flag, otherwise
disabling WDE won't work
 WDTCR |= (1<<WDCE) | (1<<WDE); // timed sequence
 WDTCR = 0; // disable the watchdog

Das sind die einzigen Zugriffe auf den Watchdog beim ATmega162 
Bootloader.

Jetzt die Frage:
Da ich nicht so tief in der Materie bin, was kann ich jetzt probieren um 
zu schauen woran es liegt?

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.