# RS232 / USB / Bezvadu komunikācija >  ESP8266 + Arduino IDE. help!

## sasasa

Sakāros ar sekojošu problēmu. Ir gatavs kods, kas jau darbojas uz ES8266 ESP-12e. Ielādējot ar Arduino IDE 1.6.4 sketču jaunā ESP8266 modulī , WDT sāk resetot moduli un tas nestrādā. Ja aizkomentēju ar // taimera koda rindas un tad ielādēju kodu ESP modulī, tad WDT vairs netraucē. Pēc tam noņemot  //  un ielādējot visu sākotnējo kodu WDT vairs negļuko un viss darbojas kā nākas. Kas tur izmainās ar šādu muļķošanos nevaru saprast. Rezultāts it kā ir panākts, bet kad jāieraksta vairāki ES moduļi, tad šitā lieta sāk kaitināt. Tāpat arī rakstot kodu gadās ka WDT sāk visu bremzēt. Sākumā domāju ka es ko galīgi nepareizi rakstu, bet tad kaut kā pie atkļūdošanas uzķēru šo fīču un aizgāja arī visi mani iepriekšējie rakstītie kodi, tika bija jāpačakarējas viņu uploadojot. Varbūt kaut kādā nepareizā secībā definēju mainīgos vai bibliotēkas? Vai tas kaut ko ietekmē kur un kā tas tiek definēts?
.. var jau būt ka pat nevajag uploadot pārveidoto kodu, bet iespējams ka pietiek tikai aizkomentēt un nokompilēt, bet to vēl nesmu pārbaudījis.

----------


## JDat

Savulaik paziņa čakarējās ar webisku LED bliknotāju. Viena no niansēm bija tāda ka jāuzmanās kur pullup/pulldown pieslēgts. Runa ir par native moduli 8 pin headeri. Varbūt tur jāsāk pētīt?

----------


## sasasa

Nav nekur pullup, pulldown. Un ja arī būtu, tad kā gan tas var izmainīt wdt un koda kompilāciju pēc otrās reizes? Sajūta tāda, ka pēc pirmās kompilācijas kaut kas saglabājas Arduino ide atmiņā, un pēc tam veicot nelielas izmaiņas viņš nekompilē visu pa jaunu, bet tikai jauno koda daļu. Līdz ar to fināla kods ir citādāks, nekā ja ja kompilē tikai vienu reizi visu kodu. Rezultātā kaut kādi taimera dati acīmredzot ir ierakstīti citur un vairs neizsauc wdt resetus.
..bet nu tas ir riktīgs čakars katru reizi atverot skeču raxtīt tos // un atkal pēc tam ņemt nost. 
Un vēl trakāk ir pie koda atkļūdošanas, jo citreiz nevar īsti saprast vai ieraxtīta kļūda kodā vai kompilators gļuko. Ir gadījies ka lielu daļu koda nākas aizkomentēt, kamēr wdt nomierinās.  :: 
Vēl tāds novērojums, ka wdt nepatīk, ja funkcijā, ko izsauc taimera pārtraukums, tiek lietoti mainīgie, ko aprēķina citas funkcijas

----------


## Jurkins

Neesmu baigais specs, bet ar tiem pārtraukumiem vajag darīties uzmanīgi, jo, ja šie ir atļauti visu laiku, tad var gadīties, ka pārtraukums notiek brīdī, kad tā cita funkcija rēķina tos mainīgos. Un tad protams sanāk šmuce. Domāju, ka ja uz attiecīgās funkcijas izpildes laiku pārtraukums tiks liegts, tad nekādu gļuku nebūs.
Ar wdt bijatāds moments. Es gan nedarbojos ar arduino, bet ar attiny13 un "tuvu dzelžiem". Pie kaut kādas konfigurācijas viņš vienā pārtraukumā uztaisa resetu, nākamajā tikai pamostas, atkal resetu, atkal pamostas u.t.t. Kaut ko biju ne tā uzrakstījis, un situācija bija līdzīga kā šeit aprakstīta. Kaut kas tur bija ar wtd konfigurācijas bitiem. Pašlaik man RAMs aizņemts ar citām domām, tāpēc varbūt tā bišķi nesakarīgi muldu. Štukoju, ka šitas obligāti jāatcers, bet nu kā vienmēr.

