Sida 1 av 1

AVR dokumentation sökes

Postat: 8 januari 2008, 16:02:12
av dangraf
sitter och skriver lite kod och kan inte hitta dokumentationen till några inbyggda funktioner.

Miljön jag sitter med heter IAR avr.
dokumentationen jag söker är för <inavr.h>
som i sin tur kallar på filen <intrinsics.h> (hoppas det e rättstavat)
och därifrån vill jag veta hur de olika funktionerna fungerar för att manipulera med flash minnet.
De inbyggda funktionerna som ser väldigt kryptiska och mystiska ut heter t.ex:

__AddrToZByteToSPMCR_LPM
__DataToR0ByteToSPMCR_SPM
__AddrToZWordToR1R0ByteToSPMCR_SPM

Hittar man en hittar man nog alla :-)
Jag hade kunnat skriva egna men hoppas på att det ska gå snabbare att leta upp hur de färdigskrivna funktionerna fungerar.

Någon som har aning om vart jag kan få reda på hur de fungerar? vilka inparametrar de tar och vad de egentligen gör.

Mvh//
Daniel

Postat: 8 januari 2008, 16:15:46
av sodjan
Jag vet inte ett smack om den miljö du använder, men det där
*låter* inte som någon som det är tänkt att man ska pilla i... :-)
Är du inte en "nivå" lägre än den som man förväntas använda ?

Postat: 8 januari 2008, 16:25:31
av dangraf
Det är forfarande funktioner som används av användaren. De finns att titta på om man letar upp AVR109.
De har ifs gömt funktionen i ett makro:
ex:

Kod: Markera allt

#define _FILL_TEMP_WORD(addr,data) __AddrToZWordToR1R0ByteToSPMCR_SPM( (void __flash *) (addr), data, 0x01 )
#define _PAGE_ERASE(addr) __AddrToZByteToSPMCR_SPM( (void __flash *) (addr), 0x03 )
det man i huvudsak vill göra för att skriva i flashminnet är.
1. fylla en buffert med ny data,
2. radera en hel page( 256 bytes)
3. skriva ny data till flash-minnet från bufferten.

Det jag undrar över är t.ex
1. Varför måste man skicka med addressen för varje word när man ska fylla bufferten, stegar inte den av sig själv.
2. vad händer om man försöker skicka en page-write eller erase till en address som inte ligger i början på en page? tar den hand om detta själv, eller måste jag göra det som användare?

Det känns alltid lite bättre om man får en känsla för vad koden egentligen gör..

Postat: 8 januari 2008, 16:27:54
av sodjan
OK, rimliga frågor... :-)

Postat: 8 januari 2008, 17:40:50
av MicaelKarlsson
dangraf: Har du tittat runt på http://www.avrfreaks.net/ eller ställa en fråga där?
Eller hört med http://www.iar.com/?

Postat: 8 januari 2008, 18:32:18
av dangraf
Nej, jag har inte ställt frågan på AVR freaks, men tror nästan att jag borde registrera mig som användare där..

Jag har inte heller ställt den till IAR.

Det jag sökt på är dokumentationen som kom med kompilatorn, webben, AVR's hemsida och diverse header-filer.

Tackar! får kolla de ställena med som du föreslog.

Postat: 9 januari 2008, 00:28:35
av $tiff
Finns det ingen komplett information om hur man använder IARs färdiga bibliotek, likt libc-manualen till GCC? :humm:

Postat: 9 januari 2008, 06:53:14
av speakman
Ett lämpligt tillfälle att köra inline assembler kanske?

Postat: 9 januari 2008, 10:15:27
av dangraf
Det finns dokumentation för de flesta funktioner som "abs","ceil" osv, har även hittat dokumentation för inbyggda funktioner som __interrupt_enable() osv. Men för just dessa är det lurigt.

Jag vill helst inte kludda med assembler om det finns funktioner som fungerar, varför uppfinna hjulet 2 gånger?

Postat: 9 januari 2008, 10:57:27
av $tiff
varför uppfinna hjulet 2 gånger?

För att det inte blev tillräckligt runt vid första försöket :lol:

Postat: 9 januari 2008, 11:56:04
av sodjan
Är inte heller de två makrona dokumenterade ?
Det borde räcka i så fall.

Postat: 9 januari 2008, 15:05:27
av cykze
Jag kan väl aldrig tänka mig att man ska behöva använda något som heter __AddrToZWordToR1R0ByteToSPMCR_SPM. Har du provat att söka efter typ bootloader, boot, page eller något i dokumentationen?


> 1. Varför måste man skicka med addressen för varje word när man ska fylla bufferten, stegar inte den av sig själv.

Såvitt jag vet så kan du ladda en tömd page i vilken ordning som helst. Så någon har väl tänkt att det är lika bra att användaren själv får bestämma ordningen. Det är väl inga problem för dig att skicka med en variabel som stegar upp? Kanske IAR har någon funktion som kan ladda en page blockvis om du nu vill det.


> 2. vad händer om man försöker skicka en page-write eller erase till en address som inte ligger i början på en page? tar den hand om detta själv, eller måste jag göra det som användare?

Valfri adress inom samma page borde fungera. Har du kollat igenom kapitlet om bootloaders i databladet för din AVR?

Postat: 9 januari 2008, 20:55:02
av dangraf
Det verkar som att hjuler kommer bli uppfunnet en andra gång. IAR vill inte berätta var jag hittar informationen eftersom licensen är för gammal.. Skit IAR! :roll:

Jag har läst både databladet för bootloader AVR109 samt AVR914 och bootloader kappittlet för just den processorn jag använder, hurså? Jag är inte grym på assembler och tycker det är bättre att använda någon annas färdigtestade kod än att bygga min egen.. trodde jag..

Om det är ett index på 1 byte som man ska skicka med i ett funktionsanrop (256 element) så går det väl snabbare att kopiera än att skicka med ett 32 bitars variabel varje gång man ska lägga till ett element? Dessutom borde det heta index och inte address, vilket självklart är min helt personliga åsikt.

Jag har letat efter allt möjligt i databladen, bla "flash" (även på macrona, men nada..)

jag får tacka för tipsen, kasta in handduken och börja skriva lite kod till, kanske lär jag mig nått nytt :D

Postat: 11 januari 2008, 20:01:17
av cykze
Surt.

Först: http://www.nongnu.org/avr-libc/user-manual/porting.html
Sen: http://www.nongnu.org/avr-libc/user-man ... _boot.html
Klart! :)

Apropå databladet så hittade jag det här (Mega88):

Kod: Markera allt

25.7.3 Performing a Page Write
                     To execute Page Write, set up the address in the Z-pointer, write “X0000101” to SPMCSR and
                     execute SPM within four clock cycles after writing SPMCSR. The data in R1 and R0 is ignored.
                     The page address must be written to PCPAGE. Other bits in the Z-pointer must be written to
                     zero during this operation.
Så det verkar som att adressen *inom* en page måste vara noll vid skrivning. Alltså hade jag fel. Eftersom det har fungerat för mig ändå så har jag nog antingen haft tur eller så har boot_page_write() i avr-libc maskat bort det själv.