mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATmega32 Flash beschreiben


Autor: Ralf (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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[] = {...};

Autor: Ralf (Gast)
Datum:

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

Autor: Markus K. (markus-)
Datum:

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

Markus

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralf (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Martin Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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/ind...
)

Martin Thomas

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: der inoffizielle WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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/ind...
mit seinem Makefile gehts. (Ich hoffe er hat nichts dagegen)

Vielen Dank an alle Helfer!

Ralf

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.