Börja med PIC kretsar!

Elektronikrelaterade (på komponentnivå) frågor och funderingar.
Användarvisningsbild
Icecap
Inlägg: 26632
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

BoF: Tack för den du!

Jag lever på att designa elektronik och programmera och all min programmeringskunnande är självlärd!

De saker jag har gjort har rykte om sig att vara mycket stabila, speciellt i programväg och mitt senaste större projekt (2K+ á 26KKr/stk på marknaden) är programmet klickfritt och elektroniken har enbart problem med ett motstånd som inte tålde vissa pulser i 0805-utförande men det går kanonbra i 1206 och sedan var det nätdelen som lägger av utan anledning men det är en "extern" grej som inte håller specifikationerna.

De mekaniska grejer tar jag dock inte på min kappa, där följer jag bara med.
BoF
EF Sponsor
Inlägg: 222
Blev medlem: 7 oktober 2006, 16:43:37

Inlägg av BoF »

Senast redigerad av BoF 5 april 2007, 23:01:31, redigerad totalt 1 gång.
Användarvisningsbild
Icecap
Inlägg: 26632
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Javisst.... och vilka råd har du givit? Hur har du visat vägen?

Jag började med BASIC *ryyyys* 1982 och gick mycket snabbt över till ASM på Z80 under CP/M, 1984 gick jag till Pascal, 1991 till Borland C++ och har sedan programmerat CiCode, PLC, SioX, C, Pascal, VB, PIC (ASM + C). Mitt första kommersiella program gjorde jag 1985 och det körde felfritt fram till fabriken stängdes 16 år senare.

Jag vill alltså påstå att jag har ett hyggligt underlag att utgå ifrån men jag kan inte se vad vi ska vara kritiska till, du kanske kan påpeka det?

Att C(++) är mer effektivt i programmeringstid jämfört med ASM är helt sant men det är inte det bästa sätt att lära känna processorn och klämma ur de sista skvätter kraft ur den, jag har mycket behållning av att valfritt kunna programmera i ASM eller C, i C kan jag "optimera" uträkningar för att jag vet hur de blir i ASM och hur jag hade löst dom i ASM, därav förstår jag att ASM är "grundlaget" för att klämma effektivitet ur ett program.
BoF
EF Sponsor
Inlägg: 222
Blev medlem: 7 oktober 2006, 16:43:37

Inlägg av BoF »

Senast redigerad av BoF 5 april 2007, 23:01:10, redigerad totalt 3 gånger.
Användarvisningsbild
Icecap
Inlägg: 26632
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Rönnbären är sura sa räven.
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Inlägg av v-g »

Hmm kanske en Mod kunde städa upp lite i tråden då det är lite svårt att följa på sistens. Någon verkar ha brutit mot reglerna :roll:

Generellt kodar man stort tar man C kodar man litet tar man assembler. Fast ofta kan man klippa och klistra i assembler med färdiga rutiner och då är faktist tidsvinster borta iom C.

Märkte senast idag hurpass "smarta" rutiner man kan göra med lite "finurlighet" i ASM. Det roliga är också att man kan räkna på EXAKT vad och när något kommer att ske :hacker:

Varje cycle som dör i onödan är en för mycket! :D

Edit:Tillägg: Jag är INTE professionell utan glad amatör som inte har ett dugg att vinna på att fler köper WISP628 förrutom fler "kompisar" då 8)
Användarvisningsbild
Housepainter
EF Sponsor
Inlägg: 1318
Blev medlem: 19 juli 2006, 18:50:38
Ort: Borås

Inlägg av Housepainter »

Jag gillar att en sådan här tråd skapades! Jag har själv väldigt nyligen köpt en Wisp av sodjan. Dock har jag inte gjort något mer än att montera ihop den. Jag har många frågor, men jag har inte haft tid eller ork att börja nysta i det än.
Det jobbiga är att man får olika bud från olika håll. Den största frågan är ju Assembler eller C eller annat språk. Man får så många olika svar.
IceCap och Sodjan verkar vara ganska överens om att man skall göra det ordentligt med assembler. Och jag som aldrig programerat något mer är lite print och goto i en miniräknare för ca 10 år sedan känner att det kanske är lika bra att göra det ordentligt från början.
Dock känner jag viss rädsla att det kommer att vara en såpass övermäktig sak, så man ger upp till slut.
Men det känns bra att man har forumet med alla som hjälper varandra.

