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
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[] = {...};
Oh, das ist noch vom rumprobieren. vorher hatte ich unsinged char sinus[128]. Das wollte ich dann zum testen in den Flash schreiben.
Soweit ich weiß kann nur der Bootloader ins Flash schreiben. Führst Du Deinen Code als Bootloader aus? Markus
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
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
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
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
>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...
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.