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   477 / 840
(#) blackdog válasza compaqamplifier hozzászólására (») Szept 7, 2012 /
 

A google-t ismered? http://www.google.hu/search?client=opera&rls=hu&q=fpga&sourceid=ope...uggest
Egyébként amiket felsoroltál fényévekre vannak egymástól. De ez itt már OFF.
(#) kurosaki hozzászólása Szept 8, 2012 /
 
Sziasztok.
Elakadtam, hogyan lehet egyik AVR böl értéket átadni egy másiknak? mármint pl: Első AVR elindul elszámol 5-ig majd kiküldi a jelet a második AVR nek,hogy kapcsolja be a ledet.

Neten nem találtam semmit és épp a Multiplex-ess megoldást keresgélem a neten mert sikerült beszereznem egy 2 x 7 Szegmenses kijelzőt amin 12 láb van de nem tudom hogy kéne megírni a kódot hogy 9 utána 10 jelenitse meg mert 9 ig eltudom számoltatni.
(#) Fizikus válasza kurosaki hozzászólására (») Szept 8, 2012 /
 
Ehhez SPI-t vagy I2C-t, vagy UART-ot kell hasznalnod.
SPI: http://www.ermicro.com/blog/?p=1050
I2C: http://www.ermicro.com/blog/?p=1239
Az egyik AVR lesz a Master, a masik a Slave.
(#) kurosaki válasza Fizikus hozzászólására (») Szept 8, 2012 /
 
Akkor ezek szerint a MOSI-MISO kel használnom? (bár az USBASP én MOSO van nem tudom miért lehet elírták.) úgynézki az SPI lesz amit alkalmazni fogok. Igazából nekem csak az kéne, hogy PLB1 et megnyitom egy pillanyatni jelet adok neki amit a Slave érzékel és elindít egy számlálót. PB1 -> PB4 es a Slave ben megadnam hogy a PB4 en kap jelet akkor induljon el. Ekkor is kell a MOSI-MISO? (mert SI es SO Slave In es Slave Out nincs külön)
(#) zombee válasza kurosaki hozzászólására (») Szept 8, 2012 /
 
Ezekkel most ne bajlódj, örülj ha EGYETLEN AVR-t szóra tudsz bírni - de látom ez sem megy igazán.
De most tényleg. Egyetlen IC-vel is meg lehet oldani, miért akarod tovább bonyolítani?
Sokkal egyszerűbb ha mindent az ATTiny2313 csinál! Ha kettővel viaskodsz, nemhogy előre
nem jutsz vele, félő, hogy beleunsz az egészbe és más hobbi után nézel...

I2C, SPI, UART:
Ezekkel sem jó úgy kezdeni hogy két AVR között próbálod ki: ha hiba van bármelyik AVR programjában,
semmi sem fog működni és elég lehangoló tud lenni ha az ember még azt se tudja hogy melyik a hibás.

Ha ezeket meg akarod tanulni(de inkább vársz vele fél évet), cél IC-t kell venni, az biztos működik:
I2C: PCF8574
SPI: 74HC595
UART: MAX232 és egy PC
A hozzászólás módosítva: Szept 8, 2012
(#) kurosaki válasza zombee hozzászólására (») Szept 8, 2012 /
 
Ez ilyen formában nem igaz. Attiny45 és a Attiny2313 is működő képes. És ellátja a funkcióját de lehet igazadvan, hogy az Attiny2313 eltudja látni mert van annyi lába. De érdekel a közti kommunikáció is de akkor ezt most elhalasztom. UI:perpil 1 IC vel nem tudom megoldani mivel a Multiplexet nem nagyon értem.Ha meg 2 db 7 Szegmentest kötök rá akkor már nincs helyem a 2312 on vagy ha mégis akkor szűkösen.
(#) TavIR-AVR válasza sikolymester hozzászólására (») Szept 8, 2012 /
 
vagy itt:
- 60 nap alatt Arduino
http://avr.tavir.hu
(#) compaqamplifier válasza blackdog hozzászólására (») Szept 8, 2012 /
 
Egyébként nem én találtam ki, ezek közül lehet választani de mindegy.
(#) Reggie válasza kurosaki hozzászólására (») Szept 8, 2012 /
 
Nem kell erteni, masok mar leprogramoztak helyetted. Viszont zombeenak igaza van, eloszor egy menjen.
(#) kurosaki válasza Reggie hozzászólására (») Szept 8, 2012 /
 
De hiába programozták le ha nem értem a felé pitését.Meg elég kezdő vagyok a C nyelvben.
  1. /* WinAVR Code to display 0-9 or 0-F to 7-segment display.
  2. Change Variable dec_hex in Main function to swap between
  3. hex and decimal. Warning: clock speed is defined as 1MHz (F_CPU) because new
  4. AVR devices have default 1MHz Internal RC. Change F_CPU to match your clock speed.
  5.  
  6. There are 7-segments + decimal point (DP) and they are active low, that is 0 = segment on.
  7. DP is always off (1).
  8. PIN wiring is
  9.  
  10. Pin Segment
  11. 7    g
  12. 6    b
  13. 5    d
  14. 4    f
  15. 3    DP
  16. 2    e
  17. 1    a
  18. 0    c  */
  19.  
  20. // clock speed for delay
  21. //#define F_CPU 1000000UL  // New AVR devices are at 1MHz Internal clock
  22. // STK200 board has 8MHz cystal
  23. #include <avr/io.h>
  24. #include <util/delay.h>
  25.  
  26. //Configurations
  27.  
  28. //**************
  29. // Change constant here to change port used by 7-segment
  30.  
  31. #define PORT_7_SEGMENT PORTB
  32. #define DDR_7_SEGMENT DDRB
  33.  
  34.  #define C4_ON()    PORTD |=  (1<<PIND0)
  35.  #define C4_OFF()    PORTD &= ~(1<<PIND0)
  36.  
  37.  //-------------------------------------
  38.  void m_delay_10ms(unsigned long val) {
  39.          //-------------------------------------
  40.          while(val--) _delay_ms(10);
  41.  }
  42.  
  43.  //-------------------------------------
  44.  void do_delay(uint16_t ms_delay, uint16_t num_ms, uint16_t us_delay, uint16_t num_us)  {
  45.          //-------------------------------------
  46.          uint16_t i;
  47.          
  48.          for(i=0;i<num_ms;i++) _delay_ms(250);
  49.          for(i=0;i<ms_delay;i++) _delay_ms(1);
  50.          for(i=0;i<num_us;i++) _delay_us(250);
  51.          for(i=0;i<us_delay;i++) _delay_us(1);
  52.  }
  53.  
  54.  
  55.  //-------------------------------------
  56.  void generate_tone(uint16_t frequency, uint16_t duration)
  57.  //-------------------------------------
  58.  {
  59.          uint32_t total_delay_time;
  60.          uint16_t total_ms_delay_time, total_us_delay_time;
  61.          uint16_t num_us_delays, num_ms_delays, ms_delay_time, us_delay_time;
  62.          uint16_t num_periods;
  63.          
  64.          total_delay_time = (1000000/frequency)/2-10;
  65.          
  66.          total_ms_delay_time = total_delay_time/1000;
  67.          num_ms_delays = total_ms_delay_time/250;
  68.          ms_delay_time = total_ms_delay_time%250;
  69.          
  70.          total_us_delay_time = total_delay_time%1000;
  71.          num_us_delays = total_us_delay_time/250;
  72.          us_delay_time = total_us_delay_time%250;
  73.          
  74.          num_periods = ((uint32_t)duration*1000)/(1000000/frequency);
  75.          
  76.          while((num_periods--) != 0)
  77.          {
  78.                  do_delay(ms_delay_time, num_ms_delays, us_delay_time, num_us_delays);
  79.                  PORTD |=  (1<<PIND1);
  80.                  do_delay(ms_delay_time, num_ms_delays, us_delay_time, num_us_delays);
  81.                  PORTD &= ~(1<<PIND1);
  82.          }
  83.          
  84.          return;
  85.  }
  86.  
  87. int main()
  88. {
  89.         //Setup
  90.         DDR_7_SEGMENT=0xFF;    //All output
  91. //RT_7_SEGMENT=0xFF;   //All segments off
  92.  
  93.          DDRD = (1<<PIND1);
  94.          
  95.          int time=450;
  96.          int time2=5;
  97.          
  98.          int csipogas=0;
  99.        
  100.  
  101.         while(1)  //loop forever
  102.         {
  103.                
  104.                
  105.                 if (time > 10)
  106.                
  107.                 {
  108.                        
  109.                         m_delay_10ms(time); //450*10ms = 45s
  110.                        
  111.                         C4_ON();
  112.                         generate_tone(28000,20);
  113.                         m_delay_10ms(1);
  114.                         C4_OFF();
  115.                         time=time-10;
  116.                        
  117.                         // desc=desc+1;
  118.                        
  119.                 }
  120.  
  121.                 else {
  122.  
  123.                         m_delay_10ms(time2); //450*10ms = 45s
  124.                         C4_ON();
  125.                         generate_tone(28000,20);
  126.                         m_delay_10ms(1);
  127.                         C4_OFF();
  128.                         csipogas=csipogas+1;
  129.                        
  130.                         if (csipogas > 20)
  131.                         {
  132.                                 return 0;
  133.                         }
  134.                        
  135.                        
  136.                
  137.                 }
  138.                                
  139.                         }      
  140.        
  141.         return 0;
  142. }
ez a kód a ledet és a Piezót működteti beleírtam a 7 Szegmentest (1 db al még csak) de most jön a fekete leves nem tudom, hogyan rakjam a Kijelzőt bele a kódba ha bele irom igy a legvégére hogy
  1. IF (time > 100) {
  2.                 PORTD = 0b00110000;     // Display Number 1}
ha eléri a 100 alatti időzítőt akkor erre vált át és a csipogás abba marad :/ de aza baj, hogy ha nem Multiplexszel oldom meg akkor muszáj a 2 IC megoldás :/

UI: Akkor is Multiplexer kell ha alapból a 7 Szegmentes 2 böl al? mármint nem én rakom egymás melle?Mármint Kód szempontjából másabb lesz? vagy lehet egyszerűbben is megírni?
A hozzászólás módosítva: Szept 8, 2012
(#) Reggie válasza kurosaki hozzászólására (») Szept 8, 2012 /
 
Kezdetnek a 132. sorbol vedd ki a return-t, mert mikrokontrolleren a main-bol sosem terunk vissza, ugyanis nincs hova (PC-n a parancsertelmezohoz vissza lehet). Ez okozza a gondot es valojaban nem a 100 alatti erteknel nem csipog, hanem a 79 alattiaknal.

A 7szegmens vezerlokodjat neked megszakitasba kene raknod, mivel a fohurokban sokfele van blokkolo idozites.
(#) kurosaki válasza Reggie hozzászólására (») Szept 8, 2012 /
 
Értem köszönöm.Ezt a megszakítást, hogy érted? Előbb még hozzá írtam a Hozászolásomhoz nem tudom,hogy láttad-e arra tudsz válaszolni?
(#) Reggie válasza kurosaki hozzászólására (») Szept 8, 2012 /
 
- A megszakitasok olyan esemenyek, amikor valamilyen kivalto ok miatt a program futasa megszakad, a processzor allapota elmentesre kerul, majd meghiv egy az adott megszakitashoz tartozo fuggvenyt. Majd ha ennek a fuggvenynek vege, akkor visszallitja a processzor allapotat es folytatodik tovabb a program futasa.
AVR-nel peldaul ilyen esemeny egy szamlalo tulcsordulasa lehet.
- Nem lattam.
- Ha egybe van tokozva gyarilag tobb, akkor kizarolag multiplexelve tudod hasznalni.
A hozzászólás módosítva: Szept 8, 2012
(#) kurosaki válasza Reggie hozzászólására (») Szept 8, 2012 /
 
-Értem akkor multiplex lesz a kódot lehet egyszerübben megírni? mert a neten nagyon hosszú :/

- A megszakításra a IF eket érted? mert beteszem a végére az IF et akkor végre hajtódik mikor eléri a 100 at és vissza számol de nem csipog :/ oda is bekéne raknom a csipogást? úgyérzem túl bonyolítom az egész kódot pedig egyszerű lehetne.
(#) Fizikus válasza kurosaki hozzászólására (») Szept 8, 2012 /
 
(#) kurosaki válasza Fizikus hozzászólására (») Szept 8, 2012 /
 
Lehet kiröhögsz és szánalmasnak fogsz tartani.De ezeket énis meg találtam és maga a Kódot nem nagyon értem.Plusz az én Csipogásom és a Piezóm hova tehetném be.

Hétfőn lesz nálam a Tranzisztor ami kell a Multiplexhez most sima 7 Segmentel kísérletezem. nálam az időzítés a fontos bár lehet a Multiplexel könnyebb mert ott 45 röl kel számolnom és nem kel pepecselnem hogy 9 MP töl számoljon és IF .
Lehet hétfő délutánig elnapolom ezt a kérdést és befejezem most a fejlesztést.

Köszönöm az eddig válaszokat addig is átolvasom a netet a Multiplex el kapcsolatban hátha találok egy jó leírást ami egyszerű.
(#) Reggie válasza kurosaki hozzászólására (») Szept 8, 2012 /
 
Nagyon konnyu.
Az IF az mas(elagazas es nem megszakitas). Ezt nezd meg: http://www.google.hu/url?sa=t&rct=j&q=&esrc=s&source=web&cd=25&ved=...QHSZPA
A hozzászólás módosítva: Szept 8, 2012
(#) kurosaki válasza Reggie hozzászólására (») Szept 8, 2012 /
 
Elolvastam kb azt írja le amit én használtam az int el hogy eltároltam egy értéket amiböl kivonta-hozzáadtam-kiolvastam. de nekem aza gond,hogy a kijelzőt a többitől függetlenül kéne hogy működjön (most speciel a timertől kéne hogy függjön) 90 MP töl számoljon ami (timer = 90)

félek a multiplexertől mert a neten a kódok nagyon bonyolultak.Számomra ez az átadásos módszer lenne a jo pl: PB1 töl egy jelet adok ami a attiny2313 on az egyik lábon bemegy és a IC észleli és elindítja a timert és kész.
(#) blackdog hozzászólása Szept 8, 2012 /
 
Sziasztok!

A programom kiegészítettem órával és dátummal. A TIMER1_OVF_vect megszakítást használom. Ugye a nagykönyv azt mondja, hogy megszakításban a lehető legszükségesebb kód legyen. Itt most az óra,perc,másodperc,év,hónap,nap számítása zajlik és LCD-re történő kiírása.
Az utóbbi maradhat a megszakításban vagy jobb lenne átteni a főprogramba?
A másik, hogy időponthoz kötött eseményeket szeretnék később végrehajtani. Gondolom ezeknek is jobb helye lenne a főprogramban mint a megszakításban.
Szeretném, ha nem kellene havonta állítgatni az órát és a program futása is megfelelő lenne.
(#) Reggie válasza kurosaki hozzászólására (») Szept 8, 2012 /
 
Lehet, hogy azt irja le, de teljesen mashogy mukodik es ez a lenyeg. A massag reszben abban merul ki, hogy fuggetlenul megy a tobbi kodtol.

A multiplexertol nem kell felni, az elv egyszeru. Bonyolult kodot mindenhez lehet irni, attol meg nem biztos, hogy bonyolult. Ha egy darab hetszegmenses kijelzot leprogramoztad, akkor a multiplexelt kijelzes 90%-at megcsinaltad. A kulonbseg annyi, hogy ha ket I/O labat hasznalsz a ket kijelzo kivalasztasara, akkor felvaltva ki kell oket valasztani es az eredeti kiiro fuggvenyeddel kiirni a hozza tartozo erteket. Ha ezt rovid idokozonkent megteszed, akkor ugy latod, mintha egyszerre mind a ketton megjelenne a hozzajuk tartozo ertekek.
(#) Reggie válasza blackdog hozzászólására (») Szept 8, 2012 /
 
Ha biztositod, hogy a foprogramban vagy mas megszakitasban levo LCD kezelest es/vagy LCD interfesz kezelest nem szakitja meg az idozitodben levo LCD kezeles, akkor alapvetoen nem okozhat nagy gondot. Ekkor egyedul csak arra kell figyelned, hogy a megszakitas periodusidejenel rovidebb legyen a megszakitas vegrehajtasi ideje. A maradek ido forditodik a foprogramodra.

A kesobbi vegrehajtast is gond nelkul meg tudod oldani. Egyedul arra vigyazzal, hogy azokat a valtozokat, amelyeket egyarant hasznalsz a foprogramban es a megszakitasban, volatile-kent deklarald. Valamint ha egy valtozo nagyobb mint a szomeret(azaz itt 8 bit), akkor amig muveletet vegzel vele tiltsad le a megszakitasokat.

(#) kurosaki hozzászólása Szept 8, 2012 /
 
Értem
erről a megszakítorol hol tudok példát nézni?

Értem igazából akkor úgy megy mint a LED nél h megadom az alap értéket egy változóban. KB igy portb1 disp1: 1 portb2 disp2:2 es akkor ez kirakja hogy 12 ekkor ha hozzáadok egyet akkor disp2:3 ? (kb ez az elmélete?)

de ha én megadom neki a 12 öt minden láb oda van rá kötve. Honnan tudja a kimenet hogy neki az 1 est kell és nem pedig a kettest? mert egybe vannak kötve a lábak kivéve az Anodok. az Anod amin az 5V van. az nem csinál semmit.
(#) Reggie válasza kurosaki hozzászólására (») Szept 8, 2012 /
 
Igen.

Onnan tudja, hogy ki kell valasztani azt a negy bitet a valtozobol, amelyik a kivalasztott szegmens-csoporthoz tartozik.

Peldaul igy:
ha a kijelzot 1-tol szamozzuk:
  1. #define kivalaszt(kijelzo,kiirando_valtozo) (((kiirando_valtozo)>>(((kijelzo)-1)*4))&0xF)

ha a kijelzot 0-tol szamozzuk:
  1. #define kivalaszt(kijelzo,kiirando_valtozo) (((kiirando_valtozo)>>((kijelzo)*4))&0xF)


Ekkor a szegmenseket kivalaszto fuggvenynek, ha mondjuk az 1. sz.-cs.-ra szeretnel kiirni, a kivalaszt(1,adat) erteket kell atadni.
A hozzászólás módosítva: Szept 8, 2012
(#) blackdog válasza Reggie hozzászólására (») Szept 8, 2012 /
 
Jelenleg három esetre használok megszakításokat.
RS232 kommunikáció, Nyomógombok kezelése, Óra.
Nem értem, hogy tiltsam le a megszakítást. Ha a timer-t letiltom akkor nem lesz pontos. Az USART-ot se tilthatom mert nem lesz kommunikáció a PC-vel. A nyomógomb kezelés még problémás mert öt gombot kezelek. Főleg az LCD menü vezérlésre. Timer óra kvarcot használ TOSC1/TOSC2 lábon. Nem tudom ez mennyit javít a helyzeten.
(#) kurosaki válasza Reggie hozzászólására (») Szept 8, 2012 /
 
Huuuuu na most ez engem jol meg fogott. Szóval nemértem nem tudom feldolgozni, hogy most mi hova megy. Szóval Kiválasztáshoz meg a Disp1 vagy Disp2 ugye? vagy a Kijelzőre? a kiírandó aza 8bit sor 00000011 ugye?

és a megszakításhoz példát hol találok?

Bocsánatot kérek, hogy ennyire béna vagyok .
(#) Reggie válasza blackdog hozzászólására (») Szept 8, 2012 /
 
Csak addig tiltsad le, amig az adott valtozot irod, vagy olvasod. Tehat ha mondjuk van egy "valami" nevu, uint8_t tipusu valtozod, amit foprogramban es megszakitasban is hasznalsz, akkor igy kell megoldani a hasznalatat:

  1. uint8_t valami_tmp;
  2. cli();
  3. valami_tmp=valami;
  4. sei();
  5. ...itt modositod, de a valami helyett valami_tmp-t hasznald...
  6. cli();
  7. valami=valami_tmp;
  8. sei();
(#) Reggie válasza kurosaki hozzászólására (») Szept 8, 2012 /
 
Peldaul ki szeretned irni, mondjuk a 0x13 erteket a kijelzore. Ehhez a bal oldali kijelzore az 1-et kell kikuldeni, a jobb oldali a 3-mat. A bal oldali kijelzo legyen a kettes sorszamu, a jobb oldali az egyes sorszamu.
Namost a 0x13 binarisan 0b00010011. Ebbol is latszik, hogy a felso 4 bit erteke 0b0001, azaz 0x1, amire nekunk szuksegunk van a bal oldali kijelzonel. Az also 4 bit erteke 0b0011, azaz 0x3, amire a jobb oldali kijelzonel van szuksegunk. Tehat jol lathato, hogy ha a kettes kijelzore szeretnenk kikuldeni az adatot, akkor "es" muvelettel az also 4 bitet kell megtartani. Ha a bal oldali kijelzore szeretnenk kikuldeni, akkor a felso 4 bitet kell megtartani, viszont ha es muvelettel toroljuk az also negy bitet, akkor 0b00010000, azaz 0x10 fog eloallni. Tehat ezt nekunk jobbra kell tolni 4 bittel. Ekkor mar 0b0001, azaz 0x1 marad.
Tehat osszegezve, ha a kivalasztott kijelzo 1, akkor 0 bittel kell eltolni(azaz nem toljuk el), ha a kivalasztott kijelzo 2, akkor 4 bittel kell eltolni. Azaz az eltolas erteke (kijelzo-1)*4 lesz. Ha eloszor az eltolast hajtjuk vegre eloszor es a maszkolast masodjara, akkor minden esetben csak az also 4 bitet kell megtartani. Igy adodik az elozo kommentemben irt muvelet. define helyett fuggvennyel megvalositva:
  1. uint8_t adatkivalaszt(uint8_t kijelzo, uint8_t adat) {
  2.   uint8_t eltolas;
  3.   uint8_t tmp;
  4.   eltolas=(kijelzo-1)*4; //itt szamoljuk ki, hogy hany bittel kell eltolni
  5.   tmp=adat>>eltolas; //itt eltoljuk az adat tartalmat es egy ideiglenes valtozoba helyezzuk
  6.   tmp=tmp&0xF; //a kapott adatbol csak az also 4 bitet tartjuk meg
  7.   return tmp; //a fuggveny visszateresi erteke a kiirando szam lesz
  8. }

A hozzászólás módosítva: Szept 8, 2012
(#) blackdog válasza Reggie hozzászólására (») Szept 8, 2012 /
 
Őszintén szólva még ilyet nem nagyon láttam. Amikor módosítok egy olyan változót amit megszakítás is használ természetesen tiltom a hozzá tartozó megszakítást.
De túlnyomórészt ellenőrzést végzek ezekkel a változókkal. Pl.: adott óra:perc esetén kapcsolok egy kimenetet. Ha RS232 csatlakozás él akkor minden adat megy a PC-re is. Van adatáramlás ilyenkor, de arra figyeltem, hogy ne nagy csomagok menjenek.
(#) kurosaki válasza Reggie hozzászólására (») Szept 8, 2012 /
 
Huuu most még jobban meg kavartál. Már kezdem érteni . de önmagában ez a kód nem müxik vagy tévedek? Hogy adom meg hogy pl: portb1? vagy a kijelző helyére?

Télleg bocsánat, hogy zaklatlak vele csak meg szeretném érteni .

Másik, hogy tudok 2 folyamatot végeztetni?vagy az IC nem tud ilyesmi fajta dolgot? pl:led-piezó és a számlálót mellé kapcsolja külön ágon. mert most akkor kéne bekapcsolni mikor 9Másodperc van hátra (most még a Multiplex nem kell az csak hétfőn). de köszönöm, hogy segítesz a Multiplexben csak most igy nem tudom probálni mig nincs meg a tranzisztorom.
Következő: »»   477 / 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