Jag får se när det blir till att börja programera, och vad man kommer att programera.

Så vad säger ni? Skall jag lära mig assembler redan nu, trots avsaknaden av någon som helst tidigare erfarenhet av programering?

Hm.. fick jag något vettigt sagt? Och vad är det BoF skrev som sedan togs bort? Frågorna är många!! :)
Användarvisningsbild
Icecap
Inlägg: 26632
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

BoF skrev att det var dåligt om man var självlärd och att vi skulle låta bli att ge dåliga råd. Jag saknar dock fortfarande förklaring på vilka råd som var dåliga...
Jag misstänker att det var en del "i morgon är det röd dag-saft" inblandat...

Men precis som v-g skriver: stora program kan vara bäst i högnivåspråk, små program i ASM. Fördelen med ASM är att man "lärar känna" den valda µC i minsta detalj och ofta kommer på varför det kan löna sig att göra på vissa sätt i C (eller vad man nu väljer), en annan fördel är att man kan "tweaka" en hel del om man behöver ganska speciella saker gjorda.

Mitt råd att undvika högnivå som ingångssteg hänger också ihop med att det finns en del exemplar på att användare har använd t.ex. 'serout(...)' utan att fatta vad det egentligen gör (mjukvara UART), eller 'delayms(...)' osv. Detta gör att man använder ett "virtuellt" system utan inblick i hur resurser används och sedan klagar i detta forum på att "minnet tar slut" och/eller "det kör för långsamt" osv.

Så C (högnivåspråk) är bra.... när man väl VET vad man jobbar med. Och BASIC suger alltid!
MADZerQ
Inlägg: 34
Blev medlem: 2 april 2007, 09:43:19
Ort: Harmånger

Inlägg av MADZerQ »

Housepainter: Jag känner ungefär som du! Men iom att vi är två som slår skallen i väggen så kanske det kommer ut en väldigt massa bra saker efter ett tag :)

Icecap har övertygat iaf mig vad man skall satsa på. Sedan får var och en dra sina egna funderingar kring hans tankar och idéer.

Det som jag ser som mitt problem är vad det finns för rutiner i ASM och hur man skall börja leta efter sådan info, är det böcker, internet eller bara sitta och traggla...

Fram med mer sådan info, kanske en noob kurs i ASM programmering skulle vara på sin plats :D
Användarvisningsbild
Icecap
Inlägg: 26632
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Ett lite tips: när man läser in data, det kan vara från serieport eller t-bord, kan det vara bra att kunna omvandla dom till "riktiga" värden.

Exempel: man får "123", hur gör man då det till en byte med värdet 123?
Pseudokod:

Kod: Markera allt

Start:
  // 'Pekare' visar första tal, i detta fall '1'
  Resultat = 0; // Alltid ett startvärde
Loop:
  Resultat = Resultat * 10;
  Resultat = Resultat + (Pekare) - '0'; // Lägg till värdet, '1' blir '1' - '0' = 1 osv.
  Pekare = Pekare + 1; // Pek på nästa plats
  om(Pekare) är legalt tal gå till Loop
Med (Pekare) menas värdet i den byte som Pekaren pekar på.

Då så, nu kan man läsa in tal..... men hur fan multiplicerar man med 10 enklast möjligt då?

Kod: Markera allt

Multiply_10:
  Mellanvariabel = Inkommande;
  Mellanvariabel shiftas vänster 1 gg; // Mellanvariabel = Inkommande * 2
  Mellanvariabel shiftas vänster 1 gg; // Mellanvariabel = Inkommande * 4
  Mellanvariabel = Inkommande + Mellanvariabel; // Mellanvariabel = Inkommande * 5
  Mellanvariabel shiftas vänster 1 gg; // Mellanvariabel = Inkommande * 10
  Resultatet är nu i Mellanvariabel.
