Fórum témák

» Több friss téma
Fórum » AVR - Miértek hogyanok
 
Témaindító: pakibec, idő: Márc 11, 2006
Témakörök:
WinAVR / GCC alapszabályok:
1. Ha ISR-ben használsz globális változót, az legyen "volatile"
2. Soha ne érjen véget a main() függvény
3. UART/USART hibák 99,9% a rossz órajel miatt van
4. Kerüld el a -O0 optimalizációs beállítást minden áron
5. Ha nem jó a _delay időzítése, akkor túllépted a 65ms-et, vagy rossz az optimalizációs beállítás
6. Ha a PORTC-n nem működik valami, kapcsold ki a JTAG-et
Bővebben: AVR-libc FAQ
Lapozás: OK   841 / 841
(#) lazsi válasza dara hozzászólására (») Máj 12, 2025 /
 
(Gyakran az újabb gépekben is még az alaplapon ott van a párhuzamos port csatlakozó, csak nincs kivezetve a hátuljára... A gép szétszedése nélkül megnézhető pl. a BIOS-ban, hogy be lehet-e kapcsolni: ha igen, akkor érdemes belenézni. Vagy az alaplap leírása alapján.
Ha ott a tüskesor, akkor igen nagy eséllyel sokan tudunk adni olyan kábelt, ami kiviszi a portot a hátlapra. Vagyis kis szerencsével a nyomtatóportos megoldáshoz sem kell előszedned egy régi gépet...)
(#) dara válasza lazsi hozzászólására (») Máj 12, 2025 /
 
Köszönöm de már rendeltem egy usb programozót a nagy fal tövéböl ha nem bírok vele akkor lèpek tovább.
(#) zamatőr hozzászólása Jún 21, 2025 /
 

ATMEGA-8 program

Üdv!
Adott egy atmega8-al működő DCF szinkronizált óra. Szeretném ha a kettőspontok felváltva villognának amikor szinkronizál az óra a DCF vevővel. Bővebben: Link Az "asm" file elérhető Bővebben: Link. Valaki módosítaná a programot és lefordítaná hex-re -a beégetést meg tudom csinálni.. ( Csak után építeni "tudok")
Köszönöm.
A hozzászólás módosítva: Jún 21, 2025
(#) pajesz66 hozzászólása Júl 3, 2025 /
 

I2C szintillesztés hogyan?

Sziasztok!
Nem teljesen AVR a téma, de hátha valaki tud segíteni.
Egy áramkörben lévő eprom tartalmát kell kiolvasnom, egy adott hardverrel.
A gond az, áramkörben 1,8V-os I2C vonalak vannak, az eprom olvasó hardver pedig 3,3V-ot kezel.
Már megrendeltem egy pici PCA9306 szintillesztő áramkört, viszont dolgozni szeretnék amíg az megérkezik.
Nincs valakinek valami megoldása/ötlete a szintillesztésre?
(#) vargham válasza pajesz66 hozzászólására (») Júl 3, 2025 / 1
 
Ez található az eredeti Philips ajánlásban.
Bővebben: AN97055
A hozzászólás módosítva: Júl 3, 2025
(#) tki válasza vargham hozzászólására (») Júl 3, 2025 / 1
 
Csak vigyázni kell, mert a szokásos 3,3..5 V-os konverzióhoz képest itt már 1,8 V-os feszültségnél stabilan kell nyitnia a MOSFET-nek (szórással együtt), ami <1 V normál gate threshold voltage-et jelent. Ez ritkább, és egyáltalán nem biztos, hogy van otthon.

Ezek jók lehetnek, de inkább csak tippnek vedd, ne higgy nekem: : -)
https://www.hestore.hu/prod_10048178.html
https://www.hestore.hu/prod_10021023.html
(#) pajesz66 válasza tki hozzászólására (») Júl 7, 2025 / 1
 
Sziasztok!

Én is ezt találtam, rendeltem a néhány fajta mosfetet, kell pár nap mire megjön, addig várnom kell...
Amit itthon találtam azzal nem/nem jól működött a dolog... kevés az 1,8V... 3,3V és 5V között ok!
(#) wbt hozzászólása Júl 28, 2025 /
 

Felejtés

Sziasztok!
Most előtúrtam pár 15-18 éves készüléket (mérnöki példány, itt marad, ne kelljen Dél-Afrikába menni egy sor módosításáért ugye...). 6 látványprogramot tudó VU-méter, ha nincs hang, unatkozik=lágy átmenetekkel elvan. Kivéve, ha egy bizonyos program fut, akkor vibrál. Ugyan az a rutin van meghívva, semmi különleges (nem lehet időzítési gond, WS2812, kitanultuk anno), visszaolvasva, 1 bit hiba. Másik dolog (GPU-t csinált barátom mono LCD-hez), tökéletes a megjelenítés, de egy programrész nem megy. Visszaolvasva, 1 bit hiba. (ez kb 15 évig volt fiókban). Ti találkoztatok ilyennel, hogy 10-15 év után elmegy a flash? (ezeknél a példáknál kideríthetetlen, ki-mivel megy el az erdőbe, de nem okoztak itt nagy hibát, de nem ASM, tehát lehetetlen rájönni, mit okoz egy bithiba...másutt teljes összeomlást, itt csak egy kérdést). Ezekben Mega32 és M328 van, a bénább látvány VU-ban csak Attiny84, az meg elvan, nem felejt. Na, akkor ne tervezzek semmit 10+ évnél hosszabb időre? (félőbb, ha balesetet okoz egy cucc, most akkor én vagy a gyártó a hibás?)
(#) Gafly válasza wbt hozzászólására (») Júl 29, 2025 /
 
Létező dolog, különösen nagyon nagy integráltságú chip-eknél.
Van ahol figyelik is:
Idézet:
„serSupervisionTimer This attribute is used for activating or deactivating Soft Error Rate (SER) checking for Digital Signal Processors (DSP) on *** Board, and providing the periodicity of the Cyclic Redundancy Check (CRC).
Note:
SER faults are generated when high-energy sub-atomic particles collide with the DSP silicon and alter the DSP memory content by one bit. The source of the particles is, for example, the encapsulation material of the DSP or cosmic radiation. SER faults occur seldom and are considered expected behavior.”
(#) wbt válasza Gafly hozzászólására (») Júl 29, 2025 /
 
Mondjuk, a cipősdoboz maximum az alfa-béta sugárzás ellen véd...ami érdekes, hogy egy (ugyanolyan idős) készülék kiszögelve a falra évente 4-5 alkalommal be van kapcsolva, annak semmi baja, talán a flash olvasóerősítő, ha látja, hogy a töltés mondjuk 70% alá esik, visszatölt (???). Chip-en bármit el tudok képzelni. Van olyan AVR-es áramkör, ami iparban 20+ éve megy éjjel-nappal, semmi gond. Csak a lezsírozott, elfeledett, "minekszedjemszét" áramkörök esetén jött elő. (nem ártana itt már egy nagytakarítás/selejtezés is) Köszönöm!
(#) chipi hozzászólása Szept 21, 2025 /
 

Atmega 2560 jtag debugger

Sziasztok,

Atmega 2560 Jtag olvasásra- ra mit javasoltok?
ATMEL MKII ha jól tudom csak programozó.

Köszi!
(#) TavIR-AVR válasza chipi hozzászólására (») Okt 28, 2025 /
 
JTAG ICE MKII
AVR-JTAG
AVR-Dragon.
(#) Laslie hozzászólása Pé, 7:51 /
 

ATtiny85 LED füzér vezérlés

Sziasztok!
Közeledik a karácsony, így előkerültek a fiók mélyéből az elemes LED füzérek. Van itthon jó sok. Az egyik részük időkapcsolós (van benne beépítve timer), ami 6 órán keresztül engedi világítani, majd 18 órán keresztül pedig kikapcsolva tartja a LED füzért. Ezek szinte mindegyike 2 db AA ceruza elemről működnek. Persze van 1-2 db, ami 3 db AA ceruza elemet igényel.
Mivel van itthon jó pár olyan is, ami nem időkapcsolós, és van itthon jó pár ATtiny85 chip-em is (SOIC-8 tokozású), ezért kitaláltam, hogy "felokosítom" ezeket a LED füzéreket is. Ezek is legyenek időkapcsolósosak!
Minimális kódolást igényel, ez nem gond (max. segít a ChatGPT ). Viszont nem tudom eldönteni, hogy tranzisztorral (BCX56-16, és egy 1k ellenállás a bázisra) vagy FET-el (AO3400, és egy 10k lehúzó ellenállás, és egy 10 Ohm ellenállás a Gate-re) legyen megoldva a LED füzér kapcsolgatása. Azt megmértem Amper mérővel, hogy 240 mA áramot igényel a LED füzér 2 db AA ceruza elemről.
Szerintetek melyik megoldást érdemes választani, és jól gondolom-e, hogy elég csak ennyi alkatrész?
(#) Gafly válasza Laslie hozzászólására (») Pé, 8:29 /
 
Ahogy nézem még ellenállás sem kell a FET-hez.:
Idézet:
„Port B is a 6-bit bi-directional I/O port with internal pull-up resistors (selected for each bit). The Port B output buffers have symmetrical drive characteristics with both high sink and source
capability.”

Ugyan kicsi a feszültség, de a FET adatlapja alapján működhet.
(#) Laslie válasza Gafly hozzászólására (») Pé, 8:51 /
 
Egyik sem kell? Se a soros ellenállás, se a lehúzó ellenállás a Gate-hez?
(#) Nabukodonozor válasza Gafly hozzászólására (») Szo, 11:28 /
 
Úgy emlékszem, hogy a felhúzó ellenállás csak input módban működik, mert a PORTx regiszterrel lehet állítani.

Az eredeti kérdéshez: a 240 mA a MOSFET-el működni fog. Szerintem nem kell ellenállás a gatere, mehet direktben. A bipoláris is jó, de a CE szaturáció elég nagy, ami csak fölöslegesen viszi el a teljesítményt.

Arra figyel, hogy a LED sor melyik végére teszed a tranzisztort, mert a bipolárist a táp és a szalag közé, addig a MOSFET-tet a szalag és a test közé kell tenni.

A tapasztalatom szerint a ChatGPT az időzítés hosszába szokott belezavarodni, abban szerintem tudunk itt segíteni, ha van már kód.

Ami szűk keresztmetszet lehet, hogy az Attiny milyen alacsony feszültségen tud működni. 1 MHz-en 1,8 V-on biztosan megy. Szerintem lehet itt trükközni hogy alacsonyabb frekiről megy. Sőt érdemes lehet a power savinggel is játszani.
(#) vargham válasza Laslie hozzászólására (») Vas, 19:52 /
 
Ó, karácsonyi LED villogót én is készítettem pár éve. Ha érdekel, előtúrom a kódot.
(#) Nabukodonozor válasza Nabukodonozor hozzászólására (») Hé, 8:31 /
 
Megmerem kockáztatni, hogy ezt egyszerűbb lenne megoldani néhány 4000-es sorozatú IC-vel, mint egy ATtinyvel.
(#) Laslie válasza vargham hozzászólására (») Hé, 11:39 /
 
Megköszönöm, ha megkeresed.
Megkérdeztem a ChatGPT-t, mivel nem vagyok annyira otthon az AVR programozásában, és adott egy kódot (az elvárás, hogy bekapcsoláskor indít, 6 órán keresztül világítanak a LED-ek, majd 18 órára aludni megy):
  1. #include <avr/sleep.h>
  2. #include <avr/wdt.h>
  3. #include <avr/power.h>
  4.  
  5. #define LED_PIN 3
  6.  
  7. volatile bool wdt_wake = false;
  8.  
  9. ISR(WDT_vect) {
  10.   wdt_wake = true;
  11. }
  12.  
  13. void setup_wdt_1s() {
  14.   MCUSR &= ~(1 << WDRF);
  15.   WDTCR |= (1 << WDCE) | (1 << WDE);
  16.   // 1s időzítés, csak interrupt
  17.   WDTCR = (1 << WDIE) | (1 << WDP2) | (1 << WDP1);
  18. }
  19.  
  20. void sleep_1s() {
  21.   wdt_wake = false;
  22.   set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  23.   sleep_enable();
  24.   sleep_cpu();
  25.   sleep_disable();
  26. }
  27.  
  28. void setup() {
  29.   pinMode(LED_PIN, OUTPUT);
  30.   digitalWrite(LED_PIN, LOW);
  31.  
  32.   // Órajel csökkentése a kisebb fogyasztáshoz
  33.   clock_prescale_set(clock_div_8);  // 1 MHz vagy még kevesebb, ha fuse-al állítod
  34.  
  35.   setup_wdt_1s();
  36. }
  37.  
  38. void loop() {
  39.   // 6 óra = 21600 másodperc
  40.   digitalWrite(LED_PIN, HIGH);
  41.   for (uint32_t i = 0; i < 21600; i++) {
  42.     sleep_1s();
  43.   }
  44.  
  45.   // 18 óra = 64800 másodperc
  46.   digitalWrite(LED_PIN, LOW);
  47.   for (uint32_t i = 0; i < 64800; i++) {
  48.     sleep_1s();
  49.   }
  50. }

Nem tudom ez mennyire lesz jó, de majd kipróbálom.
A NYÁK készítése még folyamatban van.

Nabukodonozor
Lehet egyszerűbb lenne, de azért esett a választávom az ATtiny85-re mert ilyen van itthon (SOIC-8), és a hely ahova be kell férnie (25 mm x 10 mm), adja magát.
A hozzászólás módosítva: Hé, 11:41
(#) tki válasza Laslie hozzászólására (») Hé, 12:15 /
 
Szerintem működőképes a kód, csak nem jó. : -) Ugyanis a watchdog timernek, ha ez is belső R-C oszcillátor, 10-20%-ot is eltérhet az értéke, és ez az eltérés ebben a kódban egyfolytában halmozódik, tehát ha ennyire egyszerűen csinálod meg, akkor valamennnyivel biztosan el fognak csúszni a napok, és szerintem gyorsan. Azt hiszem, külön RTC nélkül nincs igazán kisfogyasztású megoldás, de majd valaki megmondja.

A másik egy itt jelentéktelen probléma: elmehet a levegőbe egy-egy ébresztés, ha a WDT-megszakítás pont akkor csattan be, amikor a kód a sleep_enable() és a sleep_cpu() között jár, így a sleep_enable() előtt tiltani kellene a megszakításokat, utána meg engedélyezni. De 1 másodperces ismétlődésnél és az egész rendszer pontosságát tekintve ez amúgy sem tétel.
(#) Nabukodonozor válasza tki hozzászólására (») Kedd, 21:23 /
 
Igazából több sebből vérzik a kód, például:
- az ISR-nél nincs explicite jelölve, hogy a megszakítás hogyan kezelődjön
- a wdt_wake-t védeni kellene azzal, hogy előtte tiltani kellene a megszakításokat, utána megengedélyezni. Igazából elég lenne meghívni a wdt_enable-t.
- a 15. 16. sorok is viccesek, először szépen bit vagyolja a regisztert, aztán simán felülírja az egészet
- az i változónak elég a uint16_t típus
- akárhogy nézem, de nem találom a main-t, de szerintem ott van az csak nem lett bemásolva. És egyébként a wdt_wake-t nincs is használva.

De az utolsót leszámítva ezek nem okoznak semmilyen gyakorlati problémát ebben a programban.

A sleephez egyáltalán nem értek.

Idézet:
„amikor a kód a sleep_enable() és a sleep_cpu() között jár, így a sleep_enable() előtt tiltani kellene a megszakításokat, utána meg engedélyezni.”


Ezt miért így kell csinálni?
(#) tki válasza Nabukodonozor hozzászólására (») Kedd, 22:29 /
 
A setupot most nem nézem meg a vagyolgatással és az értékadással, de nyilván arról van szó, hogy kétlépcsős a regiszter átállítása biztonsági okokból; először engedélyezzük a beállítást, aztán beállítjuk.

Az viszont igaz; hogy ha jól akarjuk csinálni, a wdt_wake változót is meg kell védeni.

Így képzelem, aztán majd kijavítasz: a WDT timer szabadon fut, így bekapcsolás után először bármikor megjöhet egy másodpercen belül a WDT interrupt. Itt lehet egyedül race condition. Amikor a WDT timer túlcsordul, az nekünk nem gond, az az ő dolga.

A cli() ... sei()-n belülre kell rakni a wdt_wake változó hamisra állítását is, amit jelenleg semmire sem használunk. A set_sleep_mode()-nak meg mindegy, jön-e megszakítás előtte-utána - ha minden igaz, a bitjeit semmi sem változtatja meg, csak a biztonság kedvéért állítjuk be minden alkalommal.

Azt meg biztosan tudod, hogy:
- az sei() garantálja, hogy a következő utasításig nem lesz interrupt,
- a sleep_cpu() pedig nem egy függvény, hanem egy makró, egyetlen Assembly utasítás, vagyis nem lehet előtte interrupt. Vagyis így nem lehet race condition: ...sei(); sleep_cpu();...

Források:
- "Timed Sequences for Changing the Configuration of the Watchdog Timer" egy doksiban (mégis megnéztem),
- https://github.com/avrdudes/avr-libc/blob/main/include/avr/sleep.h a sleep függvényekhez,
- https://ww1.microchip.com/downloads/en/DeviceDoc/AVR-Instruction-Set-Manual-DS40002198A.pdf, 5.104.1-es bekezdés.

Itt mit hiányolsz: "az ISR-nél nincs explicite jelölve, hogy a megszakítás hogyan kezelődjön"?
(#) vargham válasza Laslie hozzászólására (») Sze, 18:26 /
 
Nálunk ezzel megy a karácsonyi fényfűzér. Feleségem reklamált, hogy a gyári programban túl hirtelen változik a fényerő. Ez tulajdonképpen egy potméterekkel állítható paraméterű fader.
Olyan időzítést pont nem tud, amit te szeretnél, de nem macera beletenni.
  1. /*
  2.  * blink_fade_85.cpp
  3.  *
  4.  * Created: 2020. 12. 17. 11:14:02
  5.  * Author : VMP
  6.  */
  7.  
  8. #ifndef F_CPU
  9. #define F_CPU 8000000u
  10. #endif
  11.  
  12. #include <avr/io.h>
  13. #include <avr/interrupt.h>
  14. #include <util/delay.h>
  15. #include <avr/pgmspace.h>
  16.  
  17. const uint8_t PROGMEM gamma8[] = {
  18.   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  19.   1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
  20.   1,  1,  1,  1,  1,  1,  1,  2,  2,  2,  2,  2,  2,  2,  2,  2,
  21.   2,  3,  3,  3,  3,  3,  3,  3,  4,  4,  4,  4,  4,  5,  5,  5,
  22.   5,  6,  6,  6,  6,  7,  7,  7,  7,  8,  8,  8,  9,  9,  9, 10,
  23.   10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 15, 15, 16, 16,
  24.   17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 24, 24, 25,
  25.   25, 26, 27, 27, 28, 29, 29, 30, 31, 32, 32, 33, 34, 35, 35, 36,
  26.   37, 38, 39, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 50,
  27.   51, 52, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 66, 67, 68,
  28.   69, 70, 72, 73, 74, 75, 77, 78, 79, 81, 82, 83, 85, 86, 87, 89,
  29.   90, 92, 93, 95, 96, 98, 99,101,102,104,105,107,109,110,112,114,
  30.   115,117,119,120,122,124,126,127,129,131,133,135,137,138,140,142,
  31.   144,146,148,150,152,154,156,158,160,162,164,167,169,171,173,175,
  32.   177,180,182,184,186,189,191,193,196,198,200,203,205,208,210,213,
  33.   215,218,220,223,225,228,231,233,236,239,241,244,247,249,252,255 };
  34.  
  35. constexpr uint8_t cPotmeter1Adc = 0x1u;
  36. constexpr uint8_t cPotmeter2Adc = 0x2u;
  37. constexpr uint8_t cPotmeter3Adc = 0x3u;
  38. constexpr uint8_t cAdcChannelCount = 3u;
  39. constexpr uint8_t cFirstAdcChannel = 1u;
  40. constexpr uint16_t cAdcMaxValue = 1023u;
  41. constexpr uint8_t cPwmMaxValue = 255u;
  42. constexpr uint8_t cAdcLowerLimit = 4u;
  43. constexpr uint16_t cAdcUpperLimit = 1020u;
  44.  
  45. volatile uint8_t edAdcChannel = cPotmeter3Adc;
  46. volatile uint16_t maxDuty = 0; // Potmeter on ADC1
  47. volatile uint16_t onDelay = 0; //Potmeter on ADC3
  48. volatile uint16_t offDelay = 0u; //Potmeter on ADC2
  49.  
  50. void NextAdcChannel() noexcept {
  51.   edAdcChannel = ++edAdcChannel <= cAdcChannelCount ? edAdcChannel : cFirstAdcChannel;
  52.   ADMUX &= ~(3);
  53.   ADMUX |= edAdcChannel;
  54. }
  55.  
  56. void startConversion() noexcept {
  57.   ADCSRA |= (1 << ADSC);
  58. }
  59.  
  60. ISR(ADC_vect) {
  61.   switch (edAdcChannel) {
  62.     case cPotmeter1Adc: {
  63.       maxDuty = ADC / 4u;
  64.       break;
  65.     }
  66.     case cPotmeter2Adc: {
  67.       offDelay = ADC > cAdcLowerLimit ? ADC : 0u;
  68.       offDelay = ADC < cAdcUpperLimit ? ADC : cAdcMaxValue ;
  69.       break;
  70.     }
  71.     case cPotmeter3Adc: {
  72.       onDelay = ADC > cAdcLowerLimit ? ADC : 0u;
  73.       onDelay = ADC < cAdcUpperLimit ? ADC : cAdcMaxValue ;
  74.       break;
  75.     }
  76.     default: {
  77.       break;
  78.     }
  79.   }
  80.   NextAdcChannel();
  81.   startConversion();
  82. }
  83.  
  84. int main(void) {
  85.   cli();
  86.   TIMSK &= ~(1 << OCIE1A); //Disable Timer0 compare A interrupt
  87.   TIMSK &= ~(1 << OCIE1B); //Disable Timer0 compare B interrupt
  88.   DDRB |= (1 << PB1); //LED output (OC0B/OC1A)
  89.   TCCR1 &= ~(1 << COM1A1); //Toggle OC1A
  90.   TCCR1 |= (1 << COM1A0); //Toggle OC1A
  91.   TCCR1 |= (1 << CS10); //Timer runs  IO clock without prescaler
  92.   TCCR1 |= (1 << PWM1A); //Enable PWM output mode
  93.   OCR1A = 0u;
  94.   ADMUX |= (1 << MUX1) | (1 << MUX0); //Use ADC3 (PB3)
  95.   ADCSRA |= (1 << ADPS0); //Set ADC clock prescaler to 32
  96.   ADCSRA |= (1 << ADIE); //Enable conversion ready interrupt.
  97.   ADCSRA |= (1 << ADEN); //ADC enable
  98.   DIDR0 |= (1 << ADC3D) | (1 << ADC2D) | (1 << ADC1D); //Disable digital input on ed analog inputs
  99.   startConversion();
  100.   sei();
  101.  
  102.   while (true) {
  103.     // Always on
  104.     while (onDelay == 0u && offDelay == 0u) {
  105.       OCR1A = maxDuty;
  106.       _delay_ms(1u);
  107.     }
  108.     OCR1A = 0u;
  109.     // Fade in
  110.     uint8_t duty = 0u;
  111.     while (duty < maxDuty) {
  112.       OCR1A = pgm_read_byte(&gamma8[duty++]);
  113.       uint16_t counter = 0u;
  114.       while (counter++ < onDelay / 16u) {
  115.         _delay_us(1u);
  116.       }
  117.     }
  118.     // Sustain
  119.     uint16_t counter = 0u;
  120.     while (counter++ < onDelay / 32u) {
  121.       OCR1A = pgm_read_byte(&gamma8[maxDuty]);
  122.       _delay_ms(1u);
  123.     }
  124.     // Fade out
  125.     duty = maxDuty;
  126.     while (duty > 0) {
  127.       OCR1A = pgm_read_byte(&gamma8[duty--]);
  128.       uint16_t counter = 0u;
  129.       while (counter++ < onDelay / 16u) {
  130.         _delay_us(1u);
  131.       }
  132.     }
  133.     // Off period
  134.     OCR1A = 0u;
  135.     volatile uint16_t fakeVariable = 0;
  136.     while (fakeVariable++ < maxDuty * 2u) {
  137.       uint16_t counter = 0u;
  138.       while (counter++ < offDelay / 32u) {
  139.         _delay_us(1u);
  140.       }
  141.     }
  142.   }
  143. }
(#) Nabukodonozor válasza tki hozzászólására (») Sze, 19:19 / 1
 
A WDTCR állítás: megnéztem a datasheetet és azt értem, hogy miért történik két lépcső, de azt nem hogy először miért "|=" a "=" helyett.

Igazából sosem mélyültem el a watchdog lelki világában és eddig csak védelemre használtam olyan szempontból, hogy ha valami beakad, akkor a WD resetelje az CPU-t. Csak simán meghívom a wdt_enable(...) és a wdt_reset() függvényeket innen: Bővebben: Link

Ah, szóval a race condition ott van, hogy a WD interruptja akkor hívódik meg mielőtt a sleep megtörténik. Szóval, lesz egy igazából hatástalan interrupt, mert nincs minek feldolgoznia és a CPU meg megy aludni.

Az ISR esetén erre gondolok: Bővebben: Link (ha van beállított LSP clangd-vel, akkor az jelzi is, hogy az ISR() paraméterei hiányosak).

Ezer köszi az infókat! Bőven vannak hiányosságaim az AVR területen, de a C-ben és a szoftverfejlesztés körüli dolgokban úgy gondolom, hogy erős vagyok.
(#) tki válasza vargham hozzászólására (») Sze, 19:19 /
 
Végül is igaz, ez a proci úgysem eszik többet néhány milliampernél 8 MHz-nél sem, az meg szinte elhanyagolható a világítás mellett. Mindig a legegyszerűbb megoldás marad ki. : -)

Csakhogy... a cucc 24 órából, ha jól értettem:
- 8 órában világít 240 mA körüli árammal, procival együtt ez max. 250 mA,
- 16 órában pedig magában fut max. 10 mA fogyasztással.

Egy (találomra mondom) 2,5 Ah-s akkupakkból, mert az elemeket felejtsük el, a 8 óra elviszi a töltöttség 80%-át, a 16 óra magában futás pedig a maradék energia kb. egyharmadát.

A probléma csak az, hogy egy újabb 8 órás világítási periódushoz úgyis tölteni kell az eszközt, ahhoz meg be kell dugni vagy kivenni az akkukat, foglalkozni vele, vagyis az éjszakai időzítésnek, önműködésnek gyakorlatilag nem lesz értelme - csak sokkal nagyobb akkumulátorral. Nem is tudom, miért árulnak ilyeneket, elemmel sem mehet tovább, hacsak nem villog kis kitöltéssel.
A hozzászólás módosítva: Sze, 19:23
(#) tki válasza Nabukodonozor hozzászólására (») Sze, 19:58 / 1
 
"az ISR() paraméterei hiányosak"

Ha csak ennyire gondolsz, az ISR makrónak változó argumentumlistája van, valamint nyilván az ISR_BLOCK a defaultja, azt az attribute-ot nem kell külön megadni. És el van rejtve a warning. Vagy akármi. : -) https://github.com/vancegroup-mirrors/avr-libc/blob/master/avr-libc...rupt.h:

  1. #define ISR(vector, ...)            \
  2.     void vector (void) __attribute__ ((signal,used,externally_visible)) __VA_ARGS__; \
  3.     void vector (void)

Megnéztem pár régi kódomat, vegyesen volt benne megadva és nem megadva a kezelés módja, de az már minimum tíz éve volt:
- ISR(INT2_vect)
- SIGNAL(SIG_OUTPUT_COMPARE1A)
A hozzászólás módosítva: Sze, 20:04
(#) vargham válasza tki hozzászólására (») 13:14 / 1
 
Igen, ez érthető. Nálunk telefon töltőről megy. A szoftver azért kellett, hogy szépen halványítson, ne villogva, mint a gyári vezérlő. Azért hátha van benne hasznos rész neked is.
Következő: »»   841 / 841
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem