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   678 / 840
(#) Szabi1 hozzászólása Júl 7, 2015 /
 
Sziasztok! Ha egy LDR-el csak azt szeretném vizsgálni, hogy sötét van vagy nincs akkor szükséges ADC-re kötni ATMGEA8 esetén?
(#) Zsolt2 válasza Szabi1 hozzászólására (») Júl 7, 2015 /
 
Nem szukseges. Lehet hasznalni a belso analog komparatort vagy kulso analog komparatort (muveleti erosito) vagy ha eleg nagy tartomanyban be lehet allitani az LDR kimeneti feszultseget akkor direkt az I/O bementre is lehet kotni.
(#) Ivan93 válasza Ivan93 hozzászólására (») Júl 7, 2015 /
 
Köszönöm a válaszokat!
@vzoole: Ahogy ígértem: kód és kapcsolás. (mellékletben van teljes kód mindennel együtt)
Ez az spi init:
  1. void initSPI()
  2. {SPCR=(1<<SPE)|(1<<MSTR)|(1<<CPHA)|(1<<SPR1)|(1<<SPR0); //spi engedélyezve, mester mód, spi 1-es mód, ??-es előosztás
  3. }
ez pedig az olvasás:
  1. uint16_t get_temperature() //hőmérsékletet adja vissza, HA 0 AKKOR NINCS HŐELEM CSATLAKOZTATVA !!!
  2. {
  3.         uint16_t temp=0;
  4.         PORTB&=~(1<<PB2);       // max6675 kiválasztva
  5.         _delay_us(1);
  6.         SPDR=0x00; //valami küldése
  7.         while(!(SPSR & (1<<SPIF)))
  8.         temp|=SPDR<<8;
  9.         SPDR=0x00; //valami küldése
  10.         while(!(SPSR & (1<<SPIF)))
  11.         temp|=SPDR;
  12.         PORTB|=(1<<PB2);        // SS felhúzva
  13. //      if(!(temp & 0b00000100))        // ha van a hőelemmel kapcsolat
  14. //      {
  15. //              temp=(temp>>5)&(0b1111111111);
  16. //      }//if
  17. //      else {temp=0;}
  18.         return temp=SPDR;
  19. }//hőmérséklet lekérdezése
az inicializálási részben pedig beállítom a lábakat:
  1. DDRB=0b00101110;        //5:sck, 4:miso, 3:mosi, 2:SS, 1:optotriak
  2.         DDRC=0b00111111;        //seg6-seg1
  3.         DDRD=0b11100111;        //7:dig3, 6:dig2, 5:dig1, 2:led_r, 1:led_g 0:seg7 kimenetek.
  4.                                                 //4:encoder, 3:encoder_int1
  5.         PORTD|=0b11100000;      //kikapcsolva minden digit
  6.         PORTB|=0b00000100;      // SS felhúzva
@Droot: úgy látom az az ic passzol ennek a helyére, de remélem nem kell kicserélni.
@Zsolt2: A CPHA-ra figyeltem, bár próbáltam már fordítva is, hátha úgy jó lenne. A kódod még nem próbáltam, de úgy látom ilyen az enyém is.
Megpróbálom az ic-t ki- és visszaforrasztani, de szerintem nem ezen fog múlni.
Szerk: az olvasásban ki van kommentezve egy rész, és csak az spdr-t adja vissza, de a nyitott hőelem miatt 0-tól különböznie kellene, ha van válasz
A hozzászólás módosítva: Júl 7, 2015
(#) Ricsi89 hozzászólása Júl 7, 2015 /
 
Köszönöm fiúk a válaszokat!
Igazából nem akarom nagyon túllihegni a dolgot, így első körben megpróbálom a bemenő feszt figyelni ADC-vel és az alapján indítani a mentést.
(#) vzoole válasza Ivan93 hozzászólására (») Júl 7, 2015 /
 
Így gyorsan átnézve jónak tűnik minden.
Szerintem az ebay-es IC lesz a ludas.
(#) Ivan93 válasza vzoole hozzászólására (») Júl 7, 2015 /
 
Köszi! Ettől félek. Pedig eddig még minden jó volt amit ebay-en vettem (szenzor, mega8, napelem,...)
(#) Kovidivi válasza Ricsi89 hozzászólására (») Júl 7, 2015 /
 
Hello. Lehetne free running is, és interrupt lenne meghívva, ha kész a konverzió, ott pedig csak megnézed, hogy kisebb-e mint a határ, ha igen, indulhat a mentés, így a háttérben futna az egész az ADC előosztóját pedig úgy állítod be, hogy elég sűrűn legyen mérési eredményed, de ne túl sűrűn! A soros diódát és a nagy pufferkondit ne felejtsd el. Az sem hátrányos, ha mentés előtt azonnal kikapcsolod a nem kelló perifériakat, portokat, mindent, ami nem kell! Így biztosan lesz idő a mentésre.
(#) Ricsi89 válasza Kovidivi hozzászólására (») Júl 7, 2015 /
 
Hasonló módszerben gondolkozom én is.
(#) vzoole válasza Ivan93 hozzászólására (») Júl 7, 2015 /
 
Betöltöttem a programodat egy mega8-ba, és szépen megy az spi, és jön a jel.
Az ebay-en sok hamis cucc kószál... régen hamis atmega8-al volt tele. FTDI232-ből is nem kevés hamis van és ezek szerint MAX6675-ből is van.
(#) Zsolt2 válasza Ivan93 hozzászólására (») Júl 8, 2015 /
 
A homerseklet visszateriteset probald meg kijavitani.
  1. temp=SPDR;
  2. return temp;

Nem vagyok benne biztos de igy nem valoszinu, hogy jo erteket terit vissza.
(#) Ivan93 válasza vzoole hozzászólására (») Júl 8, 2015 /
 
Szia! Köszönöm a segítséget! Rendelek másikat, de jobban odafigyelek majd az eladóra.
(#) Ivan93 válasza Zsolt2 hozzászólására (») Júl 8, 2015 /
 
Szia! Igen az tudom, hogy nem jó értéket ad vissza, de már arra is gondoltam, hogy a logikai és bitműveleteket rontom el. Így az alsó byte-ot adja vissza, ami levett páka esetén biztosan különbözik 0-tól (nyitott hőelem jelzőbit miatt). De így is 0 jött, ezért gyanakodtam az spi-ra meg a max-ra.
(#) csabeszq válasza vzoole hozzászólására (») Júl 8, 2015 /
 
Elég sok cuccot vásároltam Ebay-en, 50-ből egy ment tönkre idő előtt. Meg kell jegyezni ebay-en a megbízható partnereket.

Szerintem kevesebb gagyiba futsz bele, mint itthon a boltokban. Legutóbb digitális hőmérőt vettem egy Tesco patikában, azt mutatta, hogy 34 fokos vagyok. Az emberfélék 35 fokon indulnak, alatta a hüllők vannak. Visszavittem, hogy kérem az 1200 Ft-ot, mert láthatóan félremér. Azt mondták írjak a Hartmann-nak, mert ők patika és nem foglalkoznak garanciális ügyekkel 3 napon belül sem.

Mondtam nekik, hogy inkább bukom az 1200 Ft-ot és önökkel nem fogok többet foglalkozni. Gratuláltam, hogy az évi 10-20 ezres forgalmukat lenullázták 1200 Ft miatt. Azért tudni kell, hogy egy Paypal claim ment volna az Ebay-en és visszakapom a pénzt (arról nem is beszélve, hogy ott 300-ért megkapom). Ehelyett itthon fogyasztóvédelemmel levelezés, meg a többi gittegylet.

Ebay-en ilyet nem mertek volna kézbesíteni.
A hozzászólás módosítva: Júl 8, 2015
(#) csabeszq válasza (Felhasználó 15355) hozzászólására (») Júl 8, 2015 /
 
Beírtam a vásárlók könyvébe és pontosan az történt, ami ilyenkor Magyarországon szokott.
(#) k3gy3tl3n hozzászólása Júl 8, 2015 /
 
Sziasztok, kéne egy kis S.O.S segítség. Egy Atmega328 uc-n állítottam be 122Hz-es pwm jelet a PD5 PD6 lábakon. Két érdekes dolog történt: 1- 0% kitöltési tényezőnél is jönnek impulzusok a lábról (led-del néztem) 2- az impulzusok 122Hz-nél jóval kisebb frekire utalnak, mint ahogy hallható a videóban a kattogás, csak most leddel villogtattam ki: Bővebben: Link
A kód mindössze ennyi:
  1. #define F_CPU 8000000UL
  2.  
  3. #include <avr/io.h>
  4. #include <util/delay.h>
  5. #include <avr/interrupt.h>
  6. #include <avr/wdt.h>        // Supplied Watch Dog Timer Macros
  7. #include <avr/sleep.h>      // Supplied AVR Sleep Macros
  8.  
  9.  
  10. #define LED 0
  11. #define LED_OFF() PORTB &= ~(1<<LED)
  12. #define LED_ON() PORTB |= (1<<LED)
  13.  
  14.  
  15. void portinit()
  16. {
  17.  
  18.         DDRD |= (1 << PD5) | (1<<PD6); // PWM output DC motor
  19.        
  20. }
  21.  
  22.  
  23. int main(void)
  24. {
  25.  
  26.         portinit();
  27.  
  28.  
  29. /*set PWM for DC motors*/
  30.      OCR0A = 0;
  31.     // set PWM for 0% duty cycle
  32.      OCR0B = 0;
  33.     // set PWM for 0% duty cycle
  34.        
  35.     TCCR0A |= (1 << COM0A1) | (1 << COM0B1);
  36.     // set none-inverting mode
  37.  
  38.     TCCR0A |= (1 << WGM01) | (1 << WGM00);
  39.     // set fast PWM Mode
  40.  
  41.     TCCR0B |= (1 << CS02);
  42.     // set prescaler to 256 and starts PWM (122Hz)
  43.        
  44.      OCR0A = 0;
  45.     // set PWM for 0% duty cycle
  46.      OCR0B = 0;
  47.     // set PWM for 0% duty cycle       
  48.        
  49. /*set PWM for DC motors*/              
  50. while(1)
  51. {
  52.  
  53.         for(int i=0; i<100; i++)
  54.         {
  55.                 _delay_ms(10);
  56.         }
  57.  
  58.         while(OCR0A<60)
  59.         {
  60.                 OCR0A++;
  61.                 OCR0B++;
  62.  
  63.                 for(int i=0; i<10; i++)
  64.                 {
  65.                         _delay_ms(10);
  66.                 }
  67.         }
  68. }
  69. return (0);
  70. }

szerk.: egy sec után próbaképp elkezdem növelni a kitöltést kb 25%-ra ettől a led fényesebben villog (nyilván hosszabbodnak a magas jelhez tartozó idők). A fő kérdés, miért villog már az elején is, amikor 0% a kitöltés? A másik, miért ilyen lassan?
A hozzászólás módosítva: Júl 8, 2015
(#) kapu48 válasza k3gy3tl3n hozzászólására (») Júl 8, 2015 /
 
Mindenekelőtt, ha új az uC akkor alapból be van kapcsolva az órajel /8 osztó!
Szóval fuse biteket babráltál már?
(#) Max26 hozzászólása Júl 8, 2015 /
 
Sziasztok!

Ezt tervezem megoldani:
------
Start nyomógomb: SD kártyára szöveges állományba írás, amíg meg nem telik.
Stop: file lezárás
------
Ismét start esetén, a .txt file felülírása.

Nézegettem fórumokat, de mindenhol FAT32/FAT fájlrendszert használtak. Olvastam olyat is, hogy nem kell hozzá fájlrendszer. Hogyan lehetne ezt megoldani legegyszerűbben?
(#) vzoole válasza k3gy3tl3n hozzászólására (») Júl 8, 2015 /
 
Fast PWM-nél van ilyen bug. Használj PC PWM-et.
(#) csabeszq válasza k3gy3tl3n hozzászólására (») Júl 8, 2015 /
 
Nekem nem úgy tűnik, mintha kitöltési tényezőt adnál meg.

A CTC módban a timer OCRA-ig számol, utána RESET-el. Ez leginkább a frekvenciára van hatással. Ha 10-ig számol a timer, értelemszerűen gyorsabb, mintha 200-ig számolna.

Utána megfordítja A és B kimenetet is. Tehát ez frekvencia-osztást jelent 2-vel (COM0A1). Kicsit jobban át kellene gondolni, hogy mit akarsz.

Ha PWM-ezni akarsz, az OCRA-t állítsd be fixre, OCRB meg lesz a kitöltési tényező.
(#) k3gy3tl3n válasza kapu48 hozzászólására (») Júl 8, 2015 /
 
A fuse bitekhez nem nyúltam, az ábrán látható a beállítás.
Hohóó CKDIV8, akor egy része megoldódott, úgytűnik.
Ezekszerint 1MHz-en jár, a prescaler 256 szóval F(PWM) = F(Clock Freq)/ (256 * N) = 15Hz nagyjából.

fuses.png
    
(#) k3gy3tl3n válasza csabeszq hozzászólására (») Júl 8, 2015 /
 
Az adatlap szerint ha WGM02 = 0 WGM01 =1 és WGM00 = 1 akkor ez fast PWM (Mode 3) ami FF-ig számol. OCR0A és OCR0B-vel állítom a kitöltési tényezőt a PD5 és a PD6 lábakon nem?
Nekem mindkét lábra azonos frekvenciájú PWM jel kell amiknek a kitöltését külön állítgathatom.Ez elvileg nem CTC mód, hanem fast PWM.
A hozzászólás módosítva: Júl 8, 2015

wgm.png
    
(#) csabeszq válasza k3gy3tl3n hozzászólására (») Júl 8, 2015 /
 
hát, ezt benéztem, tényleg fast PWM
(#) k3gy3tl3n válasza csabeszq hozzászólására (») Júl 8, 2015 /
 
Akkor a miért van impulzus 0% kitöltésnél kérdés még nyitott marad
(#) kapu48 válasza k3gy3tl3n hozzászólására (») Júl 8, 2015 /
 
Szerintem a csipogód/motorod nem összehasonlítható, PWM es üzemmódban!

A motor meg sem fog röceni attól a rövid tű impulzustól, amit kap, míg a csipogódnak bőven elég a muzsikáláshoz.
(#) k3gy3tl3n hozzászólása Júl 8, 2015 /
 
Multiméterrel 0.02V-ot mértem a pwm lábon, ez ugye 5V lenne 100% kitöltés mellett, azt már tudom hogy kb 15Hz volt a freki, számolás..., kisebb mint fél % volt a kitöltés amikor én 0%-ot állítok be, 15 Hz az 66ms szóval az impulzusok kb 0.03 ms-esek voltak ez már elég hosszú volt hogy felvillanjon a led/kattogjon a motor. Mitől lehet ez? Fogadjam el és kész? 122Hz-en majd úgyse látom?
szerk.: az a0.03ms jólesz 0.3ms nek is nehéz dolog fél %-ot kiszámolni este 9-kor.
A hozzászólás módosítva: Júl 8, 2015
(#) vzoole válasza k3gy3tl3n hozzászólására (») Júl 8, 2015 / 1
 
(#) k3gy3tl3n válasza vzoole hozzászólására (») Júl 8, 2015 /
 
Utánaolvasok mit tud ez a PC PWM, még sosem használtam.
(#) k3gy3tl3n válasza vzoole hozzászólására (») Júl 8, 2015 /
 
A mode-ok közt nem is látom, miféle állatfaj ez?
(#) csabeszq válasza kapu48 hozzászólására (») Júl 8, 2015 /
 
Hát, ezt én is megettem. Az elképzelés az volt, hogy az álló vonatot a terepasztalon úgy érzékelem, hogy nagyon rövid inpulzust adok és ha folyik rajta áram, akkor van vonat.

Ahogy Móricka elképzeli. A DC motor egy induktivitás, amire ha néhány us-es impulzust küldesz, azon bizony mérhető áram nem fog elindulni. Annyi sem, hogy egy opto csatolót behúzzon.

Nekem 300 us hosszú impulzus kellett ahhoz, hogy érzékeljem a motort.
(#) vzoole válasza k3gy3tl3n hozzászólására (») Júl 8, 2015 /
 
Phase Correct PWM
Következő: »»   678 / 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