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   624 / 837
(#) Kovidivi válasza Hp41C hozzászólására (») Okt 24, 2014 /
 
Szia, köszi, én is így kerestem.
Ahol spéci IC szerepel, azt azonnal ki kell zárnom, ezen kívül csak ezt a megoldást találtam: Bővebben: Link. Ha ebből kettőt építek, lassú sebesség mellett működhet? Nekem nem kell nagy sebesség, csak a két irányú kommunikáció.
(#) vzoole válasza Droot hozzászólására (») Okt 24, 2014 /
 
100ms lesz az...
Kezdetnek jó lesz a szűrő...
Freki az olyan legyen, hogy minél kevesebb zajt termeljen... Ezt így nehéz lenne megmondani.
(#) killbill válasza Droot hozzászólására (») Okt 24, 2014 /
 
Az AVCC-t mindenkeppen kosd tapra. Akkor is, ha nem hasznalod az A/D-t.
A hoelemhez hozzatartozik, hogy, amikor eloszor kerdeztel a MAX chip-rol, es feltettel egy kepet a mert adatoktol, mar ott is 8-10 fokos ugralas volt. Ezen erdemes elgondolkodni. De, ahogy vzoole mondja, valoszinuleg a paka kapcsolgatasa okozza a zaj nagy reszet. Ilyen esetekben elofordul, hogy szinkronizaljak a PWM-et a mereshez. Mivel ez egy lassu valami, itt a PWM jelet akar sw-bol is elo lehet allitani, nem hiszem, hogy 10Hz-nel gyorsabb kellene. A merest meg mindig a futotest bekapcsolasa elott kell vegezni. De ez csak egy otlet, lehet, hogy rendes szuressel, es sw atlagolassal megoldhato a problema.
(#) minimodel hozzászólása Okt 24, 2014 /
 
A fórumból elvesztek hozzászólások, reggel mög egy lappal több volt de sebaj.

Szóval szeretném nektek a sok segítö választ megköszönni. Szimpatikus az AVR USBasp, de mivel itt Münchenben nem nagyon tudnák felprogramozni, egy ilyenre gondoltam megvenni. Pedig az építés és a felélesztés élmményét meghagyhatták volna nekem. Sme soros portom, sem LTP-m nincs a laptopomon már így csakis USB-s jöhet szóba.
(#) videokartyab hozzászólása Okt 24, 2014 /
 
Sziasztok

Picit elakadtam, adott egy mozgásérzékelő, ami ha érzékel, az atmegán keresztül növeli egy digitális hangerőszabályzó kimeneti jelét.
Ha viszont nem, akkor lecsökken a hangerő egy adott mértékig. A problémám az, hogy ez az egész egy while ciklusban van és így ha érzékel is a mozgásérzékelő(csak mozgást érzékel jelenlétet nem) mindenképpen le fog csökkenni a hangerő a minimális szintre. (mert nem ugrabugrálok előtte folyamatosan)

Azt szeretném megoldani hogy mielőtt elkezdené csökkenteni az értéket várjon mondjuk 1 percet és csak azután induljon el. És csökkentés közben ha érkezik újabb jel a mozgásérzékelőből akkor növelje a hangerőt(vissza) és megint csak 1 perc múlva kezdje ezt.

Mivel lehet ezt megoldani?
(#) Droot válasza killbill hozzászólására (») Okt 24, 2014 /
 
Köszönöm mindkettőtöknek a választ. Akkor megcsinálom amit tanácsoltatok és ha gond van jelentkezem.
(#) k3gy3tl3n válasza videokartyab hozzászólására (») Okt 24, 2014 /
 
Szia, szerintem csak be kell vezetned egy új változót aminek az értékét egy mozgás érzékelése után beállítod, majd folyamatosan csökken minden ciklusban mikor nem volt mozgás, ha lemegy 0-ig (nem volt mozgás már egy idelye) akkor elkezdesz halkítani, ha menetközben volt mozgás úra max-ra állítod az értékét.
(#) videokartyab válasza k3gy3tl3n hozzászólására (») Okt 24, 2014 /
 
Köszi szépen jó ötlet! Működik!
(#) minimodel hozzászólása Okt 24, 2014 /
 
Még egy utolsó felvetés a programozóval kapcsolatban: láttam videót, hogy Aurdino is tud programozni. Lehet avval jobban járok mint egy kis USB-sel, ha már mindenképp vennem kell és nem építhetek.
(#) pluto válasza minimodel hozzászólására (») Okt 24, 2014 /
 
Azt tudod, hogy a hozzászólásaidat a modik áthelyezték ide?
(#) minimodel válasza pluto hozzászólására (») Okt 25, 2014 /
 
Köszönöm, így már rátaláltam.
(#) Primary hozzászólása Okt 25, 2014 /
 
Egy ATMega128-al hogyan mérnétek két external interrupt között eltelt időt?
Az ICPx lábak sajnos foglaltak, így nem tudom használni az Input Capture módot.
Az egyik lábon, amire be van állítva az external interrupt, keletkezik egy felfutó él, majd megint egy felfutó él. A kettő között legalább 3-4 ms eltelik, de van amikor hosszabb. Ez lehet 500ms is, de ez nincs még leszögezve, de az 1:10 átfogást tudni kellene. A pontosságon még gondolkozom, ha már tudom mérni, akkor könnyebb lesz eldönteni, hogy milyen pontosan.
A feladat egy optikai kapu által érzékelt két lyuk közti idő lemérése.

Nekem megoldásként az jutott eszembe, hogy simán elindítok egy időzítőt, majd megállítom a következő eseménynél. Eztán kiolvas, töröl, újraindít...
(#) killbill válasza Primary hozzászólására (») Okt 25, 2014 /
 
Vagy azt csinalod sw-bol, amit az input capture. Mindket interruptnal letarolod egy folyamatosan szamolo szamlalo erteket, es egyszeruen kivonod a kettot egymasbol. Csak arra kell figyelni, hogy a szamlalo teljes korbefordulasa legalabb a duplaja legyen a leghosszabb merendo idokoznek. Tehat, ha 500ms a max, amit merni kell, akkor a szamallao legalabb 1 masodperc alatt jarjon korbe. 16 biten ez ~15us felbontas.
(#) Kovidivi válasza Hp41C hozzászólására (») Okt 26, 2014 /
 
Szia.
Két AVR közti leválasztott kommunikációra láttam egy megoldást, ahol a TX és RX lábak vannak optocsatolóval leválasztva. Ezt ki fogom próbálni, szimpatikusnak tűnik a megoldás. Nem is tudom, miért akartam kétirányú SDA lábat leválasztani, mikor ott van a soros port.
(#) lajos1969 hozzászólása Okt 26, 2014 /
 
Sziasztok!
Megépítettem ezt az időzítőt Atmega8-al. Csak van egy gond vele orosz vagy valami kínai a menűje, elég nehéz rajta eligazodni nem lehetne valahogy valami angol vagy magyarra átírni? Sajnos ehhez én nem értek.
Ha valaki tudna segíteni azt nagyon megköszönném!!
Ennyi infóm van róla ez alapján építettem meg.
(#) kapu48 válasza lajos1969 hozzászólására (») Okt 27, 2014 /
 
Ha nincsen forráskód az adott projecthez?
Akkor nem tudsz mit tenni!

Keres másik hasonló projektet, forráskóddal.
Biztos találsz tucatjával.
(#) lajos1969 válasza kapu48 hozzászólására (») Okt 27, 2014 /
 
Köszi szépen akkor marad így!!
(#) videokartyab hozzászólása Okt 27, 2014 /
 
Sziasztok

Egy potméterrel szeretném állítani egy változó értékét. Meg lehet ezt oldani valahogy?
Van egy komplett program, nálam egy adat nevű változó amivel beállítok egy hangerősséget. De több helyen is felülírom egy while cikluson belül.
Meg tudom e azt oldani, hogy pl létrehozok egy adat max változót és akkor a program nem tudja túllépni az adat max-ban definiált értéket?
(#) kapu48 válasza videokartyab hozzászólására (») Okt 27, 2014 /
 
Igen!
(#) gabi20 válasza videokartyab hozzászólására (») Okt 27, 2014 /
 
Rákötöd a poti kimenetét valamelyik ADC bemenetre
(#) Kovidivi válasza videokartyab hozzászólására (») Okt 28, 2014 /
 
Szia. A loop-ba raksz egy feltételt, hogy ha válozó>max, akkor változó=max; , vagy ezt berakod minden helyre, ahol változtatás jön létre, ha esetleg hosszabb ideig tartózkodnál egy while-on belül.
Egyik ADC bemenetre raksz egy potit, annak beolvasod az értékét, ekkor kapsz 0-1024 értéket. Nem tudom, hogy neked ez a változód minimum és maximum értéke mi, de biztos nem ez a határ, erre lehet használni a map( ) függvényt, ez arányosan átalakítja a változó értékét. Ha programból ÉS potiról is változtatni akarod a változót, akkor azt megteheted, hogy csak akkor írja felül a változót a poti értékével a program, ha megmozdul a poti. Ezt egyszerűen ellenőrizheted: ha (előzőpotiérték!=mostpotiérték), akkor változó=mostpotiérték. Ebben az esetben csak poti forgatáskor változik a változó, viszont ugrás szerűen! Ha előtte nulla volt, a poti viszont majdnem maximumon van, és megmozdítod, akkor egyből a változó értéke is nagy lesz. Ezt is ki lehet persze korrigálni...
(#) AxaGame hozzászólása Okt 28, 2014 /
 
Sziasztok!
Egy röpke megerősítést vagy fejrázást kérek a "szakiktól".
Igaz-e, hogy Tiny861 uP, PWM6 üzemmódban a negált kimenetek mindenképpen a hullámforma inverzei lesznek?
Pontosítva, kicsit bővebben:
Ha megnézem a z Atmel doksi 12-8 "Dead Time Generator" rajzát, akkor úgy tűnik, hogy OCWnx hullámhoz képest OCnx inverz mindig inverze lesz.
Ha viszont megnézem a 12-14 ábrát ("PWM6 Mode, Single-slope Operation, Timing Diagram", akkor úgy tűnik, hogy az inverz kimenet is OCW1A hullámmal azonos helyzetű.
Üdv!
(#) Hujikolp hozzászólása Okt 28, 2014 /
 
Sziasztok!

Van egy termék nálam, aminek a vezérlő IC-je egy ATXMEGA32D4. Ennek az egyik lába tönkrement. Milyen programozóval lehet ebből az IC-ből kinyerni a forráskódot, hogy ha a helyébe egy másikat forrasztok, akkor utána azt fel tudjam programozni vele? Ha esetleg van védelem, attól még a teljes területet ki lehet vele olvasni és azt átemelni egy ugyan olyan vezérlőbe?
Nincs valakinek véletlen egy napra kölcsön egy ilyen programozója? Hálás lennék érte!
(#) videokartyab hozzászólása Okt 29, 2014 /
 
Hol a hiba miért nem szól?
Ha csak szimplán nyomógombról változtatom adatki értékét(hangerőt) akkor tökéletesen működik.
Valahol elbénázom a ADC beállítást?
AREF és AVCC 5V ra vannak kötve AGND földön. AREF egy 100nF-os kondival földre kötve.
Poti így van bekötve ADC0-ra
POTI

sajat1.zip
    
(#) Hooligan01 válasza videokartyab hozzászólására (») Okt 29, 2014 /
 
Most komolyan, szerinted hányan szedik le a zipedet, hogy segítsenek megtalálni a hibát a kódodban? Szívesen ránéznék, de bocs én nem fogok zipelgetni.
(#) videokartyab válasza Hooligan01 hozzászólására (») Okt 29, 2014 /
 
Bocsi máris átjavítom.
Közben minden beavatkozás nélkül egyik beírás során megszólalt és azóta működik.
Szóval valami gond volt amit nem értek.
  1. #include <avr/io.h>
  2. #include <avr/interrupt.h>
  3. #include <util/delay.h>
  4.  
  5.  
  6. #define SPI_DDR  DDRB
  7. #define SPI_PORT PORTB
  8. #define SPI_2311_CS  PB4    // 2311 SPI-t aktivalo Chip Select lab
  9.  
  10.  
  11. unsigned int Beolvas8bitADC(unsigned char csatorna)
  12. {
  13. //ADMUX = (ADMUX & 0b01100000) | csatorna;    //ADC csatorna kivalasztasa
  14. ADCSRA |= (1<<ADSC);    // ADC konverzio elinditasa
  15. while (ADCSRA & (1<<ADSC));    // varas az atalakitasra
  16. ADCSRA |= (1<<ADSC);         // konverzió elindítás
  17. while (ADCSRA & (1<<ADSC));    // varas az atalakitasra
  18. return (ADCH);    // ADC ertek kiolvasasa
  19. }
  20.  
  21. int main()
  22. {
  23. //***************Atmega 16 periféria beállítások*******************
  24. //MOSI es az SCK lab beallitasa kimenetnek,SS(PB4)beáll. kimenetnek
  25.  DDRB = (1<<PB5) | (1<<PB7) | (1<<PB4);
  26. //SPI engedelyezese, Master mod, SPI orajel beallitasa (FCPU/16)
  27.  SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR1);
  28. //*****************************************************************
  29.  
  30.  
  31. //ADC CONFIG
  32. ADMUX |= (1<<REFS0)|(1<<ADLAR);    // Vcc mint referencia
  33. ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);  // ADC engedelyezese, ADC eloosztas = 128 (125 KHz)
  34.  
  35.  
  36. unsigned char adatki=180;  //kezdő hangérték 0-255 ~ (100-214) 192=0dB
  37.  
  38.  
  39. while(1)
  40. {                      
  41.   adatki=Beolvas8bitADC(0);
  42.        
  43.  
  44.  
  45.   //**************SPI kommunikáció********************         
  46.   SPI_PORT &= ~(1<<SPI_2311_CS); // 2311 SPI bekapcsolasa (CS lab logikai alacsony szint)
  47.   _delay_us(1);
  48.  
  49.   SPDR = adatki;  //Adattranszfer elinditasa (MOSI)
  50.  
  51.   while(!(SPSR & (1<<SPIF)));  
  52.                                                                                                
  53.   SPDR = adatki;   //következő bájt küldése
  54.   while(!(SPSR & (1<<SPIF)));  //Varakozas amig az adattranszfer befejezodik
  55.  
  56.   // 2311 SPI kikapcsolasa, Latch kimenetek bekapcsolasa
  57.   SPI_PORT |= (1<<SPI_2311_CS);
  58.  
  59.  
  60. }//while lezáró
  61.  
  62. return 0;
  63. }
(#) csabeszq válasza Hujikolp hozzászólására (») Okt 29, 2014 /
 
Általában le szokták tiltani, hogy kész termékből a kódot kiolvasd.
(#) Melphi hozzászólása Okt 29, 2014 /
 
Egy kis érdekesség.
(#) zsolt58 hozzászólása Okt 29, 2014 /
 
Sürgös!
Az Atmega16-16PU ugyanaz mint az Atmeg16?
A hozzászólás módosítva: Okt 29, 2014
(#) Jaedong válasza zsolt58 hozzászólására (») Okt 29, 2014 / 1
 
Szia!
Atmega16 után a 16 az órajelre utal(és e miatt szükséges nagyobb tápfeszültségre!!!) a pu meg a tokozásra. Egyébként ilyen kérdésekre általában az adatlapban (is) megtalálod a választ. ctrl+f ott is működik. (nem rosszindulatból mondom, de időt spórolhatsz magadnak. )

atmega16.png
    
Következő: »»   624 / 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