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   602 / 839
(#) knmhb8 hozzászólása Ápr 25, 2014 /
 
Ez a program egy "software debounce button". Összeraktam, működik az alábbiak szerint: a PINB1 levő mikrokapcsoló nyomkodásával egyszer a PINB0-on másszor a PINB2-őn lévő led gyullad fel. Hogyan kell értelmezni ezt a programot? Néhány napja kezdtem csak el programozni AVR-t. Mit jelent a pressed/released confidence level és miért van rá szükség? (maszkolással és késleltetéssel nem lehetne megoldani a pergésmentesítést?/vagy ennél egyszerűbben?/
  1. int main(void)
  2. {
  3. DDRB |= 1 << PINB0; //For Notes on what these actions mean
  4. PORTB ^= 1 << PINB0;
  5. DDRB |= 1 << PINB2;
  6. DDRB &= ~(1 << PINB1);
  7. PORTB |= 1 << PINB1;
  8.  
  9. int Pressed = 0;
  10. int Pressed_Confidence_Level = 0; //Measure button press cofidence
  11. int Released_Confidence_Level = 0; //Measure button release confidence
  12.  
  13. while (1)
  14. {
  15. if (bit_is_clear(PINB, 1))
  16. {
  17. Pressed_Confidence_Level ++; //Increase Pressed Conficence
  18. Released_Confidence_Level = 0; //Reset released button confidence since there is a button press
  19. if (Pressed_Confidence_Level >500) //Indicator of good button press
  20. {
  21. if (Pressed == 0)
  22. {
  23. PORTB ^= 1 << PINB0;
  24. PORTB ^= 1 << PINB2;
  25. Pressed = 1;
  26. }
  27. //Zero it so a new pressed condition can be evaluated
  28. Pressed_Confidence_Level = 0;
  29. }
  30. }
  31. else
  32. {
  33. Released_Confidence_Level ++; //This works just like the pressed
  34. Pressed_Confidence_Level = 0; //Reset pressed button confidence since the button is released
  35. if (Released_Confidence_Level >500
  36. {
  37. Pressed = 0;
  38. Released_Confidence_Level = 0;
  39. }
  40. }
  41. }
  42. }
  43. Find us on Goo
(#) kapu48 válasza knmhb8 hozzászólására (») Ápr 25, 2014 /
 
Ez a késleltetés egy tovább fejlesztet formája.

A bemeneten minden változó állapot észlelésétől elszámol 500-ig, utána cselekszik.
De ha közben történik 1 változás a bemeneten, akkor elölről kezdi a számolást.
(#) fifadani hozzászólása Ápr 25, 2014 /
 
Sziasztok!
Szeretnék tőletek tanácsot kérni. Építgetek egy digitális órát AVR-el.
Közös anódú kijelzőt használok, az anódokra a tápfeszt NPN tranzisztoron keresztül kapcsolom.
A kijelző típusa:
LN5624-11
Az őt meghajtó IC SN74LS47. Ebbe csatlakoznak a katódok, katódonként 10 Ohm-os ellenállással.
Ez a kód üzemel az atmega8-ban (16Mhz, 22pF):
  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3. #include <avr/interrupt.h>
  4. #define F_CPU 16000000UL
  5.  
  6. #define H1_ON()  PORTD |= (1<<PD5)
  7. #define H1_OFF() PORTD &= ~(1<<PD5)
  8. #define H2_ON()  PORTD |= (1<<PD6)
  9. #define H2_OFF() PORTD &= ~(1<<PD6)
  10. #define M1_ON()  PORTD |= (1<<PD7)
  11. #define M1_OFF() PORTD &= ~(1<<PD7)
  12. #define M2_ON()  PORTB |= (1<<PB0)
  13. #define M2_OFF() PORTB &= ~(1<<PB0)
  14.  
  15. void m_delay_10ms(unsigned int val)
  16.         {
  17.                 unsigned int i;
  18.  
  19.                         for(i=0;i<val;i++)
  20.                         {
  21.                         _delay_ms(10);
  22.                         }
  23. //hozzá tartozó m_delay_10ms(10) //10*10ms
  24. //Késleltetés bővítés
  25. //a _delay_ms max 65.535 ms-et képes sleepelni,
  26. // tehát nagyobb idozítést többol lehet "összerakni"  
  27.     }
  28.  
  29. volatile unsigned char sec,min,hour,min1,min2,hour1,hour2; //globális változók
  30.  
  31. void inits(void) //alapvető beállítások
  32. {
  33.    DDRB  = (1<<PB0); //PB0 kimenet
  34.    DDRD  = 0b11100000; // PD7,PD6,PD5 kimenet. Többi bemenet.
  35.    DDRC  = (1<<PC2) | (1<<PC3) | (1<<PC4) | (1<<PC5);
  36.    PORTD = 0b00000111; //PD0,PD1 felhúzó R be
  37.  
  38.    OCR1A   = 15624;  //  F_CPU/előosztó/1sec - 1;  16000000/1024/1 - 1
  39.    TCNT1   = 0;
  40.    TCCR1B |= (1 << WGM12);              // Mód 4, CTC -> OCR1A
  41.    TIMSK  |= (1 << OCIE1A);             // Interrupt ha komparátor 1
  42.    TCCR1B |= (1 << CS12) | (1 << CS10); // Előosztó 1024 , timer indítás
  43.    sei();
  44.    hour = 0;
  45.    min  = 0;
  46.    H1_OFF();
  47.    H2_OFF();
  48.    M1_OFF();
  49.    M2_OFF();
  50. }
  51.  
  52. ISR (TIMER1_COMPA_vect) //megszakítás rutin, timer1
  53. {
  54.         sec++;
  55.         if(sec >= 60)
  56.         {
  57.                 sec = 0;
  58.                 min++;
  59.         }
  60.         if(min >= 60)
  61.         {
  62.                 min = 0;
  63.                 hour++;
  64.         }
  65.         if(hour >= 24)
  66.         {
  67.                 hour = 0;
  68.         }
  69. }
  70.  
  71. int main ()
  72. {
  73.  
  74.   inits();
  75.        
  76.   while(1)
  77.    {
  78.        
  79.         M2_OFF();
  80.         PORTC = ((hour/10)<<PC2);
  81.         H1_ON();
  82.         _delay_ms(1);
  83.         H1_OFF();
  84.         PORTC = ((hour%10)<<PC2);
  85.         H2_ON();
  86.         _delay_ms(1);
  87.         H2_OFF();
  88.         PORTC = ((min/10)<<PC2);
  89.         M1_ON();
  90.         _delay_ms(1);
  91.         M1_OFF();
  92.         PORTC = ((min%10)<<PC2);
  93.         M2_ON();
  94.         _delay_ms(1);
  95.  
  96.    }
  97. return 0;
  98. }


Az a baj, hogy még így is gyenge a fényerő. Nappal alig látni a számokat. Ha lejjebb veszem a frekvenciát, azaz a delay-t a digitek között akkor valamivel erősebb ugyan, viszont így előjön a vibrálás.
Kijelzőt kellene cserélni? Vagy van valami szoftveres trükk erre?
(Továbbá, azért csak 10 Ohm, mert nagyobb ellenállással megint azt értem el, hogy a fényerő lecsökken... )

Köszi szépen
A hozzászólás módosítva: Ápr 25, 2014
(#) Istvanpisti válasza fifadani hozzászólására (») Ápr 25, 2014 /
 
PNP-re nem gondoltál?
(#) pont válasza fifadani hozzászólására (») Ápr 25, 2014 /
 
Az Ls változat kb. fele ampert tud. De hogy működik egy közös anódos kijelző egy közös katódra tervezett ic-vel, az avr megfordítja?
(#) fifadani hozzászólása Ápr 25, 2014 /
 
The '46A, '47A, and 'LS47 feature active-low outputs designed for driving, common-anode LEDs or incandescent indicators directly.

P-s tranyóval nem próbáltam még.
(#) killbill válasza fifadani hozzászólására (») Ápr 26, 2014 / 1
 
Az adatlapja szerint ez nem egy tul fenyes kijelzo..
Ettol fuggetlenul, normalisan 20mA kellene egy-egy szegmensnek. Ha 4-es multiplexelest hasznlasz, akkor ennek a negyszerese kell, hogy ugyanazt a fenyerot kapd. Tehat 80mA-es szegmensmeghajto kellene. A 74LS47 maximalis terhelhetosege 24mA. Szoval ez igy nem lesz jo. A sima 7447 is csak 40mA. Tobb megoldas is van a dologra.

1. hagyod benne a 74LS47-et, de minden kimenete utan teszel egy PNP tranzisztort (BC212) emitterkoveto kapcsolasban. (kollektrol foldon, bazis a 7447 kimeneten, emitter a kijelzo fele)

2. a 74LS74 helyett beteszel egy TPIC6C595 tipusu IC-t, ami egy 8 bites shift regiszter, aminek a kimenetei 100mA-ig terhelhetoek. Ezzel a megoldassal persze a programot modositani kell jelentosen. Viszont ugy lehetoseged van barmilyen karakter kiirasara is, pl. kotojel, vagy alahuzas, nehany betu.

Mindket esetben ki kell pontosan szamolni a LED-ek elotet ellenallasat, ami fugg a + tap oldali megoldastol es a valasztott meghajtastol is. Ha folul NPN tranzisztor van, akkor a 22 Ohm nagyjabol 80mA-t fog kiadni.

Viszont valamit tudnod kell. Nem minden LED-nek lesz a fenyereje negyszeres ha negyszeres aramot folyatsz at rajta. Vagy 20 eve talalkoztam egy olyannal, hogy egy piros Kingbright kijelzo ilyen multiplexelt meghajtasnal piros helyett halvany narancssarga volt. Ugyanabbol a kijelzobol a zold szinu tokeletesen mukodott a kapcsolasban. Mivel a te kijelzod adatlapja nem adja meg, hogy impulzus uzemben mennyi a maximalis aram, igy csak proba szerencse alapon tudhatod meg.
(#) Seton válasza killbill hozzászólására (») Ápr 26, 2014 /
 
Idézet:
„Nem veletlenul szoktam en uzem kozben nezni, hogy egy programban a processzek mennyi stack-et hasznalnak.”


Ezt hol/hogyan lehet nézegetni? Szimuláció, debugger?
Sőt, mondhatni féltékenyen tekintek az ilyen témákra, mert egy klasszikus hobbista AVR Studio 4 + WinAVR kombó esetét véve elvileg a stack fogalom ismeretének hiányában is tökéletesen boldogulnék. Ha nem mániánk a végtelen rekurzió és nem atomerőmű kontrollert építünk...
(#) kapu48 válasza Seton hozzászólására (») Ápr 27, 2014 /
 
Most vegyük azt a mindennapi esetet, hogy el akarod adni a Projected.
És számit a bekerülési költség is!

Akkor a legkisebb olcsóbb Megát kel választanod, amibe még bele tudod gyömöszölni a programod.

Nincsenek 1000 BYTEk a heap és a stack közt.

Van Pár tucat adatod + pár tucat függvényhívásod, pár megszakításod.
És nem figyelsz oda a változók helyfoglalására + a verem használatra?

E miatt bent marad, valami rejtet búg, ami a használattól függően majd 1 hét múlva esik ki a szekrényből.

Majd visszadobják az egészet, mert nem biztonságos! + különben is a Kínai olcsóbban adja!

Késsz csőd lesz az egész munkád!
(#) killbill válasza Seton hozzászólására (») Ápr 27, 2014 / 1
 
A hobbista winavr-hez nem tudok hozzaszolni, en Linux-on fejlesztek, gcc-t hasznalok, es semmifele integralt fejlesztorendszert nem hasznalok. Csak egy editort (jEdit) es unix tool-okat mint a make, awk, sed, grep, meld es tarsai. Meg persze a gcc toolchain-t. A C libek es a multitask kernel sem gyariak, a batyam eloszeretettel ir ilyeneket minden processzorra, igy AVR-re is es ARM-re is azokat hasznalom. Ezek persze open source, free dolgok. A startup kodot es a linker script-eket is mindig magam irom, ugyhogy egyetlen byte gyari kod nem fut a munkaimban. Nalam a debug-olas altalaban ugy megy, hogy minden mikrokontrolleren van egy sorosvonal, amin keresztul a program tud kommunikalni, azon keresztul kuldok ki debug infokat, ha kell. Mondjuk egy 100 soros ATmega8 kodot nem nagyon szoktam debug-olni...

Szerintem a stack fogalmanak ismerete nelkul el sem lehetne kezdeni programozni. Fokepp nem mikrokontrollert. Persze boldogulni lehet, foleg hobbi szinten, de azert illik ismerni.

A kerdeserde valaszolva en ezt ugy szoktam csinalni, hogy a processznek szant stack teruletet meg a processz inditasa elott feltoltom valami ismert mintazattal (pl. 0xe521), es az elobb emlitett debug sorosvonalon keresztul meg lehet neznni, hogy mennyit irt felul a stack hasznalat soran a kod. Mivel sokszor multitaskos rendszert hasznalok, igy tobb stack is van, mert minden processznek sajatja van, es altalaban van egy minitor vagy hivjuk debugger processznek, ami pont arra jo, hogy a sorosvonalon keresztul bekuldott parancsokat ertelmezi es valaszol ra. Na, ezek a parancsok kozott van olyan, ami a stack-et a 'másik' vegetol kezdve vegignezni, es megszamolja, hogy hany darab 0xe521 van benne, es ennek alapjan kiirja, hogy mennyi a hasznalt terulet.
A hozzászólás módosítva: Ápr 27, 2014
(#) Droot hozzászólása Ápr 27, 2014 /
 
Sziasztok!

Adott egy volatile char buf[50]=""; változó, amit ISR-ben használok a main-ben és: ezt kellene egy külön xy.c fájlban egy függvény visszatérési értékének visszaadni. Hogyan kell megoldani? Azt hiszem a függvényen belülre be lehet "hívni" lokális változónak. De csak így rémlik. Mi az utasítása?
(#) Seton válasza killbill hozzászólására (») Ápr 27, 2014 /
 
Nem véletlenül kérdeztem hát, ez a színvonal otthoni barkácsolásra talán indokolatlanul profi, de iránymutatásnak tökéletes. Köszönöm!
(#) proba válasza knmhb8 hozzászólására (») Ápr 29, 2014 /
 
Egyszerű szerintem, a portot bemenetnek programozod, a led a felhúzó ellenállás (esetleg rá is segíthetsz) ez után a gomb a test és a port közé kerül. Megnyomod a gombot, led kigyullad, processzor észreveszi a bemenet változást, kimenetét beállítja alacsonyra. a led úgy marad, míg szoftveresen ki nem kapcsolod.Még prell mentesíteni sem kell a gombot.
A hozzászólás módosítva: Ápr 29, 2014
(#) tib12 hozzászólása Ápr 29, 2014 /
 
Üdv, egy kis segítségre lenne szükségem. Adott egy Atmega8 a 24 lábával. 50db ledet kellene vezérelnem vele de ehhez kevés a láb. Gondoltam multiplexre de ahogy még meg tudnám oldani szoftveresen úgy is 15 lábat igényelnek a ledek. Sajnos nekem több lábra lenne még szükségem. Másik lehetőség amit meg tudnék oldani szoftveresen ahhoz hardveresen nem ismerek megoldást. 6 lábon azaz 6 biten lehetne 2es számrendszert használni így 63 kapcsolható kimenetet létre lehetne hozni. Remélem érthető amit akarok. Ehhez keresek egy IC-t vagy megoldást. Programozás téren kezdő vagyok de van segítségem. Válaszokat előre is köszönöm.
(#) pont válasza tib12 hozzászólására (») Ápr 29, 2014 /
 
Ezt ismered?Bővebben: Link
(#) tib12 válasza pont hozzászólására (») Ápr 29, 2014 /
 
Ez jónak tűnik, és mivel smd nem is foglal sok helyet, de még mindig minimum 6 db kell belőle. Ilyen sorbafűzhető 8nál több bites kellene. Találtam a CD4067-et de az a probléma hogy nincs smd-be és még csak nem is lehet sorbakötni tudtommal. Ha nem marad más akkor az általad javasoltat fogom használni.
(#) pont válasza tib12 hozzászólására (») Ápr 29, 2014 /
 
A 74hc154-es kapható SMD-be is, sorba is fűzhető csak a demultiplexerek egyszerre egy kimenetet kapcsolnak kellene még utánuk rs tároló szóval megint csak jobb a shift regiszter végül is a lábak száma számít mindegy hány tokban van. A 74 HC 595 SMD 49ft áfával.
A hozzászólás módosítva: Ápr 29, 2014
(#) pont válasza tib12 hozzászólására (») Ápr 29, 2014 /
 
A 74 HC 595-ből multiplex üzemben 2db kell a 64 Ledhez és 4 portot használ.
(#) Koncsar hozzászólása Ápr 29, 2014 /
 
Sziasztok! Terveztem egy NYÁkot amin egy Attiny85 látna el egy apró feladatot. Az IC 2,3 as lábára potencióméter kerülne. Az egyik poti impulzus hosszát állítaná 5-30ms ig, a hármas lábon meg az impulzusok közötti szünet idejét lehetne 0.5 és 3mp között állítani. Az IC 6. lábán pedig az optó felé a kimenet. Megszeretnék kérni Valakit akinek van kedve és ideje, írja meg nekem a progit. Arduinós környezet is jó lenne. Mert ha bele kell módosítani akkor azt meg tudjam tenni. Előre is köszönöm.
Üdv: K.Gy
A hozzászólás módosítva: Ápr 30, 2014
(#) TavIR-AVR válasza tib12 hozzászólására (») Ápr 30, 2014 /
 
Buszra portbővítőt? A multiplex nem annyira jó...
mcp23014 - i2c/16láb, 8 db fűzhető 1 buszra.
ds2408 - 1wire - 7x db fűzhető
mcp23S17, mcp23008, mcp23s08, pcf8574, 74hc595....
(#) Droot válasza Droot hozzászólására (») Máj 1, 2014 /
 
valaki?
(#) kapu48 válasza Droot hozzászólására (») Máj 1, 2014 /
 
Bocsi!
De esetleg próbáld meg keresni magad!

Itt a segédlet:
A C programozási nyelv
(#) zoly15 hozzászólása Máj 2, 2014 /
 
Sziasztok!
Vásároltam egy USB ASP V2-es programozót, de nem tudom a számítógéppel összehozni.
Windows 7 op. rendszerem van, de nem ismeri fel (eszközkezelőben vagy meg sem jelenik, vagy "ismeretlen eszköz" jelenik meg). A drivert nem engedi feltenni, hogyan tudnám megoldani ezt a dolgot? Valakinek van/ volt hasonló ügye? Előre is köszönöm a választ!
(#) ThompsoN hozzászólása Máj 2, 2014 /
 
Sziasztok.

Össze szeretnék kötni egy AVR-t a gépemmel. A V-USB működik Windows 8.1 64 bites változatával? Vagy inkább más megoldást javasoltok? (Lehetőleg USB-t szeretnék, de ha Ethernet, az még emészthető. Csak kis mennyiségű adatot küldenék a PC felé, nem szükséges kétirányú kommunikáció.)
(#) TavIR-AVR válasza zoly15 hozzászólására (») Máj 2, 2014 /
 
Igen. Dobd ki a * a programozót:
- emulált USB,
- nincs hozzá normális, aláír driver,
- egyedi programozási nyelv, nem kompatibilis valóságban semmivel, csak önmagával.

Ezzel szemben olcsó.
Röviden: Olcsó, de *.

Egy valódi USB-illesztős programozóval sokkal kevesebb szívással van eredményed. Pl. MKII, STK500 (USB illesztővel).

Feltenni:
- LibUSB létrehoz hozzá,
- Win7 driverellenőrzés kikapcsol,
- fekete kakas éjfélkor feláldoz teleholdnál,
- a készítőtől kérdezz rá, melyik szoftverrel működik együtt Win7 alatt.
A hozzászólás módosítva: Máj 2, 2014
(#) TavIR-AVR válasza ThompsoN hozzászólására (») Máj 2, 2014 /
 
USB-re:
- Arduino leonardo (valódi USB-s eszköz),
- Emulált USB-s csak kis sebesességű átvitelre és sok szabadidővel és ősz hajszálhiányban szenvedőknek javasolt.

Ethernet:
- Arduino + EthWiz (W5100 illesztővel)
(#) ThompsoN válasza TavIR-AVR hozzászólására (») Máj 2, 2014 /
 
Sosem foglalkoztam még Arduinoval. A programozásuk hogyan működik? Úgy értem, hogy az elkészült programot hogyan töltöm a mikrokontrollerbe? Illetve működik rendesen 64 bites Windowszal? (A driver aláírásos marhaság az őrületbe kerget, mert a 8.1 újítása többek között az volt, hogy minden alkalommal, amikor használni akarom, akkor ki kell lőni a driver ellenőrzést...)
A hozzászólás módosítva: Máj 2, 2014
(#) TavIR-AVR válasza ThompsoN hozzászólására (») Máj 2, 2014 /
 
Igen, aláírt driver van hozzá. Arduinoban bootloader van, azon keresztül PC-ről van feltöltés.
(#) ThompsoN válasza TavIR-AVR hozzászólására (») Máj 2, 2014 /
 
Értem, köszönöm a segítséget.
(#) ThompsoN válasza TavIR-AVR hozzászólására (») Máj 2, 2014 /
 
Már nem engedte szerkeszteni.

Az nem lesz gond, hogy az Arduino külön tápegységről fog menni, és így dugom az USB-re?
Következő: »»   602 / 839
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