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   798 / 837
(#) rascal válasza TavIR-AVR hozzászólására (») Szept 16, 2018 /
 
Sziasztok! A szétfeszítő ellenállás mi fán terem? Most hallottam ezt a kifejezést először.
(#) Sick-Bastard válasza rascal hozzászólására (») Szept 17, 2018 /
 
Szerintem az ebben a kapcsolásban található 620 Ohm-os R3-R5 fel-/lehúzó ellenállások (talán R4 is) együtt képezik a szétfeszítő ellenállást.
(#) killbill válasza Sick-Bastard hozzászólására (») Szept 17, 2018 /
 
Igen, de ezt széthúzónak szokás nevezni, nem szétfeszítőnek.
(#) rascal válasza killbill hozzászólására (») Szept 17, 2018 /
 
Köszi a válaszokat! Valójában egyik változatot sem hallottam még, felhúzó és lehúzó ellenállásokkal volt eddig csak dolgom, így együtt nem tudtam, hogy külön nevük van. Visszanézve már látom, hogy TavIR-AVR már megírta, hogy mire is valók, csak elsiklottam felette.
(#) fifadani hozzászólása Szept 20, 2018 /
 
Sziasztok!
A problémát még nem sikerült detektálnom. A max-os modulokat lecseréltem, sn75176-ra. 120ohm lezárás, 720 ohm fel és lehúzó, 3 eszköz a buszon.
Megpróbálom a szoftveres részét kizárni.
Viszont egy kérdés.
Watchdog és/vagy BODEN segíthet?

Köszi,
Dani.
(#) Rolie11 hozzászólása Szept 22, 2018 /
 
Üdvözlet!

Keresek AVR program megírására gyors, megbízható embert! Nem ingyen meló!

Köszönet!
(#) dc001 hozzászólása Okt 3, 2018 /
 
Valaki találkozott olyan esettel, amikor a i2c slave üzemmódban "eltünt" a TW_ST_SLA_ACK, rögtön TW_ST_DATA_ACK-val indul a kommnikáció?

Illetve mi lehet a 0xe0 státusz jelentése?
(#) Szasza9668 hozzászólása Okt 17, 2018 /
 
Sziasztok!

4mhz járatott avr-nek mennyi ideig tart végig menni egy if then cikluson ami kb 60 számot tartalmaz? Hogyan tudok ennek utána járni, estleg kiszámolni?

Üdv!
(#) Kovidivi válasza Szasza9668 hozzászólására (») Okt 17, 2018 /
 
Egy körülbelüli számolás, ha egy if, egy órajelig tart (ami valószínű, ahogy utána olvastam), plusz utána is van egy utasítás, ami csinál valamit, ezt is 1-nek veszem:
1 órajel tart: 1/4 000 000sec=0.25us, 60 db if, plusz az utána levő utasítás 120 órajelet igényel, vagyis 120x0.25us=30us. Javítsatok ki, ha valami hibás. De tudsz szimulátorban debuggolni, és ott pontosan látszani fog, hány órajelet igényel a programod.
(#) Szasza9668 válasza Kovidivi hozzászólására (») Okt 18, 2018 /
 
Köszi!
(#) kapu48 válasza Kovidivi hozzászólására (») Okt 18, 2018 /
 
Szerintem nagyon le egyszerűsítetted az if-then műveletet.

Vegyük példának:
if(A==B){nem tudtuk meg, hogy itt mi van!}
1. betöltjük ’A’-t valamelyik regiszterbe
2. betöltjük ’B’-t …
3. összehasonlítjuk A==B? {}
4. És a 60 számot szintén be kel tölteni a memóriából regiszterbe, hogy tudjunk velük valamilyen műveleteket végezni …
Az sem megy 1 órajel alatt, főleg ha a számunk pl, int? Az már 2 Byte.
A hozzászólás módosítva: Okt 18, 2018
(#) Kovidivi válasza kapu48 hozzászólására (») Okt 18, 2018 /
 
Egy nagyon egyszerű esetet számoltam. A szimulátor fogja pontosan megadni, hány órajelig tart ez a programrész.
Tanultunk pipeline-ról, egyszerre megy a memória olvasás és a feldolgozál, de nem vagyok ebben a témakörben szakértő.
"Since AVR is a RISC architecture, most instructions only take a single cycle to execute. "
A hozzászólás módosítva: Okt 18, 2018
(#) Sick-Bastard hozzászólása Okt 18, 2018 /
 
Bocsi hogy mellékletként rakom fel a kérdésem, de valamiért nem jelenik meg....

kérdés.txt
    
(#) kapu48 válasza Kovidivi hozzászólására (») Okt 18, 2018 /
 
Nem tudom, mire gondolsz?

Ha rámutatnál melyik asm feltételes ugrás utasítás vizsgál meg 2 ram címen levő változó egyezőségét?
Bővebben: Link
(#) Kovidivi válasza kapu48 hozzászólására (») Okt 18, 2018 /
 
Írtam, hogy nem vagyok profi a témában, assemblyben nem tudok programozni. Ha érdekel a téma olvass utána, tőlem ennyit tudtál tanulni csak, az irányt ismerem, ha nekem kelleni fog további infó, el tudok indulni.
Vagy ha tudod a megoldást, írd meg a kérdezőnek.
Gondolkodok, de nem tudok többet hozzárakni.
A hozzászólás módosítva: Okt 18, 2018
(#) kapu48 válasza Sick-Bastard hozzászólására (») Okt 18, 2018 /
 
Nem tudom, hogy ez a szövegszerkesztő tréfája e?
  1. De Xor ’^’ operátor nem lehet a nevekben!
(#) Sick-Bastard válasza kapu48 hozzászólására (») Okt 18, 2018 /
 
Elnézést, próbáltam egyszerűsíteni a kódot, de ezek szerint félreérthető voltam.

A tömb^0 csak példa, úgy értettem, hogy tömb0, tömb1, ... stb.
tömb2 = text, ami a probléma részét képzi.
(#) kapu48 válasza Sick-Bastard hozzászólására (») Okt 18, 2018 /
 
A pointerek kezelésében én is mindig bizonytalan vagyok.
De talán ez a könyv segít neked is: Bővebben: Link
5.3. Mutatók és tömbök
(#) Szasza9668 válasza kapu48 hozzászólására (») Okt 18, 2018 /
 
Van egy változóm 0 és 59 közötti értékkel. Ez random változik de mindig pozitív egész szám. Nekem attól függően mennyi ez az érték kell fel le mozgatnom 5 lábat az avren. Az érték elég gyorsan változik 300msec( most pontosabbat nem tudok mondani).

Select case gyorsabb lenne?
(#) rascal válasza Szasza9668 hozzászólására (») Okt 18, 2018 / 1
 
Én valamilyen tömbös megoldást javasolok, ahol a 0-59 érték a mutató és a tömbből kivett érték kerül a portokra. Ennek az az előnye, hogy bármelyik érték esetén ugyan akkora lesz a választás futásideje és gyorsabb is lesz mint az if, vagy a case. Ha összetettebb dolgot kell csinálni, akkor mutatókat rakhatsz a tömbbe, amikkel ha kell mind a 60 esetre egyedileg megírt programrészletre ugorhatsz.
(#) Kovidivi válasza Szasza9668 hozzászólására (») Okt 19, 2018 /
 
300ms nem tragikus. Amit számoltam, ott ns-ot írtam, 1ms ezredrésze. Nem elég ekkora sebesség? A pointeres tippek nagyon jó ötletek! Viszont komolyabb programozói tudást igényel.
(#) killbill válasza Kovidivi hozzászólására (») Okt 19, 2018 / 2
 
A ns a ms milliomod része.
(#) Szasza9668 válasza rascal hozzászólására (») Okt 19, 2018 /
 
Ezen elmélkednem kell.
Jónak tűnik.
Kérdéses azonban az agyi kapacitásom, mármint ami a programozói tudást jelenti.
De tetszik, nem mellesleg biztosan tanulnék belőle ezt azt!

Üdv!
(#) rascal válasza Szasza9668 hozzászólására (») Okt 19, 2018 /
 
Egy kis segítség az elmélkedéshez: Kimazsoláztam egy régebben írt programomból, hogy én hogyan csináltam hasonló dolgot. (Az egészet nem adhatom közre.) Kicsit kommenteltem is. Nem teljes, nem is AVR-hez készült, ezért a típus és változó deklarációk nem vehetők át egy az egyben. Több mint egy éve nem programoztam és a C egyébként sem a szívem csücske, ezért sokkal többet nem nagyon tudok hozzátenni.

  1. // Ez van a .h-ban
  2.  
  3. // Megvallom rég volt... Talán ez mondja meg, milyen felépítésű függvényeket akarunk hívni, és milyen tipusú a pointer. Ez ARM-en Atollic studioban működött. AVR-en lehet, hogy más a jó.
  4.  
  5. typedef uint32_t (*lista_fn_def)(void);
  6.  
  7.  
  8. // Nekem a hívandó fv-k címe mellett más paraméterek is kellettek. Ha neked nem kell egy dimenziós tömböt is használhatsz.
  9.  
  10. typedef struct
  11. {
  12.         lista_fn_def fnpnt;     // menüpontot végrehajtó függvény pointere.
  13.         uint8_t mode;   // menü üzemmódok - ebben a kivonatos kódban nem használjuk semmire.
  14. }lista_element_tdef; // menu leíró tömbhöz struktúra.
  15.  
  16. // ez van a .c-ben
  17.  
  18. #define LEN_LISTA (sizeof lista_elements/ sizeof (lista_element_tdef)) // a lista hossza elem számban - itt nem használjuk
  19.  
  20. uint32_t fuggveny_00(void); // felsorolom a függvényeket, amiket majd a kapott paraméter alapján hivogatni akarok
  21. uint32_t fuggveny_01(void);
  22.  
  23. // bepakolom a címeiket egy tömbbe
  24. lista_element_tdef lista_elements[]={
  25.                 {.fnpnt=&fuggveny_00,.mode=1},
  26.                 {.fnpnt=&fuggveny_01,.mode=0}
  27. };
  28.  
  29. // megvalósítom a függvényeket. Nekem kellett visszatérési érték, de neked nem biztos, hogy kelleni fog.
  30. uint32_t fuggveny_00(void)
  31. {
  32.         // csinálunk valamit
  33.         return 0;
  34. }
  35.  
  36.  
  37. uint32_t fuggveny_01(void)
  38. {
  39.         // csinálunk valamit
  40.         return 0;
  41. }
  42.  
  43.  
  44. // a végrehajtást felügyelő függvény
  45. void lista(lista_element_tdef *aActiveLista)
  46. {
  47.         int32_t nListaPos;      // Ez az a paraméter, ami nálad 0-59 közötti érték lesz
  48.         uint32_t nStatus;       // meghívott függvény visszatérési értéke
  49.         nStatus=(*aActiveLista[nListaPos].fnpnt)(); // itt hívódik meg az éppen szükséges függvény.
  50. }
  51.  
  52.  
  53. // valahol a programban: nekem több listám volt, ezért a listát paraméterként adtam át a végrehajtást felügyelő függvénynek.
  54. lista(lista_elements);
(#) Szasza9668 válasza rascal hozzászólására (») Okt 19, 2018 /
 
Köszi!

A c nekem teljesen kínai. Bascom-ot használok. Nekem ez csak hobby.

neten utána olvasok majd.
(#) wbt válasza Szasza9668 hozzászólására (») Okt 20, 2018 /
 
Lookup tábla megoldja neked a dolgot, egy olvasás, egy írás a portra.
(#) Sick-Bastard válasza kapu48 hozzászólására (») Okt 21, 2018 /
 
Köszönöm a linket. Ám esetemben a "#define" használatában lesz a probléma, tippem szerint.

Mivel a globális változóimat egy mátrix tömbbe rendeztem, ezért a változóim neve meglehetősen hosszú lett. Ezt azzal orvosoltam, hogy #define-al rövidítettem azokat:

  1. #define year            global_register_2d_array.global_register_array.rtc.datetime.date.year


Ami hibát még elkövethettem, az az volt, hogy funkciókba argumentumként is ilyen nevet adtam meg:

  1. u8b is_leap_year(u16b year)
  2. {
  3.         if (year % 4)
  4.         {return (0);}
  5.         else
  6.         {
  7.                 if (!(year % 100))
  8.                 {
  9.                         if (!(year % 400))
  10.                         {return (1);}
  11.                         return (0);
  12.                 }
  13.                 return (1);
  14.         }
  15. }


Miért is úgy fogalmaztam, hogy "elkövethettem"? Mivel eddig ez nem okozott gondot! A fordítót nem zavarta, a megírt program azt tette (teszi otthon most is), amit akartam. Mi változott? Ez egy új dolog az avr-gcc 8.2-ben?

Közben valahogy sikerült a WinAVR-t is összekuszálnom...
(#) jdani hozzászólása Okt 29, 2018 /
 
Üdv. Van egy beforrasztott ATMEGA162 SMD ICm, és egy minipro programozóm. Ebbe lehet választani ATMEGA162 IC-t viszont csak DIP kivitelben. Na most én az SMD megtelelő lábait beleszurkáltam a programozó csatlakozójába, az viszont mégse olvassa le. MIért lehet?
(#) Kovidivi válasza jdani hozzászólására (») Okt 29, 2018 /
 
Valószínűleg más a két tokozás azonosítója. Atmega328 és Atmega328p-nek is más. DIP vs. SMD.
(#) david10 válasza jdani hozzászólására (») Okt 29, 2018 /
 
Szia,
Az ID gombra mit olvas be IDnek?
Sokszor a nyákra ráforrasztva szoktam írni vele az IC-ket, most jelenleg egy PIC18F4250-el játszom ezt. Régen ugyanezt csináltam Atmega328-al, csak arra könnyü volt soros-port bootloader-t tenni, ezért nem volt szükség a MiniPro-ra többet egy ideig.
Következő: »»   798 / 837
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.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