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   473 / 840
(#) mzozo95 válasza zombee hozzászólására (») Aug 30, 2012 /
 
Hű, köszi hogy szóltál, programozó csatlakozó az áramkörbe lesz integrálva, sokat bosszankodtam volna emiatt...
(#) zombee válasza mzozo95 hozzászólására (») Aug 30, 2012 / 1
 
Tudom, ez csak egy apróság. Egyébként a legtöbb esetben 10k-t alkalmaznak felhúzü ellenállásként,
és nem csak a reset, hanem rendes portra kötött nyomógombos megoldásoknál is.
Kisebb áramköröknél még ezt is le szokták hagyni, elég a belső felhúzó ellenállást(~47k) beállítani.
(#) Proci_85 válasza Proci_85 hozzászólására (») Aug 30, 2012 /
 
Közben találtam egy teljesen más ENC28J60 libary-t. Bővebben: Link

Érdekessége, hogy a WizNet chippel szerelt panelhez hasonlóan, itt is bejön az egyszerűbb függvények sora, mint pl.:
  1. client.print("Hello World");

És az igazán ficsőrös benne az, hogy szintaktikailag megegyzik a használata a Serial.print utasítással, így amit sorosra ki tudok iratni (lásd korábban byte alapú adat HEX formában), azt ide is:
  1. for( byte i=0; i < 8; i++) {                        
  2.               client.print(allAddress[k][i], HEX);                
  3.             }

Ilyenek összetákolása után pedig (Zsom Gyula után szabadon) egyenesen megkönnyezi az ember
Ezt ilyen egyszerűen is lehet, ráadásul lebegőpontos értéket is zokszó nélkül kiprintel negatív előjellel is:
  1. client.print(printTemperature(allAddress[k]));


Az egész ethernek kezelés néhány sor, a teljes lefordított kód szűk 1 kbyte-tal lett nagyobb (13.5->14.5k), mely csökkenthető még, a Dallas include-ra nincs nagy szükség, onewire modullal is 1:1 megoldható.

Ha hamarabb rátalálok, nem szívok (és nem tanulok) emmyit az elmúlt 3-4 nap alatt
(#) sikolymester válasza Proci_85 hozzászólására (») Aug 30, 2012 /
 
Byte tomb char tombbe alakitasahoz nezd meg a stdlib.h -t. Ott talalsz egy itoa() fuggvenyt.
(#) Proci_85 válasza sikolymester hozzászólására (») Aug 30, 2012 /
 
Köszi megnézem, bár google szerint elég necces a téma, mert ráadásul a byte tartalma csak HEX formában értelmezhető az ember számára, tehát 8 byte-ot 16 karakteren tudom csak letároln
(#) pluto válasza mzozo95 hozzászólására (») Aug 30, 2012 /
 
Szia!

Használd az eredeti ATMEL ajánlást. Abból még nem lett baj. R=10K, C=4,7nF, Dióda pl:1N4148.

Reset1.PNG
    
(#) zolee1209 válasza Proci_85 hozzászólására (») Aug 31, 2012 /
 
Jájj de imádtam az Öreget!
Nyamanyama
(#) kurosaki hozzászólása Aug 31, 2012 /
 
Sziasztok
csatlakoztam hozzatok mint AVR használó megvagyok vele elégedve.Csak pár kérdésem lenne első: Error Settings USBASP ISP Clock ez mitöl lehet?? (a program rairodik ettöl független meg minden) de nem tudom szabalyozni a sebesseget a Khz elvileg 80000 ra kene tennem de nem tudom mert nem fer hozza a Clock hoz ezek szerint
Attiny45 - AVR Studio 6 ban irom a programot es Khazama AVR Programerrel egetem ra. elöre is köszönöm a segitséget.
(#) sikolymester válasza kurosaki hozzászólására (») Szept 2, 2012 /
 
Mivel nem kaptál választ, ezért javaslom, hogy kérdezd attól akitől vetted. Biztosan tud valamit erre mondani neked.
(#) zombee válasza sikolymester hozzászólására (») Szept 2, 2012 /
 
Szerintem külföldről vehette, normális ember itthon nem gyárt USBASP-t...
(#) Nastro hozzászólása Szept 2, 2012 /
 
Sziasztok!
ATmega16-ra írom a következő kódot:

  1. #include <avr/io.h>
  2. #define F_CPU 20000000UL
  3. #include <util/delay.h>
  4. #include <stdio.h>
  5. .....
  6. void Konfig10bitADC(){
  7.         ADMUX = 0x40;
  8.         ADCSRA = (1<<ADEN) |
  9.                  (1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|
  10.                  (1<<ADATE)|
  11.                  (1<<ADIE) |
  12.                  (1<<ADSC);                                                    
  13. }
  14. .....

AVRStudio-t használok, feltelepítettem a WinAVR-t. Fordításkor a következő hibát kapom:
../tpanel.c: In function 'Konfig10bitADC':
../tpanel.c:72: error: 'ADATE' undeclared (first use in this function)
../tpanel.c:72: error: (Each undeclared identifier is reported only once
../tpanel.c:72: error: for each function it appears in.)

Ez a programrész egyszer már működött, nem tudom, hogy most miért nem.
Tudtok segíteni? Valamit nem include-oltam? Vagy valamilyen könyvtár hiányzik? Előre is köszönöm!
(#) Nastro válasza Nastro hozzászólására (») Szept 2, 2012 /
 
Közben rájöttem, elég banális hiba volt.
A Project->Configuration Optionsben rossz eszköz volt beállítva. Bocs...
(#) kurosaki válasza zombee hozzászólására (») Szept 2, 2012 /
 
MI a baj az USBASP vel? szerintem tök korrekt kis kütyü csak ez az egy hibaja hogy a CLOCK ot nem tudom allitani vagy a bekötes rosz nem tudom de legalabb müködik amire kell nekem.

---EDIT----
Valaki tudna segiteni egy kis kodreszlettel? szeretek egy Csipogo hangot ellöallitani egy Piezo val ami eprcenkent csipog es egy ledet ami szinten villog külön mind a 2 meg van de hogyan tudnam egybe gyurni?? a kod meg talalhato a AVR nyolclabbal cimü leirasban a Csipogo keszites. csak ott sajna a led nem villog hanem vilagit meg kikapcsol.
A hozzászólás módosítva: Szept 2, 2012
(#) trudnai válasza kurosaki hozzászólására (») Szept 3, 2012 /
 
En azt hittem meg szeretned tanulni az AVR programozasat. Ha igy van, akkor kezdd el modositgatni azt a programot amit abban a nyolc labu cikkben talaltal, es ha elakadsz, akkor tudunk segiteni. De megirni helyetted nem lenne ertelme, mert akkor egyreszt nem tanulod meg masreszt minden alkalommal ha valami mast szeretnel a programodba, akkor ujra meg kell majd kerj minket, hogy irjuk meg helyetted -- mi pedig ezt nem szeretnenk
(#) kurosaki válasza trudnai hozzászólására (») Szept 3, 2012 /
 
eabaj hogy elakadtam benne.
tul bonyolult. a ledet megoldottam nagyabol de a dallamot nem tudtam kivenni es valamivel egyszerübb re gondoltam nem ien bonyolultra :/ amit meg neten talaltam egy külön .h filebol olvasta be a dallamot de nekem csak csipogas kene :/ probaltam modositani de hiaba adtam meg a labot amin csipogna semmi sem törtent vagy ERROR :/ probaltam azt is hogy külön .h filebol beolvasatni vagy valami de error .

Programozo AVR Studio 6 - Égető Khazama AVR - Attiny45 20PU
A hozzászólás módosítva: Szept 3, 2012
(#) trudnai válasza kurosaki hozzászólására (») Szept 3, 2012 /
 
En azt javasolnam, hogy a tanulasi fazisban ne probalj meg egyszerre tobb dolgot megerteni, es, hogy kezdd az alapoknal, ne rogton bonyolultabb dologkkal. Csecsemo sem rogton gatfutassal kezdi, hanem elubb hasrol hatra, majd hatrol hasra fordul, aztan elkezdi negykezlab hintaztatni magat, majd kuszik hatra meg elore is, szoval jo par fazison atmegy mire egyaltalan felall, es akkor meg hol van a futas kozbeni ugralgatasoktol! De ha rogton a vegen kezded akkor szinte torvenyszeru a sikertelenseg!
A hozzászólás módosítva: Szept 3, 2012
(#) kurosaki válasza trudnai hozzászólására (») Szept 3, 2012 /
 
külön külön megtudom irni ez a vicces hogy ha egybe szeretnem tenni nem tom h kene na mind1 akkormeg annyit kerdeznek hogy LED nel lehet definalni hogy off-on mast is lehet?
pl:
#define C4_ON() PORTB |= (1< #define C4_OFF() PORTB &= ~(1<
a csipogast is lehet igy megoldani? vagy azt kimondottan kodreszbe kell irni?>>>>
(#) trudnai válasza kurosaki hozzászólására (») Szept 3, 2012 /
 
Nem teljesen latom a kododat, mert valamiert ugy tunik a HE levagta -- rakatintottal a Kod gombra alul es ugy tetted be?

Na mindegy, ha jol sejtem mit csinaltal akkor az mukodhet igen. De ezek elemi muveletek. A csipogas is es a LED villogtatas is idozites vegeredmenyeben. A csipogasnak hallhato frekvenciaval ki-be kapcsolgatod a port labat ami egy vegtranyo segitsegevel egy piezora vagy hangszorora van kotve. A LED-nel meg ennel joval lassabban kell villogtatnod. Pszeudo koddal a csipogas valahogy igy nezhet ki:

  1. for( i = 0; i < 100; i++ ) {
  2.     HANGBE();
  3.     DELAY(1/1kHz);
  4.     HANGKI();
  5.     DELAY(1/1kHz);
  6. }


Ugyanez LED villogtatasnal:

  1. for( i = 0; i < 100; i++ ) {
  2.     LEDBE();
  3.     DELAY(1/10Hz);
  4.     LEDKI();
  5.     DELAY(1/10Hz);
  6. }


Remelem erzekelheto a ketto kozotti eros osszefugges?

Namost a kettot osszetenni sem bonyolultabb, csupan a LED idozitesebe kellene valahogy a csipogast bele izzitani, valahogy igy:

  1. for( i = 0; i < 100; i++ ) {
  2.     LEDBE();
  3.     CSIPOGAS();
  4.     LEDKI();
  5.     DELAY(1/10Hz);
  6. }


A CSIPOGAS() makro vagy fuggveny lehet a fentebb leirt csipogo algoritmus. Ugye abban 100*2*1ms az idozites, azaz 200ms -- ez a 10Hz-hez kepest (100ms) ketszer hosszabb ideig tart. Tehat ha ez nem tetszik akkor ott a 100-at leveheted 50-re, avagy a frekvenciat megemelheted, tehat a varakozast 1ms-rol lecsokkented 500us -re amitol magasabb hangot fogsz hallani.

Hangsulyozom, hogy ez a megoldas annyira "baba hasrafordulos eset", hogy a korabbi absztrakcional maradjak, hogy ezt csak tanulasra javasolnam -- hiszan ahogy mar feszegettuk a LED pislogasi ideje tul sok mindentol fog fuggeni, nehez jol beloni egy ilyet, es ha kesobb valtoztatni kell, akkor nehez karban tartani. De most egyenlore remelem megteszi, es ha ez megy, akkor nezegethetned a billentyuzet kezelest mielott megszakiasokkal folytatnad.
A hozzászólás módosítva: Szept 3, 2012
(#) sikolymester válasza kurosaki hozzászólására (») Szept 3, 2012 /
 
En pedig arra kernelek meg, hogy hasznalj a mondataidban irasjeleket, illetve nagybetuket. Ennyi erofeszitest tan megerdemlunk toled, hogyha mar segitsegere szamitasz tolunk. Koszonom!
(#) lalus hozzászólása Szept 3, 2012 /
 
Szevasztok!!! Kérdésem a következő lenne: STK200-as http://blog.savel.org/stuff/stk200.png programozóval lehet Attiny45-öst programozni??
(#) sikolymester válasza lalus hozzászólására (») Szept 3, 2012 /
 
Kérlek áruld el nekünk, hogy miért nem tudsz rákeresni erre neten?
(#) lalus hozzászólása Szept 3, 2012 /
 
Rákerestem, de nem kaptam SZÁMOMRA egyértelmű választ sehol... ezért tettem fel itt a kérdést, gondolhattad volna, hogy nem jövök minden kis aprósággal, előbb rákeresek és ha nem hoz eredményt akkor jön a fórum....
(#) sikolymester válasza lalus hozzászólására (») Szept 3, 2012 /
 
Hát pedig hidd el, nem egy ember esik ide be, mert nem képes használni a keresőt.
Íme:http://lmgtfy.com/?q=stk200+attiny45
Az első két találat szerintem eléggé egyértelmű. A harmadik nem olyan egyértelmű, ellenben a negyedik találat konklúziója igencsak az.
A hozzászólás módosítva: Szept 3, 2012
(#) kurosaki válasza sikolymester hozzászólására (») Szept 3, 2012 /
 
Bocsánatot kérek és figyelni fogok rá.
Köszönöm szépen a segitséget este írok, hogy sikerül-e.
(#) Proci_85 hozzászólása Szept 3, 2012 /
 
Sziasztok

Ha analóg jelet szeretnék beolvasni és a VREF-nek a belső 5V-os VCC-t választom, akkor az avr-től kapott ADC értéket a következő egyenlettel alakítom át?
5/1024 *ADCout
Az így maximálisan kapható 1023-as érték 5 [V] / 1024 * 1023 = 4,9951171875 V ?
Melynek magyarázata az, hogy az 0-1023-ig tudja 10 biten felbontani a VREF-et és folyamatos közelítéssel összehasonlítani a bemenő jellel és legutolsó (1023) értéket rápakolva már nem tudja összemérni a VREF-fel, mert túlcsordulna?

Egy visszaigazolást szeretnék kérni, mert több helyen (szerintem tévesen) 1024 helyett 1023-mal osztják le a VREF-et, mert szerintük így az 5V tényleg 5V kiértékelés után is.
Megfeledkezve arról, hogyha VREF alatti feszültséget mérnek, egy bitnyi hibát bevittek.

Előre is köszönöm.
(#) Csépe Zoltán hozzászólása Szept 3, 2012 /
 
Sziasztok!

Egy fejlámpa fejlesztésébe fogtam és van egy kis problémám. A mellékelt kapcsolást két power leddel elkészítettem, és a mellékelt kóddal hajtanám meg. Szimulátorban jól is megy, viszont mikor összeépítettem nem hajlandó megfelelően működni a két led nem világít egyszerre. Ha bekapcsolom az egyik ledet és utána lenyomom a másik ledhez tartozó nyomógombot akkor csak villan az eddig világító led és másikkal nem történik semmi. A kapcsolást úgy csináltam meg hogy elem helyett egy tápegységet használtam és groundokat mind a tápegység negatív ágához kapcsoltam. Szerintetek mi lehet a hiba?
(#) blackdog válasza Proci_85 hozzászólására (») Szept 3, 2012 /
 
Először is a belső referencia 2,56V. Amúgy olvasd el ez: http://www.hobbielektronika.hu/cikkek/will-i_v20_robotika_es_avr_ke...2.html
0-1023 az pontosan 1024 bit. Ha tévedek akkor elnézést!
De Google-be bepötyögve mindenre ott a válasz is: http://www.google.hu/search?client=opera&rls=hu&q=avr+adc&sourceid=...uggest
A hozzászólás módosítva: Szept 3, 2012
(#) trudnai válasza Proci_85 hozzászólására (») Szept 3, 2012 /
 
Igen, hat ha bele gondolsz, a max ertek amit kiolvasol az ugye 1023. Ez lesz a maximalisan merheto feszulyseg, jelen esetben 5V. Hogy hogyan kapod meg a szamot?
  1. ( meres / 1023 ) * 5

Ezzel csak annyi a gond, hogy elobb kapsz egy 0-1 erteket, amit majd felszorzol a meres tartomannyal. Ehhez pedig float kell. Hogy elkeruljuk probalkozhatunk ezzel is:
  1. meres / ( 1023 / 5 )

Ezzel meg az a baj, hogy ha nem float-okat hasznalsz, akkor pontatlan lehet a dolog, meghozza meglehetosen pontatlan (1023 / 5 = 204.6, tehat kerdes 204-re vagy 205-re szeretned-e kerekiteni ezt a szamot... 205 nekem szimpatikusabb, de igy is 4.99 -et kapsz ami neked szepen 4-re le lesz vagva, tehat nem vagy ki a bilibol)
  1. ( meres * 5 ) / 1023

Na ez mar jo, pontosan 5-ot kapsz ha 1023 a mert ertek (mily meglepo, igaz? ) Azonban mivel nem float-ot hasznalsz a tort resz igy is elveszik. Ha elegendo egyetlen tizedes, akkor lehetne igy is csinalni:
  1. ( meres * 5 * 10 ) / 1023

azaz
  1. ( meres * 50 ) / 1023

Akkor 1023 eseten 50-et, 511 eseten 25-ot kapsz eredmenyul -- kijelzes kerdese, hogy ebbol 5.0-t ill 2.5-ot kapj...

Ezt esetleg optimalizalhatod:
  1. ( meres * 5 ) / 102

meg igy is talan eleg pontos az eredmeny...

Ha ket tizedes kell, akkor pedig:
  1. ( meres * 5 ) / 10

Ami mar eleg pontatlan lesz, de az elonye, hogy optimalizalhato:
  1. meres / 2

Ami persze 511 -et ill 255-ot ad 5 ill 2.5 eseten. Tehat nem pontos, de kompenzalhato:
  1. V = meres / 2;
  2. V = V - (V / 50)

Valoszinuleg meg igy is joval gyorsabb es kisebb kodot kapsz, mintha float-okkal szamolnal.
(#) kurosaki hozzászólása Szept 3, 2012 /
 
Üdvözletem mindenkinek.
Történt egy apró galiba.Konkrétan szegény AVR -emre (Attiny45 re egy Fuse and Lock ot nyomtam) de nem tudta Írni. gondoltam semmise történt mert akk nem error lett volna.Hát de nem sajna most nem tudom kiolvasni az ID jét se írni rá.Kuka az egész Chipem?Le ellenőriztem a kábeleket minden a helyén van.
csatoltam a hibát is hátha valaki tud segiteni.
------------------------Új Kérdés------------
Előbb nem rég feltettem egy kérdés hogyan tudnám szinkronba hozni a Ledet és a csipogást.
Kaptam egy választ és próbáltam felhasználni.Erre jutottam de nekem úgy kéne hogy percenként majd 5 perc után egyre gyorsabban. ha kiveszem az IF,Else függvényt részt akkor hogy tudom megadni hogy a csipogás az adott lábon jöjjön ki? akárhogy átírtam kivettem beraktam mindig vagy hiba fordításnál vagy nem működött.
Mielőtt valaki rosszra gondolna egy Airsoft Játékra készíteném-e szerkezetet.
-----EDIT------
Attiny45 helyett a Attiny13 megfelel? ilyen kisseb dolgokra? bar aza 300ft nem szamit sokat nekem csak megis ha veletlen elfüstöl miattam akkor olcsobb a potolasa (kivéve ha feltudom eleszteni szegeny Attiny45 ömet) elöre is köszönöm a segitséget.
  1. #include <avr/io.h>
  2.     #include <util/delay.h>
  3.  
  4.          #define C4_ON()    PORTB |=  (1<<PB4)
  5.      #define C4_OFF()    PORTB &= ~(1<<PB4)
  6.  
  7.  
  8.     #include <avr/io.h>
  9.     #include <util/delay.h>
  10.    
  11.     //-------------------------------------
  12.     void m_delay_10ms(unsigned long val) {
  13.             //-------------------------------------
  14.             while(val--) _delay_ms(10);
  15.     }
  16.    
  17.     //-------------------------------------
  18.     void do_delay(uint16_t ms_delay, uint16_t num_ms, uint16_t us_delay, uint16_t num_us)  {
  19.             //-------------------------------------
  20.             uint16_t i;
  21.            
  22.             for(i=0;i<num_ms;i++) _delay_ms(250);
  23.             for(i=0;i<ms_delay;i++) _delay_ms(1);
  24.             for(i=0;i<num_us;i++) _delay_us(250);
  25.             for(i=0;i<us_delay;i++) _delay_us(1);
  26.     }
  27.    
  28.    
  29.     //-------------------------------------
  30.     void generate_tone(uint16_t frequency, uint16_t duration)
  31.     //-------------------------------------
  32.     {
  33.             uint32_t total_delay_time;
  34.             uint16_t total_ms_delay_time, total_us_delay_time;
  35.             uint16_t num_us_delays, num_ms_delays, ms_delay_time, us_delay_time;
  36.             uint16_t num_periods;
  37.            
  38.             total_delay_time = (1000000/frequency)/2-10;
  39.            
  40.             total_ms_delay_time = total_delay_time/1000;
  41.             num_ms_delays = total_ms_delay_time/250;
  42.             ms_delay_time = total_ms_delay_time%250;
  43.            
  44.             total_us_delay_time = total_delay_time%1000;
  45.             num_us_delays = total_us_delay_time/250;
  46.             us_delay_time = total_us_delay_time%250;
  47.            
  48.             num_periods = ((uint32_t)duration*1000)/(1000000/frequency);
  49.            
  50.             while((num_periods--) != 0)
  51.             {
  52.                     do_delay(ms_delay_time, num_ms_delays, us_delay_time, num_us_delays);
  53.                     PORTB |=  (1<<PINB3);
  54.                     do_delay(ms_delay_time, num_ms_delays, us_delay_time, num_us_delays);
  55.                     PORTB &= ~(1<<PINB3);
  56.             }
  57.            
  58.             return;
  59.     }
  60.    
  61.     //-------------------------------------
  62.     int main(void) {
  63.             //-------------------------------------
  64.             DDRB = (1<<PINB3)|(1<<PINB4); //csak a PB3 és a PB4 kimenet
  65.             while(1) {
  66.                     generate_tone(10000,300);
  67.                         C4_ON();
  68.                         m_delay_10ms(100); //100*10ms = 1s
  69.                         C4_OFF();
  70.                                 m_delay_10ms(6000); //100*10ms = 1s
  71.                                
  72.                        
  73. ;
  74.  
  75.  
  76.                     if(PORTB & (1<<PINB4)) PORTB &= ~(1<<PINB4);
  77.                    else
  78.                    
  79.                   //C4_ON();
  80.                    m_delay_10ms(1); //100*10ms = 1s
  81.                   // C4_OFF();
  82.             }
  83.             return 0;
  84.     }
A hozzászólás módosítva: Szept 3, 2012

hiba.png
    
(#) sgt válasza kurosaki hozzászólására (») Szept 3, 2012 /
 
Ha lockoltad, akkor búcsút inthetsz neki. Ha csak a CLOCK-ot állítottad volna akkor van még remény, de így már nem, mert hardveresen lockolja saját magát.

Ha azt szeretnéd, hogy egyre gyorsabb legyen, akkor a végtelen ciklusban a delayek helyére egy iterációval felszorzott értéket tegyél.

Attiny13 egy végtelenül lecsupaszított jószág. Ha 1 kB ROM-ba beleférsz, akkor oké.

Kérlek mondd, hogy még nem érettségiztél le!
Következő: »»   473 / 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