# ATMEL mikrokontrolleri >  Atmelis 328P (arduino nano) dziļajā miegā.

## Jurkins

Labs vakars!
Vasarā galīgi maz sanāk  padarboties ar atmeļiem, bet nu tā pamazām ņemos ar 328-to un SI4432 transīveri. Nonācu tik tālu, ka vienkāršākajā (pietiekamajā) FIFO pakešu režīmā radiokanāls strādā un tagad sāku atmeli radināt aizmigt dziļajā miegā un atmosties reizi n-tajās sekundēs, minūtēs u.t.t. no SI4432 wake-up taimera pa INT0 rising edge.  Tā kā ar INT0 vai INT1 vēl nebiju sastapies, vienkāršam piemēram paņēmu arduino nano:


```
void setup() {
  Serial.begin(115200);
  DDRD &= ~(1<<PD2);
  PORTD &= ~(1<<PD2);
  // Enable the interrupt as a raising edge.
  EICRA = (1<<ISC00)|(1<<ISC01);
  EIMSK = (1<<INT0);

}

void loop() {
  Serial.println("I'll go to sleep");
  _delay_ms(1);
  PRR = (1<<PRTWI)|(1<<PRTIM2)|(1<<PRTIM1)|(1<<PRTIM0)|(1<<PRSPI)|(1<<PRUSART0)|(1<<PRADC);
  SMCR = (1<<SM1);
  SMCR |= (1<<SE);
  asm ("sei");
  asm ("sleep");
    
  // Zzz...
    
  SMCR &= ~(1<<SE);
  asm ("cli");
  PRR = (1<<PRTWI)|(1<<PRTIM2)|(1<<PRTIM1)|(0<<PRTIM0)|(1<<PRSPI)|(0<<PRUSART0)|(1<<PRADC);     
  Serial.println("I'm wake-up");
  _delay_ms(2000);

}

ISR(INT0_vect)
{
  //_delay_ms(50);
}
```

 Pārtraukumu realizēju vienkārši vadiņu piemetot pie +5 (uz zemi no PD2 1k rezistors). Saprotams, ka tādā "piemetienā" notiek "kontaktu drebēšana". Bet uzreiz pēc atmošanās pārtraukums tiek aizliegts un atļauts tikai pēc nedaudz vairāk kā 2 s nākamajā "loop" caurgājienā. Bet vienalga printlaini izlec pēc kārtas divi pāri, it kā divi pārtraukumi viens aiz otra. Visādi mēģināju (cli likt iekš ISR, EIMSK = 0 iekš ISR u.t.t.), nekas nepalīdz. It kā mērķvajadzībai tas nav būtiski, jo SI4432 jau ģenerē cmuku impulsiņu, bet "ņeporjadok".
Un vēl viena nianse. Bez 1 ms aiztures pēc pirmā println, porta monitors teksta rindas galu pārvērš ķeburos. Vai tas būtu saistīts ar to (minu), ka serial modulis vēl nav paspējis nosūtīt visu infu, bet procis jau mēģina aizmigt?

----------


## Texx

Nu kā tad tur neleks 2 interupti, ja ir iespējots gan uz augošo gan uz krītošo fronti.  :: 

Sorre, pats kļūdījos. Interupti izskatās sakonfigurēti pareizi.

----------


## Jurkins

Jā, interupti ir pareizi - abi vieninieki ir augošā fronte. Bet  vienalga, pat, ja būtu abas frontes... pēc pirmā mēģinot kaut kādā veidā  aizliegt, nekādi nesanāk.

----------


## Kodolskiltava

Ar masku jau Tu tikai aizliedz pašu pārtraukumu. Tas, kas liek pārtraukumam notikt ir "karodziņš" INTF0 un INTF1, jeb biti iekš EIFR reģistra. Pirms atļauj pārtraukumus, var būt pamēģini notīrīt INTF0 vai 1, kurš nu atbilst Tavai programmai. To iesaku, jo ja gadījumā Tev tas INTF0 bits ir uzstādījies kamēr pārtraukums ir izslēgts, pārtraukums notiks brīdī kad to ieslēgsi.

----------


## Jurkins

Vo!!! Paldies. It kā jau skatījos uz to pusi, bet tā īsti skaidrības nebija. Pārbaudīt gan varēšu tikai vakarā.

----------


## M_J

Gribu teikt to pašu, ko Kodolskiltava, bet tā kā viņš galveno jau ir pateicis, no savas puses tikai piebildīšu (jo esmu uz to kādreiz uzrāvies), ka šos bitus (un arī citus pārtraukumu bitus) notīra, ierakstot tajos nevis nulli, bet vieninieku. Liekas neloģiski, bet padomājot - tur ir savs funktieris apakšā. Ja ir baits ar visādiem bitiem, tajā skaitā arī pārtraukuma bitiem, un vajag tikai nomest pārtraukumus, pārējo nemainot, atliek doto baitu nolasīt un ierakstīt to pašu atpakaļ.

