Arduino - TIMER regiszterek direkt kezelése (ATMega328P / ATTINY10)

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
borisz
DrótVégénSzéndarab
Hozzászólások: 31
Csatlakozott: 2016. november 26. szombat, 9:39

Arduino - TIMER regiszterek direkt kezelése (ATMega328P / ATTINY10)

HozzászólásSzerző: borisz » 2020. január 25. szombat, 12:48

Sziasztok. Kérnék megint egy kis segítséget.

Kód: Egész kijelölése

void setup() {
  // put your setup code here, to run once:
pinMode(6, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
OCR0A=64;
delay(500);
OCR0A=128;
delay(500);
OCR0A=192;
delay(500);
OCR0A=255;
delay(500);
}

Ez miért nem csinál semmit? Hol vétettem hibát?

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3348
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

Re: Arduino kezdő

HozzászólásSzerző: kapu48 » 2020. január 25. szombat, 17:20

Esetleg igy:

Kód: Egész kijelölése

   
   PORTD = (1<<PORTD6);         // Turn pin on ----TROUBLESHOOTING
   PORTD = (0<<PORTD6);         // Turn pin off ---TROUBLESHOOTING

Avatar
Robert
Elektronbűvölő
Hozzászólások: 10047
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: Arduino kezdő

HozzászólásSzerző: Robert » 2020. január 25. szombat, 19:01

Ez mióta kezdő szint?

Valamint kérdés: mit szerettél volna a programmal csinálni?
http://www.tavir.hu - a gazda :)

borisz
DrótVégénSzéndarab
Hozzászólások: 31
Csatlakozott: 2016. november 26. szombat, 9:39

Re: Arduino kezdő

HozzászólásSzerző: borisz » 2020. január 25. szombat, 19:20

Bocsánat ha nem jó helyre írok, csak nem találtam megfelelőbb témát. A Timer hardverközeli programozását szerettem volna jobban megismerni. Egyszer mindent kipróbálok egy Uno-n mert még mindig az Attiny10-el kínlódok. De sajnos egyre több kérdés adódik. Esetleg útba tudnál igazítani hogy melyik témában lenne a legjobb ezt folytatni?

Avatar
Robert
Elektronbűvölő
Hozzászólások: 10047
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: Arduino kezdő

HozzászólásSzerző: Robert » 2020. január 25. szombat, 20:00

A TIMER kezelést nézd meg:
http://www.electronoobs.com/eng_arduino_tut12.php
A lap alsó 1/3-a :).
A Mega328P és a Tiny10 eléggé eltér....
http://www.tavir.hu - a gazda :)

borisz
DrótVégénSzéndarab
Hozzászólások: 31
Csatlakozott: 2016. november 26. szombat, 9:39

Re: Arduino kezdő

HozzászólásSzerző: borisz » 2020. január 25. szombat, 20:44

Már a Timer-t sikerült működésre bírni. Annyiban hasonlít a kettő, hogy mielőtt az OCRnx regiszternek értéket adunk azelőtt be kell állítani a TCCRnx-ben a milyen módban működjön a komparátor. Ha jól fogalmaztam :)
További problémám az, hogy pl.

Kód: Egész kijelölése

if (PINB & 0B00000100 == 0B00000100)

bizonytalanul működik. Ez a PB2. De pl. a PB0-val jól működik, vagy ha a digitalRead(2)-t használom. A PB2-re azért volna szükségem mert az az INT0 megszakítás amivel szeretném alvó módból felébreszteni, ha az is működne :D Uno-val próbáltam az alvó módba lépést és a felébresztést INT0-val. Ott ha engedélyeztem az EICRA regiszterben a az INT0 megszakítást és az EIMSK-ben az INT0 megszakítási kérelmet akkor ha alvó módban teljesült az INT0 megszakítási feltétel (fel- vagy lefutó él vagy alacsony szint), akkor felébredt. Az Attiny-nél is így jártam el, de az nem hajlandó felébredni, csak reset-re. Mit nem veszek észre?

