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   324 / 840
(#) sikolymester válasza cicero hozzászólására (») Máj 10, 2011 /
 
Én építettem, meglepően sokáig elvoltal vele, amíg megtaláltam minden nyák hibát, ami miatt nem ment.
Ajánlom figyelmedbe mindenekelőtt azokat a pineket, amiket ki kell szedni a 40 lábas dip foglalatból, az nem valami látható helyen van elmagyarázva.

Persze, csak ha az előre megadott NYÁKot gyártottad le.

Szóval én azt javaslom, hogy multimétert elő, és hibákat keres.
(#) cicero válasza sikolymester hozzászólására (») Máj 11, 2011 /
 
Szia!

Köszönöm a válaszodat...

Időközben megoldódott a problémák egyik, fő része.A 2.11-es firmware-t beprogramoztuk az ATmega88P-be, és a szerkezet működik.Három Atmega8-at és egy ATmega88P-t "megjavított"...

A MANUAL üzemmóba kapcsolás továbbra is gond az RS232 konverteremmel. Automata módban remekül kiír mindent, de nem hajlandó belépni Manual-ba. Végülis ez már nem nagy probléma, csak kicsit zavaró, mert nem igazán értjük mi okozhatja.

A panelt egy jó barátom készítette, meglehetősen igényesen dolgozik, lajos1969 néven szokott felrakni a fórumokba az elkészített dolgairól (dolgainkról)képeket (pl.Labortáp, 3D globe...stb.). Természetesen ellenőriztük a PCB-t.

Csak ez a fránya RS232...

(#) Ladoz hozzászólása Máj 12, 2011 /
 
Sziasztok,

ATmega128 alatt egy rádiós IC-vel RS232 kommunikációt kell folytatnom 19200 baud, 8N1 beállítások mellett. Az alábbi C függvény végzi a soros konfigot:

  1. void RFUartInit(void) {
  2.         unsigned short ubrr;
  3.  
  4.         ubrr = (F_CPU / 16 / UART0_BAUD) - 1;
  5.         UBRR0H = (unsigned char)(ubrr>>8);
  6.         UBRR0L = (unsigned char)ubrr;
  7.  
  8.         cbi(UCSR0A, U2X0);      /* double speed off */
  9.  
  10.         UCSR0C = (_BV(UCSZ01) | _BV(UCSZ00));   /* async, no parity, 1 stop, 8 data */
  11.  
  12.         UCSR0B = (_BV(RXCIE0) | _BV(RXEN0) | _BV(TXEN0));       /* rx int, rx enable, tx enable */
  13.  
  14. }


F_CPU = 8000000

0x3E karaktert kellene kapnom az eszköztől, amelyet rendben lévőnek látok a szkópon: start bit, 8 adatbit, 1 stop bit. ~50 us a bitidő, ami a baud beállításnak megfelelő. Viszont az RX megszakításban már 0xBE vagy 0x9E érkezik, azaz a bájt felső nibble-jében bit eltérések adódnak. Bitekkel szemléltetve:

  1. |001111110| - 0x3E
  2. |101111110| - 0xBE
  3. |100111110| - 0x9E


Van valakinek ötlete, javaslata, hogy mi történik?

Köszönöm!
(#) zolee1209 válasza zolee1209 hozzászólására (») Máj 12, 2011 /
 
Idézet:
„Fontos, hogy minden sorban páros bájt legyen megadva, ha egy 16bites számot adsz meg (.dw) akkor ez már megoldott.”


Ezt rosszul írtam, ez a megadási mód a flash-nél igaz, EEPROM területen páratlan számú bájt is megadható egy sorban.
(#) Ladoz válasza Ladoz hozzászólására (») Máj 12, 2011 /
 
Mégis gond van a bitidőkkel. Az általam kiküldött bájt esetében látom, hogy az 5. bit környékén már ~fél bitnyi "belógás" van. Az ATmega128 8 megás belső oszcillátorát használom, a baud biztos hogy jól van kiszámolva és beállítva. Létezhet ekkora elcsúszás ilyen nem túl nagy sebességnél (19200)? Kipróbálom 14 megás külsővel.
(#) sikolymester válasza Ladoz hozzászólására (») Máj 12, 2011 /
 
Idézet:
„Létezhet ekkora elcsúszás ilyen nem túl nagy sebességnél (19200)?”


Igen lehet. Nekem pont előfordult most. Egy korábban már jól működő programot beégettem egy másik Atmega8-ba. Nos, mindkettő a belső 8Mhz-es oscillatorról megy. A jelenség az volt, hogy az utóbbi esetben csupa zagyvaság jött át az UARTon. Sokáig keresgettem, hogy mi lehet a baj, majd rájöttem, hogy az oscillator volt a hibás. Pedig csak 9600-as baud ratet használtam.

Ami megoldotta a dolgot az az hogy kalibráltam a belső oscillatort ez alapján
Röviden annyi, hogy az avrstudioban bemész a programozó felületre, ott van egy Advanced fül. Ott be tudod állítani, hogy milyen frekvenciára akarsz kalibrálni. A Read gombra kidob egy értéket. Nos ezt kell neked beírni az OSCCAL regiszterbe. Lehetőséged van az Read gomb alatt a write megnyomásával egy megadott eeprom címbe írni ezt az értéket, amit aztán runtime-ban kiolvashatsz. Ez gyakorlatilag arra jó, hogy ugyanazzal a kóddal különböző uc-ket tudj kalibrálni, mivel mindegyiknek más és más lesz ez a kalibrációs értéke.

A mellékelt képen lehet látni az említett menüt.
(#) Ladoz válasza sikolymester hozzászólására (») Máj 12, 2011 /
 
Szia, köszönöm, hogy válaszoltál!

Próbáltam a kalibrálást és a 8 MHz-re adott értékkel (0xB7) inicializáltam a processzort (OSCCAL), de nem változott semmi, ugyanúgy 0xBE jött 0x3E helyett.
Most 14 megás külső kristály van rajta, viszont most nem tudom, hogy a SUT_CKSEL dropdown listában melyik beállítást válasszam. F_OSC már beállított 14745600-ra.
Ext.Crystal/Resonator High Freq.; Start-up time: 16K + 64 ms beállításokkal hibás karakterek jönnek át (0xF8). Mit kellene beállítanom?
(#) Ladoz válasza Ladoz hozzászólására (») Máj 12, 2011 /
 
Sikerült megoldani. A 14 megás külső kristállyal szépek a bit idők, nincs csúszás, az adatok jók. Ez fog maradni, mert szabadban, fagyban, hőségben is mennie kell az eszköznek. Üdv
(#) vagnerjazon válasza vagnerjazon hozzászólására (») Máj 13, 2011 /
 
Vettem ATtiny2313-mat, Ezen megy a program, de valamiért instabil egy kicsit a soros kommunikáció. Igazából nem baj, mert I2C-n fog menni, az remélem jó lesz.
Viszont ATtiny2313-on hogyan kell beállítani a TWI-t? Az adatlapban nem találom, ott valami USI (Universal Serial Interface) van, de van neki SDA meg SCL lába, tehát kell lennie benne.
(#) vagnerjazon válasza vagnerjazon hozzászólására (») Máj 14, 2011 /
 
Az instabilitás megoldódott (a szervó bezavart a tápfeszültségbe, tettem rá egy kondenzátort, így most tökéletes). Találtam egy mintát az USI használatára mint slave TWI eszköz, de sajnos bárhogy próbálom nem sikerül elküldeni neki semmit. Úgy tűnik itt végleg megakadtam, ha valaki meg tudná mondani, hogy hogyan kell használni ezt a mintát, annak nagyon örülnék.
(#) Ricsi89 hozzászólása Máj 14, 2011 /
 
Sziasztok!
Lenne egy kérésem. Hogyan lehetne megoldani, hogy egy gps modul által küldött infót átalakítsak kissé. van egy program, amiben elvileg működik a dolog, csak nekem valamiért nem jó.
  1. /*
  2.  * Parse and convert the given string into degrees and minutes.
  3.  * Example: 5333.9472N --> 53 degrees, 33.9472 minutes
  4.  * converted to: 53.565786 degrees
  5.  */
  6.  
  7.  
  8. void parse_degrees(char *str, uint8_t *degree, uint32_t *minutes) {
  9.         char buf[6];
  10.         uint8_t c = 0;
  11.         uint8_t i = 0;
  12.         char *tmp_str;
  13.        
  14.         tmp_str = str;
  15.         while ((c = *tmp_str++) != '.') i++;
  16.         strlcpy(buf, str, i-1);
  17.         *degree = atoi(buf);
  18.                
  19.         tmp_str -= 3;
  20.         i = 0;
  21.         while (1) {
  22.                 c = *tmp_str++;
  23.                 if ((c == '\0') || (i == 5)) {
  24.                         break;
  25.                 }
  26.                 else if (c != '.') {
  27.                         buf[i++] = c;
  28.                 }
  29.         }
  30.         buf[i] = 0;
  31.         *minutes = atol(buf);
  32.         *minutes *= 16667;
  33.         *minutes /= 1000;
  34.  
  35. }

Nos ez a kód külön adja vissza a fok és perc értéket, nekem viszont egyben kellene, és ráadásul nem számként, hanem stringként. Valaki át tudná nekem írni ezt a részletet, hogy jó legyen, mert én nem igazán vágom a pointeres értékekkel való játszadozást. Úgy is jó lenne, ha csak egyszerűen egy string lenne a visszatérési értéke a függvénynek. persze ha megoldható. Tehát mint a kód elején beadok neki egy stringet, pl "5333.9472" és visszatérési érték meg "53.565786" legyen.
(#) sikolymester válasza Ricsi89 hozzászólására (») Máj 14, 2011 /
 
Fogyaszd egészséggel. Amúgy meg kezdd átnézni a pointereket, mert hamar el fogsz akadni a mikrokontroller programozásban.

  1. #include <avr/io.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <stdbool.h>
  5.  
  6.  
  7. void parse_degrees(char *str, uint8_t *degree, uint32_t *minutes) {
  8.         char buf[6];
  9.         uint8_t c = 0;
  10.         uint8_t i = 0;
  11.         char *tmp_str;
  12.        
  13.         tmp_str = str;
  14.         while ((c = *tmp_str++) != '.') i++;
  15.         strlcpy(buf, str, i-1);
  16.         *degree = atoi(buf);
  17.                
  18.         tmp_str -= 3;
  19.         i = 0;
  20.         while (1) {
  21.                 c = *tmp_str++;
  22.                 if ((c == '\0') || (i == 5)) {
  23.                         break;
  24.                 }
  25.                 else if (c != '.') {
  26.                         buf[i++] = c;
  27.                 }
  28.         }
  29.         buf[i] = 0;
  30.         *minutes = atol(buf);
  31.         *minutes *= 16667;
  32.         *minutes /= 1000;
  33.  
  34. }
  35.  
  36. void stringdegree(char *str, char *kimenet, bool vesszovel)
  37. {
  38.   uint8_t  fok;
  39.   uint32_t perc;
  40.   char buffer[7];
  41.  
  42.   parse_degrees(str,&fok,&perc);  //A mar letezo fuggvenyt meghivjuk
  43.   utoa(fok,buffer,10);            //Atalakitjuk stringre a fokot
  44.   strcpy(kimenet,buffer);         //Beirjuk a kimenetre
  45.  
  46.   if (vesszovel)                  //Ha vesszovel kell a kimenet
  47.     strcat(kimenet,",");
  48.  
  49.   ultoa(perc,buffer,10);          //Atalakitjuk stingre a percet
  50.   strcat(kimenet,buffer);         //Hozzafuzzuk a meglevo kimenet stringhez
  51. }
  52.  
  53. int main(void)
  54. {
  55.   char fokperc[20];
  56.   stringdegree("5333.9472N",fokperc,true); //Probakeppen meghivjuk
  57.  
  58.   for(;;)
  59.   {
  60.   }
  61. }
(#) toMI-DBT válasza TavIR-AVR hozzászólására (») Máj 14, 2011 /
 
Nekem is hasonló problémám van amikor programozom az AVR-t akkor ID megegyezik az adatlappal de a dude-éval nem... néztem a man file-t de sokat nem tudtam meg belőle hogy a signature-e miért nem egyezik. mondjuk a régebben vásárolt 88-asok jók voltak, de amiket egy hónapja vettem már nem...

Atmega88 - Crunchbang - Dragon
(#) augre hozzászólása Máj 15, 2011 /
 
Hello!

12 voltról akarok egy atmeg8-at üzemeltetni.

feszültségosztóval 7.5/4.5=R1/R2
4.5V ot gondoltam az avr-nek.
csak nem tudomm mennyi áramot engedjek

vagy ha LM7805 -el csinálom abból 5V jön ki az nem sok az atmega8-nak?
(#) trudnai válasza augre hozzászólására (») Máj 15, 2011 /
 
Fesz oszto nem tul jo otlet, hiszen a tap vonalon nem szerencses a nagy impednancia. Nem beszelve arrol, hogy az ugye nem szur semmit sem. Zeneres megoldas is tulajdonkeppen egy feszultseg oszto, csak ott ugye az also tag a zener amelyik biztositja bizonyos hatarok kozott, hogy nagyjabol ugyanakkora feszultseg jojjon ki. De meg erre is ildomos egy emitter kovetot ratenni, hogy az impednancia az AVR-ed fele viszonylag kicsi legyen.

Aramot pedig nem te engeded az AVR-nek, hanem majd azt o szepen leveszi maganak. Ha pl van egy stabil 500A-es tapod, akkor nem kell oda neked semmi aram korlatozas, AVR-en nem fog 500A atmenni. A tapokon az a maximum ertek, ennyit kepes maximum leadni, hogy a feszultseg szintje jelentosen esne, de ez nem fog "atpreselodni ha torik ha szakad" az aramkoron.

7805-el az egyetlen gond, hogy az elfuti a tobblet feszultseget. Tehat ha az aramkorod tul sok aramot venne fel, akkor azt a 12V-5V azaz 7V-nyi reszt el kell melegitenie. Hogy mennyit, az Ohm torvenyevel kiszamithatod. Jobban jarnl valami LDO-val.
(#) augre válasza trudnai hozzászólására (») Máj 15, 2011 /
 
Feszosztóval:

I=const=U1/R1=U2/R2 ---> U1/U2=R1/R2 --->7.5/4.5=R1/R2

Tehát ha feszosztó mellett döntök a két ellenállás aránya adott, a méretük nem. A méretükkel én döntöm el a max áram értékét. Nyilván nemfog az avr-en nagyobb áram folyni mint amit felvesz, de mivel nemtudom, h. mekkora akkor nyugodtan engedjek rá 1/2A-t?
(#) Ricsi89 válasza sikolymester hozzászólására (») Máj 15, 2011 /
 
Köszönöm szépen, tökéletesen működik. Végre kiírja rendesen az értékeket. Most már mehet a gsm modul beüzemelése is és utána már küldhetem az adatokat sms-ben.
(#) Ricsi89 válasza augre hozzászólására (») Máj 15, 2011 /
 
1-2A? Most viccelsz? Miért akarsz elfűteni ekkora teljesítményt ellenálláson? Akkor már inkább a stab IC. Nem tudom mi a bajod a stab IC-vel. 5V-os stabbal pont jó is lenne és nem kellene ennyit vacakolni.
(#) sikolymester válasza augre hozzászólására (») Máj 15, 2011 /
 
Ezt a feszültség osztóval való táplálást verd ki a fejedből.
Abból amit írsz látszik, hogy nincsen nagy tapasztalatod elektronikában, szóval ne szállj szerintem vitába, ha meg akarsz fogadni egy jó tanácsot.

Használj feszültség stabilizáló IC-t. Ilyen pl. a 7805-ös.
Ha te úgy gondolod, hogy az áramkörödben amperek fognak szaladgálni, akkor szemezgess innen valami "bikábbat": Fesz stab IC-k.

Hogy mennyi sok az atmega-nak az az adatlapból derül ki. Forgasd bizalommal. Bár annyit megelőlegezek, hogy az 5V-ot imádni fogja.

Azt pedig, hogy egy feszültség osztóval való táplálás egyenértékű lenne egy feszültség stabilizáló IC-vel, azzal erősen vitatkozni lehetne. Ugyanis előbbinél nincsen visszacsatolás, míg utóbbinál van.
(#) augre válasza Ricsi89 hozzászólására (») Máj 15, 2011 /
 
igaz, akkor megvan a válasz a kérdésemre:
Nem kell sokkal nagyobb áramot engedni a kelleténél, h. ne legyen nagy a teljesítményveszteség, akkor ~10mA-el számolok, annyi bőven elég.

Vagy sabilizátor IC.

A két megoldás közel egyenértékű szerintem.
(#) Ricsi89 válasza Ricsi89 hozzászólására (») Máj 15, 2011 /
 
Valami nem jó. Szerintem a gyári rész, amit beraktam, az nem jól csinál valamit. Ebből az adatból: 4800.2942 ez lesz: 48,4903. Ez pedig nem helyes, mivel 48,004903-nak kellene lennie. Valamiért a percet nem 0,2942-ből számolja, hanem 29,42-ből.
(#) Ricsi89 válasza Ricsi89 hozzászólására (») Máj 15, 2011 /
 
Azt hiszem megvan a gond.
Most a perc az 0,2942. Ez beolvasásnál még jó is. De ha ezzel számol, akkor az elején lévő két nulla kiesik. Utána hiába oszt, szoroz, ha a nullákat nem veszi figyelembe. És ha a végén kellene az a két nulla, akkor az a műveleteknek hála már nem lesz ott.
(#) trudnai válasza augre hozzászólására (») Máj 15, 2011 /
 
Megegyszer: Nem tudsz nagyobb aramot athajtani az AVR-en, mint amennyit az fel akar venni. Pont. A fesz osztonal az imednanciat a felso tag adja meg neked... ami ugye sorba van kotve ilyen modon a tappal.

Minel nagyobb az az ellenallass annal rosszabb a helyzet. Viszont minel kisebb, annal nagyobb aram folyik el feleslegben az ellenallas halozaton. Azt ugye el fogja neked melegiteni.

Zenerrel azert jarnal jobban, mert ott ugy allitod be, hogy 1 - 1.5 mA follyon az ellenallas+zeneren. Igy nem kell feleslegesen nagy ellenallas a felso tagon. Azonkivul ugye az AVR-ed ill az aramkorod is kozre jatszik az osztonal, igy egy normalis ellenallas osztonal ahogy esetleg valtozna az AVR aram felvetele, ugy valtozik a feszultseg szint is. Ez pedig nagyon nem jo...
(#) Proci_85 válasza augre hozzászólására (») Máj 15, 2011 /
 
Idézet:
„A két megoldás közel egyenértékű szerintem.”

Koránt sem. Míg ellenállás esetén az AVR-re jutó fesztültség baromi erősen függ az éppen aktuális áramtól, addig fesz.stabilizátornál olyan stabilan fog állni, mint a katonatiszt.
Ha sok a feszültséged, akkor köss sorba több diódát, melyen 0.6V esik darabonként és ezután használj egy 5V-os stabkockát vagy a korábban már említett zener+ellenállás kombinációval játssz el egy kicsit.
Bármelyik mellett döntesz, a 2 ellenállásos fesz.osztónál bármi jobb lehet
(#) augre hozzászólása Máj 16, 2011 /
 
Köszönöm a válaszokat! Sokat tisztult a kép
(#) yoman917 hozzászólása Máj 17, 2011 /
 
Sziasztok
Keressgéltem a forumon de nem kaptam választ a kérdésemre. Egy AVR-t szeretnék táplálni egy motor gyújtókábelére épített tekercsről. Alapjáraton, ha belövöm 5V-ra a feszültséget, akkor max fordulaton felugorhat 1000V-ra is (nagyvonalu becslés). Hogy tudom biztosítani az 5V-ot a szerkezetnek? (világítótekercs nincs benne, elemes módszerrel meg nem tudom megoldani, mert pont az lenne a szerkezet lényege, hogy akkor adjon feszültséget, amikor jár a motor )
Segítségeteket előre is köszönöm
(#) sikolymester válasza yoman917 hozzászólására (») Máj 17, 2011 /
 
És mi lenne, ha az akkumulátorról táplálnád, a gyújtótekercsről levett feszültség pedig csak pusztán jelezné az AVR-nek, hogy jár a motor?

Nem vagyok benne biztos, hogy egy 46dB-es sávban mozgó feszültségforrást meg tudsz szelidíteni, hogy táplálni tudjon egy mikrokontrollert.
(#) yoman917 válasza sikolymester hozzászólására (») Máj 17, 2011 /
 
Hát az a bajom, hogy nincs benne akkumulátor (cross motor)
(#) Tidzs hozzászólása Máj 17, 2011 /
 
Sziasztok!

Egy ATmega16-os kontrollert használok és a problémám az, hogy az analóg komparátorom rendszeresen megszakítást generál annak ellenére, hogy semmilyen fel vagy lefutó él nincs a bemenetén. Rögtön már a programozás után, mielőtt rányomnék a futtatás gombra már látható az I/O view-ban hogy az ACI flag egybe van állítva. Hiába írok bele egy egyest, hogy töröljem a flaget nem történik semmi.

Ez az inicializáló függvényem:

  1. void ADC_Init(void)
  2. {
  3. SFIOR &= 0xF7;
  4. ACSR |= 1<<ACI;
  5. ACSR |= 1<<ACIS1;
  6. ACSR |= 1<<ACIE;
  7. }


Mi lehet a probléma? Előre is köszönöm a választ!
(#) sikolymester válasza Tidzs hozzászólására (») Máj 17, 2011 /
 
Kicsit nehezen olvasható, hogy mi történik az első sorban. Írd így, hogy könnyebben láthassuk:

  1. SFIOR &= ~(1 << ACME);

Így látjuk, hogy az ACME-t törlöd ki az SFIOR-ban.

Azt pedig, hogy miért kapsz interruptot, ahhoz kellene tudni, hogy mi is van erre rákötve. Mármint milyen hardver/jel bemenet.

Az adatlap amúgy ezt írja:
Idézet:
„When changing the ACIS1/ACIS0 bits, the Analog Comparator Interrupt must be disabled by
clearing its Interrupt Enable bit in the ACSR Register. Otherwise an interrupt can occur when the
bits are changed.”


Tehát az inicializálás elvileg helyes sorrendben történik.

Egyébként az, hogy hiába törlöd az interruptot, az mégis rendre megjelenik arra következtet, hogy a bemeneten csak történik valami.

Ha pl. nincsenek fix potenciálra kötve az analog comparátor lábak, akkor össze vissza ugrál a potenciáljuk, tehát az simán generálhat interruptot.
Következő: »»   324 / 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