# ATMEL mikrokontrolleri >  uKontrolieru turboapguve

## Kernel

Ir vajadzība ātri apgūt kontrolierus, dabūju dažādus materiālus, palasīju, pabakstīju, uzrakstīju kādu programmiņu, kas midžina LED, tad sāku veidot savu gāzes kompja programmu (pēc darbības vienkārša), bet tad sapratu, ka nepietiek vien ar to, ka iemācījos izmantot dažas komandas ASM. 
Jautājumi kas uz doto brīdi rodas:

1. Sākt to visu ar ASM vai C? kas labāks, ātrāk apgūstams, kādi argumenti? (sāku bakstīt  ASM,liekas interesanti)

2.  Vai ir vērts apgūt atmel? protams viņi ir gana populāri un var atrast daudz mācību materiālu, bet vai nevar būt tā ka aptrūkstas ar laiku jaudas,ātruma, un nāktos mācīties ko citu (piemēram ARM) ?

3. Ja konkrētāk par pirmo programmu ko vēlos rakstīt. Ieejas signāli- temperatūra, aizdedze, gāzes slēdzis, benzīna slēdzis. Izejas signāli- benzīna sprauslas pārtraukšana un sūkņa atslēgšana(abi kopā), gāzes elektromagnētiskā vārsta ieslēgšana. kā būtu pareizi, vai kontrolieris ir patstāvīgi pieslēgts barošanai un aizdedzes slēdža pagriešanu saņem kā impulsu , vai arī kontrolieris, pagriežot aizdedzi, tiek pieslēgts barošanai? Attiecībā uz temperatūras lasījumiem. Pie definētas temperatūras tiek pārslegta degviela. kā apstrādāt analogo signālu, kas nāk no temperatūras devēja? 

Vēlētos uzklausīt kādas idejas,padomus. Paldies iepriekš!

----------


## habitbraker

Nu es saaktu ar asm. Ar C ir taa, ka pa priekshu jaaiemaacaas pats C un tad veel C prieksh mcu.

Pic piemeeram ir 35 instrukcijas (midrange piciem) - burtiski vienaaa dienaa var apguut. Saliidzinaajumam atmel -120...

Var visaadi - gan iesleegt baroshanu(buus jaasaak no reset), gan pamodinaat no sleep. Sleep ir daudz priekshrociibas - piemeeram var pamodinaat ar dazaadiem aareejiem notikumiem utt. Datsheet ir niansees.

Nu analogo signaalu ar ADC konvertee un taalaak kodaa aptraadaa. Tavs projekts neizklausaas paaraak neiespeejami uztaisiit bez daudzu gadu pieredzes   ::  

PS. http://www.failiem.lv/list.php?i=puwrlo - dazhas graamatinjas par PIC  ::

----------


## ansius

kas vainas AVR? man kaut kā pic liekas mēģinājums nodurties, tikai pirms tam tev darba reģistrā nazis jāieliek. avr manuprāt ir ērtāks. bet tas ir cits karš...

par C vs. ASM esmu par ASM jo tas liek labāk izprast uC uzbūvi un kā viņš galu galā strādā, ja matemātika nav vājā vieta arī kods sanāk efektīvāks nekā iekš C taisīts un tad kompilēts. C ir universālāk, vies algoritms korekti veidots darbosies uz plašāka spektra kontrolieriem, jo specifiku risina kompilators.

Galvenais, ka kods strādā un strādā stabili...

----------


## Kernel

paldies par materiāliem, bet sāku AVR , jau kaukto palasīju, paklabināju negribas tagad sākt apgūt pic, tas prasa laiku.
Nu šis konkrētais nav sarežģīts, bet vēlos apgūt kārtīgi,lai justos brīvi kontrolieros,noderēs.
Nu tad jau būs vien jārok ASM  ::  
Jautājums par pull-up rezistoriem. tad kad pins ir definēts kā ieeja, pull-up ir vienmēr jāpieslēdz? kādam mērķim tie ir paredzēti? 
Par tām 120 instrukcijām- manuprāt nav jau tā ka viņas visas būtu arī jāizmanto  ::  ir tur dažas gana specifiskas un reti izmantojamas, domāju ka sākumā vienkāršām lietām var iztikt ar mazu daļu no tām instrukcijām. Lasīju, ka AVR ir tā, ka ir dažas atšķirīgas instrukcijas, kas tiek apzīmētas ar vienu un to pašu bināro kodu.  Jeb pareizāk vienas instrukcijas kodam tiek piedēvēti 2 dažādi nosaukumi. 