----------


## Jurkins

OK, paldies par komentāriem. Par to "1" zinu, ar pārtraukumiem esmu jau, var teikt, padaudz darbojies, bet "fundamentālo" zināšanu par čipa uzbūvi trūkums (kas tiek aizpildīts pamazām) liek sevi manīt. Kaut kā biju palaidis garām, ka tie karogi tak uzlec, vienalga, vai pārtraukums atļauts vai nē (turpat blakus savā transīvera programmā to pat izmantoju). Un līdz ar to neiedomājos, ka atļaujot pārtraukumu, šis uzreiz notiks, ja tas karogs kaut kad ir uzlēcis.
Un par to niansi ar 1ms aizturi arī laikam sapratu. Arduino Serial tak izmanto pārtraukumus, un, ja es pa vidu sāku ar pārtraukumiem darboties, tad tāda figņa sanāk.

----------


## next

Maz ko zinu par atmeljiem.
Bet vai tur nav kas liidziigs kaa PICai kad notikums pie aizliegta globaalaa (bet atljauta individuaalaa) paartraukuma modina mcu un izpildaas naakoshaa instrukcija peec sleep?

----------


## Jurkins

Tagad viss ir pareizi. Paldies pieredzējušiem biedriem! 
Nē, jābūt atļautam globālajam un individuālajam, tad mostās.

Johaidī! Un tas 328P aizmieg un toč patērē <0.1uA (ķīniešu multimetrs  :: )

----------


## Jurkins

Sveiciens visiem, kas te vēl palikuši  :: 
Uzjautāšu tepat, lai netaisītu jaunu tēmu. 
Atkal spēlējos  ::  Tā kā gan radiomoduļi, gan LCD u.t.t. mēdz izmantot SPI interfeisu, tad radās vēlēšanās šūt iekšā heksus nevis caur to pašu SPI, bet tā kā Arduino caur seriālo. Atradu netā, ko citi darījuši, un pēc pāris stundu dejām ar hvz (tanci s bubnom) 328-jā atmegā ar ISP programmatoru tika iešūts arduino būtlouderis (bišķi modificēts) un no Arduino pa seriālo viss notiekās. Viss it kā labi. Bet nepatīk man Arduino logā rakstīt. Kā pierunāt Arduino ielādēt čipā svešu heksu?

----------


## Kodolskiltava

Cik zinu tad Arduino čipā izmanto modificētu AVR109 bootloaderi un pats Arduino IDE izmanto Avrdude komandrindu. Tas nozīmē, ka no komandrindas vari ar avrdude komandu ieprogrammēt čipu vai nu caur Arduino vai jebkuru citu atbalstīto bootloaderi. Pats gan Arduino neizmantoju, bet AVR109 bootloaderi biju pielāgojis priekš ATMega164P un tad caur seriālo varēju apgreidot plates, kuras bija tālu tālu prom pieslēgtas pie Linux kompīša.

Sīkāk info šeit: https://typeunsafe.wordpress.com/201...-with-avrdude/

----------


## karloslv

Sasodītie datori un tēmas, kas pazūd no saraksta - tikai tagad pamanīju, ka Jurkins ir pieķēries Silabs čipam. Es kā reiz kādu mēnesi arī ar to ņemos, un labprāt pievienotos "mokās". Tev ir tas čips uz kaut kāda gatava devboarda vai taisīji savējo? Man ir uztrasēta savējā plate ar procesoru un visu radio daļu, bet tikai pamazām sāku to visu palaist pie dzīvības. Kaut kādas paketes izdevās aizsūtīt, bet nu čips ir zvērīgs konstruktors ar miljons fīčām. Pārsvarā šito ir doma lietot uz dažādām zondēm un telemetrijas, bet kopumā ir fantastiskas  iespējas lietot dažādiem gataviem protokoliem, piemēram, kuģu navigācijas datu (AIS) uztveršanai, amatieru AX.25, tai skaitā APRS, un iespējams, ka arī ADS-B uztveršanai. Vai arī garāžas durvju atvēršanai, bet tas šķiet drusku pazemojoši šādam monstram (kurš maksā mazāk par 3 ērikiem).

----------


## karloslv

Bet par hex iešūšanu - tam mērķim var lietot avrdude pa tiešo, norādot kā programmatoru "arduino", piemēram, 



```
avrdude -c arduino -P /mans/seriālais/ports -p m328p -U flash:w:manshekss.hex
```

 Tas patiesībā ir tas, ko Arduino vide tavā vietā dara katru reizi, kad spied Upload. Tur gan ir nianse, ka Arduino vide, manuprāt, vēl mēģina noresetot procesoru pirms palaist avrdude, bet varbūt tas jau ir iestrādāts pašā avrdude iekšā, īsti neesmu nočekojis.