----------


## sasasa

> Neesmu baigais specs, bet ar tiem pārtraukumiem vajag darīties uzmanīgi, jo, ja šie ir atļauti visu laiku, tad var gadīties, ka pārtraukums notiek brīdī, kad tā cita funkcija rēķina tos mainīgos. Un tad protams sanāk šmuce. Domāju, ka ja uz attiecīgās funkcijas izpildes laiku pārtraukums tiks liegts, tad nekādu gļuku nebūs.


 .. a kāda tur šmuce? pēc pārtraukuma skaitļošana turpinās. Vai ne tā?
 ..un ja attiecīgās funkcijas izpildes laika taimeris būs pilns, bet partraukums izslēgts, tad viss uzkārsies... Kaut ko es te nesaprotu. Kā tu domā to pārtraukuma ieslegšanu atslēgšanu?  Visu laiku griežas uz riņķi skatītājs (timer1), kurš pārpildoties izsauc funkcju, kura savukārt uzstāda taimerim jaunu nākošā cikla vērtību. 
.. un prncipā tak man tas kods darbojas +- normāli, tik jālādē iekšā 2 reizes, un ar pielabošanu - ot tur tā bēda.
,, un ja jau prtraukumos būtu tvaina, ta tad arī pie otrās ielādēšanas (upload) nekas nemanītos..
..korče nekā nesaprotu..
taimeris un koda struktūra īsumā šāda.
kodā nav komandas interrupts(); vai noInterrupts();. Es nezinu vai vajag(?), jo arī bez tām darbojas. Ir tikai timer1_attachInterrupt(itr);



```
 
#include "funkc.h "
 void setup()
{
  timer1_isr_init();
  timer1_enable(0, 0, 1); 
  timer1_attachInterrupt(itr);
}

void loop()
{
  x=calc();
}
```

 aizkomentēts tiek //timer1_attachInterrupt(itr);
 funkcija itr() ir atsevišķā failā funkc.h , kur arī ir pārējie aprēķini
Ir mēģināts bez kādas aizkomentēšānas x ielikt kā nemainīgu vērtību - tas reizēm palīdz, bet reizēm nē. Pagaidām neesmu atklajis likumsakarību kad palīdz kad nē.




```
#ifndef FUNKC_H
#define FUNKC_H

 void itr()
 {
   timer1_write(x);
   digitalWrite(12, HIGH );
   delay_1us();
   digitalWrite(12, LOW);
}

void calc()
{
  x  = .........................   saņem datus no i2c un WiFi UDP
}

#endif
```

----------


## Jurkins

Patiesībā, man ardino ide ir tumšāka bilde par asmu vai c. Mana doma ir tāda. Ja cilpā visu laiku griežas funkcija, kura rāķina kaut kādu x, tad nav teikts, ka tajā brīdī, kad notiks pārtraukums x rēķins nebūs kaut kur pusceļā. Kas notiks šajā gadījumā? Assemblerā šajā ziņā ir vienkāršāk redzams. Šeit tā funkcija, kura idē ir vienā rindiņā x = ... varbūt ir nokompilēta uz 50 mašīnkomandām. Ja pārtraukums notiek brīdī, kad procesors pilda 32 komandu? Pārtraukums grib x vērtību. A bet tas x ir velns zina kāds.

Es jau esmu iesācējs gan c, gan asmā, bet pudu sāls izēdu uz šiem pārtraukumiem, kad biju izdomājis savu 1-wire programmu uzrakstīt. Iet, iet viss labi, te opppā, kļūda. Izrādās pārtraukums noticis brīdī, kad kontrolieris lasa termometra adresi.

