AVR dokumentation sökes

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

AVR dokumentation sökes

Inlägg 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
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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 ?
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Inlägg 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..
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

OK, rimliga frågor... :-)
Användarvisningsbild
MicaelKarlsson
Inlägg: 4669
Blev medlem: 18 juni 2004, 09:16:07
Ort: Aneby
Kontakt:

Inlägg 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/?
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Inlägg 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.
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

Finns det ingen komplett information om hur man använder IARs färdiga bibliotek, likt libc-manualen till GCC? :humm:
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

Ett lämpligt tillfälle att köra inline assembler kanske?
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Inlägg 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?
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg 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:
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Är inte heller de två makrona dokumenterade ?
Det borde räcka i så fall.
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg 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?
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Inlägg 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
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg 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.
Skriv svar