----------


## karloslv

Vēl sīkums, bet - var droši nerakstīt 



```
asm ("sei");
```

 bet gan



```
sei();
```

  ::

----------


## Jurkins

Būtlouderi man ir neskarta tēma, tāpēc braucu iekšā, tā teikt, onlainā. Ierakstīju šeit jautājumu, gūglē atradu infu par avrdude un izlasīju šeit foršas atbildes. Paldies. Jāuzmet aci tam oriģinālajam atmegas būtlouderim. HVZ, kas to resetu taisa, bet man vakar pagadījās pa rokai PL2003 (laikam) usb->usart modulis, kuram ir tikai vcc, gnd, tx un rx pini. Tāpēc mēģinu noresetot ar roku. 50% gadījumu sanāk. 
SI4432 man ir elīča moduļa http://www.ebay.com/itm/SI4432-470MH...IAAOxyOalTaD1M
Vienu nejauši ar 5V nodedzināju, uz ātro pasūtīju vēl,,, bļ... šķībacainie... ieekonomējuši uz RF sviča. Jāmēģija piešķilt, bet drošības pēc pasūtīju vēl tādus, kāds bija sākumā. Vēl ir moduļi ar 11 piniem, manējam no trim GPIO tikai viens ir izvests ārā, abus pārējos izmanto tikai RF svičam.
Kā jau rakstīju, pagaidām esmu iemācījies tikai vienkāršāko variantu - sūtīt datus paketēs ar FIFO. Pašlaik ir abos galos pa arduino nano un ķīniešu modulim savienotiem caur 5v<->3.3V konvertieriem. Arduino, lai ērtāk varētu šūt iekšā (par būtlouderi ta neko nezināju līdz šim  :: ). Iesāku gan ar tīro atmegu, tāpēc SI arī uz arduino palika karājoties uz softiskā SPI. Sākumā mēģināju ar RF22 bibliotēku, bet negribēja strādāt. Visticamāk, ka ķīniešu modulim RF sviča vadīšanai vajag citus uzstādījumus. Sāku rakt datašītā un sarakstīju pats ... un tiku tik tālu, ka :
1. Gan SI gan atmega ir maksimāli iespējami dziļā miegā. 
2. SI sargsuņa taimeris reizi 2 minūtēs pamodina atmegu.
3. Atmega atmodina SI nolasa DS18B20 temperatūru, aizsūta un aizmidzina SI un aizmieg pati.
u.t.t.
Nu jā, tie ir "garāžu vārti"  :: . Iespējas šim čipam toč ir lielas. Bet jāsaka kā ir  - šitas modulis man aizgāja vieglāk nekā tie superlētuči vispār bez čipiem  ::  ... un cena... nu nekāda. Tāpēc "dajoš katriem garāžu vārtiem SI4432"!  :: 

Kurš meklē, turš atrod  :: ! Īstie džeki visu dara komandrindā, bet tomēr patīkami:
http://blog.zakkemble.co.uk/avrdudes...i-for-avrdude/

----------


## Jurkins

Notestēju vienkāršoto ķīnieti bez RF sviča. Pie reizes pārrakstīju kodu uz dzelzisko SPI. Paketes raida, ka prieks. Saspraužu otru kā uztvērēju - neiet ne traks. Noresetējas, pārtraukuma pinu nomet uz zemi un viss. Ložņāju cauri kodam, lamāju mazos, dzeltenos kverpļus u.t.t. Atrisinājums, kā vienmēr  ::  (nu gandrīz vienmēr) copy->paste, un rezultātā nevis nolasu pārtraukumu karogu reģistrus bet mēģinu ierakstīt, līdz ar to pirmais pārtraukums ir nometis pinu uz zemi, bet es šo nepaceļu atpakaļ. Raidītājam vienalga. Šim starp paketēm pārdesmit milisekundes, problēmas nekādas nerodas, līdz ar to pilnīgi vienalga. Tātad izrādās, ka mazie, dzeltenie velni atkal ieekonomējuši. Jebšu varbūt atsevišķas SMD diodes salikuši. Vēl gan uz attālumu neesmu patestējis, vai tiešām ir deklarētais.

----------


## Jurkins

Labs rīts! Varbūt kāds var ieteikt kādu mācību līdzekli latviešu valodā par kriptēšanu?

----------


## Jurkins

HELP!!!
Tātad sāku spēlēties ar datu šifrēšanu. Ua Arduino viss ir ok. Bet tā kā ne viss pasaulē ir Arduino, tad novilku avr-crypto-lib-master. Tur ir bez savas jēgas visa kā... Bet mani interesē AES128. Notiekās viss ieskā Atmel Studio 7.
Saveidotas mapes un faili, salikti ceļi ...



Koda, var teikt vēl nav. Standarta iesākums.


