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   700 / 841
(#) k3gy3tl3n válasza Kovidivi hozzászólására (») Okt 19, 2015 /
 
Belső órajelről megy. Zárlat nincs már 2X végigmértem mindent. Másik uc-vel is ezt csinálja pedig az is új.
(#) Kovidivi válasza k3gy3tl3n hozzászólására (») Okt 19, 2015 /
 
Akkor rakj fel sima villogó programot, és teszteld. Nézd meg, hogy mikor nem villog a LED-ed.
(#) k3gy3tl3n válasza Kovidivi hozzászólására (») Okt 19, 2015 /
 
Igen most a programban keresem a hibát, az a vicc hogy ez is működött eddig a próbapanelen, most összeforrasztgatva meg nem megy.
(#) k3gy3tl3n válasza k3gy3tl3n hozzászólására (») Okt 19, 2015 /
 
Megvan hol akad meg a kód, amikor SPI-on adatokat küldenék a rádiós adóvevőnek.
(#) k3gy3tl3n válasza k3gy3tl3n hozzászólására (») Okt 19, 2015 /
 
A reset lábat ha rövid időre földre zárom akkor elindul, de ez így nem normális...
(#) k3gy3tl3n válasza k3gy3tl3n hozzászólására (») Okt 19, 2015 /
 
Úgy néz ki a DC DC konverter környékén kell keresgélni. A program elejébe tettem egy sec várakozást mielőtt adatokat küldözgetnék a rádiónak és most megy, nem akad meg, de csak az avr égetőről tápolva (ez ugyebár a DC DC konverter mögött van). Ha elemről menetném a DC DC konverterről akkor nem megy. 9V-os elemről nem illik konvertert hajtani?
(#) csatti2 válasza k3gy3tl3n hozzászólására (») Okt 19, 2015 /
 
Miért ne lehetne? Viszont az nem nagy segítség, hogy DC-DC konverter. Rengeteg fajta létezik. Milyen IC van a tieden? Esetleg valamilyen monolitikus cucc?
(#) k3gy3tl3n válasza csatti2 hozzászólására (») Okt 19, 2015 /
 
Most megy a DC DC-ről is, nem tetszett neki hogy az égető is rá volt dugva meg elemről DC DC-vel is hajtottam volna. Pedig az égető ekkor nem volt USB-ről tápolva csak rá volt dugva a uc-re. Egyébként ez a konverter.Most 2 secet várok mielőtt elkezdeném az adást, megpróbálom ezt lecsökkenteni és megnézem továbbra is működik e.
(#) csatti2 válasza k3gy3tl3n hozzászólására (») Okt 19, 2015 /
 
Valószínűleg túlterhelted. Ezek a pici készre gyártott állítható cuccok sokkal rosszabb hatásfokkal rendelkeznek, mintha te terveznéd meg. A feedback körbe tett potméter is gyakran változó kimeneti feszültséget okozhat különböző terheléseknél. A 9V-os elemből sem lehet őrületes áramokat kifacsarni.
(#) k3gy3tl3n válasza csatti2 hozzászólására (») Okt 19, 2015 /
 
Most úgy vagyok az egésszel hogy kiveszem ezt a konvertert és megy a helyére egy 7805 még ha rosszabb is lesz a hatásfok, de legalább stabilan működjön.
(#) Vacok hozzászólása Okt 19, 2015 /
 
Sziasztok!

Van egy Atmega328p AVR-rel felépített óra, mely órakvarcról megy. Egy olyan jelenség lépett fel, hogy miután tápot adok neki a kvarc rezgése nagyon sokára (~10-15mp) indul el, és utána is nagyon pontatlan, és ha csak megközelítem az ujjammal a kvarcot a rezgés lelassul vagy teljesen le is áll. Hogyan tudnám ezt a problémát megoldani?
A panel rezonátorra lett tervezve, így az óra kvarc két lába 5mm távolságra van és a "középső láb" felé testre egy-egy 33pF 0805 kondenzátor van kötve.
(#) csatti2 válasza k3gy3tl3n hozzászólására (») Okt 19, 2015 /
 
Ha van szkópod, akkor érdemes megnézni a kijövő feszültséget. Ha szükséges be lehet rakni egy LC szűrőt és az elsimítja az esetlegesen csúnya kimenetet (szkópon a DC-DC konverter frekvenciája is látszik, ami szükséges az LC méretezéséhez).
Ha hosszútávra szánod, akkor nem érdemes a 7805-el pocsékolni az energiát.
(#) k3gy3tl3n válasza csatti2 hozzászólására (») Okt 19, 2015 /
 
A konverter nem lehet túl gyenge mert szervó motort is hajtok egy ilyennel és gond nélkül elmegy vele! Egyébként kiderült hogy mért megy jól az égető tápjáról és miért csak néha néha megy a konverterről. Itt a ludas, a leg gyengébb láncszem ami megszivatott: Bővebben: Link Egyébként hajó távirányítója lesz, kíváncsi vagyok mennyit fog bírni.
(#) csatti2 válasza k3gy3tl3n hozzászólására (») Okt 19, 2015 / 1
 
Valóban viszonylag nagy áramot képes kezelni ez az IC (ez nem meglepő, ennél kisebb tokozással is csinálnak 1A+ konverter ICket). A gond az, hogy a külső alkatrészeit is illik a feladathoz méretezni különben a hatásfok hátrányára válik (ami meg melegíti az IC-t, így égse lehet akkora áramot átküldeni rajta).

Ha nem válik be érdemes beszerezni LiPo akkut és step-up konverterrel előállítani az 5V-ot. A legtöbb hobbitávirányító mostanában azt használ. Kisebb kapacitású (a 9V-os elemhez képest így is óriási) példányok kifejezetten baráti áron kaphatóak.
(#) k3gy3tl3n válasza csatti2 hozzászólására (») Okt 19, 2015 /
 
Köszi, utánanézek milyen lehetőségek vannak. Milyen kapacitású és feszültségú LiPo-t érdemes nézni?
(#) csatti2 válasza k3gy3tl3n hozzászólására (») Okt 19, 2015 /
 
A kapacitás az attól függ mennyit eszik a távirányítód (és hány cellás LiPo-t veszel). Amire figyelni kell ha rácuppansz a témára és a hajód is LiPo-val hajtod meg, akkor szerezz be egy LiPo safe bag-et is, amiben az akkukat tárolhatod amikor nem használod őket (ez egy tűzálló zsák, ami a LiPo akkuk óriási energiatárolási képessége miatt lehet érdekes). Ha több cellás akkut veszel, akkor kell venni egy LiPo töltőt is, ami a cellák balanszírozott töltésére szolgál (ez nagyon fontos), illetve karban is tartja az akkukat és nem is engedi túltölteni. A névleges feszültsége a LiPo-nak a cellák számától függ, 4 cellásnál többet ne nagyon vegyél.
(#) kiborg hozzászólása Okt 21, 2015 /
 
Sziasztok!

Tudom, hogy nem AVR téma,de mivel nem találtam C kezdőknek topicot ezért itt kérdezem meg,mert AVR-t programoznék.
  1. int buttonWasPressed,buttonWasPressed_2; /* state */
  2.  
  3.         // endless loop
  4.             while (1)
  5.                 {
  6.        
  7.                         if (bit_is_set(button_pin, button_p) ) // button_piros is pressed now
  8.                                 {
  9.                                         if (buttonWasPressed == 0) // but wasn't last time through
  10.                                                 {
  11.                                                         LED_port |= (1 << LED_pir); // do whatever
  12.                                                         buttonWasPressed = 1; // update the state
  13.                                                         _delay_ms(200);
  14.                                                 }
  15.                                 }
  16.  
  17.                         if (bit_is_set(button_pin, button_p) ) // button_piros is pressed now
  18.                                 {
  19.                                         if (buttonWasPressed == 1) // but wasn't last time through
  20.                                                 {
  21.                                                         LED_port &= ~(1 << LED_pir); // do whatever
  22.                                                         buttonWasPressed = 0; // update the state
  23.                                                         _delay_ms(200);
  24.                                                 }
  25.                                 }
  26.  
  27.  
  28.                         if (bit_is_set(button_pin, button_z) ) // button_zold is pressed now
  29.                                 {
  30.                                         if (buttonWasPressed_2 == 0) // but wasn't last time through
  31.                                                 {
  32.                                                         LED_port |= (1 << LED_zol); // do whatever
  33.                                                         buttonWasPressed_2 = 1; // update the state
  34.                                                         _delay_ms(200);
  35.                                                 }
  36.                                 }
  37.  
  38.                         if (bit_is_set(button_pin, button_z) ) // button_zold is pressed now
  39.                                 {
  40.                                         if (buttonWasPressed_2 == 1) // but wasn't last time through
  41.                                                 {
  42.                                                         LED_port &= ~(1 << LED_zol); // do whatever
  43.                                                         buttonWasPressed_2 = 0; // update the state
  44.                                                         _delay_ms(200);
  45.                                                 }
  46.                                 }
  47.                        
  48.                
  49.  
  50.             }                                                  /* End event loop */
  51.             return (0);


A fenti kód arra szolgál, hogy egy-egy gombra egy-egy ledek kapcsol fel és le.
Külön külön működik (piros vagy zöld) de ha együtt szeretném használni, akkor nem. Mit csinálok rosszul?
A hozzászólás módosítva: Okt 21, 2015
(#) kiborg válasza kiborg hozzászólására (») Okt 21, 2015 /
 
Megoldottam így:

  1. int buttonWasPressed,buttonWasPressed_2; /* state */
  2.  
  3.         // endless loop
  4.             while (1)
  5.                 {
  6.        
  7.                         if (bit_is_set(button_pin, button_p) ) // button_piros is pressed now
  8.                                 {
  9.                                         if (buttonWasPressed == 0) // but wasn't last time through
  10.                                                 {
  11.                                                         LED_port |= (1 << LED_pir); // do whatever
  12.                                                         buttonWasPressed = 1; // update the state
  13.                                                         _delay_ms(200);
  14.                                                 }
  15.                                                 else
  16.                                                 {
  17.                                                         LED_port &= ~(1 << LED_pir); // do whatever
  18.                                                         buttonWasPressed = 0; // update the state
  19.                                                         _delay_ms(200);
  20.                                                 }
  21.                                 }
  22.  
  23.                         if (bit_is_set(button_pin, button_z) ) // button_zold is pressed now
  24.                                 {
  25.                                         if (buttonWasPressed_2 == 0) // but wasn't last time through
  26.                                                 {
  27.                                                         LED_port |= (1 << LED_zol); // do whatever
  28.                                                         buttonWasPressed_2 = 1; // update the state
  29.                                                         _delay_ms(200);
  30.                                                 }
  31.                                                 else
  32.                                                 {
  33.                                                         LED_port &= ~(1 << LED_zol); // do whatever
  34.                                                         buttonWasPressed_2 = 0; // update the state
  35.                                                         _delay_ms(200);
  36.                                                 }
  37.                                 }
(#) k3gy3tl3n válasza kiborg hozzászólására (») Okt 21, 2015 /
 
Amikor a while(1) ciklusod először lefut és először vizsgálod benne a buttonWasPressed váltózókat akkor szerinted mennyi az értékük? Te sem tudod igaz? Valami kezdőértéket illene adni nekik.
(#) k3gy3tl3n válasza kiborg hozzászólására (») Okt 21, 2015 /
 
  1. while(1)
  2. {
  3.         if (bit_is_set(button_pin, button_p) && bit_is_set(button_pin, button_z ) // mindketto nyomva
  4.         {
  5.                 LED_port |= (1 << LED_pir);
  6.                 LED_port |= (1 << LED_zol);
  7.                 _delay_ms(200);
  8.                 LED_port &= ~(1 << LED_pir);
  9.                 LED_port &= ~(1 << LED_zol);
  10.         }
  11.         else
  12.         {
  13.                 if(bit_is_set(button_pin, button_z)) //csak zold nyomva
  14.                 {
  15.                         LED_port |= (1 << LED_zol);
  16.                         _delay_ms(200);
  17.                         LED_port &= ~(1 << LED_zol);    
  18.                 }
  19.                 else
  20.                 {
  21.                         if(bit_is_set(button_pin, button_p))// csak piros nyomva
  22.                         {
  23.                                 LED_port |= (1 << LED_pir);
  24.                                 _delay_ms(200);
  25.                                 LED_port &= ~(1 << LED_pir);           
  26.                         }
  27.                         else
  28.                         {
  29.                                 //egyik sincs nyomva
  30.                         }
  31.                 }
  32.         }
  33. }

Én valami ilyesmit csinálnék, az a két int változó meg nem is kell.
(#) Primary hozzászólása Okt 21, 2015 /
 
Elvileg összehegesztettem egy AVR109 hexát ATmega168P-re. Fel is töltöttem a hexát az AtmelStudio 7-tel.
Viszont szeretnék valami programot is feltölteni az alkalmazás részre, de az avrdude-ban nem szerepel a 168p csak a sima 168. Bele lehet valahogy írni?

Vagy van valami más módja a programozásnak?
A hozzászólás módosítva: Okt 21, 2015
(#) Sick-Bastard válasza Primary hozzászólására (») Okt 21, 2015 /
 
Az atmega168 és a 168p között nem találtam az adatlapon eltérést, a feszültségeket leszámítva. Tudomásom szerint használható az avrdude-ban a 168-as beállításaival.
(#) rolandgw válasza Primary hozzászólására (») Okt 21, 2015 /
 
A 168p-t is ismeri. Próbáld ki ezt.
(#) Max26 hozzászólása Okt 22, 2015 /
 
Sziasztok!

a) eset:
Kapcsolo 1 és kapcsolo 2 legyen zárt állapotban. CSatlakoztatom az USB-TTL konvertert->behúz a relé-> érzékelem a logikai 0 szintet és bontódik a K2 segédérintkező. Ha lecsatlakoztatom az USB-TTL konvertert, akkor az áramkör átvált akkura. Ekkor a DHT11 szenzorhiba jelenik meg az LCD kijelzőn, pedig a szenzor megkapja a tápot kb 4.1V.

b) eset:
Rx vagy Tx nincs bekötve.
Kapcsolo 1 és kapcsolo 2 legyen zárt állapotban. CSatlakoztatom az USB-TTL konvertert->behúz a relé-> érzékelem a logikai 0 szintet és bontódik a K2 segédérintkező. Ha lecsatlakoztatom az USB-TTL konvertert, akkor az áramkör átvált akkura. Nincs DHT11 szenzorhiba .

Miért van szenzorhiba ha Rx és Tx be vannak kötve?

Kapcsolas.png
    
(#) Max26 válasza Max26 hozzászólására (») Okt 23, 2015 /
 
Meg van a hiba, egy 100nF kondi kell közvetlen a szenzorhoz. Így már működik.
(#) ThompsoN hozzászólása Okt 24, 2015 /
 
Sziasztok!

Van egy Atmega164PA típusú mikrokontrollerem, amin a timer2-es modult használom fast PWM üzemmódban. Miért lehet az, hogy amikor az OCR2A vagy OCR2B regiszterek 0-ra vannak állítva, akkor a hozzájuk tartozó lábon lévő LED/(közvetett módon LED-ek) nagyon halványan mégis világít(anak)?

A timer beállítását ez a 2 sor végzi.
  1. //fast PWM, OCR2A -> nem-invertált, OCR2B -> invertált
  2. TCCR2A = (1 << COM2A1) | (1 << COM2B1) | (1 << COM2B0) | (1 << WGM21) | (1 << WGM20);
  3. //32-es előosztás
  4. TCCR2B = (1 << CS21) | (1 << CS20);


Teszt gyanánt mind az OCR2A, mind az OCR2B regiszterbe fixen beégettem 0-t, és ugyan ez a jelenség volt. (OCR2B invertált, de azon a lábon invertált bemenetű shiftregiszter van, ezért a beírt értéket tekintve kezelhető úgy is, mintha nem lenne invertálva.)
A hozzászólás módosítva: Okt 24, 2015
(#) Balázs válasza ThompsoN hozzászólására (») Okt 24, 2015 /
 
A DDRx regiszterben be vannak állítva kimenetként ezek a lábak?
(#) ThompsoN válasza Balázs hozzászólására (») Okt 24, 2015 /
 
Igen, mindkettő kimenetre van állítva.
(#) Balázs válasza ThompsoN hozzászólására (») Okt 24, 2015 / 1
 
Úgy látom, a Fast PWM mód erre nem lesz jó. Az adatlap ezt írja:

Idézet:
„The extreme values for the OCR0A Register represents special cases when generating a PWM waveform output in the fast PWM mode. If the OCR0A is set equal to BOTTOM, the output will be a narrow spike for each MAX+1 timer clock cycle. Setting the OCR0A equal to MAX will result in a constantly high or low output (depending on the polarity of the output set by the COM0A1:0 bits.)”

Esetleg próbáld meg a Phase Correct PWM módot, vagy használd invertálva, és BOTTOM helyett MAX-ra állítsd.
A hozzászólás módosítva: Okt 24, 2015
(#) holex válasza ThompsoN hozzászólására (») Okt 24, 2015 / 2
 
Adatlap:
Idézet:
„The extreme values for the OCRnx Register represents special cases when generating a PWM waveform
output in the fast PWM mode. If the OCRnx is set equal to BOTTOM (0x0000) the output will be a narrow spike
for each TOP+1 timer clock cycle. Setting the OCRnx equal to TOP will result in a constant high or low output
(depending on the polarity of the output set by the COMnx1:0 bits.)”


Fast PWM-nél nem tudsz 0%-os kitöltési tényezőt elérni, csak ha invertált módban használod (de akkor meg a 100%-ot nem tudod elérni). Ha megnézed logikai analizátorral, akkor láthatod, hogy a kitöltési tényező 1/255, nem pedig 0.
Megoldás:
-amit az előbb írtam, vagy
-fázishelyes PWM mód használata (ott nincs ilyen gond), vagy
-a láb kikapcsolása, amikor 0-s kitöltési tényezőt akarsz
Következő: »»   700 / 841
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