Positions-Display för svarv (AVR)

Berätta om dina pågående projekt.
Användarvisningsbild
Chribbe76
EF Sponsor
Inlägg: 1167
Blev medlem: 17 januari 2004, 22:43:17
Ort: Stockholm

Inlägg av Chribbe76 »

Hmm.... UNDEF, det hade jag missat.
Man måste visserligen själv bestämma vilka register man vill använda men återanvändandet får man iaf kontroll på och man blir varnad om man gjort fel.
Det kanske är den kompletta lösningen för allt detta.
När man skriver ner sina problem kommer ofta lösningen av sig själv.

Men programmerings-tips mottages gärna.
Användarvisningsbild
ucadv
Inlägg: 203
Blev medlem: 29 januari 2007, 23:13:49

Inlägg av ucadv »

Varför bara 16 register med vissa instruktioner? för att man inte alltid hade plats för 5-bitars (2^5 = 32) register-id i AVRs 16-bitars instruktionsformat. Tänk själv: du behöver 5 bitar för register och 8 bitar för konstanten, då blir det bara 3 bitar över för instruktionstyp (detta kan du lätt se i databladet!). Eftersom AVR är en RISC gör man inte gärna vissa instruktioner 2x16 bitar långa (det finns undantag dock).

Tycker du att 32 register är för få? x86 hade 8 register, ARM har 16 (inkl stack pekare och retur pekaren LR). 6502 som du hittar i bla C64 hade 3 register (om jag minns rätt). 68K som finns i Amigan hade 8 data register och 8 adress register. PDP-11 hade 8 (hej Sodjan!). Endast MIPS och AVR har 32 register.


Det finns ett bra skäl till det. När programmen blir större måste man överge register-tänket och använda minnet för å lagra data. Register använder man endast för beräkning. Ja, det kan bli en massa pushande och popande :), men det är precis så det ska vara i ett program som är större än, säg, 512 instruktioner...


Det är klart att det blir lite långsammare, men du kan fortfarande köra delar av din kod i register. jag brukar reservera 8-12 register för realtids grejer.

(och ingen tycker att PIC är skit. den börjar bara bli lite gammal för min smak)


/uc
Användarvisningsbild
Chribbe76
EF Sponsor
Inlägg: 1167
Blev medlem: 17 januari 2004, 22:43:17
Ort: Stockholm

Inlägg av Chribbe76 »

"Varför bara 16 register med vissa instruktioner? "
Du behöver inte förklara sånt för mig, jag är fullt medveten om att bitarna inte räcker annars.

Konfliken för mig är egentligen att antal register är för få för att använda dom till både beräkning och lagring men så pass många att man kan utnyttja dom till lagring i vissa fall för att vinna klockcykler.
Jag har alltid varit väldigt optimeringstokig och med den här arkitekturen har jag svårt att bestämma hur jag ska göra.
Om det bara fanns 8st register skulle vi inte haft den här dialogen.

C64 har mycket riktigt 3st register men dessa register fungerar inte som lagring iaf så man har inte samma dilemma där.
(Drömmer mig tillbaka till när allt började, jag köpte en bok som hette programmera 6502, det var tider det)

Undef var en bra pusselbit för temprär data men hur brukar ni göra med in och utdata från funktioner?
Brukar ni använda register eller minnet, pekare eller direkt adressering?

Jag börjar iaf få en bild av hur jag vill programmera assembler men nästa projekt blir nog i C tror jag.
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Inlägg av Micke_s »

Och sparc har 128 register, 32 synbara.
http://en.wikipedia.org/wiki/SPARC
Användarvisningsbild
Andax
Inlägg: 4379
Blev medlem: 4 juli 2005, 23:27:38
Ort: Jönköping

Inlägg av Andax »

68K register var ju 32-bitars register vilket gör ganska stor skillnad.
32 register i AVR går snabbt åt om man måste klumpa ihop flera föra att lagra större datatyper.
Användarvisningsbild
Chribbe76
EF Sponsor
Inlägg: 1167
Blev medlem: 17 januari 2004, 22:43:17
Ort: Stockholm

Inlägg av Chribbe76 »

