Forum: Mikrocontroller und Digitale Elektronik ATmega32 Flash beschreiben


von Ralf (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich möchte bei meinem ATmega32 den Flash im Betrieb beschreiben um dort
Daten zu speichern. Versuche es mit der Funktion aus dem
avr-libc-user-manual, aber es wird infach nichts in den Flsh
geschrieben, obwohl der Code Problemlos durchläuft.

Irgendwelche Ideen?




Hier das wichtigste aus dem Code:

#define F_CPU 16000000UL
#define UART_BAUD_RATE      56000

#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/wdt.h>
#include <avr/eeprom.h>
#include <util/delay.h>
#include <avr/boot.h>
#include <inttypes.h>
#include "uart.h"


typedef signed char int8_t;
typedef unsigned char uint8_t;

unsigned char adc_in;
unsigned char *sinus = {  0x80, 0xb0, 0xda, 0xf6, 0xff, 0xf6, 0xda,
0xb0, 0x80, 0x4f, 0x25, 0x09, 0x00, 0x09, 0x25, 0x4f,
                0x80, 0xb0, 0xda, 0xf6, 0xff, 0xf6, 0xda, 0xb0, 0x80, 
0x4f,
0x25, 0x09, 0x00, 0x09, 0x25, 0x4f,
                0x80, 0xb0, 0xda, 0xf6, 0xff, 0xf6, 0xda, 0xb0, 0x80, 
0x4f,
0x25, 0x09, 0x00, 0x09, 0x25, 0x4f,
                0x80, 0xb0, 0xda, 0xf6, 0xff, 0xf6, 0xda, 0xb0, 0x80, 
0x4f,
0x25, 0x09, 0x00, 0x09, 0x25, 0x4f,
                0x80, 0xb0, 0xda, 0xf6, 0xff, 0xf6, 0xda, 0xb0, 0x80, 
0x4f,
0x25, 0x09, 0x00, 0x09, 0x25, 0x4f,
                0x80, 0xb0, 0xda, 0xf6, 0xff, 0xf6, 0xda, 0xb0, 0x80, 
0x4f,
0x25, 0x09, 0x00, 0x09, 0x25, 0x4f,
                0x80, 0xb0, 0xda, 0xf6, 0xff, 0xf6, 0xda, 0xb0, 0x80, 
0x4f,
0x25, 0x09, 0x00, 0x09, 0x25, 0x4f,
                0x80, 0xb0, 0xda, 0xf6, 0xff, 0xf6, 0xda, 0xb0, 0x80, 
0x4f,
0x25, 0x09, 0x00, 0x09, 0x25, 0x4f};



void boot_program_page (uint32_t page, uint8_t *buf) {
  uint16_t i;
  uint8_t sreg;

  // Disable interrupts.
  sreg = SREG;
  cli();
  eeprom_busy_wait ();
  boot_page_erase (page);
  boot_spm_busy_wait (); // Wait until the memory is erased.

  for (i=0; i<SPM_PAGESIZE; i+=2) {
  // Set up little-endian word.
    uint16_t w = *buf++;
    w += (*buf++) << 8;
    boot_page_fill (page + i, w);
  }

  boot_page_write (page); // Store buffer in flash page.
  boot_spm_busy_wait(); // Wait until the memory is written.
  // Reenable RWW-section again. We need this if we want to jump back
  // to the application after bootloading.
  boot_rww_enable ();
  // Re-enable interrupts (if they were ever enabled).
  SREG = sreg;
}



Aufruf der Funktion wie folgt: boot_program_page (3200, sinus);

Ich find den Fehler einfach nicht.

MfG
Ralf

von johnny.m (Gast)


Lesenswert?

Abgesehen davon, dass
> unsigned char *sinus = {...};
in meinen Augen zunächst nicht viel Sinn macht (Wofür hier ein Array
von Pointern? Aber vielleicht hab ich den Zusammenhang noch nicht ganz
durchschaut...): Die Deklaration ist falsch. Wenn überhaupt, dann

unsigned char *sinus[] = {...};

von Ralf (Gast)


Lesenswert?

Oh, das ist noch vom rumprobieren. vorher hatte ich unsinged char
sinus[128]. Das wollte ich dann zum testen in den Flash schreiben.

von Markus K. (markus-)


Lesenswert?

Soweit ich weiß kann nur der Bootloader ins Flash schreiben. Führst Du
Deinen Code als Bootloader aus?

Markus

von Ralf (Gast)


Lesenswert?

Nein. Ich hab vorher schon mal versucht einen Bootloader zu
programmieren, habs aber nie geschafft in im Bootloader Bereich zum
laufen zu bekommen. Wie mach ich das mit WinAvr?

Ralf

von Ralf (Gast)


Angehängte Dateien:

Lesenswert?

Ich hab mich gerade mal weiter informiert.
Ich will mein Prog nun in die Bootloader Section flaschen, aber was
muss ich dazu bei Winavr (linker) --section-start=.text= angeben?
Ich habs mit 0x3800 versucht und dem doppletem (weil Datenblattangabe
ja in words). Bei beidem wird der Code aber nicht ausgeführt. Müsste
eigentlich per UART daten senden.
Ich hab den Auszug aus dem Datenblatt mal angehängt.

Ralf

von Martin Thomas (Gast)


Lesenswert?

Der Code aus den avr-libc boot-Funktionen zum schreiben (eigentlich
Makros) muss in er "Boot section" abgelegt sein. Flash schreiben aus
der "Application section" ist beim ATmega32 nicht vorgesehen. Man
kann entweder die Schreibfunktionen (mit den "Aufrufen" der
boot-Funktion) in eine extra gcc-section legen (attribute section,
nicht zu verwechseln mit Boot/Application section des AVR) und beim
Linken diese (gcc-)-Section eine Addresse im Boot-Bereich zuweisen
(--section-start...). Wenn die Anwendung klein ist und den die AVR
Boot-Section passt, kann man die gesamte Anwendung (".text") in die
Boot-Section verlagern (so wie bei einem Bootloader).
Vgl. avr-libc Dokumenation FAQ17, binutils/ld-Manual,
Quellcode/Makefiles vom mit der GNU-Toolchain erstellten Bootloadern
(z.B.
http://www.siwawi.arubi.uni-kl.de/avr_projects/index.html#avrprog_boot
)

Martin Thomas

von Ralf (Gast)


Lesenswert?

Danke, das hat mir schon sehr geholfen.
Mein Code wird jetzt in der Bootloader section ausgeführt.
Was allerdings immer noch nicht geht ist das beschreiben des Flash, es
wird einfach nichts geschrieben, obwohl keine Lockbits gesetzt sind.
Ich hab auch schon die Funktionen von Martin probiert, aber ohne
erfolg.

Hat das Problem schon mal jemand gehabt?

Ralf

von der inoffizielle WM-Rahul (Gast)


Lesenswert?

>Hat das Problem schon mal jemand gehabt?

Vermutlich niemand. Liegt wohl daran, dass man in Flash i.d.R. nur
Konstanten speichert. Das EEPROM ist ja eher als Datenspeicher
vorgesehen...

von Ralf (Gast)


Lesenswert?

MH, aber ein Bootloader speichert den Code ja auch im Flash, sollte von
daher also kein Problem sein.

Und der EEPROM ist für mein Vorhaben zu klein.

von Ralf (Gast)


Lesenswert?

So jetzt funktionierts :-)

Ich kann nur allen Neulingen in diesem Gebiet sagen, dass die
Bootloader programmierung sehr stark vom Makefile abhängig ist.
Ich verweise auf das Projekt von Martin
http://www.siwawi.arubi.uni-kl.de/avr_projects/index.html#avrprog_boot
mit seinem Makefile gehts. (Ich hoffe er hat nichts dagegen)

Vielen Dank an alle Helfer!

Ralf

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.