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   552 / 840
(#) David 3g válasza TavIR-AVR hozzászólására (») Aug 1, 2013 /
 
Szia. Kerámia kondi bentvan. Egy 47mikros is. Még mindig süket mint a nagyágyú sajnos a külsö stabil 5v még megprobálom.
(#) johny999 hozzászólása Aug 2, 2013 /
 
Üdv,

valami kezdő lökést tudnátok adni hogyan lehet egy egyszerű menüt készíteni, pld óra beállításhoz.
(#) zombee válasza johny999 hozzászólására (») Aug 2, 2013 /
 
Neked állapotgép kell! A fő programhurokban kell neked egy switch-case szerkezet, amiben egy állapotváltozó alapján választod ki a menüt. Használhatsz második állapotváltozót, pl. olyat ami egy időbeállító menüben megmondja hogy most éppen óra/perc/stb. közül mit állít be éppen. Az egyes menükben lekezeled az eseményeket(pl. nyomógomb), aminek hatására átlépsz egy másik menübe(csak az állapotváltozót kell módosítani!). Érdemes "belépő" állapotokat is gyártani, ami egyrészt a menü környezetét állítja be(kijelző módosítás, villogás be/kikapcsolása), és megvárja míg a nyomógombot felengeded. Nem árt ha interruptokat is használsz, hogy az események kezelése(pl. nyomógombok és pergésmentesítés) a "háttérben" fusson. Egy ilyen cucc nekem kb. fél napos munka, de megérteni és kitapasztalni sokkal tovább tart.
A haladók állapotátmeneti gráfot rajzolnak és mátrixokkal oldják meg a dolgot. Ez nagyon tömör "főprogramot" eredményez, könnyen módosítható belépőkkel és átmenetekkel, de a bővítés (új állapotokkal vagy eseményekkel == mátrix bővítés oldalra és lefelé) kicsit macera, ezért kezdőknek nem ajánlott.
A hozzászólás módosítva: Aug 2, 2013
(#) TakiG válasza johny999 hozzászólására (») Aug 3, 2013 /
 
Ha c-ben programozol, nézd meg ezt a hozzászólásomat, a mellékletben van egy váz is amiből kiindulhatsz. Egy olyasmi állapotgép megoldás amit az előző hozzászólásban zombee leírt. AVR-en is használható, ne zavarjon hogy PIC-es topikban írtam róla.
(#) neptunes4you hozzászólása Aug 4, 2013 /
 
Sikerült hozzájutnom ilyen hőmérő szenzorokhoz: Bővebben: Link, viszont nem tudom hogyan kezdjem el az SPI vezérlést, ugyanis nincs rajta csak egy láb az adatátvitelhez. Van valami ötletetek?
(#) vzoole válasza neptunes4you hozzászólására (») Aug 5, 2013 /
 
Kezd el úgy, hogy elsőnek csak a bemenetre (MISO) kötöd rá a szenzor SI/O lábát.
MCU-val indítasz egy SPI kommunikációt, és nézd meg mit kapsz vissza.

Amúgy a szenzor SI/O lába 3 állapotot vehet fel. Ezzel lehet megadni neki, hogy bemenet, vagy kimenet legyen.
Kicsit alaposabban át kéne tanulmányozni hozzá az adatlapot... de jó eséllyel nem is kell írnod a regisztereit mert sok mindent nem tud a chip.
(#) zombee válasza neptunes4you hozzászólására (») Aug 5, 2013 /
 
+1: ADATLAP!
És a kommunikációhoz 3 vezeték van, egyikkel aktiválod, másikkal adod neki az órajelet,
a harmadikon csorog ki a kőkemény 14 bit amit értelmezni kell...
(#) johny999 válasza zombee hozzászólására (») Aug 5, 2013 /
 
Ejha ez kicsit kínai. Utánanézek. Köszi.

TakiG Neked is köszi.
(#) zolek hozzászólása Aug 5, 2013 /
 
Üdv. Ma egy atmega 8-at akartam felprogramozni ponyprog-al és a fuse bit beállításnál rá kattintottam Write . De azóta nem találja az atmega-t,fusebit-et nem állítottam. Resetterel helyre hozható?
(#) neptunes4you válasza zolek hozzászólására (») Aug 5, 2013 /
 
Külső kristályod van? Meg kellene próbálni rátenni, de ha nem megy akkor vagy kikapcsoltad az SPI-t, vagy a Reset lábat, vagy külső oszcillátorra tetted.

Ilyen hibák elkerülése végett, ha Windows alatt vagy, ajánlom az AVRDUDESS-t, és az engedded fuse calculatort.
A hozzászólás módosítva: Aug 5, 2013
(#) yoman917 hozzászólása Aug 7, 2013 /
 
Sziasztok
Frekvenciát mérek egy Attiny2313-al, és szeretném 7 szegmensű kijelzőre kiíratni az értékét. 74LS47-el már ki tudom íratni, de szeretném szoftveresen megoldani a decimális kódolást. Így néz ki a while ciklusom:
  1. while(1)
  2.         {      
  3.                 helyi1 = (u16Ford_s/1000) %10;
  4.                 helyi2 = (u16Ford_s/100) %10;
  5.                 helyi3 = (u16Ford_s/10) %10;
  6.                 helyi4 = (u16Ford_s) %10;
  7.  
  8.                                
  9.  
  10. switch (PORTB)
  11.       {
  12.          case 0:
  13.          nulla; //PORTB=0x3F
  14.          break;
  15.  
  16.          case 1:
  17.          egy; //PORTB=0x6
  18.          break;
  19.  
  20.          case 2:
  21.          ketto;
  22.          break;
  23.  
  24.          case 3:
  25.          harom;
  26.          break;
  27.  
  28.          case 4:
  29.          negy;
  30.          break;
  31.  
  32.          case 5:
  33.          ot;
  34.          break;
  35.  
  36.          case 6:
  37.          hat;
  38.          break;
  39.  
  40.          case 7:
  41.          het;
  42.          break;
  43.  
  44.          case 8:
  45.          nyolc;
  46.          break;
  47.  
  48.          case 9:
  49.          kilenc;
  50.          break;
  51.       }
Kérdésem, hogy eddig jó-e a kód, és ezután hogyan tudnám kiküldeni a decimális értéket?
(#) kapu48 válasza yoman917 hozzászólására (») Aug 7, 2013 /
 
Szerintem így túl sok proci időbe fog kerülni a kijelzés!
És elcseszi a freki mérést!
(#) yoman917 válasza kapu48 hozzászólására (») Aug 7, 2013 /
 
Ezt majd akkor tudom kideríteni, ha működik a kijelzés, és szkóppal vagy frekvenciamérővel megnézem az eredetit. Egyébként van ötleted, hogyan tudnám kiíratni a helyiértékeket?
(#) kapu48 válasza yoman917 hozzászólására (») Aug 7, 2013 /
 
Ja!
Jó kísérletezgetést!

A saját magad által szerzett tapasztalatok a leg hasznosabbak.
(#) Gabó hozzászólása Aug 8, 2013 /
 
Egy AVRes relés kapcsolást tervezek. A csatolt képen nincs (neten több képet is megnézve nem volt) a tranzisztor bázis-emitter közt ellenállás, de régebben javasolták, hogy kellene. Ennek pontos szerepe micsoda?
Bővebben: Link
A hozzászólás módosítva: Aug 8, 2013
(#) TavIR-AVR válasza Gabó hozzászólására (») Aug 8, 2013 /
 
Hogy a bázis-emitter átmenetet ne égesd el.
A tranzisztor alapelve
(#) Gabó válasza TavIR-AVR hozzászólására (») Aug 8, 2013 /
 
Értem már. Köszönöm. Csak akkor miért "spórolják le" a rajzokról?
(#) IMi válasza TavIR-AVR hozzászólására (») Aug 8, 2013 /
 
Sziasztok!

És a relé tekercs ellenállása?
(#) Massawa válasza Gabó hozzászólására (») Aug 8, 2013 /
 
Vagy áramgenerátoros kimenete van a meghajtonak, ami korlátozza a kimeneti áramot,és egyben a bázis bemeneti áramát.
Ha biztosra akarsz menni akkor rakj oda mindig ellenállást.
(#) Massawa válasza IMi hozzászólására (») Aug 8, 2013 /
 
A relékkel kevesebb gond szokott lenni, minden tipusnak van egy többé kevésbé betartott ellenállásértéke (az adott feszültségre), igy ott nagyon nem lehet mellé fogni.
Ez függ a relé teljesitményététöl mennyi kontaktust és milyen áramokat kell kapcsolgatnia.
Pl. az autosrelék ellenállása általában a legkisebb, a PCB/SMD relé tekercsellenállása szokott a legnagyobb lenni, ugyanolyan tápfeszültségre gyártva (12V).
Természetesen a tranzisztornak ezt ki kell birnia.....
(#) TavIR-AVR válasza IMi hozzászólására (») Aug 8, 2013 /
 
Az a kollektor-emitter körben van...
Ott a kikapcsoláskor a mégneses mező összeomlik és indukciót csinál. Oda ezért kell a dióda, mert az a tekercset "rövidrezárja" ekkor...
(#) TavIR-AVR válasza Gabó hozzászólására (») Aug 8, 2013 /
 
Ha ULN28xx IC, akkor az beépítve a tranzisztoros fokozatban tartalmazza.
Vagy olyan tranzisztor, ami már beépítve taralmazza. Vagy FET és nem klasszikus bipoláris tranzisztor.
Vagy úgyis áramgenerátoros 40 mA-re az AVR, az majd megoldja ... De aki ilyet tervez, attól még egy darab ellenállást sem vennék....
(#) Hp41C válasza Gabó hozzászólására (») Aug 8, 2013 /
 
A vezérlést meg lehet úgy oldani, hogy működhet bázisellenállás nélkül is. Az alacsony szintet az AVR kimeneti meghajtója adja, a felhúzó ellenállást a földre kötve. Magas szintre kapcsoláskor a meghajtót letiltva, a lábhoz beépített felhúzó ellenállás adja a kimenetet, ami egyben a relét kapcsoló tranzisztor bázisellenállása is. Nem szép így tervezni, de működik...
(#) fifadani hozzászólása Aug 9, 2013 /
 
Sziasztok!

Szeretnék készíteni majd egy 6x6-os led mátrixot.
Atmega8-al, bipoláris tranzisztorokkal.
A kérdésem az, hogy ezeket a kijelzéseket képpontonként valósítsam meg?
Ha egy sorban 2 lednek is világítania kell majd, akkor egyszerre vagy egymás után "gyújtsam" ki őket?

Bár így elég hosszadalmas lesz egy program. Tud segíteni valaki, vagy ötletet adni, hogy miként lehet egyszerűsíteni a dolgot?

Köszi!
A hozzászólás módosítva: Aug 9, 2013
(#) zombee válasza fifadani hozzászólására (») Aug 9, 2013 /
 
A "LED mátrix" azt jelenti hogy két eltérő sorban nincs olyan hogy "egyszerre".
Egy "becsületes" LED mátrix valahogy így néz ki: Bővebben: Link
Kis fantáziával ezt Te megcsinálod 6x6-ra. A tranzisztorok vezérlik a sorokat, ezekből egyszerre egyidőben csak egy lehet aktív. És akkor egy rövid program:
  1. uint8_t adat[6];
  2. DDRB = 0b00111111;  //itt vezérled a sorokat(tranzisztor)
  3. DDRC = 0b00111111; //itt vezérled az ooszlopokat
  4. for(uint8_t i=0; i<6; i++)
  5. {
  6.   PORTB = 1<<i;     //sor aktiválása
  7.   PORTC = adat[i]; //adott sorhoz tartozó LED-ek kigyújtása
  8.   _delay_ms(3);    //adott ideig égnie kell a sornak. kb. 55Hz-es össz freki --> nem vibrál!
  9.   PORTC = 0;
  10.   _delay_us(10);  //ez a 2 sor a szellemkép elkerülése miatt szükséges!
  11. }


Bonyolult? Majd akkor, ha ezt időzítő megszakítással csinálod meg, esetleg kettősbuffereléssel.
A hozzászólás módosítva: Aug 9, 2013
(#) fifadani hozzászólása Aug 9, 2013 /
 
Öhm, eddig úgy csináltam, hogy az oszlopokat is tranyóval hajtottam. De gondolom az már mindegy. Köszi a segítséget, próbálkozok majd...
A hozzászólás módosítva: Aug 9, 2013
(#) fifadani hozzászólása Aug 9, 2013 /
 
Most lehet, hogy butaságot kérdezek, de nem nagyon csináltam még led villogtatásnál többet C-ben.
Szóval;
0. uint8_t adat[6]; ez mit jelent?
1. megadtad a portok irányát.
2. for ciklus, addig csinálja amíg i nem éri el a 6-ot? és miért pont 6?
3. sort bekapcs.
4. portc = adat [ i] az i helyére írom azt hogy hanyadik ledet akarok kigyújtani a sorban?
5. oszlopokat kikapcs
A hozzászólás módosítva: Aug 9, 2013
(#) zombee válasza fifadani hozzászólására (») Aug 9, 2013 /
 
Lehet az oszlopokat is tranyóval, legalább nem terheli az AVR-t. De azokhoz PNP kell.
Próbálkozz számkijelzővel, azzal könnyen ráharapsz majd a működés lényegére!

0: uint8_t azt jelenti hogy "8 bites pozitív egész", ugyanaz mint az "unsigned char"
A mátrix képét (soronként) egy 6 elemű tömbbe tárolod, ezért a [6]. A felső 2 bit nincs kihasználva.
1: még szép!
2: azért 6, mert 6 soros a mátrixod. Ezt még be kell ágyazni egy végtelen ciklusba, az lemaradt.
3: azt a sort kapcsolja be ahol éppen tart, és aminek az oszlopait beállítja éppen(a tömbből!)
4: nem, az "i" a tömbön belül címzi meg az adott sor adatát
5: rövid időre ki kell, hogy ne legyen szellemkép
A hozzászólás módosítva: Aug 9, 2013
(#) fifadani hozzászólása Aug 9, 2013 /
 
És hogy írom be azt, hogy a 3. sor 3. ledje működjön?
A hozzászólás módosítva: Aug 9, 2013
(#) zombee válasza fifadani hozzászólására (») Aug 9, 2013 /
 
Ezzel gyújtod ki - a többit nem bántja:
  1. adat[2] |= 1<<2;

Ha csak ez az egy LED ég, a többi nem:
  1. adat = {0b00000000, 0b00000000, 0b00000100, 0b00000000, 0b00000000, 0b00000000};


Még mielőtt megkérded: azért "2" mindenhol, mert 0-tól számolunk...
A hozzászólás módosítva: Aug 9, 2013
Következő: »»   552 / 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