```
#include <avr/io.h>
#include <main.h>

int main(void)
{
    /* Replace with your application code */
    while (1) 
    {
    }
}
```

 un


```
#ifndef MAIN_H_
#define MAIN_H_

#include <aes.h>

#endif /* MAIN_H_ */
```

 Mēģinu kompilēt šo "tukšo" projektu:

----------


## Jurkins

Raksta šito te.
[QUOTE]
------ Build started: Project: AES_example, Configuration: Debug AVR ------
Build started.
Project "AES_example.cproj" (default targets):
Target "PreBuildEvent" skipped, due to false condition; ('$(PreBuildEvent)'!='') was evaluated as (''!='').
Target "CoreBuild" in file "C:\Program Files  (x86)\Atmel\Studio\7.0\Vs\Compiler.targets" from project  "c:\users\jurchixxx\Documents\Atmel  Studio\7.0\AES_example\AES_example\AES_example.cproj" (target "Build"  depends on it):
    Task "RunCompilerTask"
        Shell Utils Path C:\Program Files (x86)\Atmel\Studio\7.0\shellUtils
        C:\Program Files (x86)\Atmel\Studio\7.0\shellUtils\make.exe all --jobs 4 --output-sync 
        Building file: ../src/main.c
        Invoking: AVR/GNU C Compiler : 4.9.2
        "C:\Program Files  (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-gcc.exe"   -x c -funsigned-char -funsigned-bitfields -DDEBUG  -I"C:\Program Files  (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.0.106\include"  -I"../src" -I"../src/avr-crypto-lib-master/gf256mul"  -I"../src/avr-crypto-lib-master/aes" -I"../src/avr-crypto-lib-master"   -O1 -ffunction-sections -fdata-sections -fpack-struct -fshort-enums -g2  -Wall -mmcu=atmega328p -B "C:\Program Files  (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.0.106\gcc\dev\atmega328p"  -c -std=gnu99 -MD -MP -MF "src/main.d" -MT"src/main.d" -MT"src/main.o"    -o "src/main.o" "../src/main.c" 
        Finished building: ../src/main.c
        Building target: AES_example.elf
        Invoking: AVR/GNU Linker : 4.9.2
        "C:\Program Files  (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-gcc.exe"  -o AES_example.elf  src/avr-crypto-lib-master/aes/aes128_dec.o  src/avr-crypto-lib-master/aes/aes128_enc.o  src/avr-crypto-lib-master/aes/aes192_dec.o  src/avr-crypto-lib-master/aes/aes192_enc.o  src/avr-crypto-lib-master/aes/aes256_dec.o  src/avr-crypto-lib-master/aes/aes256_enc.o  src/avr-crypto-lib-master/aes/aes_dec-asm.o  src/avr-crypto-lib-master/aes/aes_dec-asm_faster.o  src/avr-crypto-lib-master/aes/aes_dec.o  src/avr-crypto-lib-master/aes/aes_enc-asm.o  src/avr-crypto-lib-master/aes/aes_enc.o  src/avr-crypto-lib-master/aes/aes_invsbox-asm.o  src/avr-crypto-lib-master/aes/aes_invsbox.o  src/avr-crypto-lib-master/aes/aes_keyschedule-asm.o  src/avr-crypto-lib-master/aes/aes_keyschedule.o  src/avr-crypto-lib-master/aes/aes_sbox-asm.o  src/avr-crypto-lib-master/aes/aes_sbox.o  src/avr-crypto-lib-master/avr-asm-macros.o  src/avr-crypto-lib-master/gf256mul/gf256mul.o src/main.o    -Wl,-Map="AES_example.map" -Wl,--start-group -Wl,-lm  -Wl,--end-group  -Wl,--gc-sections -mmcu=atmega328p -B "C:\Program Files  (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.0.106\gcc\dev\atmega328p"   