Det kan vara början till ..... något iaf.
Användarvisningsbild
Housepainter
EF Sponsor
Inlägg: 1318
Blev medlem: 19 juli 2006, 18:50:38
Ort: Borås

Inlägg av Housepainter »

:humm: :wacko:
MADZerQ
Inlägg: 34
Blev medlem: 2 april 2007, 09:43:19
Ort: Harmånger

Inlägg av MADZerQ »

Det var mycket kod för lite arbete :wink:

Skämt åsido, Förstår hjälpligt iaf hur detta fungerar men kanske att man skall bryta ner det i sina minsta delar.

"Resultat = 0; //Alltid ett startvärde"
Detta sätter alltså variabeln Resultat till 0, skall man alltid göra det? eller spelar det ingen roll vad man anger här?

Jag antar att koden fungerar så här om jag har förstått det rätt...
Loop:
Rad 1, detta sätter variabeln till 10
Rad 2, detta adderar variablen Resultat med minnes pekaren och drar bort 0
Rad 3, detta flyttar pekaren en position framåt i vad? minnesplatsen eller värdet som kommer?

Då borde Pekare = 2 i varv 2 av loopen, men då för att vara säker om det istället för "123" skulle vara "150" används samma kodning då eller byts det någonstans?

Detta att skriva vad det gör är s**t svårt, jag ser koden och tror mig veta vad den gör men att i ord förklara... :roll:
Användarvisningsbild
Icecap
Inlägg: 26632
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Nej, du har INTE förstådd det rätt!

Resultatet SKA sättas till noll eller börjar du alltid räkna med godtyckligt tal?

Rad 1: här multipliceras föregående resultat med 10, alltså tidigare ettor blir tior osv.
Rad 2: Detta lägger till "nya" ettor och det skiljer kraftigt på 0 och '0'. '0' är 0x30, vad som menas är att man ser till att värdet som adderas är mellan 0 och 9.
Rad 3: Pekaren flyttas till nästa tecken, från '1' -> '2' -> '3' (vid sträng "123") osv. Man måste såklart ha en "stopp" på strängen, vilken beror på vilka data som kommer.

Detta sätt kan skalas till 4-bytes variabler om man vill, detta gäller även *10-rutinen.

Detta är det smidigaste sättet att göra i ASM, det fyller inte mycket och går fort.
MADZerQ
Inlägg: 34
Blev medlem: 2 april 2007, 09:43:19
Ort: Harmånger

Inlägg av MADZerQ »

Ja jag ser att detta inte är så enkelt som det verkar. Men jag skall försöka vidare och se hur det går.

Åter till koden du har visat.
Pekaren, den har inget med att göra hur värdet i minnet blir! Den bara ser till att det värde som blir i dom första 2 raderna hamnar på plats

Därför borde alltså värdet styras av dom 2 första raderna, om det inte är så då har Icecap tyvär försökt lära en betongklump att koda. :(
Användarvisningsbild
Icecap
Inlägg: 26632
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Pekaren är den som bestämmer vilken inmatning som sker.

Om vi utgår ifrån en sträng och för enkelthetens skull noll-terminerar den som i C: "123" kommer den att bestå av 4 bytes som i stigande adressordning är:
0x31, 0x32, 0x33, 0x00

Pekaren pekar då på den första av dom (lägst adress) ->0x31 (= '1') tecken som ska omvandlas.

(parantes är resultatet)
Resultat = 0;
------- 1'sta varv --------
Resultat = Resultat * 10 (= 0)
Resultat = Resultat + 0x31 - 0x30; (= 1)
Pekare->0x32; Peka på nästa tecken som ska omvandlas.
---- 2'dra varv ----
Resultat = Resultat * 10 (= 10)
Resultat = Resultat + 0x32 - 0x30; (= 12)
Pekare->0x33; Nästa tecken igen
---- 3'dje varv ----
Resultat = Resultat * 10; (= 120)
Resultat = Resultat + 0x33 - 0x30; (= 123)
Pekare->0x00, detekteras som icke-taltecken och allt är klart

Resultatet är att en sträng = "123" blir till värdet 123 i en variabel.
Skriv svar