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   726 / 837
(#) Jaedong válasza fecus hozzászólására (») Feb 29, 2016 /
 
Szia!
Két dolgot csinálhatsz:
1., Az egész programod c++ fordítóval eteted meg. Lehetnek olyan dolgok amiken kiakad, akkor azokat átdolgozot picit. Elvileg ha nem barbárkodtál nagyon, akkor nagy munkát nem kell végezned.
2., Minden c++ függvényhez amit meg akarsz hívni c kódból, ahhoz kell írni egy köztes függvényt, ami "c paraméterek kap", és ezeket átgyúrmázod olyanra, ami a c++ fügvényeddel kompatibilis.
Itt megtalálsz mindent ami csak kellhet. Amúgy van külön topikja a raspberry pi-nek (gondoltam szólok mielött valaki leharpja a fejed )
A hozzászólás módosítva: Feb 29, 2016
(#) zombee válasza FDAssasin hozzászólására (») Feb 29, 2016 /
 
Nem a tápnál kellene elkezdeni az okosítást! Én így kezdtem: adott egy régi Nokia töltő (LINK) ami a ráírt értékekkel(3.7V, 355mA) ellentétben jóval nagyobb feszt (kb. 8V) ad ki terhelés alatt is. Erre rákötsz egy 7805 stabilizátort, és kb. 200mA-el terhelheted. Az AVR-ed soha nem fog ennél több áramot felvenni!

Ha nem arduinozol akkor egy programozó is kelleni fog(persze erre arduino-t is használhatsz). Én nyomtatóportossal kezdtem, amit natúrba bekötöttem(erősítő IC nélkül) és jó is volt. PonyProg és Bascom kezeli. Lásd: kép.

Ja és ajánlott nagyobb(pl. ATMega16) IC-vel kezdeni, kezdőknél hamar elfogynak a lábak. És amit elsőként megépítenék az egy Fusebit Doctor. Hamar rájössz miért...
A hozzászólás módosítva: Feb 29, 2016
(#) zombee válasza csatti2 hozzászólására (») Feb 29, 2016 /
 
Hatásos (ohmos) terheléssel teljesen igazad lenne, ez viszont egy DC motor. Motornál én mindig induktív terheléssel számolok(tudom, terhelve nem tisztán az). PWM esetén a motortekercs induktivitása, a kapcsolótranzisztor és a schottky-dióda egy kapcsolóüzemű tápot alkot, a motortekercsben majdnem folyamatos áram folyik. Én pedig így számolok a méretezésnél: R_dsOn*(max. áram * kitöltési tényező)^2 = 1.5Ohm*(4.5A*0.33)^2=3.375W. Üresjárásban a motor a maximális áramának töredékét veszi fel, ha ezt PWM-el szaggatja akkor még ennek is csak az 1/3-át. Valószínűleg azért nem melegszik az IRF830, mert a CNC az 500W-os marómotorral túl van méretezve, a motor szinte üresen jár.

Konkrét adat a mostani projektemben szereplő motorról: 12V, 14A (168W), üresjáratban 1A-t vesz fel 100% kitöltés mellett, terheléssel 3A-t. PWM esetén a kitöltési tényezővel arányos az áramfelvétel üresjárásban és terhelve is. A túlméretezés azért kell mert így terhelve is közel azonos fordulatszámon jár a motor ami CNC-nél sem utolsó dolog.
A hozzászólás módosítva: Feb 29, 2016
(#) FDAssasin válasza zombee hozzászólására (») Feb 29, 2016 /
 
Ezzel csak az a baj, hogy nincs 7V feletti töltőm sajnos. A 7805-ös megoldásra én is gondoltam, de egy új táppal ,,drágabbra" jönnék ki, mint egy igazi arduinoval. Szóval semmiféle megoldás nem létezik erre az 5V dologra? Angol fórumokon 100 és 220 µF-os kondenzátort írnak, hogy azt kéne a táp földje és az 5V közé kötni. Ez a megoldás célravezető lehet?
(#) Kovidivi válasza FDAssasin hozzászólására (») Feb 29, 2016 /
 
Túlbonyolítod. Az Atmega328 max. 6V-tal táplálható, tehát a 4.8-5.25V tökéletes neki.
A hozzászólás módosítva: Feb 29, 2016
(#) csatti2 válasza zombee hozzászólására (») Feb 29, 2016 /
 
Én is így számoltam mint te, csakhogy 100% kitöltésnél 1,5*4,5^2 = 30,375W és nem 13,5W , amit te írtál (te 2-vel szoroztál és nem négyzetre emeltél).

Egyébként pedig illik maximum terhelésre méretezni a hűtést.
(#) zombee válasza FDAssasin hozzászólására (») Feb 29, 2016 /
 
A régi Nokia töltőt gombokért adják. Egyébként ipari környezetben működő áramköreim vannak, 5V-os kapcsolóüzemű (stabil) tápokkal. Persze ezek a tápok terheletlenül is 5V-ot adnak...
(#) csatti2 válasza FDAssasin hozzászólására (») Feb 29, 2016 /
 
A probléma a nagy kondikkal az "in-rush" áram (az elején a tranziens nagy áram, amíg a kondik töltődnek). Ez nem probléma ha külső tápot használsz, ha azonban a számítógép USB-jét is szeretnéd (arduino COM port), akkor letilthat a védelem (az USB szabvány max 10µF-t engedélyez, áramkorlátozás védelem nélkül, ráadásul a max áramfelvétel is csak 100mA lehet, amíg le nem tárgyalta az USB-n keresztül, hogy több kéne).
(#) zombee válasza csatti2 hozzászólására (») Feb 29, 2016 /
 
Igazad van, a hűtést 100%-os kitöltési tényezőre és a motor maximális terhelésére kell tervezni. Kérdés hogy ezt minden gyártó megteszi, vagy kicentizik az előforduló legnagyobb motorteljesítményhez. Márkás frekvenciaváltó kapcsolótranyóit láttam már elégni papírvastagságú hűtőbordán, és "túlterhelés" miatt a garanciális javítást sem vállalták.
Nem akarok vitázni a tapasztaltabb emberekkel, ezért OFF-ba teszem: az én képletemben négyzetre emelés van, és 3.375W az eredmény abban a speciális esetben, amikor 33% a kitöltési tényező és a motor maximális nyomatékát adja le. Ez a 30.375W-nak pontosan az 1/9 része.
A hozzászólás módosítva: Feb 29, 2016
(#) szebee hozzászólása Márc 2, 2016 /
 
Sziasztok!

Vettem régen egy ilyet de még nem használtam, valamire emlékszem hogy használat előtt kell vele valamit csinálni, de nem emlékszem hogy mit. Tud valaki segíteni?
Köszönöm!
(#) pont válasza szebee hozzászólására (») Márc 2, 2016 /
 
Ezzel semmit nem kell csinálni, a driver-ét kell feltelepíteni, és kell hozzá a programozó MCu hoz való foglalat összekötve egy ICSP foglalattal, vagy tüskesorral.
A hozzászólás módosítva: Márc 2, 2016
(#) attika válasza szebee hozzászólására (») Márc 2, 2016 /
 
Libusb kell hozzá és csakis eszközkezelőből kell hozzárendelni és utána felismeri a windows.
Parancsolj.
(#) fecus válasza Jaedong hozzászólására (») Márc 2, 2016 /
 
Köszönöm.

Csak nem tesznek ilyet...
(#) Szabi1 válasza Szabi1 hozzászólására (») Márc 3, 2016 /
 
A PWM egyáltalán nem akar működni, kicseréltem a mikrofont, egytranzisztoros erősítő van neki, azt érzékeli ha tapsolok. 25khz körüli PWM re volna szükségem, 50% kitöltéssel ha a mikrofon veszi a jelet, egy kis késleltetés utánna kitöltési tényező 0%. Próbáltam 100%-ra rakni a kitöltési tényezőt, de a mérőműszer mindig 2v körüli értéket mutat.
  1. #define F_CPU 6400000UL
  2. #include <util/delay.h>
  3. #include <avr/io.h>
  4.  
  5. void adc_setup (void)
  6. {
  7.     // Set the ADC input to PB2/ADC1
  8.     ADMUX |= (1 << MUX0)| (1 << MUX1);
  9.     ADMUX |= (1 << ADLAR);
  10.  
  11.     // Set the prescaler to clock/128 & enable ADC
  12.     ADCSRA |= (1 << ADPS1) | (1 << ADPS0) | (1 << ADEN);
  13. }
  14.  
  15. void pwm_setup(void)
  16. {
  17.                
  18.         // prescaler 1  FOR 25khz pwm  
  19.         TCCR0B = _BV(CS00);  
  20.        
  21.         // Set to 'Fast PWM' mode
  22.         TCCR0A |= (1 << WGM01) | (1 << WGM00);
  23.        
  24.  
  25.         // Clear OC0B output on compare match, upwards counting.
  26.         TCCR0A |= (1 << COM0B1);
  27.        
  28. }
  29.  
  30. int adc_read (void)
  31. {
  32.     // Start the conversion
  33.     ADCSRA |= (1 << ADSC);
  34.  
  35.     // Wait for it to finish
  36.     while (ADCSRA & (1 << ADSC));
  37.  
  38.     return ADCH;
  39. }
  40.  
  41.  
  42. int main (void)
  43. {      
  44.         // I/O SETTINGS, ALL I/O is input by default
  45.  
  46.         DDRB = _BV(PB1); //PB1 kimenet PWM
  47.         DDRB = _BV(PB0); //PB1 kimenet PWM
  48.         DDRB = _BV(PB4); //PB4 kimenet LED
  49.                 //DDRB = 0b00001011;
  50.         pwm_setup();
  51.         adc_setup();
  52.        
  53.         //variables
  54.         unsigned int adc_value;
  55.        
  56.         //pwm_write(0);
  57.         adc_value=0;
  58.        
  59.         OCR0B = 0;
  60.        
  61.         while(1)
  62.         {
  63.                 adc_value=adc_read();
  64.                 if(adc_value>25)
  65.                 {
  66.                         _delay_ms(100);
  67.                         adc_value=adc_read();
  68.                         if(adc_value>25)
  69.                         {
  70.                
  71.                                 PORTB |= _BV(PB4); // LED BE
  72.                                 OCR0B = 127;
  73.                                 //pwm_write(255);       //PWM piezzonak
  74.                                 _delay_ms(900); // varakozas
  75.                                 _delay_ms(900); // varakozas
  76.                                 _delay_ms(900); // varakozas
  77.                                 _delay_ms(900); // varakozas
  78.                                 PORTB &= ~ (1<<PB4);// LED KI
  79.                                 OCR0B = 0;
  80.                                 //pwm_write(255);               //PWM ki
  81.                         }
  82.                 }
  83.  
  84.         };
  85.          // végtelen ciklus vége;
  86. }
  87.  // foprogram vege;
A hozzászólás módosítva: Márc 3, 2016
(#) csatti2 válasza Szabi1 hozzászólására (») Márc 3, 2016 / 1
 
  1. DDRB = _BV(PB1); //PB1 kimenet PWM
  2. DDRB = _BV(PB0); //PB1 kimenet PWM
  3. DDRB = _BV(PB4); //PB4 kimenet LED
  4.  
  5. helyett
  6.  
  7. DDRB = _BV(PB1); //PB1 kimenet PWM
  8. DDRB |= _BV(PB0); //PB1 kimenet PWM
  9. DDRB |= _BV(PB4); //PB4 kimenet LED


De ez sem helyes (nem fog tökéletesen kikapcsolni):
  1. OCR0B = 0;

Inkább valami ilyesmi (példa):
  1. void SetFanPWM(int PWM)
  2. {
  3.         if (PWM > MAX_FAN) PWM = MAX_FAN;
  4.         if (PWM < MIN_FAN)
  5.         {
  6.                 TCCR0A &= ~_BV(COM0B1); // Switch off PWM pin
  7.         }
  8.         else
  9.         {
  10.                 TCCR0A |= _BV(COM0B1)// Switch on PWM pin
  11.                 OCR0B = PWM;
  12.         }
  13. }
A hozzászólás módosítva: Márc 3, 2016
(#) csatti2 válasza Szabi1 hozzászólására (») Márc 3, 2016 /
 
Az ADC rész sem valami szép. Ott mi is a cél pontosan?
(#) Szabi1 válasza csatti2 hozzászólására (») Márc 3, 2016 /
 
Az egyik barátom kért meg, hogy csináljak neki egy "kakasriasztót". Egy régi telefonból bontott mikrofon szolgál az ADC-n, kb. 1khz és 10khz közötti frekvenciákon kellene bekapcsolja a PWM kimenetet (25khz, 50% dutty). Bővebben: Link a mikrofont így illesztettem, a PWM kimenetre valami 5V ról kapcsoló logic FET-et szeretnék tenni (amit találok itthon), mert egy piezzót kapcsolgatna. Bővebben: Link ennek a videónak a hanganyagát megvizsgálva kell majd optimalizálni a mikrofont, lehet változtatok a harwdare-n és kap egy bandpass filtert. Hogy van-e PWM vagy nincs, a LED jelzi vissza.
A hozzászólás módosítva: Márc 3, 2016
(#) Szabi1 válasza csatti2 hozzászólására (») Márc 3, 2016 /
 
Köszönöm szépen, ez volt a probléma. A példában mutatott módszerrel kódoltam a PWM kitöltési tényező állítást, most minden működik.
(#) csatti2 válasza Szabi1 hozzászólására (») Márc 3, 2016 / 1
 
A 25kHz PWM az 25kHz-es hangot is fog kiadni.
Annak a példaáramkörnek is van rendesen baja (gyakorlatilag azon kívűl, hogy valami zajt fogott a mikrofon, másra nem jó az érzékelés). A bandpass filter jó ötlet, de ne felejtsd el, hogy vagy folyamatosan nagy sebességgel mintavételezel az ADC-vel (freerun mód megszakítással) és így keresed meg a csúcsértéket szoftveresen (nem lesz tökéletes de ha mondjuk 10x nagyobb a mintavételezési frekvenciád, mint a vizsgált frekvenciatartomány maximuma, az már lefogadható értéket produkálhat) vagy a filter után be kell tenni egy csúcs érzékelést is és hardveresen megoldani ezt. A jelenlegi ADC kezelésed nagyon sok fals érzékelést eredméynez majd.
(#) szebee válasza pont hozzászólására (») Márc 4, 2016 /
 
Köszönöm!
(#) szebee válasza attika hozzászólására (») Márc 4, 2016 /
 
Köszönöm!
(#) FDAssasin hozzászólása Márc 4, 2016 /
 
Sziasztok!
az lenne a kérdésem, hogy 328-as atmegából ha arduino-t építek, a 2 GND láb összeérhet? Illetve a 2 VCC és az AREF? Vagy az AREF pin elé kell valami hogy beköthessem a VCC-be?
(#) csatti2 válasza FDAssasin hozzászólására (») Márc 4, 2016 /
 
A két GND-nek természetesen közös potenciálon kell lennie. Az AREF-et nem kell bekötnöd, kivéve ha külső feszreferenciát szeretnél használni (pl. TL431). Azonban a pontosabb mérés kedvéért, szokás egy kondit kötni az AREF és a föld közé (pl. 100nF), mivel az aref lábat mindig összeköti az uC a kiválasztott referenciafeszültséggel, legyen az belső vagy külső (AVCC).
(#) csatti2 válasza FDAssasin hozzászólására (») Márc 4, 2016 /
 
Fontos még, hogy mindegyik VCC és AVCC láb saját 100nF-es kondit kapjon (láb és hozzá közeli föld láb közé), mivel a portok kapcsolgatásakor nagyon rövid időkre akár 100mA-t vagy nagyobb áramot is felvehet a mikro, ezért az áramutaknak rövidnek kell lennie (így csökkenthető a kiadott nagyfrekis zaj, illetve kondik nélkül instabil is lesz az uC).
Az AVCC láb tápját érdemes megszűrni a pontosabb analóg mérések kedvéért legalább egy ferritgyönggyel + 10µF kondival is (ez egy LC szűrőt eredményez, ami csökkenti a digitális portok által keltett nagyfrekis zajt), illetve igazán igényes kivitel esetén kiegészítve egy további lowpass LC szűrővel is a uC tápellátását (pl. 10uH +10uF), ez különösen hasznos DC-DC tápok esetén.
(#) csatti2 válasza FDAssasin hozzászólására (») Márc 4, 2016 /
 
Példa (picit más értékekkel, mivel a konverterre méreteztem a szűrőt, illetve ez egy ATXMEGA-t táplál [azért a 3.3V], ahol viszont már 12bites az ADC).
(#) p5efv hozzászólása Márc 9, 2016 /
 
Sziasztok!

Az alábbi program miért nem hajtja végre az interruptot?

  1. .INCLUDE "m162def.inc"
  2.  
  3. .ORG 0X0000
  4.         JMP             init
  5.  
  6. ;Timer0 Overflow Handler
  7. .ORG 0x0022
  8.         JMP             tim0_ovf
  9.  
  10. .ORG 0X0038
  11. init:
  12. ;STACK POINTER BEÁLLÍTÁSA
  13.         LDI             R16,HIGH(RAMEND)
  14.         OUT             SPH,R16
  15.         LDI             R16,LOW(RAMEND)
  16.         OUT             SPL,R16
  17.  
  18. ;PORTA KIMENET
  19.         SER             R16
  20.         OUT             DDRA,R16
  21.  
  22. ;PORTA=0
  23.         CLR             R16
  24.         OUT             PORTA,R16
  25.  
  26. ;TIMER0 INDÍTÁSA
  27.         LDI             R16,(1<<CS00)
  28.         OUT             TCCR0,R16
  29.  
  30. ;TIMER0 OVERFLOW INTERRUPT ENGEDÉLYEZÉSE
  31.         LDI             R16,(1<<TOIE0)
  32.         OUT             TIMSK,R16
  33.  
  34. ;GOLBÁLIS INTERRUPT ENGEDÉLYEZÉS
  35.         SEI
  36.  
  37.         LDI             R20,0XFF
  38.         LDI             R21,(1<<OCF0)
  39.         RJMP    main
  40.  
  41. tim0_ovf:
  42.         IN              R19,PORTA
  43.         EOR             R19,R20
  44.         OUT             PORTA,R19
  45.         RETI
  46.  
  47. main:
  48.         OUT             TIFR,R21
  49.         NOP
  50.         RJMP    main
(#) FDAssasin hozzászólása Márc 10, 2016 /
 
Sziasztok. Van egy USBasp programozóm, J1, J2 és J3 csatlakozással. A J1 5V-ra van állítva, a többi nincs összekötve. Win XP SP3-at használok illetve Arduino IDE-t. Feltettem a drivert (libusb 0.1.12.1) és a gép ki is írja hogy az USBasp-t csatlakoztattam, illetve hogy megfelelően van telepítve. Egy Atmega328-ból építettem ,,Arduino-t". Kapott a 16 megás kristályt, 22pf-os kerámiakondit, meg egy 10µF-os kondit az 5V és a GND közé. Viszont, amikor Arduino IDE-ben miután beállítottam hogy Arduino Uno és usbasp a programozó, a bootloader égetési kísérlet után ezt kapom vissza:

  1. avrdude: warning: cannot set sck period. please check for usbasp firmware update.
  2. avrdude: error: programm enable: target doesn't answer. 1
  3. avrdude: initialization failed, rc=-1
  4.         Double check connections and try again, or use -F to override
  5.         this check.
  6.  
  7. Hiba a bootloader égetése közben.


ezzel mit tudok kezdeni?
FW-t lehet updatelni Raspberry Pi-vel? vagy valami egyszerűbb eszközzel? nem akarok még egy programozót venni, ha nem muszáj.
(#) zombee válasza p5efv hozzászólására (») Márc 10, 2016 /
 
A legsúlyosabb hiba hogy az SREG-et nem mented a megszakításrutinban. A munkaregiszter(eke)t is szokás push-olni, de itt elhagyható mert máshol nem használod.

Én a TIFR-t sem piszkálnám, ha már egyszer interruptot használok. A flag-et amúgy is törli
egy megszakítás puszta meghívása(csak nem ezé!), ezért nem is értem. Amúgy sem így szoktak flag-et törölni, hanem SBI-vel.
(#) Sick-Bastard válasza FDAssasin hozzászólására (») Márc 10, 2016 /
 
Üdv!

A fuse biteket is átállítottad külső kristályra?
Az atmega328-ban van már beégetett Arduinos bootloader?
ISP-s (SPI) kapcsolattal próbálkozol vagy UART-ossal?
(#) p5efv válasza zombee hozzászólására (») Márc 10, 2016 /
 
Köszi a választ!

Lehet, hogy nem fogalmaztam meg egyértelműen a problémát.
Ez egy leegyszerűsített példa akart lenni arra a problémára, hogy ha akkor jön egy megszakítás, aminek a jelzőbitje ugyanabban a regiszterben van, amelyikben éppen törlök egy másik jelzőbitet, akkor nem hajtódik végre a megszakítás. Igaz, ezt eddig csak szimulátorban próbáltam, kipróbálom majd, hogy a valóságban is így van-e.
SBI-t jelen esetben nem lehet használni, mivel a TIFR regiszter az atmega162-ben a 0x38-as címen van, az SBI viszont csak 0x1F-ig használható.
A hozzászólás módosítva: Márc 10, 2016
Következő: »»   726 / 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