c:\users\jurchixxx\Documents\Atmel  Studio\7.0\AES_example\AES_example\Debug\Makefile(313,1): error: recipe  for target 'AES_example.elf' failed
        src/avr-crypto-lib-master/aes/aes_dec-asm.o: In function `aes256_dec':
c:\users\jurchixxx\Documents\Atmel  Studio\7.0\AES_example\AES_example\src\avr-crypto-lib-master\aes\aes_dec-asm.S(54,1):  error: multiple definition of `aes256_dec'
         src/avr-crypto-lib-master/aes/aes256_dec.o:c:\users\jurchixxx\Documents\Atmel   Studio\7.0\AES_example\AES_example\Debug/../src/avr-crypto-lib-master/aes/aes256_dec.c:32:  first defined here
        src/avr-crypto-lib-master/aes/aes_dec-asm.o: In function `aes192_dec':
c:\users\jurchixxx\Documents\Atmel  Studio\7.0\AES_example\AES_example\src\avr-crypto-lib-master\aes\aes_dec-asm.S(59,1):  error: multiple definition of `aes192_dec'
         src/avr-crypto-lib-master/aes/aes192_dec.o:c:\users\jurchixxx\Documents\Atmel   Studio\7.0\AES_example\AES_example\Debug/../src/avr-crypto-lib-master/aes/aes192_dec.c:32:  first defined here
        src/avr-crypto-lib-master/aes/aes_dec-asm.o: In function `aes128_dec':
c:\users\jurchixxx\Documents\Atmel  Studio\7.0\AES_example\AES_example\src\avr-crypto-lib-master\aes\aes_dec-asm.S(64,1):  error: multiple definition of `aes128_dec'
         src/avr-crypto-lib-master/aes/aes128_dec.o:c:\users\jurchixxx\Documents\Atmel   Studio\7.0\AES_example\AES_example\Debug/../src/avr-crypto-lib-master/aes/aes128_dec.c:32:  first defined here
        src/avr-crypto-lib-master/aes/aes_dec-asm_faster.o: In function `aes256_dec':
c:\users\jurchixxx\Documents\Atmel  Studio\7.0\AES_example\AES_example\src\avr-crypto-lib-master\aes\aes_dec-asm_faster.S(36,1):  error: multiple definition of `aes256_dec'
         src/avr-crypto-lib-master/aes/aes256_dec.o:c:\users\jurchixxx\Documents\Atmel   Studio\7.0\AES_example\AES_example\Debug/../src/avr-crypto-lib-master/aes/aes256_dec.c:32:  first defined here
        src/avr-crypto-lib-master/aes/aes_dec-asm_faster.o: In function `aes_decrypt_core':
c:\users\jurchixxx\Documents\Atmel  Studio\7.0\AES_example\AES_example\src\avr-crypto-lib-master\aes\aes_dec-asm_faster.S(82,1):  error: multiple definition of `aes_decrypt_core'
         src/avr-crypto-lib-master/aes/aes_dec-asm.o:c:\users\jurchixxx\Documents\Atmel   Studio\7.0\AES_example\AES_example\Debug/../src/avr-crypto-lib-master/aes/aes_dec-asm.S:100:  first defined here
        src/avr-crypto-lib-master/aes/aes_dec-asm_faster.o: In function `aes192_dec':
c:\users\jurchixxx\Documents\Atmel  Studio\7.0\AES_example\AES_example\src\avr-crypto-lib-master\aes\aes_dec-asm_faster.S(41,1):  error: multiple definition of `aes192_dec'
         src/avr-crypto-lib-master/aes/aes192_dec.o:c:\users\jurchixxx\Documents\Atmel   Studio\7.0\AES_example\AES_example\Debug/../src/avr-crypto-lib-master/aes/aes192_dec.c:32:  first defined here
        src/avr-crypto-lib-master/aes/aes_dec-asm_faster.o: In function `aes128_dec':
c:\users\jurchixxx\Documents\Atmel  Studio\7.0\AES_example\AES_example\src\avr-crypto-lib-master\aes\aes_dec-asm_faster.S(46,1):  error: multiple definition of `aes128_dec'
         src/avr-crypto-lib-master/aes/aes128_dec.o:c:\users\jurchixxx\Documents\Atmel   Studio\7.0\AES_example\AES_example\Debug/../src/avr-crypto-lib-master/aes/aes128_dec.c:32:  first defined here
        src/avr-crypto-lib-master/aes/aes_dec.o: In function `aes_decrypt_core':
c:\users\jurchixxx\Documents\Atmel  Studio\7.0\AES_example\AES_example\src\avr-crypto-lib-master\aes\aes_dec.c(121,1):  error: multiple definition of `aes_decrypt_core'
         src/avr-crypto-lib-master/aes/aes_dec-asm.o:c:\users\jurchixxx\Documents\Atmel   Studio\7.0\AES_example\AES_example\Debug/../src/avr-crypto-lib-master/aes/aes_dec-asm.S:100:  first defined here
        src/avr-crypto-lib-master/aes/aes_enc-asm.o: In function `aes256_enc':
c:\users\jurchixxx\Documents\Atmel  Studio\7.0\AES_example\AES_example\src\avr-crypto-lib-master\aes\aes_enc-asm.S(43,1):  error: multiple definition of `aes256_enc'
         src/avr-crypto-lib-master/aes/aes256_enc.o:c:\users\jurchixxx\Documents\Atmel   Studio\7.0\AES_example\AES_example\Debug/../src/avr-crypto-lib-master/aes/aes256_enc.c:32:  first defined here
        src/avr-crypto-lib-master/aes/aes_enc-asm.o: In function `aes192_enc':
c:\users\jurchixxx\Documents\Atmel  Studio\7.0\AES_example\AES_example\src\avr-crypto-lib-master\aes\aes_enc-asm.S(48,1):  error: multiple definition of `aes192_enc'
         src/avr-crypto-lib-master/aes/aes192_enc.o:c:\users\jurchixxx\Documents\Atmel   Studio\7.0\AES_example\AES_example\Debug/../src/avr-crypto-lib-master/aes/aes192_enc.c:32:  first defined here
        src/avr-crypto-lib-master/aes/aes_enc-asm.o: In function `aes128_enc':
c:\users\jurchixxx\Documents\Atmel  Studio\7.0\AES_example\AES_example\src\avr-crypto-lib-master\aes\aes_enc-asm.S(53,1):  error: multiple definition of `aes128_enc'
         src/avr-crypto-lib-master/aes/aes128_enc.o:c:\users\jurchixxx\Documents\Atmel   Studio\7.0\AES_example\AES_example\Debug/../src/avr-crypto-lib-master/aes/aes128_enc.c:32:  first defined here
        src/avr-crypto-lib-master/aes/aes_enc.o: In function `aes_encrypt_core':
c:\users\jurchixxx\Documents\Atmel  Studio\7.0\AES_example\AES_example\src\avr-crypto-lib-master\aes\aes_enc.c(109,1):  error: multiple definition of `aes_encrypt_core'
         src/avr-crypto-lib-master/aes/aes_enc-asm.o:c:\users\jurchixxx\Documents\Atmel   Studio\7.0\AES_example\AES_example\Debug/../src/avr-crypto-lib-master/aes/aes_enc-asm.S:89:  first defined here