Jautājums par AVR iespējām paliek... vai ir kāds sastapies ka kaut kad sāk nepietikt ātruma, reģistru vai vēl sazin kā?

----------


## Delfins

> tad kad pins ir definēts kā ieeja, pull-up ir vienmēr jāpieslēdz? kādam mērķim tie ir paredzēti?


 Nu jā šādi jautājumi, tad no LED mirgošanas uzreiz uz auto-tjuning elektroniku bišku pa paltu solis..  :: 

pull-up domāts, lai ieeja "nekarātos gaisā" - neprognozējams bits Tev būs.. ja vien nav ārējais rezistors pieslēgts

----------


## M_J

Ja par ASM vai C - labākais jau būtu apgūt paralēli abus. ASMā labāk sapratīsi kontroliera arhitektūru, varēsi uzrakstīt programmas, kas maksimāli efektīvi izmanto konkrēto dzelzi. Bet Tev ir padomā konkrēts uzdevums par gāzes iekārtas vadību. Un gribas izmērīt temperatūru. Nu labi - iegūsi ADC pārveidojuma rezultātu, kurš būs proporcionāls spriegumam uz temperatūras devēja. Tālāk tas jāpārveido temperatūrā. Tā ir matemātika un te jau krietni ērtāks būs C.
 Par resursu nepietikšnu atmel mikrokontrolieriem - tādas situācijas ir regulāri. Ja runājam par auto jomu, kurā arī darbojos, ātrdarbības sāk pietrūkt apstrādājot signālus no rotācijas devējiem pie lieliem kloķvārpstas apgriezieniem. Piemēram Audi motoram, kura kloķvārpstas stāvokļa devējs izmanto spararata zobus, kuru ir 135. Ja pieņemam ka signāls ir tīrs, bez traucējumiem, tad tā apstrāde ir vienkārša un daudz resursu nepaņem. Bet, ja gribam, lai programma atfiltrē traucējumus, un ir spējīga konstatēt, piemēram, ka viens spararata zobs ir nolūzis un to ņem vērā rēķinot kloķvārpstas pagrieziena leņķi - tad jau sāk just ātrdarbības trūkumu. Jo nav jau tikai zobi jāskaita - ir arī sprauslas, aizdedzes spoles, tukšgaitas regulators, turbīna jāvada, temperatūra, ieplūdes kolektora spiediens, droseļvārsta potenciometra, lambda zondes spriegums jāmēra, visi tie dati jāapstrādā. Un tā, skat, pie 10000rpm - kaut ko vairs nevar paspēt izdarīt laikā. Tas, protams, uz galda, kur visi tie signāli tiek emulēti, dzīvē jau Audi motors tik ātri negriežas. Bet ja gribam lai droši strādātu pie 8000, jāstrādā arī pie 10000. Un tad sākam skatīties - cik kura darbība tērē laiku, kā tiek izmantoti reģistri, kā organizēti pārtraukumi, kādas komandas izmantotas, vai kādu komandu kombināciju nevar aizstāt ar citu, kas dara to pašu, bet ātrāk, vai kādu darbību nevar pārcelt uz citu momentu, vei nevar kādus datus sagatavot jau iepriekš utt. Un izrādās, ka, optimizējot programmu, var izdarīt to, kas sākotnēji liekas neizdarāms. Un nākas secināt, ka ir pietrūcis nevis Atmel ātrdarbības, bet paša meistarības.

----------


## Epis

vēl jau ir Arduino opcija, bet tur ta vaig kādu no arduino kitiem, kuru ta varētu kodēt tā uz ātro augstā apstrakcijas līmenī, tas softs itkā tika taisīts lai neprofesionāļi varētu fiksi paņemt MCU un kautko uzkodēt, un ir lasīts ka patiešām iesācējiem ātri pielec. + arduino valoda ir bāzeta uz C/C++ tākā būs arī kāds priekštats par c kodēšanu, uz kuras varēsi vēlāk pāriet.
lai ko arī izvēlētos pareizi dari ka PIC neņem, asmā būtu baigi grūti to kodēt, ar tām viņa 35 instrukcijām.