Ja arduino pievieno interrupt.h bibliotēku, tad var lietot komandas sei() un cli().

----------


## sasasa

> Ja pārtraukums notiek brīdī, kad procesors pilda 32 komandu? Pārtraukums grib x vērtību. A bet tas x ir velns zina kāds.


 Velns nezin, bet nekādas problēmas - tad x ir iepriekšējā vērtība. Funkcija izmanto esošo x vērtību un nav svarīgi vai tā ir izrēķināta pirms mikrosekundes vai pirms sekundes.
.. bet kā jau teicu - ne jau tur tā bēda, jo ja tā būtu, ta kā gan pēc otrās kompilācijas kods sāktu strādāt?
.
a kāda ir atšķirība vai sei() un cli() vai interrupts() un noInterrupts()?  un kam man vēl interrupt.h, ja bez viņa srādā?

----------


## M_J

Es gan AVRus programmēju ASMā, bet tā C sintakse esot tuva ar Java sintaksi, bet ar pēdējo nedaudz niekojos, tad izmantojot šo apstākli mēģinu iebraukt problēmā. Un, ja pareizi esmu sapratis, tad taimera pārtraukumā ir arī rindiņa.
delay_1us();
Ko tas delay tur dara? Lai nu ko, bet pārtraukumus ir jātaisa maksimāli ātrus, bez jebkādiem delay. Starp citu - kāds var pateikt kā arduino organizē to delay? Varbūt tiek izmantots tas pats taimeris un tas pats taimera pārtraukums.

----------


## Jurkins

Re kā vecmeistari pamana uzreiz :: . Toč pārtraukumā delay ir galīgi garām.

Šķiet, ka arduino izmanto timer0 šim lietām.

Nu nez, esošā x vērtība ir c koda pierakstā kā x. Kas notiek reģistros? Kur viņa glabājas kompilatoraprāt es nezinu. 
Cīnoties ar virtualwire izlasīju, ka mainīgos jādefinē kā volatile, lai pārtraukumi šos nesamaitā.

----------


## sasasa

> Un, ja pareizi esmu sapratis, tad taimera pārtraukumā ir arī rindiņa.
> delay_1us();
> Ko tas delay tur dara?


 Ir gan. Ko vina tur dara var redzēt pēc koda. Tāda arī ir šī taimera/pārtraukuma funkcija - ģenerēt 1us garu impulsu uz kādas kājas (piem. pin 12) pēc iepriekš noteikta laika intevāla.  Bet ja pamanīji, tad nevis vienkārši delay(xxx), bet gan funkcija delay_1us(); zem kuras slēpjas 


```
void delay_1us()
{
  __asm__ __volatile__ (
    "nop" "\n\t"
    "nop" "\n\t"
    "nop" "\n\t"
    "nop" "\n\t"
    "nop" "\n\t"
    "nop" "\n\t"
    "nop" "\n\t"
    "nop" "\n\t"
    "nop");
}
```

 pauze ir 1 mikrosekundi gara un tā neko netraucē.  
Uzraxtīšu vēlreiz, ja kāds vabūt ko ir palaidis garām vai nav izlasījis:
Šis kods DARBOJAS NEVAINOJAMI, vienīgā problēma ir tajā ka to nevar ielādēt/upload/ ar 1 reizi, bet nepieciešanas dažādas manipuilācijas, pirms to dabū iekšā ESP8266 modulī. Kad tas ir dabūts iekšā, tad viss ir čikiniekā.  ::   Man jau liekas pēc loģikas, ka ne pārtraukumi, ne pauzes te nevarētu ietekmēt to ka 2 reizes jākompilē/jāieraxta, bet kas zin. Man ta pieredzīte krietni maza  :: 
..bet gribās, lai ar pirmo reizi ierakstās čipā..
.