c:\users\jurchixxx\Documents\Atmel  Studio\7.0\AES_example\AES_example\Debug\src\avr-crypto-lib-master\aes\aes_invsbox.o(1,1):  error: multiple definition of `aes_invsbox'
c:\users\jurchixxx\Documents\Atmel  Studio\7.0\AES_example\AES_example\Debug\src\avr-crypto-lib-master\aes\aes_invsbox-asm.o(1,1):  error: first defined here
        src/avr-crypto-lib-master/aes/aes_keyschedule.o: In function `aes_init':
c:\users\jurchixxx\Documents\Atmel  Studio\7.0\AES_example\AES_example\src\avr-crypto-lib-master\aes\aes_keyschedule.c(49,1):  error: multiple definition of `aes_init'
         src/avr-crypto-lib-master/aes/aes_keyschedule-asm.o:c:\users\jurchixxx\Documents\Atmel   Studio\7.0\AES_example\AES_example\Debug/../src/avr-crypto-lib-master/aes/aes_keyschedule-asm.S:102:  first defined here
        src/avr-crypto-lib-master/aes/aes_keyschedule.o: In function `aes_init':
c:\users\jurchixxx\Documents\Atmel  Studio\7.0\AES_example\AES_example\src\avr-crypto-lib-master\aes\aes_keyschedule.c(49,1):  error: multiple definition of `aes128_init'
         src/avr-crypto-lib-master/aes/aes_keyschedule-asm.o:c:\users\jurchixxx\Documents\Atmel   Studio\7.0\AES_example\AES_example\Debug/../src/avr-crypto-lib-master/aes/aes_keyschedule-asm.S:46:  first defined here
        src/avr-crypto-lib-master/aes/aes_keyschedule.o: In function `aes_init':

----------


## Jurkins

c:\users\jurchixxx\Documents\Atmel  Studio\7.0\AES_example\AES_example\src\avr-crypto-lib-master\aes\aes_keyschedule.c(49,1):  error: multiple definition of `aes192_init'
         src/avr-crypto-lib-master/aes/aes_keyschedule-asm.o:c:\users\jurchixxx\Documents\Atmel   Studio\7.0\AES_example\AES_example\Debug/../src/avr-crypto-lib-master/aes/aes_keyschedule-asm.S:39:  first defined here
        src/avr-crypto-lib-master/aes/aes_keyschedule.o: In function `aes_init':
c:\users\jurchixxx\Documents\Atmel  Studio\7.0\AES_example\AES_example\src\avr-crypto-lib-master\aes\aes_keyschedule.c(49,1):  error: multiple definition of `aes256_init'
         src/avr-crypto-lib-master/aes/aes_keyschedule-asm.o:c:\users\jurchixxx\Documents\Atmel   Studio\7.0\AES_example\AES_example\Debug/../src/avr-crypto-lib-master/aes/aes_keyschedule-asm.S:32:  first defined here
c:\users\jurchixxx\Documents\Atmel  Studio\7.0\AES_example\AES_example\Debug\src\avr-crypto-lib-master\aes\aes_sbox.o(1,1):  error: multiple definition of `aes_sbox'
c:\users\jurchixxx\Documents\Atmel  Studio\7.0\AES_example\AES_example\Debug\src\avr-crypto-lib-master\aes\aes_sbox-asm.o(1,1):  error: first defined here
collect2.exe(0,0): error: ld returned 1 exit status
        make: *** [AES_example.elf] Error 1
        The command exited with code 2.
    Done executing task "RunCompilerTask" -- FAILED.