----------


## JDat

Ir jāuzstāda mērķis un jāvirzās uz to mērķi. Pa druskai pa vienam solītim. Mācoties. Pa cik nezinu C, tas izvēlos ASM. Tikai bez kodēšanas eksistē 100 un viena cita nianse. Tiešām jāiesāk ar LED, bet nevis iekačāt gatavu kodu, bet gan pēc parauga uzrakstīt savu. Piemēram LEDu uzlikt uz cita porta. Pogu arī. Tikt galā ar debounde pogai. Tad iemācīties pogu caur interrupt palaist, Tad iemācīties timerus lietot. Tad iemācīties ADC lietot. Jāčakarē katrs mikrouzdevums, kamēr strādā stabili un tu pats jūties esi apguvis. Nevar tā: hop es gribu gāzes kontrolieri. Sākt kaut ko kodēt. Mikrokontroliera fīča ir tā ka kontrolieris var ātri reaģet uz datu izmaiņām un ātri veikt atbildes reakciju. Jāsaprot kur ir C priekšrocības un kur ir ASM priekšrocības. Skaidrs ir viens: daudz jāstrādā un daudz jāmācās. Tā lūk, ne ko konkrētu neatbildēju, bet caru ka ir viela pārdomām.

----------


## habitbraker

> Nu labi - iegūsi ADC pārveidojuma rezultātu, kurš būs proporcionāls spriegumam uz temperatūras devēja. Tālāk tas jāpārveido temperatūrā. Tā ir matemātika un te jau krietni ērtāks būs C.


 ir veerts imantot shaadaam darbiibaam reizinaashanu un daliishanu? (8-bit MCU )

----------


## M_J

Nu protams, ka jāizmanto visas iespējamās matemātiskās darbības. Saskaitīšana, atņemšana - tas pats par sevi, 8 bitu Atmeļiem lielākajai daļai, izņemot vecos modeļus, ir iebūvēta aparātiskā reizināšana, dalīšana nav. Dalīšanas apakšprogrammas sanāk garas, tagad nenosaukšu precīzus skaitļus, to var apskatīties iekš "applicatiom notes", nu bet izdalīt vienu divus baitus aizņemošu skaitli ar otru tādu pašu - tas laika ziņā aizņēma vairākus simtus ciklu. Lai izrēķinātu no temperatūras NTC devēja sprieguma, temperatūru, jāizmanto naturālais logoritms. Protams, to visu jāpaveic izmantojot attiecīgā mikrokontroliera pieejamās komandas, tajā skaitā reizināšanu. Tikai domāju, ka šis noteikti ir tas gadījums, kad C atvieglo procesu.

----------


## Kernel

pārlasīju pēdējos postus vairākas reizes.. lika padomāt  ::  itkā jau tā ir ka tās realizējamas darbības galvā apmēram ir, bet kad gribi rakstīt, tad iekšā ir, ārā nenāk. nu tas arī tāpēc, ka esmu šeit pilnīgs iesācējs. nu ok, tomēr jāpiekrīt Jdat un jāmācās pa solītim un jāapgūst pamatīgi, lai iesēžas. itkā interesanti, bet šitā tēma man ātri neaiziet, baigi daudz visādu navarotu uzreiz nāk, tapēc būs darbi tie jāsadala.  :: 
M_J cik sapratu konkurē ar vems un squirtiem.. Ja nav noslēpums, tad cik ilgā laika posmā aizgāja tā lieta, lai pietiktu spēka uzcelt savu kompi?

Katrā ziņā paldies par vērtīgiem ieteikumiem!  ::

----------


## next

> Tikai domāju, ka šis noteikti ir tas gadījums, kad C atvieglo procesu.


 C atvieglo procesu programmerim un iekrauj darbos mcu.
Jo izmanto standartproceduuras kas reti kad buus optimaalas konkreetajam gadiijumam.
Asmaa taisiita daliishana var sanaakt 2reiz iisaaka un aatraaka ja piedzen savai vajadziibai.
http://www.microchip.ru/phorum/read.php ... ply_122543

----------


## ansius

runājot par resursiem teikšu godīgi - lai arī rakstīt iekš c ir vieglāk, bet rezultātā resursi ātrāk pietrūkst. un sorry bet PIC vs. AVR funkcionāli pārāks ir AVR, vienos vārtos.

