Forum: Mikrocontroller und Digitale Elektronik Atmega32 Bootloader flashen


von Sebastian Z. (sz1985)


Lesenswert?

Hallo zusammen,

ich habe mich diese Woche im Schreiben eines Bootloaders für den 
Atmega32 probiert. Leider habe ich das Problem, dass meiner Meinung nach 
der Bootlader nicht in den Bootloader-Bereich des Flashs geschrieben 
wird. Die Einstellungen sollten aber richtig sein. Vielleicht hat einer 
von auch eine Idee was ich falsch gemacht bzw. übersehen habe. 
Nachfolgende die Daten und ein Auszug aus dem Code.

- Speicheradresse Bootloader bei 0x7000 über Linker mit dem Befehl
  "-Ttext=0x7000" gesetzt.
- Bei den Fuse's habe ich "SPIEN", "BOOTRST" und "BOOTSZ" auf 1024 bzw.
  2048 Words gesetzt. Daraus ergeben sich für HIGH 0xDA und LOW 0xFF 
bzw.
  HIGH 0xD8 und LOW 0xFF

Flashvorgang mit Adapter Diamex DX-ISP mittels STK500:
- Fuse's schreiben
- Bootloader flashen
- Applikation flashen

Hier ein Auszug aus dem Bootlaoder:
1
#include <avr/io.h>
2
#include <avr/boot.h>
3
#include <avr/interrupt.h>
4
#include <util/delay.h>
5
#include "uart1.h"
6
7
//9600 Baud bei F_CPU 16MHz
8
unsigned int baud = 103;
9
10
void main(void)
11
{
12
    unsigned int   c=0;         /* Empfangenes Zeichen + Statuscode */
13
    unsigned char  temp,       /* Variable */
14
    flag=1,                         /*Flag zum steuern der Endlosschleife*/
15
    p_mode=0;                   /* Flag zum steuern des Programmiermodus */
16
    void (*start)( void ) = 0x0000;      /* Funktionspointer auf 0x0000 */
17
 
18
    /* Interrupt Vektoren verbiegen */
19
    temp = GICR;
20
    GICR = temp | (1<<IVCE);
21
    GICR = temp | (1<<IVSEL);
22
 
23
    /* Einstellen der Baudrate und aktivieren der Interrupts */
24
    uart_init(baud); 
25
    sei();
26
 
27
    uart_puts("Hallo hier ist der Bootloader\n\r");
28
    _delay_ms(1000);
29
 
30
    do
31
    {
32
        c = uart_getc();
33
        if(c!=0)
34
        {
35
            switch((unsigned char)c)
36
            {
37
                 case 'q': 
38
         flag=0;
39
                     uart_puts("Verlasse den Bootloader!\n\r");
40
                     break;
41
                  default:
42
                     uart_puts("Du hast folgendes Zeichen gesendet: ");
43
                     uart_putc((unsigned char)c);
44
                     uart_puts("\n\r");
45
                     break;
46
            }
47
        }
48
    }
49
    while(flag);
50
 
51
    uart_puts("Springe zur Adresse 0x0000!\n\r");
52
    _delay_ms(1000);
53
 
54
    /* Interrupt Vektoren wieder gerade biegen */
55
    temp = GICR;
56
    GICR = temp | (1<<IVCE);
57
    GICR = temp & ~(1<<IVSEL);
58
 
59
    /* Rücksprung zur Adresse 0x0000 */
60
    start(); 
61
}

Auszug aus der Applikation
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <avr/pgmspace.h>
4
#include <util/delay.h>
5
#include "uart1.h"
6
 
7
 
8
//9600 Baud bei F_CPU 16MHz
9
unsigned int baud = 103;
10
 
11
int main()
12
{
13
   unsigned int   c;
14
   void (*bootloader)( void ) = 0x7000;
15
 
16
   uart_init(baud); 
17
   sei();
18
    
19
   uart_puts("Hier ist das Anwendungsprogramm\n\r");
20
 
21
   for(;;)
22
   {
23
       c = uart_getc();
24
       if(c!=0)
25
       {
26
     switch( (unsigned char)c)
27
     {
28
         case 'b':
29
       uart_puts("\n\rSpringe zum Bootloader...");
30
       _delay_ms(1000);
31
        bootloader();
32
        break;
33
    default:
34
                    uart_puts("\n\rDu hast folgendes Zeichen gesendet: ");
35
        uart_putc((unsigned char)c);
36
        break;
37
      }
38
        }
39
    }
40
    return 0;
41
}

Vielen Dank für eure Hilfe!

Gruss

Sebastian

von Thomas E. (thomase)


Lesenswert?

Sebastian Z. schrieb:
> Flashvorgang mit Adapter Diamex DX-ISP mittels STK500:
> - Fuse's schreiben
> - Bootloader flashen
> - Applikation flashen

Du bist sicher, daß der Flashspeicher vor dem Flashen der Applikation 
nicht gelöscht wird?

mfg.

von Sebastian Z. (sz1985)


Lesenswert?

Vielen Dank!
Ich habe übersehen, dass der Flashspeicher beim programmieren gelöscht 
wird.

von Alois (Gast)


Lesenswert?

Könntest du deinen ATMEGA32 Bootloader bitte ganz veröffentlichen.

Ich habe Probleme mit der UART-LIB von Fleury.
Bei normalen Programmen geht sie gut, wenn ich aber die Startadresse im 
Linker verändere, wird von Controller nichts mehr über die RS232 
gesendet.

Liebe Grüße
Alois

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Alois schrieb:
> wenn ich aber die Startadresse im
> Linker verändere, wird von Controller nichts mehr über die RS232
> gesendet.

Musst den Interruptvektor noch umbiegen ;)
(IVSEL)
1
void Move_interrupts(void)
2
{
3
/* Enable change of interrupt vectors */
4
GICR = (1<<IVCE);
5
/* Move interrupts to boot Flash section */
6
GICR = (1<<IVSEL);
7
}

von Alois (Gast)


Lesenswert?

DANKE!!!!!!!

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.