Kód: Egész kijelölése

int szamlalo = 0;

void setup() {
PUEB=0B00000100;
DDRB = 0B00000011;
TCCR0A = 0B10100001;
TCCR0B = 0B00001011;
}

void loop() {
  if (digitalRead(2) == 0) {
    delay(5);
   
    if (digitalRead(2) == 0) {
      szamlalo++;
      delay(150);
     
      if (digitalRead(2) == 0) {
    delay(2000);
   
    if (digitalRead(2) == 0) {
    OCR0A=0;
    OCR0B=0;
      delay(2000);
     
      if (digitalRead(2) == 1) {
        ADCSRA &= 0B01111111;
        VLMCSR &= 0B01111000;
        PRR = 0B00000011;
        EICRA = 0B00000000;
        EIMSK = 0B00000001;
        SMCR = 0B00000101;
        SREG |= 0B10000000;
        asm ("sleep");
        SMCR = 0;
        EIMSK = 0;
        PRR = 0;
        ADCSRA |= 0B10000000;
          }
        }
      }
    }
  }
 if (szamlalo > 5) {
  szamlalo = 0;
  }
if (szamlalo == 0) {
  OCR0A=64;
  OCR0B=0;
}
if (szamlalo == 1) {
  OCR0A=128;
}
if (szamlalo == 2) {
  OCR0A=192;
}
if (szamlalo == 3) {
  OCR0A=255;
}
if (szamlalo == 4) {
  OCR0A=0;
  OCR0B=128;
}
if (szamlalo == 5) {
  OCR0B=255;
 }
}

Jelenleg ezzel próbálkoztam. Tudom hogy nem a legszebb és legkiforrottab, de félig működik :D Csak elalvásból nem hajlandó felébredni.

Avatar
Robert
Elektronbűvölő
Hozzászólások: 10047
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: Arduino - TIMER regiszterek direkt kezelése (ATMega328P / ATTINY10)

HozzászólásSzerző: Robert » 2020. január 25. szombat, 22:34

Tulajdonképp mi a célod a timer regiszter írásával?
PWM kimenet? időzítés/INT kezelés?

Én meglesnék egy timer2 nevű libraryt, abban sok regiszterkezelés benne van mintával, kommentelve...
http://www.tavir.hu - a gazda :)

borisz
DrótVégénSzéndarab
Hozzászólások: 31
Csatlakozott: 2016. november 26. szombat, 9:39

Re: Arduino - TIMER regiszterek direkt kezelése (ATMega328P / ATTINY10)

HozzászólásSzerző: borisz » 2020. január 26. vasárnap, 8:53

PWM-et akartam előállítani. Egy power LED fényerejét akarom több lépcsőben szabályozni ami egy zseblámpában lesz. Sajnos nagyon szűkös a hely ezért van szükség az AtTiny-re. Azért próbálkozom a hardverközeli programozással hogy minél több funkció beleférjen az 1Kb-ba :) Na meg persze a tanulás sem az utolsó szempont.
A PWM-et már sikerült előállítani. Most amivel nem boldogulok az hogy alvó módból nem hajlandó felébredni. ( Azt kérhetem hogy a téma címe inkább hardverközeli programozás ATMega/AtTiny legyen?)

borisz
DrótVégénSzéndarab
Hozzászólások: 31
Csatlakozott: 2016. november 26. szombat, 9:39

Re: Arduino - TIMER regiszterek direkt kezelése (ATMega328P / ATTINY10)

HozzászólásSzerző: borisz » 2020. február 2. vasárnap, 20:47

Elkészült a projekt :) Nem lett tökéletes, de majd talán egyszer javítom. Annyi hibája van hogy ha bekapcsolom akkor nem a minimális fényerővel indul, hanem az eggyel nagyobbal. Alább beillesztem a kódot, ami nem a legszebb és a legjobb, de az enyém :)

Kód: Egész kijelölése

int szamlalo = 0;
int ido = 0;
int pb2 = 0B00000100;

