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   390 / 840
(#) sgt válasza mrgrassy hozzászólására (») Dec 14, 2011 /
 
Órajel frekvencián állítottál? A programban megadtad, hogy mekkora frekvencián megy a cucc?
(#) mrgrassy válasza sgt hozzászólására (») Dec 14, 2011 /
 
meg adtam mindent 125khz-n írtam be és az avr studió automatikusan állítja be a frekvenciát
(#) Topi válasza tecsa hozzászólására (») Dec 14, 2011 / 2
 
Az elv nagyon egyszerű.

Bővebben: Link

Az elv gyakorlatilag ugyan ez, annyi a különbség hogy invertált a felhúzó ellenállások miatt a T-Bird Exp panel.

Mellékletben egy nagyon egyszerű általam a demókhoz írt billentyűzet olvasó rutin.
(#) tecsa válasza Topi hozzászólására (») Dec 14, 2011 /
 
Köszönöm a segítséget!

Az egyszerűből azért arra következtetek, hogy van még hova fejlődnöm. , azért a következő 11hónap csak elég lesz megéretni.
(#) covek válasza sgt hozzászólására (») Dec 14, 2011 /
 
Schuster Gyuri? Humm, valaha diákja voltam. Beszélnem kellene vele az említett két írás miatt!
(#) tecsa válasza covek hozzászólására (») Dec 14, 2011 /
 
Engem Ő még nem tanított, majd Infó2-őt fog Ő is tanítani.
(#) trudnai válasza tecsa hozzászólására (») Dec 14, 2011 /
 
Sracok, nem kellene az offokat valahol mashol megbeszelni?
(#) Moderátor hozzászólása trudnai hozzászólására (») Dec 15, 2011
 
De, jól mondod
(#) tecsa válasza Topi hozzászólására (») Dec 15, 2011 /
 
Billentyűzet kezelő függvénnyel kapcsolatban lenne kérdésem. Csak két sor szorulna magyarázatra.
  1. #define KBRD_MASK0x7F
  2. // TBirdKeyboardInit-ből kimsáolt sor
  3. KBRD_PORT &= ~KBRD_MASK;
  4. // ReadKeyboard fv.-ből kimásolt sor
  5. KBRD_PORT = (KBRD_PORT&0x80)|(0b0001000);


Mi történik ebben a két sorban? Sajnos ilyen rövidített formákat soha nem használtam.
(#) sikolymester válasza tecsa hozzászólására (») Dec 15, 2011 / 1
 
Bitenkénti logiaki operátorok

Az általad írt 3. sorban kitörli a KBRD_PORT változóban a KBRD_MASK értékeit.

Az 5. sor magáért beszél. Összeéseli a 7-ik bitet önmagával, majd beír a 4-ik bitbe 1-et.
(#) tecsa hozzászólása Dec 16, 2011 /
 
Az oldalon lévő Nyolc lábbal AVR IV. részének az RGB hangulat világítás című kapcsolását szeretném kicsit átírni, a következő képpen:
Egy nyomógomb használatával választani 4 opció közül:
1: csak piros fény
2: csak zöld fény
3: csak kék fény
4: RGB színkeverés
Úgy megtudtam csinálni hogy ezt 4 különböző gomb megnyomására csinálja.

  1. switch(gomb())
  2. {
  3. case 1: val=0;
  4.                       R_duty=255;
  5.                       G_duty=B_duty=0;
  6.                       break;
  7.  
  8.              case 2: val=0;
  9.                          G_duty=255;
  10.                          R_duty=B_duty=0;  
  11.                          break;
  12.  
  13.              case 3: val=0;
  14.                          B_duty=255;
  15.                          R_duty=G_duty=0;
  16.                          break;
  17.  
  18.             case 4: val=1;  // itt lép be a színkeverésbe
  19.                         break;
  20. }
  21. // Gombokat a következő függvény működteti.
  22.  
  23. char gomb(void)
  24. {
  25.  char g,gg=1;
  26.  g=PING;
  27.  switch(g)
  28.  {
  29.  case 1:gg++; break;
  30. if(gg==5) gg=1; break;
  31.  }
  32.  return gg;
  33. }

A gg értéke csak a gomb lenyomásának az idejére lesz 2.
az if(gg==5) gg=1; sorral szerettem volna a 4. állapot után visszatérni az elsőre, de sajnos a 2. állapotra se jutottam el.
Hogy lehet ezt megvalósítani?
A választ előre is köszönöm:
Tecsa
(#) sikolymester válasza tecsa hozzászólására (») Dec 17, 2011 /
 
  1. char gomb(void)
  2. {
  3.  char g,gg=1;
  4.  g=PING;
  5.  switch(g)
  6.  {
  7.  case 1:gg++; break;
  8. if(gg==5) gg=1; break;
  9.  }
  10.  return gg;
  11. }


Nem csoda.
A g változó csak addig él a gomb() függvényben, amíg az fut. Hiába írsz bele bármit is, legközelebb megint 1-re inicializálod.

Keress rá a static előtagra.
(#) 06smici hozzászólása Dec 17, 2011 /
 
Sziasztok
Egy ADC értékét szeretném 7 szegmenses kijelzőre kiírni. Addig eljutottam hogy az ADC-t beolvastam és egy nyolc bites értéket kaptam.
  1. $crystal = 4000000
  2.  
  3. Config Adc = Single , Prescaler = Auto , Reference = Aref
  4. Config Portc = Output
  5. Config Portd = Output
  6.  
  7. Dim Mem1 As Long
  8. Dim Mem2 As Single
  9.  
  10. Enable Adc
  11. Start Adc
  12.  
  13. Do
  14.  
  15. Mem1 = Getadc(0)
  16. Mem2 = Mem1 / 4
  17. Mem1 = Int(mem2)
  18.  
  19. loop
  20. end


0,9V nál kéne 0 és 4,5V nál 40et kiírni 3digites kijelzőre. A harmadik digit csak tizedes jegy lenne (0,5 pontosság elég) Ebben kérném a segítségeteket, én elég kezdő vagyok ehhez. Ahogy számoltam nem jönne ki egészre az értékek közötti különbség (4,6onként) . De gondolom ezt így nem lehet beírni neki... Valakinek nincs ötlete hogy lehetne megoldani? A legjobb az lenne ha egy külön byteos változóba be lenne írva az érték 0-40ig és egy külön változóba a tizedesjegye.
A kijelző vezérlése már megvan.
Minden segítséget szívesen várok.
(#) sikolymester válasza 06smici hozzászólására (») Dec 17, 2011 /
 
Sakkozd ki milyen matematikai függvénnyel valósítható meg a dolog. Gyanítom lineáris lesz ez a függvény.

x=0,9 -> y=0
x = 4,5 -> y =40

Ha nem megy a matek, akkor írd be excelbe egy x-y grafikonba és az megmondja a függvényt ami közelíti.
(#) davidpeter hozzászólása Dec 17, 2011 /
 
Kedves hozzárétők!

Vagy egy AT90USB1287 AVR-em,a mivel kicsit meggyűlt a bajom. Elég misztikus hibákat produkál, amit arra tudtam visszavezetni, hogy UART adatküldéskor resetelődik a kontroller.

A probléma akkor derült ki, amikor visszaküldettem vele a belső adatokat. Kiderült, hogy az UART-ről beolvasott adatokat simán eltárolja, de ha vissza is küldetem, a küldés után minden belső változó újra inicializálódott. Ez a gyakorlatban úgy néz ki, hogy az első UART parancs hatására minden, korábban UART-on kapott adatot visszaküldött, a közvetlenül utána küldött kiolvasó parancsra viszont már csupa null érték jött.

A végletekig egyszerűsítve mutatja a problémát az alábbi forrsákód, melyet futtatva végtelen mennyiségű '?' árasztja el a soros portot.

  1. int main(void)
  2. {
  3. callAllInit();
  4. enableTransciever();
  5. startRN42();
  6. WDTCSR = 0;
  7.  
  8. sendChar('?');
  9.  
  10. while(1)
  11. {
  12. }
  13. }

Ebből a callAllInit az alábbi USART initet hívja:

  1. void uSARTInit()
  2. {
  3.  
  4. UCSR1A = _BV(U2X1); //clearing flags, setting double speed (versus normal)
  5. //UCSR1B = 0; //disabling transmitter, setting UCSZ12 in order to provide 8 bit frames
  6. UCSR1C = _BV(UCSZ11) | _BV(UCSZ10); //8 bit, 1 stop bit, no parity
  7. UBRR1H = ((unsigned int)(BAUD_PRESCALE) >> ; // Load upper 8-bits of the baud rate value into the high byte of the UBRR register
  8. UBRR1L = ((unsigned int)(BAUD_PRESCALE)); // Load lower 8-bits of the baud rate value into the low byte of the UBRR register
  9.  
  10. }


Az enableTransciever ezt a két függvényt hajtja végre:


  1. void enableTransmitter()
  2. {
  3. UCSR1B = UCSR1B | _BV(TXEN1) | _BV(TXCIE1); //Transmitter, enable, transmitt complete interrupt enable
  4. }
  5.  
  6. void enableReciever()
  7. {
  8. UCSR1B = UCSR1B | _BV(RXEN1) | _BV(RXCIE1); //Reciever, enable, recieve complete interrupt enable
  9. }

A sendChar() pedig így működik:

  1. void sendChar(char c)
  2. {
  3. char temp = c;
  4. while(!rN42ready()); //ez az UART adatokat fogadó modul flow control jeleit ellenörzi.
  5. while(checkDataRegister());
  6. UDR1 = temp;
  7. }



Van valakinek ötlete, hogy ez mi lesz?
(#) sikolymester válasza davidpeter hozzászólására (») Dec 17, 2011 /
 
Nem csak resetelődik az egész AVR? Nem tudom fut e watchdog, mindenesetre ne fusson.
Hogy mi okozott resetet azt eltárolja a MCUSR registerben, azt ki tudod olvasni, hátha okosabb leszel.

Ilyen fura adateltűnéseket tömbön kívüli írások okozhatnak. Nézd át, hogy mindenhol jól kezeled őket.

A kódod átlesve bennem erősen él a watchdog gyanú amúgy.
(#) davidpeter válasza sikolymester hozzászólására (») Dec 17, 2011 /
 
Elvileg induláskor kilövöm a kutyát. Lehet, hogy valami visszakapcsolja? Azért fura, mert akármeddig elmegy koherensen, beleírom az adatokat és fél óra múlva is ki tudom olvasni, majd jön a reset.

MCUSR szerint power up down reset volt. A tápot egy step-up converter állítja elő, de rámérve szépen adja a 3,3 voltot. Szkópom viszont nincs.

Akkor hogyan tovább?
(#) sikolymester válasza davidpeter hozzászólására (») Dec 17, 2011 /
 
A fuse beállításokban a WDTON (Watchdog timer always on) fuse-zal mi a helyzet?

Bár a MCUSR állapota szerint valszeg nincsen bekapcsolva. De próba cseresznye.
(#) davidpeter válasza sikolymester hozzászólására (») Dec 17, 2011 /
 
Ki van lőve, és az MCUSR szerint sem WDT resetből áll fel.
(#) sikolymester válasza davidpeter hozzászólására (») Dec 17, 2011 /
 
Igen, az szerkből már ment tőlem is (bocsánat).
Akkor még a következő gondolatom támadt: WINAVR féle Avrgcc-vel fordítod, vagy az atmel féle Avrtoolchainnel?
Utóbbit nagyon szídják az avrfreaksen, egyszerűen bugosnak ítélik a legtöbben.

MCU típusa biztos At90USB1287-re van állítva a makefileban?
(#) Reggie válasza sikolymester hozzászólására (») Dec 17, 2011 /
 
Van egy szep buglistje, de a legtobb nem valami komoly hiba, hanem az optimalizacio hianya. Attol nem fog ujraindulni a uC.
(#) Reggie válasza davidpeter hozzászólására (») Dec 17, 2011 /
 
Probald meg, hogy ideiglenesen mashonnan taplalod meg egy sima atereszto tappal (pl. 9V elem vagy usb port + 3.3V-os stab). Ha akkor is ez a hiba, akkor biztos nem a tappal van gond.

Az alapproblemadhoz visszaterve: nekem ilyen jellegu hibak akkor szoktak elojonni, ha a stack eleri a valtozokat.
(#) zombee hozzászólása Dec 18, 2011 /
 
Sziasztok!

74HC595-ös shift regiszterekből álló rendszert illesztenék AVR-hez. Nem ez az első, már több sikeres eszközt
építettem ezzel a módszerrel. A probléma hogy a tápfeszültség ráadásakor egy pillanatra
az összes kimenet "HI" állapotba kerül ami egy ilyen vezérlőnél nemkívánatos jelenség.

Még az AVR-t sem építettem bele hogy megbizpnyosodjak, nem-e az okozza a problémát. Hát nem!
A panelt úgy terveztem hogy a shift regiszter "/MR - Master Reset" bemenetére felhúzóellenállás-kondi
párost kötöttem, a "/G" lábakat pedig automatikusan a földpontra. Ez nem vált be, és az IC adatlapjából
azonnal rá is jöttem mi a baj: a Master Reset csak a shift regisztert törli, a Latch-et nem! Megáll az ész...
(Az eredeti terv egy részlete a csatolt képen is látható.)

Ezután a "/G" bemenetet levágtam a földpontról, tettem rá felhúzó ellenállást(2k2), és az AVR-re kötöttem.
Mivel így a shift regiszter kimenete nagyimpedanciás is lehet, a FET-ek lehúzó ellenállást is kaptak.
Így a Gate vezérlését is az AVR-re bízom, de ez sem vált be: most már nem villantak fel a LED-ek,
de ha sokáig nem kap áramot(több óra) akkor a jelenség megismétlődik, a LED-ek felvillannak.
Most az összes felvillan, de az eredeti megoldással csak azok amelyek a kikapcsoláskor HI állapotban voltak.
Mivel tudnám ezt a hibát megszüntetni? Segítségeteket előre is köszönöm.
(#) Reggie válasza zombee hozzászólására (») Dec 18, 2011 /
 
Valami problema lehet a keppel, amit feltoltottel, mert sem a bongeszo nem jeleniti meg, se a photo viewer, ha letoltom.

De ha az OE lab a tapra van huzva, akkor biztos nagyimpedancias allapotban kell lennie a kimenetnek. Ha ez megsem igy van, akkor vagy az OE lab nincs tapon(uC valamiert lehuzza) vagy hibas az IC.
(#) zombee válasza Reggie hozzászólására (») Dec 18, 2011 /
 
Valamiért nem engedi feltölteni. ITT elérhető.

Pár perce már leszedtem az AVR-t, én is gondoltam rá hogy az okozza a hibát.
A következő bekapcsolásnál újra villant a cucc, szóval nem az volt a gond...
(#) Reggie válasza zombee hozzászólására (») Dec 18, 2011 /
 
En a tobb ora utani felvillanasra gondoltam, amikor a uC hibajat emlitettem.

Sajnos ezeknel az IC-knel nincsen semmilyen garancia arra, hogy bekapcsolaskor ugy viselkedik, mint ahogy te szeretned. Ha a jelenseget meg szeretned figyelni, akkor adjal neki kulon tapot labortaprol es lassan noveld a tapfeszultseget, hatha megtudsz valami erdekeset.
A kimeneten a villanast szerintem RC vagy LC taggal szurd ki. Ha ez nem megoldas, akkor egyebb aramkori kiegeszitesen kell gondolkodni. Peldaul hasznaljal kettot ebbol az IC-bol, es a LED-eket ket szomszedos lab koze kossed. Igy csak akkor fognak vilagitani a LED-ek, ha 10(vagy 01, bekotestol fugg) bitsorozatokat kuldesz ki.
(#) zombee válasza Reggie hozzászólására (») Dec 18, 2011 /
 
Sajnos nem megoldható a 2 shift regiszter, ráadásul nem a LED-ek vezérlése a cél hanem a FET-eké.
A LED-ek csak visszajelzésre szolgálnak, a korrekt visszajelzés érdekében a FET hajtja meg őket...
(#) Reggie válasza zombee hozzászólására (») Dec 18, 2011 /
 
Igen, most neztem meg a masik helyre feltett kepet. Ugy latszik, akkor marad a szures. Esetleg probalj meg egy masik tipust, pl. a HCT595-ot. Vagy egy masik gyartotol szarmazot probalj ki. Ha ezek sem valnak be, akkor a kritikus alkalmazasokban inkabb microchip fele i/o expandert hasznalj.
(#) dc001 hozzászólása Dec 18, 2011 /
 
Van egy "misztikus" hibám. Nem tudom találkozott-e valaki ezzel, vagy volna-e valakinek ötlete:

Adott egy Atmega168, amelynek a TWI portjára van kötve egy PCF8583 óra IC. A kapcsolásban +5V-os tápra nagyobb kondenzátor van kötve, hogy ha elmegy a táp az atmega még EEPROM-ba ki tudja írni a státuszát. Az AVR-ben lévő program folyamatosan olvassa a PCF8583-at (00-04 regisztereket) és ez alapján megjeleníti az időt.

Probléma akkor van, ha át akarom állítani az órát. Amikor a program beírja az új értékeket a fenti regiszterekbe az óra lelassul (sacc/kb a felére, 2 mp alatt vált 1 mp-et).

Először arra gondoltam, hogy a programmal van valami baj, de ha reset-elem az atmegát a jelenség továbbra is fenn áll.

Utána arra gondoltam, hogy rossz érték kerül beírásra a PCF8583-ba, de ha néhány másodpercre megszakítom a tápot, akkor az atmega újra indul, de az óra még megtartja a beállított értéket (a fent említett kondenzátorok miatt), viszont ez után már újra jól működik a következő beírásig.

Bárkinek volna ötlete mit nézzek meg vagy merre induljak?
(#) davidpeter válasza Reggie hozzászólására (») Dec 18, 2011 /
 
Megvan a gond, nem volt lekezelve a TX complete interrupt, ez hülyítette meg.
Következő: »»   390 / 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