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
Szia!Megvettem a programozót:usb-s AVR programozó de nem sikerül programozni.A txd és rxd lábakat be kell kötni?
Programozó PONTOS típusa? Esetleg link az adatlapjára?
http://www.elektrobot.hu/termek.php?filename=USB_AVR_programozo.htm...;i=109
A hozzászólás módosítva: Dec 19, 2018
Ez ISP programozó, tehát annak megfelelően kell csatlakoztatni. Csak írd be a gugliba az "avr isp" varázsszavakat, kiegészítve az avr típusával. Nem olvastam vissza, melyik avr-t akarod programozni, ezért nem is tudok konkrét kivezetéseket mondani.
atmega 8
ugy csináltam de azt irja ki flash hiba
Mivel akarod használni? AVRDude? Milyen paramnéterekkel hívod?
Sokkal gyorsabban sikerülne segítséget adni, ha a kérdés feltevésekor MINDEN körülményt leírnál. Cél MCU típusa, programozó típusa, operációs rendszer, programozó szoftver, kapcsolási rajz, fotó az összeállításról, pontos hibaüzenet, stb.
Helló!
Ezzel a programozóval szeretnék felprogramozni egy atmega8-ast. Windows 10-et használok ,Khazama AVR programmer a szoftver. A hiba "csak" annyi hogy amikor rákötöm a programozóra az ic-t akkor le tudom a programmal kérni az azonosítóját, törölni tudom az ic-t és olvasni is tudom, de amikor írnék akkor kiirja hogy flash writing error és így nem sikerül a programozás. És a forráskódot ,kapcsolási rajzot és minden egyebet innen szereztem.
Atmel Studio-val próbáltad programozni?
Boldog Karácsonyt!
Ismer valaki esetleg olyan egyvezetékes egyirányú protokollt, amivel sorba lehet kötni kettő vagy több mikrokontrollert? Több ATtiny13-at szeretnék sorba illeszteni, ahol mindegyik AVR a következő kontrollernek továbbít egy adatcsomagot (~10 bit) maximum 1 kHz/csomag frekvenciával. Az adatküldést egy mester indítja, és ő is gyűjti össze. Kitalálhatok én is valami okosságot, de minek feltalálni újra a kereket? Máskülönben a tiny AVR mérete (1 kB) miatt túl fellengzős nem lehet a kód, assemblyre nem szállnék rá. Google most nem volt annyira barátom. A hozzászólás módosítva: Dec 25, 2018
Használhatod az USI perifériáját soros portként (UART). Bővebben: Link.
A sorban levő AVR-eknek az TX-RX lábát kell összekötni, TX-transmit-adó, RX-receive-vevő. Egyvezetékes, egyirányút írtál, ekkor az utolsó AVR-nek a masterhez kell kapcsolódnia. A hozzászólás módosítva: Dec 25, 2018
Lehet megérte volna rádobni azt a plusz ezrest egy fejlettebb AVR-ért, amikor megvettem a tucat ATtiny13-at.
![]()
Azt nem tudtam, hogy az Attiny13-nak nincs USI perifériája... Nem tudom, mennyi a fő kódod, de lehet 1k-ba beleférne egy tömör, egyéni, egyszerűsített USART.
Én ezt találtam: 6.hozzászólásban van egy rövidke kód. A hozzászólás módosítva: Dec 25, 2018
Bascom-mal a szoftware-s UART pl. ennyi:
Open "comc.1:19200,8,n,1" For Output As #1 Print #1 , "serial output" Close #1
A bascomos példához hasonlóan ez is csak küldésre alkalmatos. Csicseregni könnyű, azt fogadni és dekódolni már kevésbé. Ezek szerint vagy a 1-Wire protokollt fogom szétszedni, vagy a hozzá hasonló DHT22-nél alkalmazott kommunikációt. Ezeket egyszerűbbnek látom leprogramozni mindkét oldalon.
Valószínűleg nem mondok újat a tapasztalataimmal. I2C kétirányú kommunikációt programoztam le ATMEGA8-ra. Részben még hibakezelést is beletettem.
Ha nem időkritikus a program (ha a kommunikáció alatt semmi mással nem foglalkozik), akkor viszonylag egyszerű. Ha időkritikus, akkor a megszakítási rendszer felhasználásával kell lekezelni minden interakciót. Ekkor a válaszra várakozás alatt mással is tud foglalkozni. Ez már nem olyan egyszerű. Nekem a lépésenkénti tesztelése okozta a legnagyobb problémát. (ha nincs válasz: a hiba az adó illetve a vevő kódjában is lehet) Nehezítő körülmény: assembly-ben programozok...
Az aszinkron UART-ot (soros vonal) nem nehéz venni, ha van egy timer-ed, ami tud megszakítást kérni. Amikor megvan a start bit lefutó éle, akkor a timert felhúzod másfél bit időre. Amikor bejön a timer megszakítás, akkor leolvassa a bemenet állapotát, beshifteli egy változóba, egy másik változóban meg számolja a biteket, és ha még van, akkor a timer-t felhúzza egy bitnyi időre. Az utosó bit mintavételezése után a timert leállítja, és jelzi, hogy bejött a byte. A startbitet lehet érzékelni valami pin change megszakítással, ha van ilyen a szóban forgó uC-n.
A hozzászólás módosítva: Dec 31, 2018
Olyan problémám lenne, hogy egy nyomógombbal akarom elindítani, majd esetleg egy hosszú nyomással leállítani a motort, ami a következő program szerint fut:
Mivel soros futású a program, így a goto paranccsal nem ugrik vissza az elejére, azaz ha akkor nincs benyomva a gomb, akkor nem megy a motor. Hogyan lehetne megoldani, hogy a gomb egyszeri rövid nyomására elinduljon, és addig ne álljon le, amíg a gombot nem nyomom hosszan? (Leállítás kb 2sec nyomásra)
Megszakítással lehet megoldani. Itt egy kis mintakód ATMega328p-re. A timeRef-hez te használhatod a millis-t (ha már Arduino-t használsz).
Sziasztok!
Az ATMEL manual-ban a soros kommunikáció inicializálásánál van egy ilyen sor (aztán később több is): UCSRC = (1<<USBS)|(3<<UCSZ0); Tudom, hogy ez egy olyan dolog, hogy itt van, csak használni kell, de én kezdőként szeretném érteni hogy hogyan működik, mi van mögötte, viszont ezt akárhogy is számolom nem akar kijönni a jó érték. Megpróbálnám levezetni, abban kérnék segítséget, hogy hol rontom el. Először is mivel a shiftelés két operandusú művelet, ezért mind az USBS-nek mind az UCSZ0-nak kell, hogy legyen egy default értéke, amit a manual-beli UCSRC default bitjei alapján 0-nak és 11-nek vettem. Tehát ha 2 stopbittel és 8 adatbittel operálunk a leírás alapján akkor 1<<USBS esetén az 1-et shiftelem balra 0-val tehát marad 1, a 3-at (ami 11-nek felel meg) shiftelem balra 11-el (azaz 3-al), tehát 11000 lesz belőle, amit ha össze "VAGY"-olok egymással akkor az UCSRC regiszter értéke 00011000 lesz, ami a bitek alapján azt jelentené, hogy 5 adatbit, 2 stopbit, paritásbit szempontból pedig egy érvénytelen kombináció. Tehát az lenne a kérdés, hogy hol a hiba, és hogy kéne ezt pontosan értelmezni? Köszönöm!
Szerintem te kevered a maszkot a bit pozícióval. Mivel nem adtad meg melyik mikrokontrollert használod ezért én a 328P-re adom meg.
Adatlap példa:
iom328p.h
Ebből kijön, hogy az 1-et 3-al tolja el, a 3-at pedig csak 1-el, majd ezt vagyolja. Ezzel pedig kijön a 8bit 2 stop bittel.
Az UCSRC egy 8 bites regiszter, aminek az egyes bitjei beállítanak meghatározott állapotokat.
Az USBS és UCSZ0, a megnevezet bitek regiszterben elhelyezkedő számait képviselik 0-7. Az UCSZ0 elnevezés 0 része érzékelteti, hogy több bitből ál a kapcsoló. Tehát UCSRC =1-et eltolsz USBS-vel OR 3<<UCSZ0
Köszönöm!
Így már valóban stimmel a dolog. Ha nem tévedek nagyot akkor ennek az értelme az, hogy egyértelműen lehessen mutatni a kódban, hogy az UCSR0C regiszterben az egyes biteknek milyen értéket akarunk adni, jelen esetben az USBS legyen 1, az UCSZ0 pedig 3 azaz 011 ami a 8 adatbitnek felel meg. Ezt jól látom? Ezek szerint a header file-ban úgy vannak a define-ok meghatározva, hogy az az érték amit egy adott bitnek szánok annyival tolódjon el, hogy pont a helyére kerüljön a regiszterben? Ez lenne a maszk amit említettél? Bár gondoltam arra is közben, hogy jóval egyszerűbb lenne inicializálni, hogy UCSR0C=0b00001110.
Csak a későbbiekben nem tudom könnyen módosítani ezt: " UCSR0C=0b00001110. " Míg ha ott szerepel, hogy a prescaler-hez (timernél) ez meg ez tartozik, egyből tudod, hogy a többit nem kell bántani. Én, ha lehetséges, az összetartozó dolgokat soronként tagolom.
A maszk 00001110 (vagy másképp írva 111 << 1) az UCSZ0 regiszter bitekhez. Az UCSZ00 pedig a pozíciója az első bitjének (mennyivel kell eltolni a regiszterben, hogy a megfelelő biteket írd). A maszk hasznos lehet a programozási hibák hatásának csökkentésére. Ha pl. az I/O-k konfigurálásánál átküldöd a maszkon (&&) is akkor elkerülheted, hogy egy hibásan megadott konfigurációval a rossz lábat állítsd például kimenetnek tönkretéve ezzel a mikrokontrollert.
Igazság szerint ezt sokkal jobban megoldották az ATXMega sorozatnál. pl. ATXMega128A1U
A gm-el jelöli a bitcsoport maszkját. A gp-vel a pozícióját a regiszteren belül. Majd bm az egyedi bitek maszkja és bp pedig a pozíciója.
Remek, kicsit még utánanéztem egy-két helyen, minden világos.
Köszönöm mindenkinek a segítséget.
Meg van mi okozta a hibát. Miután sikerült még két avr-t "megölnöm".
A teszt áramkör breadboard-on van összerakva, amihez a tápellátást labortápról oldottam meg. A hiba azután jött elő, miután a tápot úgy kapcsoltam be, hogy már rá volt csatlakoztatva az áramkör. Mikor csatlakozás nélkül előbb táp bekapcsolás, majd csatlakoztatás volt a sorrend nem is volt semmi gond. Azóta 3xAAA elemről kapja a tápot az áramkör. Nincs is semmi gondom. ![]()
Sziasztok ! Kicsit off kérdésem lenne.. Van ez a 328 alapú kis "műszer Bővebben: Link. Ügyesen lesodortam, és betört a kijelzője. Megjött az új kijelző. A fólia csatikat mivel lehet leforralni és az újat vissza hogy ne sérüljön ? Pákát kibírja?
Kibírja, de alacsony hőmérsékleten és gyorsan forrassz. Használj csipeszt, amivel óvatosan emeld el a kiforrasztott szakaszt, nehogy letépd a pad-eket. Az új kijelző csatlakozóját futtasd be óvatosan vékony réteg ónnal (az eredeti valószínűleg ólommentes) a tényleges beforrasztás előtt és használj külön folyasztószert. Ha ezeket betartod akkor nem nagy kunszt beforrasztani. Bekapcsolás előtt nézd át nagyítóval vagy mikroszkóppal, hogy nem maradt-e valahol ónhíd.
Ez viszont tényleg nagyon off, úgyhogy itt hagyjuk is abba. |
Bejelentkezés
Hirdetés |