I/O register i AVR Atmega168, vad kan man använda dom till?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Glattnos
Inlägg: 3106
Blev medlem: 29 oktober 2009, 20:01:18

I/O register i AVR Atmega168, vad kan man använda dom till?

Inlägg av Glattnos »

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.
snigelen
Inlägg: 815
Blev medlem: 8 maj 2009, 11:02:14
Ort: Lund

Re: I/O register i AVR Atmega168, vad kan man använda dom ti

Inlägg av snigelen »

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/
Senast redigerad av snigelen 14 juni 2011, 14:30:12, redigerad totalt 1 gång.
bearing
Inlägg: 11676
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: I/O register i AVR Atmega168, vad kan man använda dom ti

Inlägg av bearing »

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?
snigelen
Inlägg: 815
Blev medlem: 8 maj 2009, 11:02:14
Ort: Lund

Re: I/O register i AVR Atmega168, vad kan man använda dom ti

Inlägg av snigelen »

Register-operationerna är i regel en klockcykel. Vid SRAM-access krävs två.
Glattnos
Inlägg: 3106
Blev medlem: 29 oktober 2009, 20:01:18

Re: I/O register i AVR Atmega168, vad kan man använda dom ti

Inlägg av Glattnos »

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

Re: I/O register i AVR Atmega168, vad kan man använda dom ti

Inlägg av sodjan »

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).
Användarvisningsbild
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

Inlägg av ghost_rider »

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.
bearing
Inlägg: 11676
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: I/O register i AVR Atmega168, vad kan man använda dom ti

Inlägg av bearing »

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

Re: I/O register i AVR Atmega168, vad kan man använda dom ti

Inlägg av sodjan »

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 ?
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: I/O register i AVR Atmega168, vad kan man använda dom ti

Inlägg av jesse »

Du kanske har en bootloader som står och väntar i starten innan programmet går igång?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: I/O register i AVR Atmega168, vad kan man använda dom ti

Inlägg av sodjan »

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).
ds77
Inlägg: 2460
Blev medlem: 24 juli 2008, 09:38:07
Ort: småland

Re: I/O register i AVR Atmega168, vad kan man använda dom ti

Inlägg av ds77 »

Det kanske är en bootloader som startar bara vid power on reset inte annars....

men som sagt det är bara spekulation...
Användarvisningsbild
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

Inlägg av ghost_rider »

Nä precis, det är både vid reset och när den har varit spänningslös.
Skulle kunna vara bootloadern då.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: I/O register i AVR Atmega168, vad kan man använda dom ti

Inlägg av sodjan »

Vilken bootloader ???
Användarvisningsbild
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

Inlägg av ghost_rider »

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.
Skriv svar