> Šķiet, ka arduino izmanto timer0 šim lietām.


 Man taču ESP8266 nevis Arduino
arī uz timer0 darbojas šis kods, bet man šoreiz ir ērtāk izmantot timer1, jo tas ir 32bit

----------


## Jurkins

ok, ok , neesmu vēl izaudzis līdz ESP8266 - neizpakots stāv uz galda. 
Vēl viena doma. Arduino vidē jau nav iespēju mainīt kompilatora direktīvas. Saistībā ar to pašu volatile nepieciešamību mainīgajam. Ja kompilatoram atslēdz koda optimizāciju, tad viss strādājot ar parastu mainīgo. Varbūt arduino pēc kaut kāda sev zināma algoritma pamaina kompilatora direktīvas. Salīdzini tos mazos baltos burtiņus  :: , kas tur skrien kompilējot tad, kad kods darbojas un tad, kad nē. Laikam kaut kur aiz avr-gcc varētu meklēt.

----------


## M_J

Nu jā, šāda "nop" virknīte nekādi nevarētu kaitēt. Es neredzu citu variantu, kā nolasīt iešūto kodu, kad nestrādā, pēc tam, kad strādā, atrast atšķirības, dizasamblēt, salīdzināt ar to, ko vajadzēja iešūt un tad mēģināt saprast, kāpēc kas kā. Izskatās, ka ar pirmo reizi netiek viss iešūts un vietā, kur būtu jābūt pārtraukuma apstrādei, nekā nav, t.i. tur ir FFFF un nonākot tur procesors restartējas.

----------


## sasasa

> Es neredzu citu variantu, kā nolasīt iešūto kodu, kad nestrādā, pēc tam, kad strādā, atrast atšķirības, dizasamblēt, salīdzināt ar to, ko vajadzēja iešūt un tad mēģināt saprast, kāpēc kas kā..


  ::   :: 
mana saprašana par īsu priekš tā. Nolasīt un dizasemblēt jau tā kā varētu iemācīties, bet diez vai sapratīšu, kas jaraxta citādi, lai panāktu ka ar pirmo reizi iešujas pareizajā vietā  :: 
..
aaa tu domā ka raxtīt iekšā jau gatavu nokompilētu kodu, kas nokopēts no ejošas ESP8266?  Ta nav slikta doma, bet atkal problēmas, ja kaut kas jāpamaina kodā...   
Vai to kodu jau nevar binra formāno paša Arduino IDE dabūt laukā, lai nav no ESPkas jāvelk nost?

----------


## M_J

Es gluži nebiju domājis klonēt kodu no ejoša moduļa uz neejošu. Biju domājis nolasīt tīri hex formāta failu no ejoša moduļa un no neejoša un sākumā salīdzināt tīri uz aci, kur ir atšķirības. Man domāt neejošā variantā, vietā, kur būtu jābūt pārtraukuma apstrādes apakšprogrammai būs vieni FFFF, šķiet, ka kaut kādu iemeslu dēļ šī apakšprogramma netiek kompilēta vai iešūta. Ha, viens no iemesliem kāpēc tā varētu netikt kompilēta:
#ifndef FUNKC_H
#define FUNKC_H
pārtraukuma apstrādes apakšprogramma tiek kompilēta tikai tad, ja FUNKC_H nav iepriekš definēta. Bet ja nu kompilators domā, ka ir definēta. Varbūt kompilatoram ir kāds iemesls tā domāt. Varbūt pamēģini bez šitā:
#ifndef FUNKC_H

----------


## sasasa