Jag misstog mig ang undef, man får inga varningar om subrutiner använder samma register, det fungerar bara på linjär kod.
Den enda fördelen med undef är att man slipper varningar för fungerande kod.

Så frågan kvarstår hur det är tänkt att man ska kunna hålla koll på alla temporära register när man har många funktioner som anropas?
Jag får väl i annat fall använda hjärncellen men det borde finnas bättre sätt.

Så här gör jag för att "allokera" ram-minne till mina variabler.
Finns det bättre sätt?

#define Variabel1 $100
#define Variabel2 $101
#define Variabel3 $102


Jag sitter inte bara och klagar, jag programmerar oxå :D
Så här ser det ut för tillfället, BCD-omvandlingen fungerar och jag kan skriva ut det på displayen.
Väldigt tråkig film

hmm.. kom på en sak, Minustecknet ska ju flyttas fram till siffrorna, det ser inte bra ut nu.
Användarvisningsbild
exile
EF Sponsor
Inlägg: 496
Blev medlem: 21 oktober 2005, 23:32:07

Inlägg av exile »

Det mer "korekta" sättet är att använda RAMet är

Kod: Markera allt

.dseg
MinVariabel: BYTE 1 ;Reserverar en byte i minnet

.cseg

;exempel

lds r16 MinVariabel
Angånde hur man ska se 32register som workregisteret i picen.

Sedan angånde att and och or portar så är det snarare en fråga kommpremis, exempel sbi som sätter en bit i ett i/o på en klock cykel... troligt viss fick man inte plats med and och or direkt mot i/o :/

Hoppas att det svara några av dinna frågor ^^
Användarvisningsbild
Chribbe76
EF Sponsor
Inlägg: 1167
Blev medlem: 17 januari 2004, 22:43:17
Ort: Stockholm

Inlägg av Chribbe76 »

Ja, det var precis det jag var ute efter, Tack!

"Angånde hur man ska se 32register som workregisteret i picen."

Det låter som att det ska komma en fortsättning på den meningen, tappade du tråden? :wink:
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Finns det några varianter av ".dseg" ?
T.ex för "overlayade" variabler (d.v.s att t.ex temp variabler
i olika subrutiner kan "dela" på samma adress) ? Alltså motsvarande
PIC-asm's UDATA, UDATA_SHR, UDATA_OVR och UDATA_ACS ?
.dseg allokerar alltså inte bland de 32 registren, utan i det övriga RAM-minnet ?

> och ingen tycker att PIC är skit. den börjar bara bli lite gammal för min smak

Dessutom ska man kanske titta lite mer på PIC18 när man jämför med de *större* AVR'erna.
Där har man t.ex tillgång till (ca) 128 register i access-banken, d.v.s alltid utan extra bank-switchning.
Resten av registrerna är också tillgängliga för *alla* instruktioner, men eventuellt efter att ha "satt" rätt bank.

I access-banken har man alltid tillgång till *alla* specialregister (inkl I/O-portar)
och ca 128 byte RAM för *alla* instruktioner (utan extra bankhantering).
Personligen tycer jag detta är en "renare" arkitektur än AVR'ens uppdelning på "register"
(som i sig är uppdelade i grupper med olika funktion/egenskaper) och "RAM"...

(Dessutom är W mappat som ett register WREG, så alla "file" instruktioner
kan även göras direkt mot W. Bit set/clear o.s.v... :-) )

Det om det. Finns ingen anledning att diskutera detta mer här, och jag
skriver inget mer i denna tråd... :-)
(Om det inte blir *alldeles* nödvändigt... :-) )
Användarvisningsbild
exile
EF Sponsor
Inlägg: 496
Blev medlem: 21 oktober 2005, 23:32:07

Inlägg av exile »

>Finns det några varianter av ".dseg" ?
Nej, Det behövs inte efter som du har 32 st register som fungerar som "temp variabler", skulle man behöva en till så push man på stacken en som man för tillfället inte använder, Ungefär som en vanlig dator.

