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   699 / 840
(#) Csirkefej válasza killbill hozzászólására (») Okt 12, 2015 /
 
Tegyük.

Elkezdtem a for-t írni de egy sor után töröltem azt a részt mert nem akartam regényeket írni -nomeg nem is tudom rendesen elmagyarázni csak élőszóban gép/papír-ceruza segítségével.
Instant helpnek azért elment remélem.
(#) rolandgw válasza Csirkefej hozzászólására (») Okt 12, 2015 /
 
Légy szíves arra írjál egy rövid példát,ahol azt a sok if-et megspórolod.
(#) Kovidivi válasza rolandgw hozzászólására (») Okt 12, 2015 /
 
Miért fontos ez? Teljesen lényegtelen. Én ma megismertem egy új parancsot, nem biztos, hogy fogom használni, de jó tudni, hogy ilyen is van, és nem fogok megijedni, ha valahol találkozok vele.
(#) killbill válasza Csirkefej hozzászólására (») Okt 13, 2015 / 1
 
Ma már begépeltem, csak menet közben kirakott a forum motor.. Szóval nagyon kellene már egy C topik ezeknek az alapvető kérdéseknek. Mert nagyon sok a nem processzor specifikus kérdés itt is és más mikrokontrolleres topikokban is.
(#) k3gy3tl3n válasza rolandgw hozzászólására (») Okt 13, 2015 /
 
Szerintem nem megspórolásra gondol, ingább csak futás idő csökkentésre valami ilyesmi formában:

  1. while(1)
  2. {
  3.    /*valami kód ami csinál valamit és utána ellenőrzünk pár dolgot if-ekkel*/
  4.    if(valami)
  5.    {
  6.       akarmi;
  7.    }//itt kiderül hogy felesleges tovább menni ezért az else ágban visszaugrunk a while elejére, megspórolva a hátrébb lévő if-ek kiértékelését
  8.    else
  9.    {
  10.       continue;
  11.    }
  12.  
  13.    if(...)........ //ezeket már mind megspórolhatjuk, persze nem mindíg feleslegesek csak lehet olyan ciklus amiben azok
  14.    if(...)........
  15.    if(...)........
  16.    if(...)........
  17.    if(...)........
  18.    if(...)........
  19.  
  20. }
A hozzászólás módosítva: Okt 13, 2015
(#) MATA hozzászólása Okt 13, 2015 /
 
Sziasztok!
Szeretném Topi által közzétett Processzoros, automata NiMH tőltő (ATtiny13)-al megépíteni Kérdésem egy cellára is jó lenne a töltő csak a "CELL_NUM" definíciót kellene 1-re javítani? A válaszokat előre is köszönöm.
(#) Csirkefej válasza rolandgw hozzászólására (») Okt 13, 2015 /
 
Rendben. De a hozzászólásod alapján úgy tűnik, hogy eleve kötekedni akarsz
Idézet:
„Elég fura tanokat hirdetsz!”
ezért megjegyzem, hogy nem akarok senkit rábeszélni ezeknek az utasításoknak a használatára. Szóba került - javasoltam.
Ha könnyebbé/jobbá tudod vele tenni a programod, használd. Ha nem tetszik, akkor ne használd.

Az if-ek spórolása csak egy példa volt egyébként úgy használja mindenki, ahogy akarja.
Ha akarja.

Példának itt egy hevenyészett kód neked:

A sorfeldolg() a kapott bufferben keres nem idézőjelek között szereplő byte sorozatot: Hobbi
és idézőjelek közötti: Elektronika

Az idézőjel lehet ' és ".

Ha idézőjelek közötti Hobbi-t talál nem törődik vele, ha idézőjeleken kívüli Elektronikát - azzal sem.

Ha megjegyzéshez ér a bufferben, akkor leáll (# karakter)

A while ciklus után összegzi az eredményeket és visszatér.

A kód számomra áttekinthető így és viszonylag kevés időt pazarol.(persze még lehet rajta finomítani, ez csak egy példaprogram, mondhatnám gömbáramkör)

Próbáld ugyanezt megcsinálni break/continue nélkül.

A fórum motorja nagyon sok üres sort szúrt be a kódba + sort is tört ott, ahol nincs(legalábbis előnézetben) -nem tudom miért!- így rettentően szellős lett és nagyon hosszúnak tűnik.
Ezért ajánlott inkább kedvenc editorba bemásolni és úgy böngészni.

  1. #include <stdio.h>
  2.  
  3. int sorfeldolg(char *sor)
  4. {
  5.     char *s = sor, idezo = 0, rem = 0;
  6.     int hobbi = 0, elektronika = 0;
  7.  
  8.     while (*s != 0)
  9.     {
  10.         // ha nem idezojelben szereplo rem karakter jon (#) akkor vege
  11.         if (*s == '#' && idezo == 0)
  12.         {
  13.             rem = 1; break;
  14.         }
  15.  
  16.         // idezojel zar?
  17.         if (*s == idezo)
  18.         {
  19.             idezo = 0; s++; continue;
  20.         }
  21.  
  22.         // idezojel nyit?
  23.         if (idezo == 0 && (*s == '"' || *s == '\''))
  24.         {
  25.             idezo = *s; s++; continue;
  26.         }
  27.  
  28.         if (idezo == 0 && strncmp(s, "Hobbi", 5) == 0)
  29.         {
  30.             hobbi++; s += 5; continue;
  31.         }
  32.  
  33.         if (idezo != 0 && strncmp(s, "Elektronika", 11) == 0)
  34.         {
  35.             elektronika++; s += 11; continue;
  36.         }
  37.  
  38.         // tovabbi feldolgozas...
  39.  
  40.         // kovetkezo karakter
  41.         s++;
  42.     }
  43.  
  44.     if (rem == 0)
  45.     {
  46.         // rem van a soron
  47.     }
  48.  
  49.     else
  50.     {
  51.         // rem nelkuli sor
  52.     }
  53.  
  54.     printf("Hobbi:%d db\tElektronika:%d db\n", hobbi, elektronika);
  55.  
  56.     return hobbi;
  57. }
  58.  
  59. int main()
  60. {
  61.     char sor[] = "Hobbi \"Elektronika\"  Elektronika 'Hobbi'";
  62.  
  63.     sorfeldolg(sor);
  64.  
  65.     return 0;
  66. }
(#) Csirkefej válasza Csirkefej hozzászólására (») Okt 13, 2015 /
 
Csak előnézetben volt a sok üres sor + sortörés! Elküldés után rendben van.
(#) rolandgw válasza Csirkefej hozzászólására (») Okt 13, 2015 /
 
Nagyon jó példa,meggyőztél. Ha sok hasonló feladat lesz AVR kapcsán,használni fogom.
(#) kameleon2 hozzászólása Okt 13, 2015 /
 
Sziasztok! 89c52-vel van bárkinek tapasztalata? Programozott valaki már ilyet? Mert a fejlesztőkészlet és maga a chip sem drága. Érdekelne a véleményetek. Olcsó és sok portos mikrokontrollert keresek - ez jó is lenne, van is pár panelem, amibe illik (PLC klón, programozó) Eddig annyit tudtam csinálni, hogy a felélesztett programozót egy előre megírt (PLC-klón) chippel leteszteltem, de itt megállt a tudományom mert azt sem tudom hol az eleje és hol a vége. Nem a programozással van gondom, hanem azzal, merre induljak el. 3-féle mikrokontrollert már programozok egy ideje - ez sötét ló kicsit. Valami induló infó is jó lenne magyar nyelven. Jegyzet stb. Előre is köszönöm.
(#) wbt válasza kameleon2 hozzászólására (») Okt 14, 2015 /
 
Szia! Én anno GAMF jegyzetet használtam, az tömör és jó, illetve valami német könyv fordítása jelent meg a 8051 mikrokontroller programozása (?) címmel, szép kék előlappal.
Ha eddig alap RISC cuccokat (PIC, AVR) programoztál, akkor pár napig égnek áll a hajad, de persze szokni kell. Ezek a régi cuccok még elég lassúak (1MIPS), de hatékonyak. Persze ebből is van már 100MHz/100MIPS-es változat is. STC most is gyártja marha olcsón az 1 órajeles verziót (34MHz), valami 2-400Ft/db, beépített soros boot-loader-el. MCS51 családnak nagyon nagy irodalma van, csak kicsit később léptek a sebességben / árban. Lehet, még ma is tanítják fősulin...Én vagy 10 évig nyomtam a különböző verzióit, nem volt vele gondom. De szokás kérdése...nem hitvita (!). Megpróbálom előtúrni a leírásokat, kicsit saláta, de hát ha valakinek itt meg van a dr. Madarász-féle jegyzet.
(#) Sick-Bastard válasza kameleon2 hozzászólására (») Okt 14, 2015 /
 
Nekem nincs.
Az meglehet, hogy olcsobb, mint az AVR, de kevesebbet is tud. Az AVR-ek kozott vannak darabok tobb RAM-mal, Flash-el ill EEPROM-mal is... ADC, I2C, extra USART, PWM, RTC... Igaz a 89C52 (89S52)-hoz hozza lehet illeszteni, de a vegere arban ugyan ott is tarthatsz, mintha egy AVRt vennel meg es meg a portok felet el is vesztetted (felhasznaltad).

Egy ATMEGA32A-PU jobb valasztas lenne, szerintem.

Annyi hatranya van, hogy a PLC klonoddal nem fog menni, az eltero labkiosztas miatt.
(#) kameleon2 válasza Sick-Bastard hozzászólására (») Okt 14, 2015 /
 
Ez sajnos éppen elég baj. Ugyanis így csak bedobnám az olcsó, kínai hardver foglalatába a saját programomat tartalmazó chipet. Készítettem chip adapterpanelt, működik is, de növeli a költségeket.
(#) rolandgw válasza kameleon2 hozzászólására (») Okt 14, 2015 / 1
 
Ez az a könyv,amit wbt említ,ha rákeresel pdf-ben is megtalálod.
(#) wbt válasza kameleon2 hozzászólására (») Okt 16, 2015 /
 
Szia! Játszani, kísérletezni most rendeltem kemény 1000Ft-ért (ebay, mi más...)
karos foglalatú MCS51 próbavackot, sorossal, portok "kiLEDezve", tökéletes próbaanyag. (már mert az én régi paneljeimet belepte a por/hó/pók/fecskefészek stb.) Mivel az újabbak is mind ISP-vel rendelkeznek, csak egy ISP programozót kell összedobnod. Ha nagyon érdekessen akarsz fejleszteni, nekem még van piggy-back tokozású NEC 8052-őm, na, ott minden port szabad
(#) AxaGame válasza rolandgw hozzászólására (») Okt 16, 2015 /
 
Hali!
Hát ez nekem az intel driver frissítése után is betart, nem fut a debug rész és marad.
Pedig a windows azt írja, hogy a legfrissebb driver van a gépen.
Másnak fut a Studio 7 debug rész és csak nekem van vele bajom?
(#) rolandgw válasza AxaGame hozzászólására (») Okt 17, 2015 /
 
Ezzel megnézted ?
(#) AxaGame válasza rolandgw hozzászólására (») Okt 17, 2015 /
 
Igen.
Talált is valami frissíteni valót a wifi részen és ennyi.
Utána még frissítettem az Asus oldalról is, amit lehetett, de az sem segített.
A windows eszközvezérlője azt állítja, hogy a legfrissebb video illesztőm van fent.
Ezek után nem tudom mit lehet még frissíteni.
Érdekesnek találom a problémát.
Annyi öröm van azért, hogy legalább a működő 6.2 verziót nem rontotta el.
Kis öröm is öröm!
(#) rolandgw válasza AxaGame hozzászólására (») Okt 17, 2015 /
 
Lehet,hogy a 6.2 a probléma.Én tisztán tettem fel.Fórumokon írogatnak lehetséges atmel usb driver keveredésről,hasonló hibajelenséggel.
(#) AxaGame válasza rolandgw hozzászólására (») Okt 17, 2015 /
 
Háááát....
Erről nem írtak a hibakód alapján. Azt nem tudom, hogy le merjem-e venni ezután a jól működő verziót. Szerintem még várakozom. Gyanítom, még jön itt egy-két javítása a 7. verziónak.
Mindenesetre köszönöm a tippjeid!
(#) Droot hozzászólása Okt 18, 2015 /
 
Sziasztok!

GSM modult szeretnék kezelni. Bizonyos utasításokra nyilván várni kell, úgy mint az hogy felmegy hálózatra, sms küldés, gprs-re csatlakozás.
Tehát nem szeretném a végtelenciklusban futtatni, mivel akkor amíg várakozik, megállítja a program futását.
Profi módon hogyan lehet megcsinálni?
(#) csatti2 válasza Droot hozzászólására (») Okt 18, 2015 / 1
 
Készítesz egy állapotgépet (state machine). Meghatározod milyen fázisokra (állapotokra) van szükséged a GSM modul kezelése közben, majd pedig az átmenetek feltételeit a különböző fázisok között. Az ezt kezelő funkciót pedig minden egyes loop ciklusban meghívod.
Itt egy rövid példa kód:
Ez egy ESP8266 modul inicializálását végzi. (A _timerGeneral egy időzítőmegszakításban 10ms-nként csökkentett változó) Használata valójában egy főbb állapotgép egyetlen fázisában történik (egymásba ágyazhatók és így jobban átláthatóak bonyolultabb feladatok).
0. fázis: Először beállítja a serial port alapértelmezett sebességét és engedélyezi a modult.
1. fázis: Ezután megvárja, amíg a modul jelzi, hogy felállt a rendszere.
2. fázis: Kikapcsolja az echo-t
3. fázis: Megvárja, amíg az eszköz kész a parancsfogadásra majd még egyszer elküldi a parancsot, itt már ellenőrzi majd, hogy rendes választ kapott-e vissza (a válaszokat kezelő megszakítás kikapcsolt echo-t feltételez)
4.,6.,8. fázis: Sikeres parancsvégrehajtásra vár
5. fázis: Átállítja az eszközt az általam használni kívánt baudrate-re.
7. fázis: Teszt utasítás kiadása.
9. fázis: Eszköz sikeresen konfigurálva.

  1. uint8_t esp8266_enable(void)
  2. {
  3.         USART_Baudrate_Config_t baudConfig;
  4.        
  5.         switch (_phase)
  6.         {
  7.                 case 0:
  8.                         debug_print_P(PSTR("ESP8266 Configuring default baudrate..."));
  9.                         usart_calculate_config(USART_ASYNCHRONOUS_NORMAL, ESP8266_DEFBAUDRATE, &baudConfig);
  10.                         ESP8266_USART.BAUDCTRLA = baudConfig.BCTRLA;
  11.                         ESP8266_USART.BAUDCTRLB = baudConfig.BCTRLB;
  12.                         ESP8266_USART.CTRLB = USART_RXEN_bm | USART_TXEN_bm;
  13.                         debug_ok();
  14.                         set_ready_off();
  15.                         debug_print_P(PSTR("ESP8266 Enable device..."));
  16.                         #ifdef ESP8266_ENPORT
  17.                                 #ifdef ESP8266_LOW_ENABLE
  18.                                         ESP8266_ENPORT.OUTCLR = ESP8266_ENPIN;
  19.                                 #else
  20.                                         ESP8266_ENPORT.OUTSET = ESP8266_ENPIN;
  21.                                 #endif
  22.                         #endif
  23.                         debug_ok();
  24.                         debug_print_P(PSTR("ESP8266 Waiting for device..."));
  25.                         _timerGeneral = ESP8266_READY_TIMEOUT;
  26.                         _phase++;
  27.                         break;
  28.                 case 1:
  29.                         if (!(_state & ESP8266_STATE_READY) && _timerGeneral) break;
  30.                         if (!(_state & ESP8266_STATE_READY)) {
  31.                                 debug_fail();
  32.                                 return ESP8266_ASYNC_FAULT;
  33.                         }
  34.                         debug_ok();
  35.                         _timerGeneral = 50;
  36.                         _phase++;
  37.                         break;
  38.                 case 2:
  39.                         if (_timerGeneral) break;
  40.                         debug_print_P(PSTR(" Echo off..."));
  41.                         ESP8266_USART.CTRLB = 0; // Flush buffers
  42.                         ESP8266_USART.CTRLB = USART_RXEN_bm | USART_TXEN_bm;
  43.                         ESP8266_USART.CTRLA = USART_RXCINTLVL_MED_gc | USART_TXCINTLVL_LO_gc;
  44.                         esp8266_echo_off();
  45.                         _phase++;
  46.                         break;
  47.                 case 3:
  48.                         if (!esp8266_is_clear_to_send_command()) break;
  49.                         esp8266_echo_off();
  50.                         _phase++;
  51.                         break;
  52.                 case 4:
  53.                 case 6:
  54.                 case 8:
  55.                         if (!esp8266_is_clear_to_send_command()) break;
  56.                         switch (_cmdResult)
  57.                         {
  58.                                 case ESP8266_RESULT_TIMEOUT: debug_print_P(PSTR("timeout..."));
  59.                                 case ESP8266_RESULT_NOTRUNNING:
  60.                                 case ESP8266_RESULT_FAULT: debug_fail(); set_ready_off(); return ESP8266_ASYNC_FAULT;
  61.                         }
  62.                         _phase++;
  63.                         break;
  64.                 case 5:
  65.                         debug_ok();
  66.                         debug_print_P(PSTR(" Changing baudrate..."));
  67.                         esp8266_set_baudrate(ESP8266_BAUDRATE);
  68.                         _phase++;
  69.                         break;
  70.                 case 7:
  71.                         ESP8266_USART.CTRLB = 0;
  72.                         usart_calculate_config(USART_ASYNCHRONOUS_NORMAL, ESP8266_BAUDRATE, &baudConfig);
  73.                         ESP8266_USART.BAUDCTRLA = baudConfig.BCTRLA;
  74.                         ESP8266_USART.BAUDCTRLB = baudConfig.BCTRLB;
  75.                         ESP8266_USART.CTRLB = USART_RXEN_bm | USART_TXEN_bm;
  76.                         debug_ok();
  77.                         debug_print_P(PSTR(" Test..."));
  78.                         esp8266_test();
  79.                         _phase++;
  80.                         break;
  81.                 case 9:
  82.                         debug_ok();
  83.                         _state |= ESP8266_STATE_CONFIGURED;
  84.                         _phase = 0;
  85.                         return ESP8266_ASYNC_OK;
  86.                         break;
  87.                 default:
  88.                          return ESP8266_ASYNC_FAULT; // Programming error
  89.         }
  90.        
  91.         return ESP8266_ASYNC_BUSY;
  92. }
(#) Primary hozzászólása Okt 19, 2015 /
 
Valaki ki tudna segíteni egy Self programming példával? Lehetőleg C-ben.
(#) k3gy3tl3n hozzászólása Okt 19, 2015 /
 
Sziasztok, az mitől lehet, hogy az AVR amit használok nem indul el? Külső tápforrásról egyeltalán nem megy, az AVR égetőről elindul de csak akkor ha nyomok mondjuk egy fuse bit kiolvasást, vagy egy read signature-t, szóval valahogy kommunikálok vele az égetővel. Ha az égetőt kihuzom az USB-ből és vissza akkor ismét nem megy.
(#) Kovidivi válasza k3gy3tl3n hozzászólására (») Okt 19, 2015 /
 
Reset lábat nézd meg.
(#) k3gy3tl3n válasza Kovidivi hozzászólására (») Okt 19, 2015 /
 
kapja az 5 voltot
(#) Kovidivi válasza Primary hozzászólására (») Okt 19, 2015 /
 
Ha bootloaderre gondolsz, akkor nézz meg egy Arduino bootloadert, a teljes program fent van, C-ben is, ASM részekkel.
(#) k3gy3tl3n válasza k3gy3tl3n hozzászólására (») Okt 19, 2015 /
 
Az a leg szebb az egészben hogy rádugom az égetőt, erről kapja az 5V-ot de nem megy. Nyomok egy fuse bit olvasást, vagy egy read signaturet és elindul. Ha lehuzom az égetőtés visszadugom ujranem megy. Elsirom magam.
(#) Kovidivi válasza k3gy3tl3n hozzászólására (») Okt 19, 2015 /
 
A másik lehetőség, hogy a kvarcod nem akar berezegni, vagy rövidzárlatos a paneled, esetleg a programod induláskor azonnal megrántja a tápot, és közbelép a feszültség védelem, amitől resetel, majd ismét megrántja a tápot, ismét reset...
Következő: »»   699 / 840
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