Done building target "CoreBuild" in project "AES_example.cproj" -- FAILED.
Done building project "AES_example.cproj" -- FAILED.

Build FAILED.
========== Build: 0 succeeded or up-to-date, 1 failed, 0 skipped ==========

[/QUOTE]

Nu no šī teksta es saprotu(ja pareizi saprotu), ka kompilatoram dod  vienu un to pašu vairākas reizes. Bet kur??? 3.14sos te jau stundas  trīs. Netu esmu pārracis. Bet visur galu galā atrodas vieta, kur tiešām  notiek atkārtošanās, bet šeit... nu nevaru atrast.

----------


## Jurkins

Mļaķ!!!! Nu jā esmu lohs  :: . Izrādās tajā bibliotēkā džeki sarakstījuši vienas un tās pašas funkcijas gan c gan asmā. Es biju iedomājies, ka daļa uzrakstīta asmā, lai kaut kādas funkcijas būtu ātrākas, bet vajadzīga ir visa biblene...

p.s. sorry par palagu.

----------


## Jurkins

Laba diena tiem, kas te vēl palikuš!

Radās jautājums par komandu nosūtīšanas algoritmu. Spēlēties ar šiem mazajiem transīveriem mani uzbudināja šis raksts. Ar minētajām MRF49 (e-līča) mikrenēm pirmajā piegājienā cietu pilnīgi neveiksmi, tāpēc pārgāju uz SI4432 gataviem modulīšiem. Bet stāsts ir par ko citu. Par algoritmu šīm te 10 pogām. Džeks izejas kodu nerāda. Darbības princips - nospiežot vienalga cik pogas kopā otrā galā izšauj attiecīgie stobri, pogas atlaižot šaušana beidzas. Cik saprotu viss darbojas nepārtraukti noraidot fiksēta izmēra datu paketes, katram stobram savs(i) bits(i). Teorētiski, ja kanāls "apraujas" pie nospiestas pogas, attiecīgais stobrs turpina šaut. Jebšu ņemam kaut kādas zināmas milisekundes starp paketēm un, ja nav paketes, tad slēdzam stobru ārā? Tad principā, ja neviena poga nav nospiesta, var slēgt raidītāju ārā?

----------


## M_J

Manuprāt daudz kas ir atkarīgs no tā, cik vadāmā ierīce ir autonoma tieši drošibas ziņā. Ja tā nav pietiekami saprātīga, lai spētu pati atpazīt avārijas situācijas un izslēgties, no drošības viedokļa prātīgākais tiešām būtu - ja pārtrūkst sakari, pēc brīža slēdzam visu ārā. Citādi Dievs zina, kādas ziepes var sataisīt, ja tiek ieslēgts kāds mehānisms, un pēķšņi to vairs nevar izslēgt. Bet ja iekārta spēj darboties un apstrādāt avārijas situācijas autonomi, tad tas nav vajadzīgs. Piemēram garāžas vārtu motors, kurš ir ieslēgts, kamēr turam nospiestu pults pogu. Nospiežam pogu, kontrolieris ieslēdz raidītāju nosūta komandu ieslēgt garāžas vārtu motoru un slēdzam raidītāju ārā. Kamēr turam pogu nospiestu, raidītājs ir izslēgts, brīdī, kad pogu atlaižam, kontrolieris ieslēdz raidītāju, nosūta komandu izslēgt motoru un slēdz raidītāju ārā. Ja pults sabojāsies pēc pirmās komandas nosūtīšanas, nekas slikts nenotiks, garāžas durvis atvērsies pilnībā, nostrādās gala slēdzis un motors apstāsies. Cita situācija, ja ar to pašu verķi vadīsim auto pacēlāju garāžā ar zemiem griestiem. Tā var kādu džipu saplacināt.

----------


## Jurkins

Nu jā. Paldies, M_J! Velns, pat prātā neienāca šāds algoritms, ka piespiežot pogu nosūtās komanda vienu reizi un tad gaida atlaišanu. Kaut kā bija iesēdies galvā, ka vajag visu laiku raidīt.

----------


## Jurkins

Brīnumainā kārtā sačiņījis gāzes katlu, atkal ķeros atpakaļ pie C/C++.
 Ir definēti stringi programmu atmiņā:


```
static const uint8_t mnu1[] PROGMEM = {"RED"};
```

 Pēc tam tiek definēta struktūra un pointeris uz šādu struktūru un salikti šim dati.


```
void loop() {
  struct mnu_item
  {
    uint8_t *title;
    uint8_t active = false;
    uint8_t selected = false;
    uint8_t *value;
  };

  struct mnu_item  *mnu_red;
  mnu_red = malloc(sizeof(struct mnu_item));
  
  mnu_red->title = (uint8_t*) mnu1;
  *(mnu_red)->value = 150;
  mnu_red->active = true;
  mnu_red->selected = true;
```

 Sākumā nebija tās atmiņas piešķiršanas rindiņas (malloc). Kompilieris lamājās, ka:
