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   240 / 840
(#) (Felhasználó 4577) válasza Bigya hozzászólására (») Jún 22, 2010 /
 
Szia!

Senki se foglya helyetted megírni, ezért nem kaptál választ.
Másold be a próbálkozásod és majd egy Bascom-os kijavítja.
(#) ISF79 hozzászólása Jún 22, 2010 /
 
Hali
Csinálom tovább az attiny45-ös nyomógombos kapcsolást.
A következő lépés az lenne, hogy ha egyszer megnyomom a gombot akkor kigyullad a led és x másodperc után elalszik.
De sajnos ha pl 5 mp-ig szeretném, hogy világítson a led, akkor 5 mp-ig kell nyomnom a gombot is.
PB3 LED
PB4 nyomógomb
Mi a hiba a kódban?

  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3.  
  4.  
  5.  
  6.  
  7. int main(void)
  8.  
  9.         {
  10.                 DDRB = (1<<PINB3)|(0<<PINB4);           //PB3 kimenet, PB4 bemenet
  11.         PORTB |= _BV(PB4);                              //PB4 belső felhúzó bekapcs
  12.        
  13.                 while(1) {
  14.  
  15.                       if (!(PINB & _BV(PB4)))
  16.                            PORTB |= _BV(PB3);
  17.                                                        
  18.                        
  19.                                               _delay_ms(3000);
  20.                                               PORTB &=~_BV(PB3);
  21.      };
  22. }

Előre is köszönöm a segítséget.
(#) Topi válasza ISF79 hozzászólására (») Jún 22, 2010 /
 
Először is. Ahhoz hogy segítséget kérj, tiszteld meg a többieket azzal, hogy a kód amit bemásolsz, nem idehányt.
Tagold rendesen!
  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3.  
  4. int main(void) {
  5.   DDRB = (1<<PINB3)|(0<<PINB4);         //PB3 kimenet, PB4 bemenet
  6.   PORTB |= _BV(PB4);                            //PB4 belső felhúzó bekapcs
  7.        
  8.   while(1) {
  9.     if (!(PINB & _BV(PB4))) {
  10.       PORTB |= _BV(PB3);
  11.     }
  12.  
  13.     _delay_ms(3000);
  14.     PORTB &=~_BV(PB3);
  15.   }
  16. }


Így már egyből látszik a hiba, hogy ha nyomod a gombot ha nem, akkor is lefut a _delay_ms... Azaz ha épp delay van és akkor nyomod meg a gombot, akkor ki kell várnod a delay-t mire a program a bit vizsgálathoz ér. Lehet hogy elírás, lehet hogy nem ismeret, de az IF kapcsos zárójel nélkül csak a soron következő kifejezést veszi "maga alá".

Ha azt akarod, amit elmondtál, akkor egyszerűen a _delay_ms és a kikapcsolás parancsot tedd bele az IF-en belülre. Így:
  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3.  
  4. //=====================================
  5. int main(void) {
  6. //=====================================
  7.   DDRB = (1<<PINB3)|(0<<PINB4);         //PB3 kimenet, PB4 bemenet
  8.   PORTB |= _BV(PB4);                            //PB4 belső felhúzó bekapcs
  9.        
  10.   while(1) {
  11.     if (!(PINB & _BV(PB4))) {
  12.       PORTB |= _BV(PB3);
  13.       _delay_ms(3000);
  14.       PORTB &=~_BV(PB3);
  15.     }//if
  16.   }//while
  17. }//func


Amúgy meg "}" után nem kell ";"!
A jövőben ilyen forma kód bemásolás után, ne nagyon reménykedj segítségben, mert nem sokan veszik a fáradtságot hogy újratagolják és formázzák a kódodat ahhoz, hogy neked segítsenek.
(#) ISF79 hozzászólása Jún 22, 2010 /
 
Köszi a segítséget.

A kód tagolva volt (mondjuk talán kicsit több benne az üres sor mint kéne) de amikor ide másoltam szétcsúszott, így is háromszor szerkesztettem a hsz-t, hogy visszakapja a formáját kicsit.
(#) totht91 hozzászólása Jún 22, 2010 /
 
A Doper Programozót sehogy sem tudom felismertetni a gépemmel. Lecsupaszítottam az áramkört a képnek megfelelően de még mindig ugyan az a baj... a windows az írja hogy "Az USB-eszközt nem lehet felismerni"

Mi lehet a probléma?
(#) levi18 válasza totht91 hozzászólására (») Jún 22, 2010 /
 
A kapacitások a kristálynál, azok sincsenek?
(#) totht91 válasza levi18 hozzászólására (») Jún 22, 2010 /
 
nem feleslegesnek tartottam őket, az avr-ek sima kvarccal is mennek legalábbis ez a tapasztalatom.
(#) (Felhasználó 4577) válasza totht91 hozzászólására (») Jún 22, 2010 /
 
AVR-t se tegyél bele. Tök felesleges.
(#) Topi válasza totht91 hozzászólására (») Jún 22, 2010 /
 
Idézet:
„A kapacitások a kristálynál, azok sincsenek?
--
nem feleslegesnek tartottam őket, az avr-ek sima kvarccal is mennek legalábbis ez a tapasztalatom.”

Jujj... Azért ezt ne terjeszd
Kizárólag alacsonyfrekvenciájú kristályokhoz nem kell (max 32.768K)

Nem csak a kondi hiányzik, de még a programozó csati kimenet is.
Nem gondolod hogy akkor már az USB csatit és a procit is ki lehetne kapni belőle? Annyival is olcsóbb.
(#) totht91 válasza Topi hozzászólására (») Jún 22, 2010 /
 
Csak azért csináltam ezt a csupaszítást hogy kísérletezni tudjak a próbapanelon mert nem ismeri fel a gépem... Úgy gondoltam hogy ha ennyit összedobok akkor ezeket már megenné a számítógép, de még nem sikerül. Esetleg lehet olyan hogy plusz ellenállást kell raknom a d+ és d- ra?
(#) Topi válasza totht91 hozzászólására (») Jún 22, 2010 /
 
Idézet:
„Esetleg lehet olyan hogy plusz ellenállást kell raknom a d+ és d- ra?”


Úgylátom nem voltunk érthetők:

KRISTÁLY KELL! KONDI KELL! Nem helyettesíthető az USB-n ellenállással.

Ez nonszensz. Akkor szedj le valamit, ha tudod mit csinál. Ha meg mondják mi a hiba, ne ellenkezz és szórakozz másokkal.
(#) Reggie válasza totht91 hozzászólására (») Jún 22, 2010 /
 
25 megan is elketyeg, amikor csak 16 megat ir az adatlap. Nem veletlenul vannak ezek a korlatozasok, ugyanis ha nem az eloirt modon hasznalod, akkor nincs garancia a helyes mukodesre. Ezert kell a kondi is. (Pl. kondi nelkul elofordulhat, hogy valamelyik felharmonikuson rezeg be a kvarc)

A kerdesedre visszaterve, teszek fel par keresztkerdest:

1. A uC jol fel van programozva?
2. Az USB D+/D- milyen utvonalon es kornyezetben jut el a uC-ig? (pl egy fenykep jo lenne a probapanelrol)
(#) labu01wx hozzászólása Jún 22, 2010 /
 
Sziasztok!

Valaki meg tudná mondani, hogy hogyan lehet használni névtereket winavr-ben?
A "namespace my{}" fordításakor ezt a hibaüzenetet kapom:
  1. error: expected '=', ',', ';', 'asm' or '__attribute__' before 'my'


A választ előre is köszönöm.
(#) trudnai válasza totht91 hozzászólására (») Jún 22, 2010 /
 
Idézet:
„Esetleg lehet olyan hogy plusz ellenállást kell raknom a d+ és d- ra?”


Pontosan igy van! A D+ -ra +6M-ot, a D- -ra pedig -68K kellene, hogy a kristalyon levo kondikat helyettesitsd. Ez a Random Theorem-nek is nevezett osszefuggefbol fakad, ami kimondja, hogy egy negativ es egy pozitiv ellenallas parhuzamos kapcsolasa kapacitiv a kritalyok korul.
(#) krkic hozzászólása Jún 22, 2010 /
 
Hello ezzel az avrel működne Topi programozója?
(#) (Felhasználó 4577) válasza krkic hozzászólására (») Jún 22, 2010 /
 
Nem.
(#) novarobot hozzászólása Jún 22, 2010 /
 
Sziasztok!

Én ma reggel raktam össze az első AVR programozómat (egy LPT portra csatlakoztatható STK200/300 kompatibilis programozó), tehát kezdő vagyok.

Nézegetem TOPI "Nyolc lábbal AVR ..." cikksorozatát, és a második részben a PWM -es LED fényerőszabályzónál elakadtam. Az ott lévő mintakódot sikeresen átírtam az általam használt mikróvezérlőre (ATMEGA88-20PU, csak a "PORTB" ki kellet cserélni "PORTD" re).

Ott akadtam el, hogy szeretném az AVR-ben található másik PWM-et is használatba venni, tehát kezdetben a "AIN0"-ról (12.es láb PORTD 6BIT) átírni TOPI kódját az "AIN1" -re (13.as láb PORTD 7BIT).

A működő kód "AIN0" (12.es láb PORTD 6BIT) lábon.

(A kódba beleírtam még egy LED kapcsolgatását, hogy lássam mikor erősödik és mikor gyengül a PWM es LED fényereje.)

  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3.  
  4. //-------------------------------------
  5. int main(void)
  6. {
  7.         uint8_t    fel_le;
  8.         DDRD = 0xFF; //PD 0-7 kimenet
  9.         DDRC = 255; //PC 0-7 kimenet
  10.         //timer inicializálás PWM módra
  11.         GTCCR = 0x00; //nincs TSM
  12.         TCCR0A =  (1<<COM0A1)
  13.                         | (1<<COM0A0)    //01 = set on comp. match
  14.                         | (0<<WGM02)
  15.                         | (1<<WGM01)
  16.                         | (1<<WGM00);    //011 = Fast PWM mód
  17.  
  18.         TCCR0B =  (0<<CS02)
  19.                         | (1<<CS01)
  20.                         | (1<<CS00);     //011 = clk/64 előosztás
  21.         TCNT0 = 0;  //countert nullázzuk
  22.         OCR0A = 0;  //komparálási szintet nullázzuk
  23.         fel_le = 1; //tehát fel
  24.  
  25.         while(1)
  26.         {
  27.                 if(fel_le)
  28.                 {
  29.                         if(OCR0A<255) OCR0A++; //addig növelem (a komaprálási értéket, a led fényereje csökken) amíg nem max
  30.                         else
  31.                         {
  32.                                 fel_le = !fel_le; //ha max, akkor lefelé
  33.                                 PORTC=255;
  34.                         }
  35.                 }
  36.  
  37.                 if(!fel_le)
  38.                 {
  39.                         if(OCR0A) OCR0A--;   //addig csökkentem amíg =0
  40.                         else
  41.                         {
  42.                                 fel_le = !fel_le; //ha min, akkor felfelé
  43.                                 PORTC=0;
  44.                         }
  45.                 }
  46.                 _delay_ms(2);
  47.         }
  48.         return 0;
  49. }


Ez a kód jól működik, erősödik és gyengül a PWM-es led, a PORTC-re kötött LED meg villog hogy mikor erősödik és mikor gyengül a PWM-es led...

És a nem működő kód:

  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3.  
  4. //-------------------------------------
  5. int main(void)
  6. {
  7.         uint8_t    fel_le;
  8.         DDRD = 0xFF; //PD 0-7 kimenet
  9.         DDRC = 255; //PC 0-7 kimenet
  10.         //timer inicializálás PWM módra
  11.         GTCCR = 0x00; //nincs TSM
  12.         TCCR1A =  (1<<COM1A1)
  13.                         | (1<<COM1A0)    //01 = set on comp. match
  14.                         | (0<<WGM12)
  15.                         | (1<<WGM11)
  16.                         | (1<<WGM10);    //011 = Fast PWM mód
  17.  
  18.         TCCR1B =  (0<<CS12)
  19.                         | (1<<CS11)
  20.                         | (1<<CS10);     //011 = clk/64 előosztás
  21.         TCNT1 = 0;  //countert nullázzuk
  22.         OCR1A = 0;  //komparálási szintet nullázzuk
  23.         fel_le = 1; //tehát fel
  24.  
  25.         while(1)
  26.         {
  27.                 if(fel_le)
  28.                 {
  29.                         if(OCR1A<255) OCR1A++; //addig növelem (a komaprálási értéket, a led fényereje csöken) amíg nem max
  30.                         else
  31.                         {
  32.                                 fel_le = !fel_le; //ha max, akkor lefelé
  33.                                 PORTC=255;
  34.                         }
  35.                 }
  36.  
  37.                 if(!fel_le)
  38.                 {
  39.                         if(OCR1A) OCR1A--;   //addig csökkentem amíg =0
  40.                         else
  41.                         {
  42.                                 fel_le = !fel_le; //ha min, akkor felfelé
  43.                                 PORTC=0;
  44.                         }
  45.                 }
  46.                 _delay_ms(2);
  47.         }
  48.         return 0;
  49. }


A második esetben csak a PORTC-re kötött LED villog, hogy mikor (kéne) erősödnie és mikor gyengülnie a PWM es LED-nek, mert a PWM-es LED sötét, egyéltalán nem világít.

Próbáltam az adatlapból rájönni, de sajnos nem tudok angolul, így alig értettem meg valamit az adatlapból.

Miért nem megy a 2. PWM láb?
Mit csinálok rosszul?

Novarobot
(#) totht91 válasza trudnai hozzászólására (») Jún 22, 2010 /
 
Látom itt is értelmes emberek vannak és ha egy egyszerű ember kérdezne valamit akkor lehurrogják.

1. én nem ellenállással akartam helyettesíteni a kondikat, csak nekem egyszer már volt gondom az igor féle infra vevővel amikor azt építettem. Arra ezt a megoldást találtam: http://www.ocinside.de/html/modding/usb_ir_receiver/usb_ir_driver.html" target="_blank" rel="nofollow" >Bővebben: Link
Idézet:
„If Windows XP or 2000, etc. just recognizes an "Unknown Device" instead of the proper USB Device name,
this can be a problem with the mainboard, which supports only 3.3 Volt at the data lines of the USB port.
To solve this failure, unsolder the data+ and data- USB cable (green and white or yellow and blue) and solder each with a approx. 100-200 Ohm resistor (e.g. brown-black-brown for 100 Ohm) to the PCB.”


magyarul: d+ és d- ra rakjunk 100-200ohm-ot, ha nem látja a win, megcsináltam, sikerült, de a programozó kapcsán nem működött.

2. nekem az igor avr IR is vígan fut 12kHz-en kondik NÉLKÜL.

3. terveztem egy saját NYÁK-ot a doperhez és az nem működött azért kezdtem el kísérletezni a próbapanelon. Lehet hogy azon van a baj. Esetleg megnézné valaki?

4. Az ilyen szemét hozzászólásokat meg hanyagoljuk jó és ne nézzük már egymást hülyének, bár ezen az oldalon sokszor találkozok ezzel a problémával, példát vehetnétek a prog.hu-ról ahol minden kezdővel értelmesen beszélnek. És sajnálom hogy a probléma felvetésénél nem voltam egyértelmű.

Köszönöm előre is a segítséget.

doper.JPG
    
(#) Topi válasza totht91 hozzászólására (») Jún 22, 2010 /
 
Senki nem hurrogott le ok nélkül. Leírták a megoldást, és erre Te úgy döntöttél, hiába mondja rengeteg ember, akkor sem próbálod meg, mert neked egyszer már valami működött.

A 10-30pF annyira kicsi, hogy akár a szórt kapacitások miatt is előfordulhat hogy berezeg kondi nélkül is.
(#) novarobot válasza novarobot hozzászólására (») Jún 22, 2010 /
 
A probléma megoldódott, én voltam a hatalmas láma

1. A PWM-et nem "AINO" és "AIN1" -nek hívják hanem "OC0A" és "OC0B" (mellesleg 4 db van benne, mert ilyen is van hogy "OC1A" és "OC1B")

2. Az "OC1B" nem a 13. hanem a 11. láb.

3. A kódban a hiba (vagyis amit meg kell változtatni hogy "OC0A" helyet "OC0B")

  1. #
  2. #include <avr/io.h>
  3. #
  4. #include <util/delay.h>
  5. #
  6.  
  7. #
  8. //-------------------------------------
  9. #
  10. int main(void)
  11. #
  12. {
  13. #
  14.         uint8_t    fel_le;
  15. #
  16.         DDRD = 0xFF; //PD 0-7 kimenet
  17. #
  18.         DDRC = 255; //PC 0-7 kimenet
  19. #
  20.         //timer inicializálás PWM módra
  21. #
  22.         GTCCR = 0x00; //nincs TSM
  23. #
  24.         TCCR0A =  (1<<COM0B1)  //COM0A' helyet! át
  25. #
  26.                         | (1<<COM0B0)  //COM0A0 helyet!
  27. // 01= set on comp. match
  28. #
  29.                         | (0<<WGM02)
  30. #
  31.                         | (1<<WGM01)
  32. #
  33.                         | (1<<WGM00);    //011 = Fast PWM mód
  34. #
  35.  
  36. #
  37.         TCCR0B =  (0<<CS02)
  38. #
  39.                         | (1<<CS01)
  40. #
  41.                         | (1<<CS00);     //011 = clk/64 előosztás
  42. #
  43.         TCNT0 = 0;  //countert nullázzuk
  44. #
  45.         OCR0A = 0;  //komparálási szintet nullázzuk
  46. #
  47.         fel_le = 1; //tehát fel
  48. #
  49.  
  50. #
  51.         while(1)
  52. #
  53.         {
  54. #
  55.                 if(fel_le)
  56. #
  57.                 {
  58. #
  59.                         if(OCR0A<255) OCR0A++; //addig növelem (a komaprálási értéket, a led fényereje csökken) amíg nem max
  60. #
  61.                         else
  62. #
  63.                         {
  64. #
  65.                                 fel_le = !fel_le; //ha max, akkor lefelé
  66. #
  67.                                 PORTC=255;
  68. #
  69.                         }
  70. #
  71.                 }
  72. #
  73.  
  74. #
  75.                 if(!fel_le)
  76. #
  77.                 {
  78. #
  79.                         if(OCR0A) OCR0A--;   //addig csökkentem amíg =0
  80. #
  81.                         else
  82. #
  83.                         {
  84. #
  85.                                 fel_le = !fel_le; //ha min, akkor felfelé
  86. #
  87.                                 PORTC=0;
  88. #
  89.                         }
  90. #
  91.                 }
  92. #
  93.                 _delay_ms(2);
  94. #
  95.         }
  96. #
  97.         return 0;
  98. #
  99. }


Novarobot
(#) trudnai válasza totht91 hozzászólására (») Jún 22, 2010 /
 
A linken amit kuldtel pontosan ezt irja:
Idézet:
„If Windows XP or 2000, etc. just recognizes an "Unknown Device" instead of the proper USB Device name,
this can be a problem with the mainboard, which supports only 3.3 Volt at the data lines of the USB port.
To solve this failure, unsolder the data+ and data- USB cable (green and white or yellow and blue) and solder each with a approx. 100-200 Ohm resistor (e.g. brown-black-brown for 100 Ohm) to the PCB.”

Magyaran abban a kapcsolasban nincs szintillesztes, a soros ellenallassal pedig valoszinuleg csak a bemeneteket vedo clamp diodakon atfolyo aramot korlatozzak. Nem egy szerencses megoldas szerintem, mindenesetre az a programozo amit mutattal tartalmazza a szintillesztest egy-egy zener es hozza tartozo ellnallasok tekinteteben.

Idézet:
„2. nekem az igor avr IR is vígan fut 12kHz-en kondik NÉLKÜL.”

Mondjuk ugy, hogy szerencsed volt. A panelen levo vezetekek kapacitasa eppen megfleleo volt, hogy a kvartz berezegjen. De lehet a kezeddel kozelitesz fele es leall, vagy teliholdkor nem indul be -- hidd el azok a kis keramiak nem veletlen vannak abba az aramkorbe betervezve.

A paneleden most igy hirtelen nem latom hol a hidegito kondi a Vdd es Vss kozott? Annak lehetoleg minel kozelebb kellene lennie a PIC labaihoz. Ertsd ugy, hogy 1-2 milimeterre!
(#) totht91 válasza trudnai hozzászólására (») Jún 23, 2010 /
 
Oké ha már azt mondjátok hogy a kvarcnál a kondik a hibásak, rendben de az első próbálkozásomnál már beépítettem őket - lásd a NYÁKot lentebb - egyébként a másik két kondit bejelölöm akkor egy másik képen hogy jobban láthatóak legyenek.

doper.JPG
    
(#) (Felhasználó 4577) válasza totht91 hozzászólására (») Jún 23, 2010 /
 
Egyik se hidegítő.
Miért nem jó Topi Dopere? Ott van a nyák terv és komplett építési leírás.

A nyáktervhez meg még mindig nem csatoltad a kapcsolási rajzot, de azért megkérsz mindenkit, hogy ellenőrizze le, senki se fogja leellenőrizni, mert senkinek sincs rá ideje, Te is le tudod ellenőrizni magad.
(#) totht91 válasza (Felhasználó 4577) hozzászólására (») Jún 23, 2010 /
 
Topi doper kapcsolási rajza alapján készítettem a NYÁKot
(#) Reggie válasza novarobot hozzászólására (») Jún 23, 2010 /
 
Akkor ezekszerint nem a masik PWM-et akartad hasznalni, hanem a masik csatornat.
(#) Topi válasza totht91 hozzászólására (») Jún 23, 2010 /
 
De van ott egyoldalas panel is, ha az lett volna a probléma.
Kezdd szépen el egyesével végignézni az összes alkatrészt, jó helyre kapcsolódik-e.
(#) totht91 válasza Topi hozzászólására (») Jún 23, 2010 /
 
Az lesz... amúgy azért terveztem sajátot mert az egyoldalasban voltak olyan rajzolatok amit kézzel esélytelen megrajzolni (mivel én kézzel rajzolom a NYÁKot tussal)
(#) zeemut hozzászólása Jún 23, 2010 /
 
Hali Mindenkinek!

A kérdésem elsősorban Topinak szólni, de talán más is tudna segíteni.
HEStore-ban vettem egy AVR-Dopert, össze is raktam, elvileg jó. Ehhez vettem gy ATTiny2313-ast, hogy majd azt felprogramozom. De egyszerűen nem megy! Semmi mást nem kapok vissza az AVR Studio-tól, hogy "Entering programming mode: FAILED". Olyan, mintha nem lenne jól beállítva a frekvencia, de már 1kHz-el is próbáltam, de úgy sem jó. Van esetleg valakinek ötlete? Előre is köszönöm!!

Üdv
(#) Ideiglenes válasza zeemut hozzászólására (») Jún 23, 2010 /
 
Programozáskor van rajta kvarc?
(#) Topi válasza zeemut hozzászólására (») Jún 23, 2010 /
 
Ellenőrizd le, hogy a tiny2313 kap-e tápot. Ha a programozóról táplálod, akkor nézd meg a táp tüske fennt van-e.
Nézd meg, hogyjó-e a vezetéked. Nem-e hibás a csatlakozóó. Sípold ki.

Ha nincs szkópod, akkor egy 330R-os soros ellenállással és egy LED-el vizsgáld meg hogy a programozás idejére a LED kialszik-e a RESET-en, és vibrál-e a többin (SCK, MISO, MOSI)

115K alá ne vidd. Felesleges, mert 1KHz-en nem is enged többnyire már programozni. (EEPROM, FLASH)
Következő: »»   240 / 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