Fórum témák
» Több friss téma |
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
Sziasztok!
Lenne még egy technikai kérdésem a program írásáról. A nem rég linkelt kapcsolásom ugye egy relékártya 100+1 lehetőséggel. A tömör lényeg, hogyha kapcsol egy bemenet akkor kapcsol a hozzá tartozó kimenet. Nos a programban én ez IF feltétellel oldottam meg, de úgy, hogy nem csak azt figyelem,hogy kapcsolt-e az adott bemenet hanem azt is, hogy a hozzá tartozó kimenet milyen szinten van. Így csak akkor lép be a program a feltételbe, ha a bemenet kapcsolt és a hozzá tartozó kimenet még nincs megfelelő szinten. Így úgy gondolom, hogy nemkapcsolgatom feleslegesen a kimenetet és a program is gyorsabb lesz valamivel. Viszont cserébe nagyobb a kód. Nem tudom ennek van-e jelentőssége. Mi a véleményetek?
Sziasztok
Hogyan tudom megoldani azt, hogy ha a Topi féle programozóval olyan mcu-t programozok amihez 3v-os eszköz van csatolva akkor az eszköz ne feküdjön ki.
A kimeneten lévő puffer tápját kösd ki és a céláramkörből (3.3V-ból) tápláld meg. Az én programozómon is régen át volt kötve 3V3-ra.
Ha minden programozóból kilépő jelszint 3V3-as, attól még az 5V-os eszközöket tudod programozni, mert a 3V3 jócskán a billenési küszöb felett van 5V táp esetén is.
Legegyszerűbb ha ellenállást kötsz a programozólábak és a programozó kivezetései közé. Fontos, hogy a programozólábak ne legyenek terhelve(pl. LED-eket és kicsi fel/lehúzó ellenállásokat nem szereti ez a megoldás). A másik lényeges dolog, hogy az AVR tápfeszültsége 3V-nál biztosan ne legyen kisebb!
3V esetében mind a 4 ellenállás értéke minimum 220Ohm legyen! Aztán vannak "jobb" megoldások, csak jóval bonyolultabbak. Pl. itt van a gyári STK500 NPN-tranzisztoros emitterkövető megoldása, aminek az a hátulütője hogy a HI állapotot 1kOhm felhúzó ellenállások adják... @Topi: Ez a megoldás - szerintem - azért nem jó, mert a programozóban lévő ATMega8 néhány vezetéken közvetlenül kapcsolódik a pufferre(pl. engedélyező lábak). Ezeken pedig védődiódák csüngenek. Azaz ugyanott vagyunk, csak nem az AVR, hanem a puffer védődiódáival játszunk orosz rulettet. A puffer céláramkörrel érintkező részei kivétel nélkül közvetlenül kapcsolódnak a céláramkörre. Ha tehát a puffer 3.3V.os, a céláramkör meg 5V akkor megint a puffer védődiódái látják kárát. A hozzászólás módosítva: Nov 5, 2012
Igen. Az avr.tavir.hu oldalon van sok anyag róla.
December közepével indul egy ingyenes alapozó, utána egy kontaktórás részletes.
Ezzel igencsak vitatkoznék, mert a védődiódák kizárólag magasabb (ill negatív) feszültség esetén védenek.
Szóval ha a céláramkör 5V-os a programozó meg 3V-os akkor a céláramkör védődiódái érintetlenek, hiszen a bemenő jelszint nem nagyobb 5V+0,6V. Visszafelé irányban pedig a egyetlen egy buffer helyezkedik el, aminek az engedélyező lábán van a céláramkör. A buffer működési módjából ered, hogy 3V-os betáp esetén jócskán elvisel 6V-os engedélyező jelet. Ha engedélyezve van akkor a kimenete GND, ha nem akkor pedig HiZ. Tehát ha a programozó 3V3-as és a céláramkör 5V-os akkor a processzor védődiódái nem lépnek életbe, és a buffer sem jelent problémát. Ha a programozó mikrovezérlője 5V-ról jár, a buffer pedig 3V3-ról, akkor visszairányú jeleknek a 3V3 logikai 1 szintet jelet, odairányú jelnek meg mint mondottam a 3V3-ról üzemelő buffer elviseli a programozó mikrovezérlő 5V-os output-enable jelét (üzemszerűen). A bemeneti jelén a buffernek van védődióda, ezért van az áramkör kapcsolási rajzába a buffer betáp előtt 10-10K-s ellenállás. Ha a programozó ISP interfésze 5V-os jelet ad ki, a céláramkör 3V3-as akkor a soros áramkorlátozó ellenállás szükséges kimeneti szintszabályozás nélkül, ugyanis akkor lépnek csak életbe a célmikrovezérlő védődiódái... De ilyenről - tehát a fordított esetről - itt szó sem volt. A 74HC126-ban is vannak védődiódák a bemenetén, ezért van soros áramkorlátozás az áramkörben. Lásd az adatlapot és a programozó kapcsrajzát. A hozzászólás módosítva: Nov 6, 2012
Valamit ma is tanultam. Köszönöm, Topi mester!
Hello.
Mega8 al próbálkozom elsajátitani az AVRes tudást. Irtam egy egyszeru kódot. Azt szeretném, hogy a PB0 pin en másodpercenként felvillanjon a led. A kód:
AtmelStudioban programozok. A helyzet az, hogy 1x elalszik a led és annyi. Mivel lehet a gond? Más (netes)kódok működnek rendesen.
Szia!
Tedd kicsit tisztába a logikai műveletekkel kapcsolatos ismereteidet! A probléma, hogy a led-et egyfolytában kikapcsolod. Szerintem helyesen:
Üdv, Thomy A hozzászólás módosítva: Nov 7, 2012
Igazad van, köszi szépen.
Elfelejtettem, hogy a
A delay valahogy nem jó, gyorsabb sokkal mint egy másodperc. A hozzászólás módosítva: Nov 7, 2012
Szia!
m_delay_ms függvényed unsigned char-t vár, ami maximum 255 lehet, te pedig 1000-et adsz át neki. Bár nem tudom hogy a fordító hogy kezeli ezt le, de szerintem levágja a felső biteket, így 232-nek veszi az 1000-et, ezért lehet kb. 4x gyorsabb mint 1mp.
Köszi. Mindig tanulok valami újat.
Azt szeretném kérdezni, hogy léteznek szimulációs programok? Azt szeretném, hogy beteszem a hex-et és figyelhetem a működést, perifériák, portok, regiszterek stb.
Helló
Olyan kérdésem lenne hogyha egy atmega644p uC-ben egy általam írt függvény 4bytes előjel nélküli egészet értéket kellene hogy visszaadjon hogyan lehet megoldani? unsigned long int nem fogadja el ![]()
delay.h manual
Nem kell amúgy ilyenekkel bonyolítani, a _delay_ms() képes 6.5535 mp hosszú delayt csinálni.
Persze, telepítsd fel az Atmel Studio 6-ot, vagy az Avr studio 4 -et.
Ha külsőleg akarsz importálni programot a szimuláláshoz, akkor az .elf file-t meg tudod etetni a két programmal egyaránt. Persze legegyszerűbb, ha rögtön bennük készül a projekted. Ha linuxon vagy, akkor neked az Avrsim kell.
Használd ezt:
Ha jól értem így?
uint32_t függvény(int érték) { számítások; return ((uint32t adat4<<24) | (uint32t adat3<<16) | (uint32t adat2<<8) | (adat1)); } >>>>>>
Igen.
Válasz köszi müködik
Sziasztok!
ADC stabilitásába beletört a bicskám. LM35 szenzort használok kb. 1m árnyékot vezetékkel van a panelhoz kötve, de ez mindegy is mert, ha direkt ott van akkor is fennáll a következő gond: Szépen méri a hőmérsékletet, de mikor emelkedi vagy csökken a hőmérséklet egy darabig +-0.5 fokot ugrál. Talán 1-2 percig. Rámérve a bemenetre ott stabil a feszültség. Pl.: Mért érték 170 mV multiméterrel stabilan, ADC váltakozva egy darabig ugrál 16,5 és 17 C között. Szrintetek mi lehet a gond? AREF 100nF kondival szűrve, AVCC 100nF kondival szűrve és 10 uH tekercsen keresztül kap tápot. A kód:
És az ellenállást hova tetted? Én a vezeték panel felöli oldalára, de csak remélem, hogy van pici változás, de nem stabil.
Szerk.: Közben úgy látom, hogy valamit a felbontással szúrok el mert 0,5C fokonként tudom kijelezni és mérni. Ha ADC 33-at mér vagy 34-et az 0,5C változás. Szerintem ezért remeg mert nem követi pontosan a 0,1C változásokat. ![]() A hozzászólás módosítva: Nov 8, 2012
A problémám a következő több ok miatt is úgy döntöttem a feladatott két atmegával oldom meg. master-slave módban I2C-n kommunikálnak egymással. A master TwI method megírása nem okozott problémát mivel azt már rengetegszer használtam cél IC -vel való kommunikációra. A Slave method megírása problémát okoz a leírásban nem egyértelmű. Amikor a master elküldi a Startot SLA+W A státusz regiszter lehet 0x60 vagy 0x68 meg 0x70 vagy 0x78 mi dönti el mi lesz ez a regiszter. Ha transmitted módban szintén nem értem mi a különbség 0xA8 és a 0xb0 közzött?
És ha valaki még arra is tudna válaszolni hogy ha elküldtem az adatott akkor mi dönti el hogy a státusz regiszter 0x80 vagy 0x88 vagy 0xc0 vagy 0xc8 lesz? köszönöm a válaszokat ![]()
Aa multimeter integralast vegez a feszultseg meresnel, azert tunik stabilnak a fesz. Te is atlagolj es nem fog ugralni.
Sziasztok!
Ismét egy számomra érdekes hiba. max232 IC-t használok és RS232-USB átalakítót. Ha az USB port-ra az átalakítót úgy dugom rá, hogy az átalakítóba már bedugtam az RS232 csatlakozót akkor rezetel a kapcsolásom és az uart_init-nél ujra rezetel így folyamatosan reset-ben marad. Ha előbb az átalakítót rádugom az USB portra majd utána dugom rá az RS232 csatlakozót akkor semmi gond. Ez mitől lehet? ![]()
Megy valakinél RFM70-el az adatátvitel ?
Érdekelne minden tapasztalat.
Sziasztok!
Azt hogyan tudom minden kétséget kizáróan ellenőrizni, hogy az AVR valóban 16 MHz-en ketyeg? Valamiért nekem gyanús mintha csak 1 MHz-en menne.
Ez nem hiba a max232 Ic sajátossága ez .Nem mindegy , hogy mikor melyik pillanatban kapja a tápot meg , mert csak akkor jön létre a kommunikációt , ha a második megoldást választod.
Sok olyan készülék amiben ilyen ic van , és Pc kapcsolatra van szükség nem mindegyiknél , de általában ha debug módban van helyezve megfelelő módon , csak akkor jön létre a kapcsolat. Ez a módszer megfelel az utóbbinak, amit írtál a kétféle megoldás között ez a különbség.
Hirtelen nem értettem melyik kérdésemre válaszoltál. Amúgy, de igen hiba.
Nem figyeltem oda és bekapcsoltam az RX megszakítását, de a prgramban nem volt definiálva/létrehozva.
Most, hogy ezt orvosoltam megszűnt a hiba. Nem rezetel az MCU. A hozzászólás módosítva: Nov 10, 2012
Beallitasz egy timert pwm kimenetre es ki kell szamolni.
|
Bejelentkezés
Hirdetés |