warning: 'mnu_red' is used uninitialized in this function [-Wuninitialized]
bet (gan jau pats visu sakārtoja) tālāk sekojošais kods uz nokias LCD izvadīja pareizi "RED  true  true 150"
Bet nu tas nav smuki, ka kāds lamājas. Sekass ar gūgli un sapratu, ka es definēju pointeri, bet nepiešķiru atmiņu.
Nu OK. Kompilieris vairs nelamājas, bet tam "value" varu rakstīt ko gribu, šis dod ārā 129. 
WTF?!?! Gūgle man tūlīt banu iedos  :: 

Reizēm ir ļoti noderīgi parunāt pašam ar sevi (nakts vidū  :: ). Lohs esmu, atzīstu  :Roll Eyes (Sarcastic): . 
Nodefinēju pointeri, bet nevis iedevu šim adresi, kur glabājas mainīgais, bet mēģināju iebarot mainīgā vērtību. Velns, tas kompilieris ir pārāk gudrs, pārāk daudz cenšas izdarīt programmētāja vietā. Tāpēc jau laikam tās Marsa zondes gāžas lejā, ka kodu šām iekš Arduino raksta  :: !

----------


## Jurkins

Labs vakars!


```
uint64_t ncOffset0 = ((uint64_t) bps * (131072 * 1)) / (62500 * (1 + 2 * 1));
uint64_t ncOffset1 = ((uint64_t) bps * (65536 * 1)) / (31250 * (1 + 2 * 1));
uint64_t ncOffset2 = ((uint64_t) bps * (32768 * 1)) / (15625 * (1 + 2 * 1));
```

 Tur, kur tas "*1" patiesībā ir mainīgais, kurš šajā gadījumā pieņem vērtību "1". Tas tā, lai būtu vienkāršāk.
Tātad. Ar pirmo rindu viss ok. Abas pārējās esot "integer overflow". Var kāds apskaidrot, kas par h..u?

----------


## karloslv

Nebija īsti laika iedziļināties, bet varbūt niķis tur, ka PROGMEM nozīmē, ka mainīgā dati reāli tiks glabāti flash, bet normāli jebkurš mainīgais C/C++ reprezentē kaut ko RAMā. Tāpēc PROGMEM datus tipiski pārlādē kādā citā mainīgajā, kurš nav PROGMEM, ar visādām speciālām pgm_read_xxx bibliotēkas funkcijām. Pointeris uz PROGMEM datiem patiesībā nav pointeris uz RAM datiem, lai gan tiek interpretēts kā tāds (līdzīgi, kā strādājot ar EEPROM). Vārdu sakot, tur ir visas iespējas sapīties meistarībā. https://www.arduino.cc/en/Reference/PROGMEM un http://www.nongnu.org/avr-libc/user-.../pgmspace.html

----------


## Jurkins

Paldies, karloslv, bet tā situācija atrisinājās. Es tur toč biju sapinies meistarībā ar pointeriem uz struktūras "locekļiem".
Bet tā problēma manā nākamajā postā paliek. Nesaprotu, kāpēc ar lielākiem skait;liem viss ir ok, bet ar mazākiem - "overflow".
Hmm, atrisinājās problēma saucējā arī "pievedot tipu" uz uint32_t, bet jautājums paliek - kāpēc pirmajā rindā ir ok. 
Es pašlaik saprotu tā. 62500 kompilators paņam kā uint16_t. Sareizinot šo ar 3 noteikti varētu sanāk "overflow", bet tur ir ok.
Otrajā rindā ir tāda pati situācija. 31250 iekļaujas uint16_t, bet sareizinot ar 3 ir par daudz. Bet atšķirībā no pirmās rindas jau ir "overflow". 
Savukārt trešajā rindā gan 15625 gan 15625*3 iekļaujas uint16_t, bet vienalga ir "overflow". 


```
uint64_t ncOffset0 = ((uint64_t) bps * (131072 * 1)) / (62500 * (1 + 2 * 1));
uint64_t ncOffset1 = ((uint64_t) bps * (65536 * 1)) / ((uint32_t)31250 * (1 + 2 * 1));
uint64_t ncOffset2 = ((uint64_t) bps * (32768 * 1)) / ((uint32_t)15625 * (1 + 2 * 1));
```

 Bet pats trakākais, ja ieraksta šādi:


```
uint64_t ncOffset2 = ((uint64_t) bps * (32768 * 1)) / ((uint16_t)15625 * (1 + 2 * 1));
```

 tad viss ir kārtībā. Kāpēc piespiedu kārtā jānorāda, ka 15625 ir uint16_t?

----------

