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   638 / 840
(#) kovacsj válasza kovacsj hozzászólására (») Jan 8, 2015 /
 
Nos, a Windows-ra vonatkozóan beigazolódott a gyanúm. A gépet újraindítva már itt sem tapasztalok a soros porton semmiféle jeleket. ARM-mel működik. A Raspberry-n egy Python script figyeli a soros portot. Némi mozgás mutatkozik, de ez így értelmezhetetlen.
A mellékelt képen a raspberry-s adatok vannak. A második képen a minicom-ban vett jelek vannak. A feszültségváltozás csak 40 mV, így azt jelnek nem lehet mondani. A bekapcsolásnál az olvashatatlan jelek nem eltérő órajelre utalnak?
A hozzászólás módosítva: Jan 8, 2015
(#) rolandgw válasza kovacsj hozzászólására (») Jan 9, 2015 /
 
GCC-ben így szokták megadni,bár lehet,hogy nem ez a baj:
  1. #define myUBRR  (((F_CPU / (BAUD* 16UL))) - 1)
(#) Istvanpisti válasza kovacsj hozzászólására (») Jan 9, 2015 / 1
 
Szia!

Szerintem ehelyett
  1. UCSR1B = (1<<RXEN1 | 1<< TXEN1) ;
próbáld ezt :
  1. UCSR1B = (1<<RXEN1) | (1<< TXEN1) ;
(#) kovacsj válasza Istvanpisti hozzászólására (») Jan 9, 2015 /
 
Azt már korábban kijavítottam, de azért köszönöm szépen!
Ennyi történik, a bekapcsoláskor. (Hátha ez segít.)

  1. void USART1_init(unsigned int ubrr) {
  2.         UBRR1H = (unsigned char) (ubrr>>8);
  3.         UBRR1L = (unsigned char) ubrr;
  4.         //UCSR1C = (1<UCSZ11) | (1<<UCSZ10);
  5.         UCSR1B = (1<<RXEN1) | (1<< TXEN1);


Ez megoldotta. Ezek szerint nem jól értelmeztemaz UCSZn1 és UCZn0 regisztereket. Nálam az n=1, mivel USART1-ről van szó. Ha valaki jobban tudja, miért volt ez hibás, megköszönném a magyarázatot!
A hozzászólás módosítva: Jan 9, 2015

putty3.png
    
(#) killbill válasza kovacsj hozzászólására (») Jan 9, 2015 1 /
 
Furcsa, mert az adatlap is pont igy programozza fel. Annyi csak a kulonbseg, hogy ott elobb allitja be az USRB-t, aztan az USRC-t. De nekem a te sorrended a logikusabb, mert a legvegen engedelyezed csak az adast/vetelt.

Nem lehet, hogy egyszeruen hibas valamelyik gyari makro? Meg tudod tenni, hogy valahova kiiratod az (1 << UCZS11) | (1 << UCSZ10) konstans erteket? Kikuldod sorosvonalon a rpi-nek
(#) kovacsj válasza killbill hozzászólására (») Jan 9, 2015 /
 
Pontosan mire gondolsz? Megpróbálom, természetesen, ha megmondod, hogyan szeretnéd!
(#) Istvanpisti válasza kovacsj hozzászólására (») Jan 9, 2015 1 /
 
Jó!

Én sebesség problémára gyanakszom, próbáld a sebességet meghatározó regiszterbe fixen beírni az értéket, ekkor biztosan jó érték kerül bele, ha a kvarc 7,3728MHz-es
  1. UBRR1H=0;UBRR1L=47;

Clipboard.jpg
    
(#) kovacsj válasza Istvanpisti hozzászólására (») Jan 9, 2015 /
 
A kvarc annyi. De már működik, csak azt az inkriminált sort ki kellett vennem belőle. Ám nem tudom, miért. A 47-tel én is próbáltam, az sem javított a helyzeten. Csak ez, ha az
  1. UCSR1C = (1<UCSZ11) | (1<<UCSZ10);

sort kivettem
A hozzászólás módosítva: Jan 9, 2015
(#) killbill válasza kovacsj hozzászólására (») Jan 9, 2015 1 / 1
 
Idézet:
„UCSR1C = (1<UCSZ11) | (1<<UCSZ10);”


Ez a hiba: < van << helyett.
(#) killbill válasza kovacsj hozzászólására (») Jan 9, 2015 1 /
 
A vilag legjobb debuggere, ha van egy sorosvoanli kimeneted es egy terminalod.

  1. char buffer[10];
  2.  
  3.   sprintf(buffer, "%d\r\n",  (1<UCSZ11) | (1<<UCSZ10));
  4.  
  5.   USART1_String(buffer);


Az (1 < UCSZ11) az ugye 1, hiszen 1 kisebb, mint 2. (#define UCSZ11 2) Az (1 << UCSZ10) az meg 2. Ezek orolva 3. Neked meg 6-ot kellene tolteni az UCSRC-be.
A hozzászólás módosítva: Jan 9, 2015
(#) kovacsj válasza killbill hozzászólására (») Jan 9, 2015 /
 
Tényleg. ))) Több szem többet lát. Köszönöm szépen!

Már van bluetooth kapcsolatom a telefonommal. Oda is ki tudom íratni, anélkül, hogy megbontanám az áramkört.
A hozzászólás módosítva: Jan 9, 2015
(#) kovacsj válasza killbill hozzászólására (») Jan 9, 2015 /
 
Annyi. 6 a kiíratott érték. Nagyon szépen köszönöm a segítséget!
(#) szucsip válasza szucsip hozzászólására (») Jan 9, 2015 /
 
Hát ezt sajnos nem tudom így egyből megoldani. Esetleg egy céláramkörrel (inverterből épített négyszögjel generátor, vagy ilyesmi). De azért köszönöm szépen a javaslatot. Mondjuk az is igaz, hogy a ~4MHz -es kvarccal is próbálkoztam, de úgy sem volt eredmény. :S
(#) mucsa válasza zombee hozzászólására (») Jan 9, 2015 /
 
Köszönöm az infót.
Úgy tűnik nem úszom meg ennek a topiknak az elolvasását legalább nagyrészét.
Nem adom fel amíg nem látok eredményt.
Azért mielőtt megvennék vagy csinálnék írót(kábelt?) meg fogom itt kérdezni, a véleményeteket.
Csodálatos szép napot!
(#) killbill válasza kovacsj hozzászólására (») Jan 9, 2015 1 /
 
Igazan nincs mit. De az eset jo pelda arra, hogy erdemes az operatorok elott es utan szokozt hagyni. Ugy valamivel jobban olvashato a kod, hamarabb eszre lehet venni az ilyen gepelesi hibakat (typo-kat).
(#) mucsa hozzászólása Jan 9, 2015 / 1
 
Sziasztok újra.
Ezt az Atmega16a-pu-t szeretném használni kezdésnek.
Kinéztem hozzá 2 olcsó programozót(egyformának látom ezeket, csak 500 ft a különbség):
ISP 1 és ISP 2.
Kérem szépen ha valakinek van 1 perce nézze meg és véleményezze hogy jók-e.
Előre is köszönöm. Szép estét/napot.
(#) csabeszq válasza mucsa hozzászólására (») Jan 10, 2015 / 1
 
Kezdetnek talán igen, de ha komolyabban elkezdesz vele foglalkozni, előbb-utóbb kuka lesz.

A véleményem:
- a számítógép USB-je nem játék, ki birod vele nyírni az alaplapot. Nézd meg, hogy adnak-e dobozt mellé. Az eredeti AVRISP2 dobozban van, talán pont ezért.
- a szalagkábel csatlakozó a 2x5-ös régi szabványt követi, manapság 2x3-asat használnak
- ha kizárólag atmega16a-t akarsz programozni, ebben nem fog akadályozni
- az USBasp nem a programozók gyöngyszeme, a fórumon szokták utálni amiatt, hogy hardver helyett szoftverből tolja az USB-t
- rövid a kábele. A programozóval kész hardvereket is szoktak javítani. Ez nálad úgy fog történni, hogy fél kezedben tartod a laptopot és próbálsz a 10 cm-es kábellel közelkerülni a kész panelhez, hogy átprogramozzad. Amikor idáig eljutsz, ne folytasd, hanem vegyél új programozót. Tapasztalatból mondom, hogy a nyakatekert szereléssel több kárt fogsz okozni, mintha pénzt adnál vagy egy hosszabb szalagkábelre (1m), vagy másik programozóra.

Egy AVRISP programozó drága, de legalább 1.5m-es távolságot átvisz a notebook és a hardver között, támogatja mindkét szabványt (2x5 és 2x3 csatlakozó), azzal nem tudod kinyírni a gép alaplapját, mert nincs is a +5V sem kivezetve, az ISP lábakkal meg ellenállás van sorbakötve, emellett hardverből USB-zik, ami gyors. Ha rányomsz 20V-ot a tápfeszre, a paneleden a összes IC-t kinyírod, de a programozót nem és az alaplapot sem. Akár még fordítva is ráteheted, max narancssárgán villog, hogy nem tetszik neki. AVRISP2-höz mindig külön tápfesz kell, ott USB-ről nem tudsz áramot vételezni.

Indulásnak, ismerkedésnek jó, amennyiben dobozba rakod, de amikor úgy érzed, hogy kevés, akkor inkább rendelj másikat szívás helyett.
A hozzászólás módosítva: Jan 10, 2015
(#) kovacsj hozzászólása Jan 10, 2015 /
 
Sziasztok! MIlyen módszerek vannak az AVR-nél az ADC automatikus végrehajtására? Itt olyasmire gondolok, hogy az ADC-t csak akkor indítanám, ha jel jelenik meg a csatornán? A külső megszakítást (EXTI) ismerem, de vajon meg lehet-e oldani ezt magával az ADC-vel csupán az analóg jel érzékelésekor? Olyasmire lenne szükségem, hogy az ADSC csak az analóg jel megjelenésével egy időben íródjon a regiszterbe! Ha ez nem lehetséges, akkor pedig azt szeretném megoldani, hogy free running módban futó ADC esetén csak valid értékeket dolgozzak fel. Egyelőre ez az út látszik járhatóbbnak, mert interrupttal a konverziót követően az ADC értékét berakom egy tömbbe. Jól gondolom? Nem teljesen világos viszont az auto trigger üzemmód. Mit tudnék ezzel kezdeni ebben az esetben? Számláló jelére mehetne a konverzió?
Minden segítséget előre is nagyon szépen köszönök!
A hozzászólás módosítva: Jan 10, 2015
(#) kapu48 válasza kovacsj hozzászólására (») Jan 10, 2015 1 /
 
Talán ez a módszer jó lesz neked:
Using ADC interrupts and TIMER interrupts at the same time
Bővebben: Link
(#) gabi20 válasza kovacsj hozzászólására (») Jan 10, 2015 1 /
 
Szia
Esetleg az analóg komparátort is fel lehetne használni. Az analóg jelet rákötöd az ADC bemenetre, illetve a komparátor + bemenetére. A komparátor - bemenetére pedig valamilyen referenciafeszültéget kapcsolsz. Az auto triggert pedig be lehet állítani úgy, hogy a komparátor indítsa el az AD konverziót. Szóval ha a bemenő jel eléri a komparátor referenciafeszültségét, akkor a komparátor kimenete átbillen, ami elindítja az AD konverziót.

Az auto triggernek az a lényege, hogy nem te indítod el a konverziót szoftveresen az ADSC bit beállításával, hanem automatikusan elindul valamilyen külső eseményre, például külső megszakítás, timer túlcsordosulás, vagy a komparátor kimenetének változásakor.
A hozzászólás módosítva: Jan 10, 2015
(#) Kovidivi hozzászólása Jan 10, 2015 /
 
Sziasztok!
Van egy karakter készletem, ascii kód alapján van létrehozva, tehat a 48. elem a nulla, a nulla ascii kódja 48. Az első 32 karaktert szeretném felhasználni, ékezetes karakterek tárolására. A gondom, hogy ha egy char tömbbe elmentek egy szöveget, pl. char tomb()="szöveg", és kicserélem az ö betűt a neki megfelelő ascii kódú karakterre, alt+10 mondjuk, akkor megjelenik a kódban a karakter eredeti képe, viszont amikor dolgoznék a tömbben, nem a betűtípus megfelelő eleme lesz meghívva, hanem az utasítás, amit az ascii kód jelent, tehat csak üres karaktert kapok. Úgy működik csak, hogy: char tomb()='s','z',10,'v','e','g'; Tehat az asci control karakterből nem egy szám lesz, hanem valami más. Van erre valami trükk? Ha nincs, akkor használok más karaktereket, csak gondoltam, ha azok úgysem jók semmire, miért ne. Köszi.
(#) killbill válasza Kovidivi hozzászólására (») Jan 10, 2015 / 1
 
Nem javaslom a 0-31 kodokat ekezetes karakternek hasznalni, mert utkozes lehet a tobbi vezerlokarakterrel (tab, cr, lf, ff, stb.), bar ez LCD-n nem sokat szamit.

Ha a stringbe akarsz 32-nel kisebb kodokat (de akarmekkorat is), akkor azt oktalis (nyolcas samrendszer) szamkent teheted meg igy:
pl. a decimalis 10, az oktalisan 12, azaz a string igy nez ki: "sz\012veg";

Ezen felul a C nyelvben van eleg sok vezerlokarakterre elore definialt irasmod:
CR - 13 - \r
LF - 10 = \n
TAB - 9 - \t
BS - 8 - \b
Es meg van par , csak azokat nem tudom fejbol.

Viszont az iso-8859-2 karakterkeszletben benne van az osszes magyar ekezetes karakter, es csak 1 byte-osak (nem UTF-8 es nem UTF-16). En mindig ezt hasznalom, ha valaminek feltetlenul magyarul kell tudnia.
(#) zombee válasza killbill hozzászólására (») Jan 11, 2015 / 1
 
Ha viszont HD44780 kijelző van a dologban akkor muszáj sajnos. Én ekkor a 8-15 karakterkódokat használom(mert a nulla az nem lenne menő)...
(#) killbill válasza zombee hozzászólására (») Jan 11, 2015 / 2
 
Termeszetesen a kijelzon azokat kell hasznalni, hiszen mas nincs, de attol meg a C forrasban a string-be iso-8859-1 vagy -2 kataktereket irnek. Aztan majd a kiiro fuggveny kicsereli a megfelelo 8-15 kodra. A baj inkabb az, hogy nincs eleg atdefinialhato karakter a 44780-ban. íáéöü es ugyanezek nagyban. Ez mar eleve 10. Es a hosszu ü es ö nem is szerepel bennuk. Ezert aztan en egyszer csinaltam olyat (vagy csak akartam?), ami a 2x16 karakteren megjeleno szovegben az eppen szukseges karaktereket toltotte le a kijelzobe. Dinamikusan valtoztatta, hogy eppen melyik kodhoz melyik ekezetes betu tartozik. Ha nem eleg a 8 darab, akkor valami ekezet nelkul marad.
A hozzászólás módosítva: Jan 11, 2015
(#) zombee válasza killbill hozzászólására (») Jan 11, 2015 / 1
 
De látom az írásaidon hogy nálad még kevesebb az ékezetes karakter...
(#) csabeszq válasza zombee hozzászólására (») Jan 11, 2015 /
 
Az informatikában büntetésből a letöröljem helyett a letaroljam-ot kellene használni.
A sok amerikai billentyűzetes csávó majd mentés helyett automatikusan klikkel.
(#) mucsa válasza csabeszq hozzászólására (») Jan 12, 2015 /
 
Szia.
Nagyon szépen köszönöm a választ. Ennek köszönhetően nem veszem meg.
Terveim között szerepel hogy egy stk500 vagy avrisp mkII-t veszek.
Szép napot.
(#) csabeszq válasza mucsa hozzászólására (») Jan 12, 2015 /
 
A döntés a tied. Mindennek van előnye és hátránya.

Az AVRISP2 drága és külső tápfeszt igényel. Ezt másik USB portról sem adhatod, mert narancssárgán villog földhurok miatt.

Ha kezdő vagy, az AVRISP2 azért jó, mert nem tudsz nagy kárt csinálni vele.

Arduino-t is használhatsz, de ott már előjönnek a számítógéppel közös táp problémái. Jobb esetben kikapcsol a gép az USB-port rövidzár miatt, rosszabb esetben kiég az alaplap.

Az AVRISP2 drága, meg kényelmetlen, hogy külső +5V is kell hozzá, de nagy baromságot tényleg nem tudsz vele csinálni. Akár klón is lehet egyébként, nem muszáj eredeti Atmel-es (én azt vettem meg).
A hozzászólás módosítva: Jan 12, 2015
(#) mucsa válasza csabeszq hozzászólására (») Jan 12, 2015 /
 
Köszönöm.
Persze klónra gondoltam, fel is kínált egyik fórumtársunk hogy készít STK500 vagy AVRISP2-t.
5V tápot még beszerzek valahogy, és kinéztem egy ILYEN panelt is hozzá.
Köszi még 1x a sok hasznos infót, így már magabiztosabban el merek indulni ezen az úton.
Szép napot!
(#) holex hozzászólása Jan 12, 2015 /
 
Sziasztok. Az miért van, hogy az USBasp nem látja az atmega8-at? A programozó valószínű jó, mert atmega328-ast tudok vele programozni. Atmega8-ből 2 újat is kipróbáltam, egyiket sem ismeri fel, nem tartom valószínűnek, hogy mindkettő rossz legyen...
Ezt írja amikor a fuse biteket akarom kiolvasni:
avrdude: error: programm enable: target doesn't answer. 1
avrdude: initialization failed, rc=-1
avrdude: AVR device initialized and ready to accept instructions
avrdude: Device signature = 0x000000
avrdude: Yikes! Invalid device signature.
avrdude: Expected signature for ATMEGA8 is 1E 93 07

Mi lehet a baja?
Következő: »»   638 / 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