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   377 / 840
(#) Gery válasza Reggie hozzászólására (») Nov 9, 2011 /
 
Nos holnap neki ülök egész délután, ki kéne hoznom belőle valamit, és majd kipróbálom amit most írtál.
Amúgy amit linkeltem AVR oldalról az az AVR Studio5ben generált EVK1101-es mintaprogram, az alapján írtam/másoltam én is. Ugye abban is benne van ez a .CMR.stbstb ami nálam nem fordul le sajnos csak ha beírom ezt:

avr32_pwm_cmr_tpwm_cmr;

Nem tudom ez mennyire probléma.
Továbbá ez mit jelenthet, mert ezt a sort nem értem:

pwm_start_channels(1 << channel_id); // Start channel 0.

?

Köszönöm:Gergő>>
(#) Reggie válasza Gery hozzászólására (») Nov 9, 2011 /
 
A header fajlban melle van kommentelve. Huzd ra a kurzort a fuggveny nevere es megjelenik egy kis ablakban egy rovid leiras.
En a helyedben kozvetlen irnam a regisztereket, nem a gyari fuggvenyekkel, nekem ugy gond nelkul mukodott a pwm.
(#) Gery válasza Reggie hozzászólására (») Nov 9, 2011 /
 
Igen a find references-t ismerem azt is nézegettem, de nem jutottam messze.

És a közvetlen regiszteres megoldás, úgy nagy vonalakban hogy néz ki, hogyan kezdjek neki, abban tudsz segíteni?
(#) Krisszes hozzászólása Nov 9, 2011 /
 
Sziasztok!
Szeretnék egy kis segítséget kérni tőletek. Elkezdtem egy Atmega128-as processzort programozni assembly-ben, pontosabban a programozását elsajátítani. Egy kicsit hátrányba kerültem azzal, hogy nem tudok angolul. Szeretnék kérni tőletek pár anyagot (magyarul) és ha lehet minta programot hozzá. Főként a megszakításokról mert erre nem bírok rájönni, hogy hogyan is akar működni.
Nem találok érthető leírást az IT vektortábláról, hogy mi is az pontosan, miért kell és hogyan működik.

Előre is köszönöm.
(#) kiborg válasza Krisszes hozzászólására (») Nov 9, 2011 /
 
Szia!

Ha assemblyben progizol, akkor nézd át a hozzászólásaimat, töltöttem fel régebben egy-egy pdf-t, az utasítások magyarázatával, magyarul.
Megszakítás:
Maga128A adatlapja, 11. fejezet. ott a tábla a megszakításkor a címekkel. Mindegyiknek ott a leírása, 3-4 angol szó, amit szerintem te is értesz.(ha nem, akkor barátod a google)
Én még Mega16-t használok, nekem ez az alapprogramom:
  1. .include "m16def.inc"
  2.  
  3. .ORG    0x000
  4. jmpRESET
  5. jmpEXT_INT0;IRQ0 handler EICR regiszter engedélyezi az IT-jét
  6. jmpEXT_INT1;IRQ1 handler- " -
  7. jmpTIM2_COMP;Timer2 compare8 bites TCNT2, TIMSK reg. az IT eng., OCR2 reg.-hez compare
  8. jmpTIM2_OVF;Timer2 overflow8 bites TCNT2, TIMSK reg. az IT eng., Timer2 overflow
  9. ;TCCR2 control register szabja meg a Timer2 üzemmódját (PWM)
  10. jmpTIM1_CAPT;Timer1 capture16 bites TCNT1, TIMSK reg. az IT eng., PD4 bitre ICR1H, ICR1L
  11. jmpTIM1_COMPA;Timer1 compare A 16 bites TCNT1, TIMSK reg. az IT eng., compare OCR1AH, OCR1AL
  12. jmpTIM1_COMPB;Timer1 compare B 16 bites TCNT1, TIMSK reg. az IT eng., compare OCR1BH, OCR1BL
  13. jmpTIM1_OVF;Timer1 overflow 16 bites TCNT1H(8)+TCNT1L(8), TIMSK reg. az IT eng., overflow
  14. ;TCCR1A és TCCR1B control register szabja meg az üzemmódját
  15. jmpTIM0_OVF;Timer0 overflow 8 bites TCNT0, TIMSK reg. az IT eng., Timer0 overflow
  16. ;TCCR0 control register szabja meg a Timer0 üzemmódját (PWM)
  17. jmpSPI_STC;SPI transfer completeSPI transfer kész
  18. jmpUART_RXC;UART RX complete vevő vett egy byte-ot
  19. jmpUART_DRE;UDR empty a ténylegesen shiftelt regiszter előtti user data reg. üres
  20. jmpUART_TXC;UART TX complete az adásnak vége
  21. jmpADC_;ADC conversion complete
  22. jmpEE_RDY;EEPROM ready EEPROM írásnak vége
  23. jmpANA_COMP;Analog comparatorkonvertálás kész
  24. jmp TWSI;Two Wire Serial Interface Handler
  25. jmp EXT_INT2;IRQ1 handler
  26.    jmp TIM0_COMP;Timer0 compare 8 bites TCNT0, TIMSK reg. az IT eng., OCR0 reg.-hez compare
  27. jmp SPM_RDY;Store Program Memory Ready Handler
  28.  
  29. RESET:
  30. ldi r16,low(RAMEND)
  31. out SPL,r16
  32. ldi r16,high(RAMEND)
  33. out SPH,r16
  34.  
  35.  
  36. ;************ PORTOK BEÁLLÍTÁSA
  37. ;************ 0 - bemenet
  38. ;************ 1 - kimenet
  39.  
  40. ;**** port A inic
  41. lditemp,0xFF
  42. out DDRA,temp;A port kimenet
  43.  
  44. ;**** port B inic
  45. lditemp,0xFF
  46. out DDRB,temp;B port kimenet
  47.  
  48. ;**** port C inic
  49. lditemp,0x00
  50. out DDRC,temp;C port bemenet + Jtag
  51. ldi temp,0b11000011
  52. out portc,temp;C port felhúzó ellenállás aktiválás
  53.  
  54. ;**** port D inic
  55. lditemp,0xFF
  56. out DDRD,temp;D port kimenet
  57.  
  58.  
  59. sei; fő interrupt engedélyezve
  60.  
  61. ;*************************************** FŐPROGRAM *****************************************
  62.  
  63. main:
  64. nop
  65. rjmp main
  66.  
  67. TIM1_COMPA:;********** Timer 1 komparálása
  68.        nop
  69. reti
  70.  
  71. EXT_INT0:
  72. EXT_INT1:
  73. TIM2_COMP:
  74. TIM2_OVF:
  75. TIM1_CAPT:
  76. ;TIM1_COMPA:
  77. TIM1_COMPB:
  78. TIM1_OVF:
  79. TIM0_OVF:
  80. SPI_STC:
  81. UART_RXC:
  82. UART_DRE:
  83. UART_TXC:
  84. ADC_:
  85. EE_RDY:
  86. ANA_COMP:
  87. TWSI:
  88. EXT_INT2:
  89. TIM0_COMP:
  90. SPM_RDY:
  91. reti

Ha valamelyik megszakítást használom, akkor őt kikommentelem és létrehozom újra, saját reti-vel zárva.(példámban a TIM1_COMPA)
Remélem érthető a megoldásom.
(#) Krisszes válasza kiborg hozzászólására (») Nov 9, 2011 /
 
Köszönöm a választ. A megoldásod logikája érthető, de a pdf-eket még nem lelem. kicsit sok ez a ~370 oldal...
(#) kiborg válasza Krisszes hozzászólására (») Nov 9, 2011 /
 
Tessék itt a ATMega128A datasheet-je ~7,4MB
Igen, annyi oldal, de csak azért, mert minden benne van. Ez alapján BÁRMIT meg tudsz vele csinálni.

Üdv Kiborg
(#) zombee válasza kiborg hozzászólására (») Nov 9, 2011 /
 
Mérés2-höz elég az assembly utasításokat és néhány interruptot(timer1_compA, timer1_ovf, INT0-7) ismerni.
Az INT0-7 - hez ez EICRA és társai, illetve a timer/counter1 átlapozása sem árt, a többi nem kell.
Esetleg ha kommunikáció is van akkor az UART, de csak aszinkron módba, és interrupt sem árt, így kényelmesebb. A 370-ből kb. 10-12 oldal ami kell, kár hogy a laborosok még mindig nem tudták zanzásítani!
(#) zombee válasza zombee hozzászólására (») Nov 9, 2011 /
 
És íme a házim. A kedves FÓRUM nem engedi bemásolni, szerinte sok benne a szmájli...
(#) kiborg válasza zombee hozzászólására (») Nov 9, 2011 /
 

Én is Kandós voltam, de sajnos nem volt közöm Atmelhez Melyik szakon van ez ? Műszer ?
Amúgy nem tudtam, hogy házihoz kell, én egy általános célra felhasználható alapot adtam, én minden programomat így indítom és utána erre építkezem,ami kell.
Üdv Kiborg
(#) sgt válasza kiborg hozzászólására (») Nov 9, 2011 /
 
Mikor tanultál itt? Prog 2 második fele erről szólt. Először asm-ben ismerkedtünk vele, aztán jött C-ben. Nyugalom sok okosságról nem maradtál le . Csak az alapokat mutatták meg, pl.: megszakításokról is csak szó esett, meg a perifériákról is, de konkrét programot nem írtunk arra sem.
(#) Gery válasza Gery hozzászólására (») Nov 9, 2011 /
 
Ha a regisztereket így definiálom:
#define PREAAVR32_PWM_PREA
#define PREBAVR32_PWM_PREB
#define DIVAAVR32_PWM_DIVA
#define DIVBAVR32_PWM_DIVB
#define ENAAVR32_PWM_ENA
#define DISAVR32_PWM_DIS
#define SRAVR32_PWM_SR
#define IERAVR32_PWM_IER
#define IDRAVR32_PWM_IDR
#define IMRAVR32_PWM_IMR
#define ISRAVR32_PWM_ISR
#define CPREAVR32_PWM_CPRE
#define CLAGAVR32_PWM_CALG
#define CPOLAVR32_PWM_CALG
#define CPDAVR32_PWM_CPD
#define CDTYAVR32_PWM_CDTY
#define CPRDAVR32_PWM_CPRE
#define CNTAVR32_PWM_CNT
#define CUPDAVR32_PWM_CUPD
és adok neki értékeket mint például:
CALG ==1;
az helyes és működőképesnek kéne lennie?

Üdv.:Gergő
(#) sgt válasza Gery hozzászólására (») Nov 9, 2011 /
 
Nem, mert te csak a nevet adtad meg. De minek a nevét? Szerintem az utolsó '_' nem kell, és akkor fog működni, ahogy azt elképzelted.

A define szintaktikája, ha átkeresztelni akarsz valamit:
  1. #define név amit_elakarsz_nevezni
(#) Gery válasza sgt hozzászólására (») Nov 9, 2011 /
 
Bocsánat most látom, hogy a szóközök valamiért lemaradtak, szóval csak az elsőt, és így a többit:
#define PREA AVR32_PWM_PREA
Ez úgy van ahogy mondtad. Akkor így helyes, és az értékmegadási példám is helyes?
(#) sgt válasza Gery hozzászólására (») Nov 9, 2011 / 1
 
Ha AVR32_PWM_PREA akarod PREA néven is hozzáférhetővé tenni, akkor nincs gond. Feltéve ha nincs még egy ilyen nevezetű regiszter.
(#) zombee válasza kiborg hozzászólására (») Nov 9, 2011 /
 
bocs: BME!!! A "mikor" kérdést valószínűleg azért teszed fel mert még meg se nézted a forráskódot.
(#) Gery válasza sgt hozzászólására (») Nov 9, 2011 /
 
Nincs ilyen nevű, az nem probléma le is fordul a program.
Elvileg ha meghatározott értékeket adok a regisztereknek el kéne indulna a motornak, és van egy külön regiszter amibe ha írok az változtatja a pwm jelet. Nos ha így megadom egyesével regiszterek értékeit:
MR==0X00000000;
ENA==0X00000001;
CPRE==1000;
CALG==1;
CPOL==0;
CPD==0;
CDTY ==25;
CPRD==50;
az helyes?
(#) sgt válasza Gery hozzászólására (») Nov 9, 2011 /
 
Nem akarok kötekedő lenni, de te a "=="-vel érték összehasonlítást végzel, nem pedig értékadást .

A PWM lábat csak szimplán kimenetre kell állítani.
(#) Gery válasza Gery hozzászólására (») Nov 9, 2011 /
 
Még egy utolsó kérdés mára. Ha azt a lábat amit pwm-ként szeretnék kezelni sima gpio-ként magas vagy alacsony szintre emelem a motornak forognia kéne jól gondolom? Mert nálam ez se történik meg.
(#) sikolymester válasza Gery hozzászólására (») Nov 10, 2011 /
 
Hűha!

Ennek:

#define PREA AVR32_PWM_PREA

és társainak mi értelme van?
Követve a logikádat folytatnám is:
  1. #define PREA AVR32_PWM_PREA
  2. #define PRE PREA
  3. #define PR PRE
  4. #define P PR


És így akkor már nagyon egyszerű lesz. Persze átláthatatlan.

Ami a motor vezérlést illeti: nagyon remélem, hogy van egy végfok a láb végén. Legyen ez a végfok egy darab tranzisztor mondjuk, akkor ezen a tranzisztoron remélem mindenképpen van egy flyback diode is. Az AVR32 lába kemény 20mA -es nagyságrendet képes táplálni.
(#) Reggie válasza Gery hozzászólására (») Nov 10, 2011 /
 
Peldault ez az EVK1100 devboardon a DIP204-es lcd modul hattervilagitasat allitja PWM-el:

  1. #define BACKLIGHT_PIN PB18
  2. #define BACKLIGHT_PWM_CHANNEL 6
  3. AVR32_GPIO.port[(BACKLIGHT_PIN)/32].gperc=bit((BACKLIGHT_PIN)%32); //nem a GPIO modul vezerli a labat
  4. //C periferia->3->10->PMR1=1->set PMR0=0->clear
  5. AVR32_GPIO.port[(BACKLIGHT_PIN)/32].pmr0c=bit((BACKLIGHT_PIN)%32);
  6. AVR32_GPIO.port[(BACKLIGHT_PIN)/32].pmr1s=bit((BACKLIGHT_PIN)%32);
  7. AVR32_PWM.channel[BACKLIGHT_PWM_CHANNEL].CMR.cpre=0b0000; //CLK=MCLK
  8. AVR32_PWM.channel[BACKLIGHT_PWM_CHANNEL].CMR.cpol=0; //Magas szinttel kezdodik
  9. AVR32_PWM.channel[BACKLIGHT_PWM_CHANNEL].CMR.cpd=0; //CUPDx irasa a kitoltesi tenyezot modositja
  10. AVR32_PWM.channel[BACKLIGHT_PWM_CHANNEL].cprd=8191; //0-8191-ig szamol
  11. AVR32_PWM.channel[BACKLIGHT_PWM_CHANNEL].cdty= AVR32_PWM.channel[BACKLIGHT_PWM_CHANNEL].cprd/2-1; //kezdetnek 50% kitoltesi tenyezo
  12. AVR32_PWM.ena=1<<BACKLIGHT_PWM_CHANNEL; //Engedelyezes

Ez utan mar mennie kell.
(#) Reggie válasza sikolymester hozzászólására (») Nov 10, 2011 /
 
Az avr32-nek csak nehany laba tud 8mA-at, a tobbi csak 4mA.
(#) sikolymester válasza Reggie hozzászólására (») Nov 10, 2011 /
 
Igaz! 10 es 20 kozott vacilaltam. De nagysagrendileg azert igy is eltalaltam. Motort meg igy se ugy se hajt meg. Csak feltem, hogy a kollega kepes es rakoti direktbe a motort.
(#) kiborg válasza zombee hozzászólására (») Nov 10, 2011 /
 

Hali!
Akkor BME, oda csak szerettem volna járni, bár így utólag nem látom bajnak, hogy nem oda sikerült a felvételi. Kandó 2001-2005.
Amúgy meg én nem kérdeztem, hogy mikor Azt TE magad kérdezted tőlem Amúgy meg átnéztem a forráskódot. Tetszik, jó sok komment van benne, ami nálam általában le szokott maradni, csak egy minimálisat írok, de az meg nem mindig elég ahhoz, hogy 2-3 év múlva megértsem, hogy mit is akartam anno...
Üdv Kiborg
(#) Krisszes válasza kiborg hozzászólására (») Nov 10, 2011 /
 
köszönöm, de ez azért meg volt. Csak tudod az angol...
(#) Krisszes hozzászólása Nov 10, 2011 /
 
Egy kicsit pontosítanám a kérésemet. Van nekem egy encoder-em amit ha tekergetek akkor ugyebár két párhuzamosan keletkező időben eltolt négyszög jelem jön létre. Az EICRB megvan lefutó élet érzékelnék, INT 4 és INT 5 -re kötöttem.
Tehát arra lenne szükségem, hogy a két jel között különbséget tegyek. Feltételezem, hogy ehhez megszakítás kéne...

Szóval ebben szeretnék segítséget kérni. (valami olyan kis pl programmal amiben csak ennek a IT vektortáblája van és az IT kezelő rutinja.)

Bocsi mindenkitől a fárasztásért, de még nagyon az elején vagyok...
(#) röntgen válasza Krisszes hozzászólására (») Nov 10, 2011 /
 
Lehet hogy van jobb vagy más megoldás is, de ez csak egy ötlet. Én úgy gondolkoznék megszakítással, hogy egyik kimenetét kötném csak megszakításra míg a másikat sima bemenetként, mivel bármelyik irányba tekered, mindkettőn van hasznos jel. A megszakításkor indítanék egy 1-2msec-es timert, ha lejárt megnézném a másik kimenet szintjét és így eldönthetem,hogy jobbra v. balra tekertem. lekezelés után IT engedély vissza.
(#) Reggie válasza sikolymester hozzászólására (») Nov 10, 2011 /
 
Motort sosem kotunk direktbe, mert induktiv terheles, igy kapcsolaskor feszultseglokest okozhat. Feltetelezem, hogy ezt azert tudjak az emberek.
(#) Reggie válasza röntgen hozzászólására (») Nov 10, 2011 /
 
Jo az otleted, de nem kell bele a kesleltetes. Egyszeruen az egyik csatorna felfuto(vagy lefuto ele) adja a megszakitast, a masik csatorna csak sima bemenet, amirol akkor kell mintat venni, amikor a megszakitas beerkezik es ez az ertek az iranyt hatarozza meg.
(#) röntgen válasza Reggie hozzászólására (») Nov 10, 2011 /
 
Igazad lehet, az a lényeg hogy az IT rutin bolond biztos legyen, mert egyébként kiakadás ténye lehet.
Következő: »»   377 / 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