Fórum témák

» Több friss téma
Fórum » AVR - Miértek hogyanok
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   623 / 623
(#) steelgoofy hozzászólása Kedd, 19:44 /
 
Üdv!

Egy háromfázisú hidat szeretnék meghajtani atmega 2560 mikrovezérlővel és DRV8303 driver IC-vel eddig sajnos nem sok sikerrel. Megvettem hozzá minden alkatrészt, szépen bekötöttem, az egyetlen dolog amit nem használok az IC-ből az a 2db erősítő ami a fázisok jeleit csatolja vissza ADC re (ezt máshogy oldanám meg). A probléma hogy az IC-be bemenő PWM jel nem jön ki egyáltalán, nemhogy erősítve. Van valakinek tapasztalata ezzel az IC vel, vagy esetleg tudna ajánlani egy másikat ? (gyakorlatilag olyan IC is jó lenne ami 4-6 PWM jelet tudna erősíteni)
(#) holex hozzászólása 13:37 /
 
Sziasztok. Belefutottam egy számomra érthetetlenek tűnő hibába.

Adott a
  1. uint32_t dateToSecs(uint8_t ev, uint8_t ho, uint8_t nap, uint8_t ora, uint8_t perc, uint8_t sec){
  2.         const uint16_t table[12] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
  3.         return ((ev * 365 + ((ev + 3) >> 2) + table[ho - 1](!(ev & 4) && ho > 2) + nap-1)*86400 + ora*3600 + perc*60 + sec);
  4. }


függvény, ami bizonyos bemenő paramétereknél (14,10,1,13,21,0) hülyeséget számol (465419324).

Napok óta szenvedek vele, hogy mi lehet a hiba, és rájöttem, hogy ha átkonvertálom az értékeket 32 bitesre, attól megjavul:

  1. uint32_t dateToSecs(uint8_t ev, uint8_t ho, uint8_t nap, uint8_t ora, uint8_t perc, uint8_t sec){
  2.         const uint16_t table[12] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
  3.         return ((ev * 365 + ((ev + 3) >> 2) + table[ho - 1](!(ev & 4) && ho > 2) + nap-1)*86400 + (uint32_t)ora*3600 + (uint32_t)perc*60 + (uint32_t)sec);
  4. }


Ugyanolyan bemenő paraméterek mellett így már 465484860-at számol. Az lenne a kérdésem, hogy mi okozza ezt? Miért nem tud típuskonverziók nélkül is jól számolni? Továbbá ahová nem írtam be a konverziót (pl az ev és a table elé), oda is érdemes beírni, mert okozhat még meglepetéseket?
(#) tursaba válasza steelgoofy hozzászólására (») 13:50 /
 
Szia! Milyen szint van a /FAULT lábon?
(#) Hp41C válasza holex hozzászólására (») 14:23 /
 
A C fordítók a kifejezések kiszámításánál vagy egy default típusból (16 bites int) vagy a paraméterek típusát tekintik az eredmény típusának, ha nincs más előírva.
Itt már az ev * 365 -nél gondok lehetnek, hiszen az ev 8 bites. A 86400 -zal való szozásról nem is beszélve. Tovább kellene folytatni a konverzió előírását. (uint16)ev * 365 ... stb.

A saját másodperces idő helyett célszerűbb egy szabványosat használni. Pl. Julian Day Number. Még a hét napja is kiszámolható belőle egy mod 7 művelettel. Bővebben: Link
A hozzászólás módosítva: 14:26
(#) holex válasza Hp41C hozzászólására (») 14:26 /
 
Rendben, így lesz, csak arra gondoltam, hogy mivel a fgv visszatérési értéke 32 bites, ezért 32 biten fogja végigszámolni a kifejezést. De úgy tűnik mégsem...
(#) steelgoofy válasza tursaba hozzászólására (») 16:44 /
 
A FAULT egyszerűen csak Vcc-re van kötve egy 10kOhm-os ellenálláson keresztül.
(#) KDavid753 hozzászólása 20:49 /
 
Sziasztok!
ATtiny2313 miért melegszik?
Egy óra kijelzőt hajt meg, de a szegmensek vannak meghajtva tranzisztorral. Ez az oka, vagy a gyors órajellel egybekötött lábkapcsolgatás? (van az ic-n kristály, de ennek kell valami külön script, hogy azt használja?)
Üdv: Dávid
Következő: »»   623 / 623
Bejelentkezés

Belépés

Hirdetés
Frissek
2014. Okt, 01. Sze
22:20:52
Jelenleg 464 fő olvassa az oldalt
Online tagok:
Lapoda.hu     XDT.hu     HEStore.hu