savukārt lai mācītos, soli pa solim. iemācies led mirkšķināt, tad izmantot taimerus / IRQ, tad padomā par multitasking, jo lai arī uzdevums nav uber sarežģīts - uC resursi ir stipri limitēti - l'diz ar to nepareizi iesākta programma, var būt nemaz nerealizējama.

----------


## M_J

Nevaru jau īsti salīdzināt ASMa un C plusus un mīnusus, jo līdz šim visu esmu rakstījis tikai ASMā. Uzskatu, ka tāda vienpusība nav laba, ja tagad sāktu no nulles, ņemtu abas valodas paralēli. Tagad gribētu savās programmās sākt kombinēt ASMu un C, tikai baidos, ka tagad jau to būs stipri grūtāk izdarīt, kā tad, ja to būtu darījis no paša sākuma. Bet C gribu izmantot, jo prasās pēc sarežģītākas matemātikas (kā piemērs - temperatūras aprēķins izmantojot spriegumu no NTC). Un ja parādās naturālais logaritms un citas tāda veida funkcijas, neliekas prātīgi to visu taisīt ASMā. Un tagad nezinu īsti ar ko tāda kombinēšana draud. Tas, ka varētu pietrūkt programmas atmiņas pagaidām nebaida -  ASMā esmu aizpildījis tikai apmēram trešdaļu ATMEGA128 atmiņas. Arī par ātrdarbību pārāk neuztraucos tās lietas jau ir sadalītas - lēnās lietas, tajā skaitā matemātika, notiek galvenajā programmas cilpā, ātrās lietas - interruptos un atgriežoties no tiem. Ātrās lietas, protams, visas paliks ASMā, bet galvenajā cilpā varētu kombinēt C un ASM. Un tagad jautājums tiem, kas programmē C - vai es varu uzstādīt nosacījumu, lai C ir tik mīļš un neizmanto virkni reģistru - tie man ir vajadzīgi interruptos. Ja C, neskatoties uz visu, sagribēs šos reģistrus izmantot, man, katru reizi ieejot interruptā nāksies saglabāt šo reģistru saturu un atgriežoties atkal atlikt atpakaļ, un tas stipri sabremzēs visu procesu. Gan jau atbildi var atrast C aprakstos, bet varbūt kāds var bez meklēšanas atbildēt.
 p.s. no idejas līdz rūcošam motoram pagāja 3 gadi, bet ko izlabot un uzlabot būs vienmēr, arī Rīga nekad nav gatava

----------


## SnacK

Kombinējot C ar ASM, pamatkods parasti tiek rakstīts C, bet procedūrām, kas prasa optimālu procesora izmantošanu, izmanto ASM.

C pats parūpējas par reģistru saglabāšanu. Tiesa, laiku tas aizņem. Atribūts ISR_NAKED atslēdz reģistru saglabāšanu un atjaunošanu. Var izmantot, ja ir zināms, ka pārtraukuma kods neko nedarīs ar reģistriem, vai arī strādās ar mainīgajiem, kas ir definēti kā noteikti reģistri, piem., _register unsigned char counter asm("r3");_ Šajā gadījumā kompilatoram ir noteikt, ka mainīgais counter vienmēr tiks glabāts reģistrā R3

----------


## abergs

> Un tagad jautājums tiem, kas programmē C - vai es varu uzstādīt nosacījumu, lai C ir tik mīļš un neizmanto virkni reģistru - tie man ir vajadzīgi interruptos.


 Fragments no CCS C manuaļa:

Type-Qualifier
static - Variable is globally active and initialized to 0.  Only accessible from this compilation unit. 
auto - Variable exists only while the procedure is active.  This is the default and AUTO need not be used.
extern - variable used with multiple compilation units.  No storage is allocated.  Is used to make otherwise out of scope data accessible.  there must be a non-          extern definition at the global level in some compilation unit.
_fixed(n) - Creates a fixed point decimal number where n is how many decimal places to implement.
volatile - Tells the compiler optimizer that this variable can be changed at any point during execution.
const -  Data is read-only.  Depending on compiler configuration, this qualifier may just make the data read-only -AND/OR- it may place the data into program   memory to save space.

----------

