Warning: Illegal string offset 'name' in [path]/includes/functions.php on line 6439
Atmelis 328P (arduino nano) dziļajā miegā.
+
1 2 3

thread: Atmelis 328P (arduino nano) dziļajā miegā.

  1. #1
    Senior Member
    Nov 2009
    Jēkabpils
    2,046

    Atmelis 328P (arduino nano) dziļajā miegā.

    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?

  2. #2
    Senior Member
    Mar 2003
    Rīga
    840

    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.

  3. #3
    Senior Member
    Nov 2009
    Jēkabpils
    2,046

    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.

  4. #4
    Senior Member
    Mar 2011
    676

    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.

  5. #5
    Senior Member
    Nov 2009
    Jēkabpils
    2,046

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

  6. #6
    Senior Member
    Jun 2006
    Cēsu novads
    986

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

  7. #7
    Senior Member
    Nov 2009
    Jēkabpils
    2,046

    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.

  8. #8
    Senior Member
    Mar 2007
    1,597

    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?

  9. #9
    Senior Member
    Nov 2009
    Jēkabpils
    2,046

    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 )

  10. #10
    Senior Member
    Nov 2009
    Jēkabpils
    2,046

    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?

+