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   662 / 837
(#) zombee válasza csabeszq hozzászólására (») Ápr 28, 2015 /
 
Az ATMega32 és ATMega16 interrupt táblája azonos méretű, de az egyes interruptok más-más helyen vannak. Csak akkor megy el egyik (hex) kódja a másikon ha nincsenek interruptok a programban! A C kód újrafordításával természetesen portolható egyikből a másikba.
A hozzászólás módosítva: Ápr 28, 2015
(#) pont hozzászólása Ápr 29, 2015 /
 
Sziasztok! Egy AVR portjait kellene vezeték nélküli módon eljuttatni 15-15m két fizikailag külön helyre, (egy egyenlő oldalú háromszög lenne). XBee-re gondoltam, de még nem dolgoztam vele, sőt még UART-on sem. Hogy kell ezt elképzelnem, bascom alatt például, ha az 1-es end device 1-es portját akarom bekapcsolni, mit írjak a PRINT után? Valakinek esetleg ilyesmi programrészlete bascomban? Köszönettel, üdv.
(#) teglascs hozzászólása Ápr 29, 2015 /
 
Szervusztok,

az Attiny-k elvileg tudnak I2C-t használni?

(minden előzetes projektterv nélkül, csak szimpla érdeklődésként kérdezem, "ráadásul" kezdő vagyok )
(#) Zsolt2 válasza teglascs hozzászólására (») Ápr 29, 2015 / 1
 
Elvileg tudnak, azonban nezd meg az adatlapjat a megfelelo IC-nek, mielott nekifognal a tervezesnek.
(#) teglascs válasza Zsolt2 hozzászólására (») Ápr 29, 2015 /
 
Köszi.
Nem tartok még tervezésnél, épp csak nézegetni kezdetem az Arduinokat, viszont elgondolkodtam azon, hogy -a könnyebb használhatóság végett, jogosan- egy csomó cucc fönt van rajtuk (az Arduinokon), amik viszont egy konkrét projektnél feleslegesek lehetnek.
Egyszerűbb, gyakori felhasználási területeken (pl. mérek valamit (hőt, időt, stb.), azt kijelzem, esetleg egy-egy relét kapcsolgatok) szerintem elég lehet a kis Tiny-k teljesítménye, de a lábak hamar elfogyhatnak - ezért kérdeztem csak.
De ettől még messze állok sajnos.
(#) csabeszq válasza teglascs hozzászólására (») Ápr 29, 2015 / 2
 
Elvileg tudnak, de problémás. Az Atmegák alatt rengeteg dolog megy hardverből, amit Attiny szoftveresen kezel. Az Attiny I2C az tulajdonképpen egy kiterjesztett shift regiszter, amelyiket I2C-re is lehet használni.

Az attiny implementáció kevesebb memóriájú chipekbe hosszabb kódot eredményez.

Hogy szemléltessem:
- atmega alatt beállítod, hogy a te címed 26, amikor valaki téged címez, interrupt kerül meghívásra. Ha senki sem címez téged, akkor nem is csinálsz semmit.
- az attiny egy shift regiszter, nem hallgat címet, minden egyes esetben, amikor start jel küldődik és utána feltöltődik az első bájt, akkor neked kell szoftveresen eldönteni, hogy az üzenet neked szól-e.

Első hangzásra nem olyan rémes, de hidd el az. Képzeld el, hogy 'A' chip beszélni akar 'B' chippel és megcímzi. Van még egy Attiny chip is a buszon, akit nem címeztek, akivel nem akarnak beszélni. Szóval kiküldődik a start jel és az első bájt. Az attiny éppen nem ér rá, ezért tartja a vonalat. Eltelik jó sok idő, az attiny már ráér és látja, hogy nem őt keresték, el is engedi a vonalat: bocsi nem engem címeztek.

A és B addig nem tudnak beszélni, amíg az összes buszon lévő Attiny el nem jut oda, hogy rájöjjön, hogy nem neki szóltak. Mindegyik feltartja a vonalat.

Atmega alatt a hardver elintézi mindezt, ha nem téged címeztek, nem pofázol bele és tartod fel az egész buszt.
A hozzászólás módosítva: Ápr 29, 2015
(#) teglascs válasza csabeszq hozzászólására (») Ápr 29, 2015 /
 
Köszi, nagyon részletes, valamelyest fogom is a lényegét.

Ez a dolog akkor is így játszódik le, ha nincs slave Attiny a buszon? Tehát ha egyetlen Attiny-t használok (masterként), azon van a kód, az I2C eszközök pedig pl. egy-egy hőérzékelő ill. LCD, akkor is ez a játék megy?

(Lehet, hogy abszurd dolgokat kérdezek, de most kezdtem csak erről olvasgatni...)
(#) csabeszq válasza teglascs hozzászólására (») Ápr 29, 2015 /
 
Attiny masternél nincs probléma. Max annyi, hogy bonyulultabb lesz a kódod.
(#) teglascs válasza csabeszq hozzászólására (») Ápr 29, 2015 /
 
Értem, köszönöm.
(#) Szabi1 hozzászólása Ápr 30, 2015 /
 
Sziasztok! Atmega8-al szeretnék egy olyan időzitőt készíteni, hogyha az egyik lábán megváltozik a kapcsoló állapota, akkor egy kimeneti lábon behúz egy relét, majd 20 másodperc múlva lekapcsolja. De ez a funkció csak akkor lép érvénybe ha egy másik bemeneti lábon egy fotoellenállás "sötétet érzékel".
Nos ez nem is volna probléma, csak az hogy ebből az egészből 3 kell, és az a kérdés, hogy meg lehet-e oldani azt hogyha az egyik relé épp behúzott állapotban van akkor közben tudjon egy másik kapcsolót is érzékelni, és ugyanúgy külön késleltetni a bekapcsolási időt?
Itt a jelenlegi kód:
  1. #define F_CPU 8000000UL// rendszer orajel: 8 MHz
  2.         #include <avr/io.h>
  3.     #include <inttypes.h>
  4.         #include <util/delay.h>
  5. /*    ATmega8 mikrovezerlo labkiosztas
  6.                            +--------------+
  7.                  RESET   -|1        PC5 28|-
  8.                          -|2 PD0    PC4 27|-
  9.                          -|3 PD1    PC3 26|-
  10.    PD2 LDR 1             -|4 PD2    PC2 25|-
  11.    PD3 LDR 2             -|5 PD3    PC1 24|-
  12.    PD4 LDR 3             -|6 PD4    PC0 23|-
  13.                    VCC   -|7 22           |- GND
  14.                   GND    -|8 21           |- AREF
  15.                  (xtal)  -|9 PB6        20|- AVCC
  16.                  (xtal)  -|10 PB7  PB5 19|- ISP(SCK)
  17.    PD5 kapcsolo 1        -|11 PD5   PB4 18|- ISP(MISO)
  18.    PD6 kapcsolo 2        -|12 PD6   PB3 17|- ISP(MOSI)
  19.    PD7 kapcsolo 3        -|13 PD7   PB2 16|- **RELE3*
  20.                 *RELE1   -|14 PB0   PB1 15|-***RELE2-*/
  21.                        //  +--------------+
  22.  
  23. void do_action_1()
  24. {
  25.     PORTB |=  (1 << PB0); //rele be
  26.     _delay_ms(20000);
  27.     PORTB |=  (1 << PB0); //rele ki
  28. }
  29.  
  30. void do_action_2()
  31. {
  32.     PORTB |=  (1 << PB1); //rele be
  33.     _delay_ms(20000);
  34.     PORTB |=  (1 << PB1); //rele ki
  35. }
  36.  
  37. void do_action_3()
  38. {
  39.     PORTB |=  (1 << PB2); //rele be
  40.     _delay_ms(20000);
  41.     PORTB |=  (1 << PB2); //rele ki
  42. }
  43.  
  44.  
  45.  
  46.     int main(void) // Foprogram
  47.     {
  48.         unsigned int prew_state=0;
  49.         DDRB = 0b11111111; /*B port kimenet*/
  50.         PORTD |= _BV(PD5);
  51.           PORTD |= _BV(PD6);
  52.           PORTD |= _BV(PD7);
  53.           /* PD5,PD6,PD7-hez tartozó felhúzó ellenállás bekapcsolása,
  54.         PD4 alapból bemenet, nem szükséges külön megadni a DDRD regiszterben */
  55.  
  56. while(1)
  57. {
  58.     /*rele 1*/
  59.       if(PIND & _BV(PD2))
  60.       {
  61.              if(PIND & _BV(PD5))
  62.             {
  63.                 if(prew_state==0)
  64.                 {
  65.                     prew_state=1;
  66.                     do_action_1();
  67.                 }
  68.             }
  69.             else
  70.             {
  71.                 if(prew_state==1)
  72.                 {
  73.                     prew_state=0;
  74.                     do_action_1();
  75.                 }
  76.             }
  77.       }
  78.         /*rele 2*/
  79.       if(PIND & _BV(PD3))
  80.       {
  81.              if(PIND & _BV(PD6))
  82.             {
  83.                 if(prew_state==0)
  84.                 {
  85.                     prew_state=1;
  86.                     do_action_1();
  87.                 }
  88.             }
  89.             else
  90.             {
  91.                 if(prew_state==1)
  92.                 {
  93.                     prew_state=0;
  94.                     do_action_1();
  95.                 }
  96.             }
  97.       }
  98.         /*rele 3*/
  99.       if(PIND & _BV(PD4))
  100.       {
  101.              if(PIND & _BV(PD7))
  102.             {
  103.                 if(prew_state==0)
  104.                 {
  105.                     prew_state=1;
  106.                     do_action_1();
  107.                 }
  108.             }
  109.             else
  110.             {
  111.                 if(prew_state==1)
  112.                 {
  113.                     prew_state=0;
  114.                     do_action_1();
  115.                 }
  116.             }
  117.       }
  118.  
  119.  
  120. }
  121.     }
(#) csabeszq hozzászólása Ápr 30, 2015 /
 
Egy kérdésem lenne az 5V-os / 3.3V-os panelek szintillesztéséről.

Ahogy látom az ebay-en, az illesztés úgy történik, hogy sorbakötnek egy 470 ohm-os ellenállást, se zener, se kutyafüle.

Ez normális, vagy fusizás és rendesen megtervezett áramkörökbe ilyet ne rakjak?
(#) vzoole válasza Szabi1 hozzászólására (») Ápr 30, 2015 /
 
Timer-el lehetne szépen megcsinálni, de mivel nem tűnik időkritikusnak az alkalmazás ezért leírok egy egyszerű elvi megoldást...
  1. while(1)
  2. {
  3. if(KAPCSOLO_1) {rele_1_counter = 20000;}
  4. if(KAPCSOLO_2) {rele_2_counter = 20000;}
  5. if(KAPCSOLO_3) {rele_3_counter = 20000;}
  6.  
  7. if(rele_1_counter) {RELE_1_ON; rele_1_counter--; }
  8. else               {RELE_1_OFF;                  }
  9. if(rele_2_counter) {RELE_2_ON; rele_2_counter--; }
  10. else               {RELE_2_OFF;                  }
  11. if(rele_3_counter) {RELE_3_ON; rele_3_counter--; }
  12. else               {RELE_3_OFF;                  }
  13.  
  14. _delay_ms(1);
  15. }//while
A hozzászólás módosítva: Ápr 30, 2015
(#) vzoole válasza csabeszq hozzászólására (») Ápr 30, 2015 /
 
Vannak olyan mikrokontrollerek, perifériák, ahol az adat lábak tolerálják az 5V-ot is.
De ez a ritkább, tehát az ellenállásos megoldás az "általában működik" kategória. Hobbira elmegy, de kereskedelmi alkalmazásokban nem illik ilyet csinálni.
(#) vzoole válasza vzoole hozzászólására (») Ápr 30, 2015 /
 
A sötét érzékelés kimaradt...
  1. if(KAPCSOLO_1 && SOTET_VAN) {rele_1_counter = 20000;}
  2. if(KAPCSOLO_2 && SOTET_VAN) {rele_2_counter = 20000;}
  3. if(KAPCSOLO_3 && SOTET_VAN) {rele_3_counter = 20000;}
(#) Jaedong válasza csabeszq hozzászólására (») Ápr 30, 2015 /
 
Szia sok esetben működik viszont nem valami elegáns megoldás, komolyabb dolgokban szerintem nincs helye. Egyébként első sorban védő diódák miatt kell az az ellenállás,lásd. Szerintem nem nagy dolog egy fetet +2 ellenállást berakni szintillesztésként, egyszerű és szerintem a legtöbb célnak bőven megfelel.
(#) csabeszq válasza Jaedong hozzászólására (») Ápr 30, 2015 /
 
Erre gondolsz?

Van rajta két ellenállás osztó és két fet-es illesztő.
(#) Jaedong válasza csabeszq hozzászólására (») Ápr 30, 2015 /
 
Igen ilyesmire. Tetszik, hogy van képük elkérni egy ilyen egyszerűen után gyártható "alkatrészért" (kb 30 forint ) elkérni 238 forintot . Ez a sokak által használt változat. Itt van róla egy application note i2c-hez, és itt egy másik kisebb leírás is.
(#) csabeszq válasza Jaedong hozzászólására (») Ápr 30, 2015 /
 
Nézd, hobbi szinten űzöm az elektronikát. Nekem megéri fizetni 238 Ft-ot, csak hogy ne ezzel kelljen foglalkozni, hanem a témára tudjak koncentrálni. Házilag nem tudnám 238 Ft-ból kihozni. Drága az univerzális nyák, legyárttatni a panelt meg mégdrágább. Otthon már nem maratok nyákot, mert egy életre megundorodtam a vaskloridtól, az UV fénytől, meg a többiektől. Drágán rossz minőséget sikerült csinálni, komplett befürdés volt az egész. Röpködtek a tízezresek használhatatlan panelekre. Most legyárttatom, a tízezresek pedig használható panelekre röpködnek, ami valljuk be előrelépés.

(#) csatti2 válasza csabeszq hozzászólására (») Ápr 30, 2015 /
 
Ellenállásosztókat nem csak azért nem használnak, mert nem elegáns, hanem azért is mert lassúak (pocsék slew rate nagy frekvencián). Ugyanez igaz a zener diódákra is. Bár ott el lehet érni nagyobb sebességet is, de csak akkor ha 20-30mA-t kényszerít ki az ember a pin-ből (minél nagyobb az árama, annál gyorsabban reagál a zener).
A helyes megoldás vagy a diszkrét fet-ek használata vagy pedig az ún. buffer IC-k, illetve szint illesztő IC-k. Ezek gyorsak is, viszonylag olcsók is. A CD4050 40-80Ft, kb. 4MHz-ig jó (5V->3V3 esetén), a HC verziója (74HC4050) ennél gyorsabb működésre is képes. Bár ezek a chipek egy irányúak, 5V és 3V3 esetén elég csak az 5V-os jeleket lekonvertálni. Természetesen léteznek kétirányú konverzióra alkalmas chipek is picit drágábban (tényleg nem drágák).

Én otthon marom a nyákjaimat. A hangsúly a maromon van, mivel CNC-t használok erre a célra, vaskloridot sosem használtam. UV-t csak a lötstophoz használok (itt még van mit javítanom a technikámon, a védelem többnyire jó de esztétikailag még messze nem tökéletes). A kezdeti befektetés volt csak drága (bár a gép sok minden másra is jó, nem csak nyákra), a selejt arányom nem vészes (kb. 50% de javul gyakorlattal, többnyire az én hibámból történnek, benézek kétoldalas nyáknál illesztést, és hasonlók).
(#) V1rusH hozzászólása Máj 2, 2015 /
 
Sziasztok!

Egy kissé macerás az ügy, amiben segítség kellene, ugyan is még soha nem programoztam uC-t, még a legalap szinten sem, de van egy audio processzorom, ami I2C-n kommunikál, és szeretném felhasználni.
Az áramkör tartalmaz beépített csatorna választót. Ez nem kívánom használni, elég egy csatorna.
Tudnátok segíteni ebben nekem?
Milyen uC lenne a legmegfelelőbb a vezérlésre? Programozóm van, mert el akarok kezdeni AVR programozást tanulni.
A hozzászólás módosítva: Máj 2, 2015
(#) zombee válasza V1rusH hozzászólására (») Máj 2, 2015 /
 
AVR, azon belül is ATMega sorozat. Hardveresen támogatott I2C van bennük, de ha C-ben
szeretnél akkor a megfelelő könyvtárat is érdemes beszerezni.
(#) zombee válasza csatti2 hozzászólására (») Máj 2, 2015 /
 
TQFP IC-k alá is tudsz marni áramkört? Egy képet dobnál a marógépről? Milyen marófejjel megy?
(#) wbt válasza V1rusH hozzászólására (») Máj 2, 2015 /
 
Szia! Uc család/típus végül is lényegtelen, mind tudja az I2C-t, de SW megvalósítás sem bonyolult. Az "audio-processzorod" regiszterkiosztását kell még megértened (ami szerintem bonyolultabb lesz, mint az I2C) Ha mg soha nem programoztál uC-t, akkor azért 1-2-3 hónap kell majd a biztonsághoz vagy egy nagyon jó tanár/segítség. (aki a kisebb buktatókon átrugdos)
JAni
(#) V1rusH válasza wbt hozzászólására (») Máj 2, 2015 /
 
Nos 1-2-3 hónapot nem akarok várni, addig keresek más vezérlési módot az erősítő vezérlésére, végül is hangerőt lehet jóval egyszerűbben is szabályozni!
Mekkora munka megírni erre az ic-hez egy vezérlő programot olyannak aki meg tudja érteni az ic regiszter kiosztását ?
(#) csatti2 válasza zombee hozzászólására (») Máj 2, 2015 /
 
Igen tudok. Most épp rokonoknál vagyok, így csak linkelni tudok egy korábbi munkát (ez egy QFN kiszerelésű ATMEGA16U2-s áramkör). Egyébként egy módosított CNC3020-as gépem van (a vezérlőelektronikát teljesen átépítettem, kapott végálláskapcsolókat, stb.).

Gravírtűvel marok nyákot (90 fokos 0,1-essel nagyolok, 20 fokos 0,1-essel pedig a finom részleteket csinálom).
(#) wbt válasza V1rusH hozzászólására (») Máj 2, 2015 /
 
Belenéztem a pdf-be, ez nem egy bonyolult jószág (tehát igen messze van az audio processzortól), aki ráér, az szerintem pár óra alatt kiszoborja, de ugye az audio IC a feladat "vége", ehhez biztos lesz valami eleje is, gombok, kijelző, távirányító, webfelület, időzített kapcsolások, űrsikló, holdraszállóegység stb. Na, arra fog elmenni az idő, tehát hogy igazából mit is szeretnél/hogyan kapcsolgatni/szabályozni a hang-láncban. Tehát összességében nem az a 3-4 adat kiadása a feladat, hanem a környezethez illesztése.
JAni
(#) V1rusH válasza wbt hozzászólására (») Máj 2, 2015 /
 
Nyomógombos hangerő szabályzót szeretnék. Tudom erre van egyszerűbb céláramkör is, de most nincs pénzem rá, és stb dolgok, ez meg meg van ugyebár... Bár pofátlanság mással megiratni, de hátha lesz ki elválalja, ha nem nagy munka...
Egy ford autó rádiós magnójának paneljában lakik még.
Van egy atmegám, de a pontos típusát most így fejből nem tudom. Egy nixe òrát meghajt. Arra is lett felprogramozva.
(#) krisztianAMG hozzászólása Máj 3, 2015 /
 
Sziasztok!

Szükségem lenne egy Assemblerben megírt óra programhoz ATmega16-hoz, 4db 7 szegmenses kijelzővel. Már egy hasonló program is hatalmas segítség lenne, hogy ne a nulláról kelljen vele szenvedni.

Krisztián.
(#) Kovidivi hozzászólása Máj 3, 2015 /
 
Sziasztok!
SPI kommunikációnál master módban használok egy AVR-t, és nem használom a MISO lábat, mert csak 74HC595-tel kommunikálok. Úgy olvastam, hogy automatikusan, felülírhatatlanul input lesz a MISO, amíg be van kapcsolva az SPI periféria, de én még is szeretném kimenetként használni. Azt írja az adatlap, hogy a felhúzó ellenállással én rendelkezem, úgy kapcsolgatom, ahogy akarom. Működő megoldás lenne, ha mondjuk 1Mohm-mal lehúznám GND-re a PIN-t, tehát mikor nincs felhúzó ellenállás, akkor GND-t, ha pedig bekapcsolom a felhúzó ellenállást (kb. 25-50Kohm), akkor pedig majdnem a tápfeszültséget kapom? Esetleg meg tudnám támogatni egy tranzisztorral. Ezzel szeretném kapcsolni a Shift regiszter Latch lábát.
Működő megoldás ez?
Köszönöm!
A hozzászólás módosítva: Máj 3, 2015
(#) Kovidivi válasza krisztianAMG hozzászólására (») Máj 3, 2015 /
 
Szia.
Miért pont assemblerben kell? C-ben egyszerűbb lenne szerintem.
Következő: »»   662 / 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