Ja viņs jau ir definēts, tas nozīmē ka šis fails jau ir nolasīts/izpildīts. Citu variantu nav.
Par #ifndef XXX un #define XXX man nav īsti skaidrs, priekš kam vispār šīs rindiņas parasti tiek rakstītas *.h failu sākumos. Es paskatījos kā citi raxts un arī ieraxtīju. Teorētiski, ja jau es piesaku kaut kādu *.h failu, tad priekš kam vēl definēt viņa nosaukumu? Vai tāpēc lai 2x viņu nelieto?
..
Laikam sapratu. Tas ir ērti, ja ir dažādas bibliotēkas, kas savstarpēji izmanto vienas un tās pašas funkcijas, bet ja tas ir man lokāls fails un pie tam paša raxtīts, un citas funkcijas to neizmanto, tad varu arī to neraxtīt.

----------


## M_J

Kā jau teicu, rakstu ASMā, bet arī tur ir pieejama tā saucamā kompilācija, ja izpildās nosacījums. Es to lietoju, lai programma būtu universāla, piemēram izmantojama dažādiem dzelžiem. Ja tiek izmantots viens dzelzis, tiek kompilēts fragmentiņš, kas rausta vienu kāju, ja tiek lietots cits dzelzis, tiek raustīta cita kāja. Tas rada zināmas ērtības, bet var uztaisīt arī jucekli, it sevišķi, pieķeroties programmai pēc ilgāka pārtraukuma, kad daudz kas ir jau aizmirsies un nav pietiekami sīki nokomentēts. Pēkšņi izrādās ka kaut kāda, jau piemirsta #ifdef/#ifndef dēļ kaut kas svarīgs netiek nokompilēts, vai nokomilēts galīgi ne tas, ko vajadzēja. Ja visos gadījumos jākompilē to un tikai to, tad tas, nafig, nav vajadzīgs.

----------


## Jurkins

http://www.instructables.com/id/Ardu...s-faster-code/

Rekur ir par kompilēšanas nosacījumiem. Mani arī pašreiz šitas interesē. Defaultā arduino izmanto pašu agresīvāko koda optimizāciju. Un tas tiešām tā ir. Aiz avr-gcc ir direktīva -Os.

----------


## Powerons

*sasasa* Tev nav ienācis  prātā pārbaudīt visus dzelžus?

Ea kādu pus gadu USBASP programmatoru lamāju, ka tas var ieprogrammēt īsus koduz, bet uz gariem nogļukoja gandrīz vienmēr.
Domāju, ka kāds softisks gļuks.

Beigās problēma izrādījas izkustināts kvarca rezonātora kājiņa lodējuma vietā, kura pa laikam zaudē kontaktu.
Pielodēju kā nākās un viss aizgāja bez problēmām.

----------


## sasasa

Doma nav slikta, bet kā lai parbaudu to programmatoru - ir man tā ka uz 921600 viņš ik pa laikam negrib raxtīt iekšā, uz 256000 stabili raxta.
Man ir šādi2  adapteri.Rakstu ar to kuram redzams uzsprausts dzeltenais jumperis, to otru pat neesmu paprovējis un pat nezinu ar ko viņš atšķiras un *vai vispār ir lietojams ar ESP8266 (??)*  - būs jānoprovē ja tik viņam ir 3.3v...

.. lai gan diez vai kāds bezkontakts vai slikts lodējums varētu radīt tik atkārtojamu gļuku, ka pēc taimera pārtraukuma aizkomentēšanas pārstāj buntoties wdt

----------


## Kodolskiltava

> Ea kādu pus gadu USBASP programmatoru lamāju, ka tas var ieprogrammēt īsus kodus


 Vispār līdzīga problēma eksistē gan, bija man tā, ka uz MAC OSa kaut kāda konkrēta avrdudes versija neprogrammēja to, kas bija virs kaut kāda izmēra atsevišķiem procesoriem. Pazaudēju dienu meklējot problēmas savā kodā, tad radās aizdomas, ka problēma nav pie manis, raks'tiju supertam, pateica, lai lieku vecāku versiju. Jā, uzliku, strādāja, bet tad bija citas problēmas. Apnika jāties, sāku lietot Atmel ICE.

----------