void setup() {
PUEB = 0B00000100;
DDRB = 0B00000011;
TCCR0A = 0B10100001;
TCCR0B = 0B10000011;
EIMSK = 0B00000000;
SMCR = 0B00000100;
PRR = 0B00000000;
VLMCSR &= 0B11111000;
}

void loop() {
  if ((PINB & pb2) == 0) {
    delay(100);
    while ((PINB & pb2) == 0 && ido < 151){
      delay(10);
      ido++;
    }
  if (ido < 150) {
    szamlalo++;
    ido=0;
  } else {
    OCR0A = 0;
    OCR0B = 0;
    delay(1000);
    EICRA=0B00000000;
    EIMSK=0B00000001;
    SMCR=0B00000101;
    SREG|=0B10000000;
    PRR=0B00000011;
     asm ("sleep");
   }
  }
if (szamlalo > 6) {
  szamlalo = 0;
}
if (szamlalo == 0) {
  OCR0A=64;
  OCR0B=0;
}
if (szamlalo == 1) {
  OCR0A=127;
}
if (szamlalo == 2) {
  OCR0A=192;
}
if (szamlalo == 3) {
  OCR0A=255;
}
if (szamlalo == 4) {
  OCR0A=0;
  OCR0B=32;
}
if (szamlalo == 5) {
  OCR0B=127;
 }
if (szamlalo == 6) {
  OCR0B=255;
 }
}

http://www.kepfeltoltes.eu/images/2020/02/02/129IMG_6596.jpg
http://www.kepfeltoltes.eu/images/2020/02/02/795IMG_6595.jpg
https://www.youtube.com/watch?v=CITfctx3Fhc&feature=youtu.be

Annyi észrevétel, ami nekem nem volt egyértelmű és hátha segítség másoknak, az INT0 megszakítás resetet generál (vagy csak nekem tűnik úgy :D ). Alvó módból felébredve elölről indul az egész program. Ezért hogy helyesen működjön muszáj voltam a sleep feltételeket a program elején kikapcsolni. A másik hogy Fast PWM-nél hiába írom a kimeneti regisztert 0-ra, nem lesz ténylegesen 0 a kimenet. Ezt csak úgy tudtam orvosolni, hogy fázishelyes PWM-et használtam.
Végül is kettő láb kimenet és egy bemenet van belső felhúzó ellenállással. Így ha alvó módba van akkor olcsó multiméterrel mérve az áramfelvételt 2mA-es állásban is 0-t mutat. Persze ez közel sem hiteles, de azért abban biztos vagyok hogy egy kb 2000mAh-s akkut nem merít le egy hónap alatt sem. Az akku a biztonság kedvéért kapott egy védelmet amit egy telefon akkuból mentettem ki és elég kicsi volt ahhoz hogy még beférjen.
Köszönöm a segítséget :)

Avatar
Robert
Elektronbűvölő
Hozzászólások: 10047
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: Arduino - TIMER regiszterek direkt kezelése (ATMega328P / ATTINY10)

HozzászólásSzerző: Robert » 2020. február 2. vasárnap, 21:03

Gratula!

Tiny10 alá mivel teszed?
Arduino tinycore vagy AVRStudio?

Tiny core - IDE:
http://www.technoblogy.com/show?1YQY
http://www.technoblogy.com/show?201J
https://github.com/technoblogy/attiny10core
http://www.tavir.hu - a gazda :)

borisz
DrótVégénSzéndarab
Hozzászólások: 31
Csatlakozott: 2016. november 26. szombat, 9:39

Re: Arduino - TIMER regiszterek direkt kezelése (ATMega328P / ATTINY10)

HozzászólásSzerző: borisz » 2020. február 2. vasárnap, 21:19

Egyik sem :D Ezt találtam amivel egy Uno-val fel lehet programozni.
https://make.kosakalab.com/make/electronic-work/arduino_tpi_en/


Vissza: “Arduino / C-nyelvű programozás (AVR-Duino, EthDuino, Arduino, Diecimila)”

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 1 vendég