Sida 2 av 4
Postat: 12 juli 2007, 15:31:40
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.
Postat: 12 juli 2007, 20:03:16
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
Postat: 12 juli 2007, 21:12:50
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.
Postat: 12 juli 2007, 22:10:28
av Micke_s
Och sparc har 128 register, 32 synbara.
http://en.wikipedia.org/wiki/SPARC
Postat: 13 juli 2007, 02:18:50
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.
Postat: 13 juli 2007, 10:13:40
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å
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.
Postat: 13 juli 2007, 14:10:47
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 ^^
Postat: 13 juli 2007, 14:32:37
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?

Postat: 13 juli 2007, 15:11:58
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...

)
Postat: 13 juli 2007, 20:05:23
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
>Det låter som att det ska komma en fortsättning på den meningen, tappade du tråden?

Tja, det försvann några ord där. Det snarare man ska se 32 registrena som "W". ^^
Postat: 13 juli 2007, 21:40:16
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 optokopplare
75-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?

Postat: 13 juli 2007, 22:13:01
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. ^^
Postat: 14 juli 2007, 12:38:22
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 ?
Postat: 14 juli 2007, 13:33:21
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.
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
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!
Postat: 14 juli 2007, 13:37:35
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.