I/O register i AVR Atmega168, vad kan man använda dom till?
I/O register i AVR Atmega168, vad kan man använda dom till?
Detta känns som att det borde vara bas-kunskap men jag har inte hittat något om det.
Varför används oftast register 16 (0x10) som temporärt register(ofta kallat "temp"). Jag gör det ju själv och sen fyller jag på uppåt när jag definierar nya namn på registren. Instruktionen LPM använder ju r0(alltså 0x00) och så har jag för mig att multiplikations-instruktionerna(MUL, MULS, MULSU m.fl.)använder r0 och r1(0x00 och 0x01).
Finns det något som hindrar att man använder t.ex. r10 - r15(0x0A-0x0F) till vad som helst? Jag har ju för mig att det var vissa instruktioner som inte gick att använda där eller hur det nu var. Hittar inget om detta i data-bladet heller. Vart ska man kolla det?
Det jag vill göra är att definiera några räknar-register som endast räknas upp och kontrolleras ibland.
Varför används oftast register 16 (0x10) som temporärt register(ofta kallat "temp"). Jag gör det ju själv och sen fyller jag på uppåt när jag definierar nya namn på registren. Instruktionen LPM använder ju r0(alltså 0x00) och så har jag för mig att multiplikations-instruktionerna(MUL, MULS, MULSU m.fl.)använder r0 och r1(0x00 och 0x01).
Finns det något som hindrar att man använder t.ex. r10 - r15(0x0A-0x0F) till vad som helst? Jag har ju för mig att det var vissa instruktioner som inte gick att använda där eller hur det nu var. Hittar inget om detta i data-bladet heller. Vart ska man kolla det?
Det jag vill göra är att definiera några räknar-register som endast räknas upp och kontrolleras ibland.
Re: I/O register i AVR Atmega168, vad kan man använda dom ti
Alla instruktioner funkar, som sagt, inte på alla register. Vilka register som funkar för en instruktion står i instruktionsuppsättningen (en egen pdf, ej i databladet för MCU'n).
Framför allt är det instruktioner som har ett register och en konstant (immediate) som argument som inte funkar på r0-r15, typ LDI, ANDI, SUBI. De kan bara ha r16-r31 som destination. Men även andra instruktioner har andra begränsningar. Anledningen är att det krävs 5 bitar för att adressera ett godtyckligt register r0-r31 och det får inte plats i op-koderna som oftast är 16 bitar.
Edit: s/30/r0/
Framför allt är det instruktioner som har ett register och en konstant (immediate) som argument som inte funkar på r0-r15, typ LDI, ANDI, SUBI. De kan bara ha r16-r31 som destination. Men även andra instruktioner har andra begränsningar. Anledningen är att det krävs 5 bitar för att adressera ett godtyckligt register r0-r31 och det får inte plats i op-koderna som oftast är 16 bitar.
Edit: s/30/r0/
Senast redigerad av snigelen 14 juni 2011, 14:30:12, redigerad totalt 1 gång.
Re: I/O register i AVR Atmega168, vad kan man använda dom ti
Jag tror inte att du talar om Input/Output-registrena, utan om arbetsregistrena.
Har för mig att några register har med indirekt adressering att göra. Vad jag minns står det i processorns datablad, eller möjligtvis i något annat annat dokument från Atmel, t.ex. dokumentet som beskriver instruktionsuppsättningen i detalj.
Vad är anledningen till att använda register och inte SRAM till räknarna?
Har för mig att några register har med indirekt adressering att göra. Vad jag minns står det i processorns datablad, eller möjligtvis i något annat annat dokument från Atmel, t.ex. dokumentet som beskriver instruktionsuppsättningen i detalj.
Vad är anledningen till att använda register och inte SRAM till räknarna?
Re: I/O register i AVR Atmega168, vad kan man använda dom ti
Register-operationerna är i regel en klockcykel. Vid SRAM-access krävs två.
Re: I/O register i AVR Atmega168, vad kan man använda dom ti
Tack för svaren!
bearing: Ja, naturligtvis talar jag om arbetsregistren! Ja nu hittade jag det, som sagt ett annat dokument än databladet. Och eftersom CP, INC och CLR fungerar för r0 - r31 så är det ju bara att använda vilket man vill, t.ex r10 - r15. Va lätt det blev plötsligt
Det är som snigelen säger att det tar färre klock-cykler att jobba i registren än i SRAM och mitt räknande ligger i ett avbrott så jag vill inte att det ska ta någon onödig tid.
bearing: Ja, naturligtvis talar jag om arbetsregistren! Ja nu hittade jag det, som sagt ett annat dokument än databladet. Och eftersom CP, INC och CLR fungerar för r0 - r31 så är det ju bara att använda vilket man vill, t.ex r10 - r15. Va lätt det blev plötsligt

Det är som snigelen säger att det tar färre klock-cykler att jobba i registren än i SRAM och mitt räknande ligger i ett avbrott så jag vill inte att det ska ta någon onödig tid.
Re: I/O register i AVR Atmega168, vad kan man använda dom ti
Du kan/bör kolla "AVR Instruction Set" :
http://www.atmel.com/dyn/resources/prod ... oc0856.pdf
Där ser du tydligt vilka register som är giltiga för varje instruktion. Det finns en
den begränsningar. T.ex fungerar bara "bit clear/set in register" SBR/CBR bara mot
register 16-31, medans "skip if bit set/cleared in register" fungerar mot register 0-31.
Och "set/clear bit in I/O register" fungerar bara mot de 32 lägsta I/O registren.
Han man enheter som ligger > 31 så får man göra på annat sätt.
Mot RAM fungerar i princip ingenting utom load/store.
Se även "7.5 I/O Memory" i databladet. Där framgår vilka olika metoder man
måste ta till för att hantera enheter beroende på var dess register ligger. Det finns
tre olika fall. De lägsta 32 adresserna, där fungerar direkta bit set/clear/skip.
IN/OUT kan användas på de lägsta 64 I/O adresserna. För överiga enheter som
ligger över de lägsta 64 adresserna fungera enbart load/store instruktionerna.
Se även "30. Register Summary" i databladet och speciellt sammanfattningen
under tabellen (Note 1-6).
> Register-operationerna är i regel en klockcykel. Vid SRAM-access krävs två.
Skillnaden är normalt mycket större än så. Du kan t.ex göra en INC (increment)
mot ett register 0-31 på 1 klockcykel, men att göra detsamma mot RAM tar
5 cykler (LDS, INC, STS). Så den stora skillnaden är att RAM enbart hanteras
av load/store instruktioner, ingenting annat. Om du vill använda en adress i RAM
som "räknare" så blir skillnaden mycket större än ett-till-två.
Jämför gärna, om du är intresserad, av PIC arkitekturen som är betydligt
renare/rakare och där man i princip kan göra "allt mot allt". Det finns
inget begrepp "RAM", allt minne är register och hanteras på samma sätt
av alla instruktioner (med ett par fåtal undantag).
http://www.atmel.com/dyn/resources/prod ... oc0856.pdf
Där ser du tydligt vilka register som är giltiga för varje instruktion. Det finns en
den begränsningar. T.ex fungerar bara "bit clear/set in register" SBR/CBR bara mot
register 16-31, medans "skip if bit set/cleared in register" fungerar mot register 0-31.
Och "set/clear bit in I/O register" fungerar bara mot de 32 lägsta I/O registren.
Han man enheter som ligger > 31 så får man göra på annat sätt.
Mot RAM fungerar i princip ingenting utom load/store.
Se även "7.5 I/O Memory" i databladet. Där framgår vilka olika metoder man
måste ta till för att hantera enheter beroende på var dess register ligger. Det finns
tre olika fall. De lägsta 32 adresserna, där fungerar direkta bit set/clear/skip.
IN/OUT kan användas på de lägsta 64 I/O adresserna. För överiga enheter som
ligger över de lägsta 64 adresserna fungera enbart load/store instruktionerna.
Se även "30. Register Summary" i databladet och speciellt sammanfattningen
under tabellen (Note 1-6).
> Register-operationerna är i regel en klockcykel. Vid SRAM-access krävs två.
Skillnaden är normalt mycket större än så. Du kan t.ex göra en INC (increment)
mot ett register 0-31 på 1 klockcykel, men att göra detsamma mot RAM tar
5 cykler (LDS, INC, STS). Så den stora skillnaden är att RAM enbart hanteras
av load/store instruktioner, ingenting annat. Om du vill använda en adress i RAM
som "räknare" så blir skillnaden mycket större än ett-till-två.
Jämför gärna, om du är intresserad, av PIC arkitekturen som är betydligt
renare/rakare och där man i princip kan göra "allt mot allt". Det finns
inget begrepp "RAM", allt minne är register och hanteras på samma sätt
av alla instruktioner (med ett par fåtal undantag).
- ghost_rider
- Inlägg: 2211
- Blev medlem: 26 maj 2008, 21:48:15
- Ort: Genarp
Re: I/O register i AVR Atmega168, vad kan man använda dom ti
Hijackar tråden lite.
Har en bunke atmega168 som jag använder för div saker, dock har jag märkt att den har en ganska så lång 'uppstartstid'.
Vad kan detta bero på? min programmering eller chippet i sig?
Skulle uppskatta att den har ca 10s fördröjning efter ha varit strömlös.
Har en bunke atmega168 som jag använder för div saker, dock har jag märkt att den har en ganska så lång 'uppstartstid'.
Vad kan detta bero på? min programmering eller chippet i sig?
Skulle uppskatta att den har ca 10s fördröjning efter ha varit strömlös.
Re: I/O register i AVR Atmega168, vad kan man använda dom ti
Det är knappast chipet som skapar fördröjningen, utan jag gissar att ditt program tar 10 sekunder på sig att göra det du tror att det ska göra direkt.
Man kan sätta några fuses för att få en Power on timer på högst 65 ms, men den tiden upplevs ju som ett ögonblick för en människa.
Man kan sätta några fuses för att få en Power on timer på högst 65 ms, men den tiden upplevs ju som ett ögonblick för en människa.
Re: I/O register i AVR Atmega168, vad kan man använda dom ti
När man ringer kommunväxeln och de säger "ett ögonblick bara"
så inte fasen är det 65 ms de menar...
Men när det gäller 10 sek fördröjningen. Är det enbart efter att de har varit strömlösa ?
D.v.s om du bara gör en reset med reset-pinnen med spänningen på så går det snabbt ?
Men du får väl mäta lite. Tar det 10 sek för matningsspänningen att stabilisera sig ?
så inte fasen är det 65 ms de menar...
Men när det gäller 10 sek fördröjningen. Är det enbart efter att de har varit strömlösa ?
D.v.s om du bara gör en reset med reset-pinnen med spänningen på så går det snabbt ?
Men du får väl mäta lite. Tar det 10 sek för matningsspänningen att stabilisera sig ?
Re: I/O register i AVR Atmega168, vad kan man använda dom ti
Du kanske har en bootloader som står och väntar i starten innan programmet går igång?
Re: I/O register i AVR Atmega168, vad kan man använda dom ti
Om det är en bootloader timeout så ska/bör det vara efter alla "reste"
inte bara power-on-reset (vilket vi i och för sig inte vet just nu).
inte bara power-on-reset (vilket vi i och för sig inte vet just nu).
Re: I/O register i AVR Atmega168, vad kan man använda dom ti
Det kanske är en bootloader som startar bara vid power on reset inte annars....
men som sagt det är bara spekulation...
men som sagt det är bara spekulation...
- ghost_rider
- Inlägg: 2211
- Blev medlem: 26 maj 2008, 21:48:15
- Ort: Genarp
Re: I/O register i AVR Atmega168, vad kan man använda dom ti
Nä precis, det är både vid reset och när den har varit spänningslös.
Skulle kunna vara bootloadern då.
Skulle kunna vara bootloadern då.
- ghost_rider
- Inlägg: 2211
- Blev medlem: 26 maj 2008, 21:48:15
- Ort: Genarp
Re: I/O register i AVR Atmega168, vad kan man använda dom ti
Det är samma som till atmega168 använder för arduino. Hittar inte den just nu. Men arduino't har också de dära ~10s i starttid.