Börja med PIC kretsar!
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.
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.
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.
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.
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 
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
Varje cycle som dör i onödan är en för mycket!
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å

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

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

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å

- Housepainter
- EF Sponsor
- Inlägg: 1318
- Blev medlem: 19 juli 2006, 18:50:38
- Ort: Borås
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!!
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!!

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!
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!
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

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

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:
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å?
Det kan vara början till ..... något iaf.
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
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.
- Housepainter
- EF Sponsor
- Inlägg: 1318
- Blev medlem: 19 juli 2006, 18:50:38
- Ort: Borås
Det var mycket kod för lite arbete
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...

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

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.
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.
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.
Å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.

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