>Dessutom ska man kanske titta lite mer på PIC18 när man jämför med de *större* AVR'erna.
Nu tycker jag att en ATmega48 (den som används här) inte är speciellt stor, 27.20kr + moms på elfa vilket inte är så farligt. Den är ganska lite flash, 4kbyte (vilket motsvarar < 2k instruktioner ).
Eller en ATtiny25... Men visst jämförelsen med PIC18 bättre (lite nyare och upp snyggad)

>Det om det. Finns ingen anledning att diskutera detta mer här, och jag skriver inget mer i denna tråd... :)
Vilken tur, jag blev nästan lite orolig :wink:


>Det låter som att det ska komma en fortsättning på den meningen, tappade du tråden? :wink:
Tja, det försvann några ord där. Det snarare man ska se 32 registrena som "W". ^^
Användarvisningsbild
Chribbe76
EF Sponsor
Inlägg: 1167
Blev medlem: 17 januari 2004, 22:43:17
Ort: Stockholm

Inlägg av Chribbe76 »

Nu har jag lyckats göra en interruptrutin som räknar quadrature.
Ganska tråkig film

Det funkar bra men jag har tydligen lite problem med stigtiden, om jag drar linjärskalan snabbt så falerar det.
Jag har tittat på spänningen på pinne 6(se bild) med oscilloscopet så jag ser att det är just stigtiden som är slö, falltiden är ok.

Jag använder denna optokopplare75-352-63mellan skalan och ATmegan.
Den ska vara tillräckligt snabb, jag har inte tittat så noga på scopet hur lång stigtiden är men den är säkert över 50µsek.

Kopplingen ser ut så här.
+12V in på höger sida och +5V(inverterat) ut på vänster sida.
Spänningen över motståndet R5 har snabb stigtid och falltid så problemet måste ligger på vänster sida.
Kan pinne7 ha något med saken att göra?

Bild
Användarvisningsbild
exile
EF Sponsor
Inlägg: 496
Blev medlem: 21 oktober 2005, 23:32:07

Inlägg av exile »

Jag ska säga vad jag tror så är det att du kör för hög ström genom dioden som leder till att transistorn "saturation", så ändra R4 till ett lägre eller höj värdet på R5. Till pinne 7 har jag ingen aning hur du ska hantera, men jag skulle tro att hög ohmiskt motstånd mellan GND och pin7 skulle "kunna" ge mild ring av "saturation".

Du får nog experimentera lite gran. ^^
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

I Sverige läser vi från vänster till höger...

> jag ser att det är just stigtiden som är slö,

"Stigtiden", är det när trissan går från on till off ?
D.v.s att inspänningen till LED'en försvinner ?

Och vad exakt betyder "slö" ????
Avviker det mycket från diagramen i databladet ?
Användarvisningsbild
Chribbe76
EF Sponsor
Inlägg: 1167
Blev medlem: 17 januari 2004, 22:43:17
Ort: Stockholm

Inlägg av Chribbe76 »

Stigtiden är när trissan går från on till off.

Jag tror att time/div är 20µsek, jag slarvade visst lite med dokumentationen.
Bild

Jag provade att ändra R5 till ett högre värde och då blev det bättre men det kan nog inte bli bra bara med den åtgärden.

Nu har jag petat fast ett motstånd på 220K mellan pinne7(bas) och jord (R4=10K och R5=2K) och nu funkar det efter förväntan.
I databladet finns faktiskt ett diagram för base-emitter resistance så det ska tydligen vara en resistans där.
För låga värden(provade bara med 10K) gör att signalen ut ligger hög hela tiden, i det fallet måste man nog öka värdet på pullup-motståndet.

Jag är iaf nöjd med resultatet i detta fall men nästa gång jag använder en optokopplare i en kritisk krets kommer jag ta reda på mer info om exakt vilka värden som är optimala.

Time/div är 10µsek
Bild
Bild

Om någon har lust att förklara varför man ska ha ett motstånd mellan bas-emitter och förklara skillnaden mellan en optokopplare utan bas och en som denna med bas så läser jag gärna, annars kommer jag själv ta reda på mer om det senare.

Tack för all hjälp!
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Det har sannolkikt med att hitta trissans optimala "arbetspunkt", så att säga...
Motståndet på basen och strömmen på LED-sidan samverkar för att switcha
trissan på/av.
Skriv svar