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   561 / 840
(#) TavIR-AVR válasza blackdog hozzászólására (») Szept 17, 2013 /
 
Nem tudsz és nem is kell konfigurálni.
Ha gyorsan olvasod ki, akkor 9 bit pontosan mérsz, ha 200msec után olvasod: 12 bites a mért eredményed.
(#) Massawa válasza Massawa hozzászólására (») Szept 17, 2013 /
 
Sajnos nem megy, hülye vagyok hozzá.
Sikerült valamit beirnom a második sorba, de nem éppen azt, amit akartam, de már ez is több mint eddig......

(#) szalaisanyi hozzászólása Szept 17, 2013 /
 
Sziasztok!
Segítséget szeretnék kérni!
Megépítettem az oldalon, a cikkek közt található dallamcsengőt.
Sikerült felprogramozni, de nagyon lassan játssza a dallamokat!
Attiny45-20PU sikerült beszerezne, aminek 20MHz-es a belső oszcillátora, de a kapcsolás 8MHz-es MCU-hoz készült, a Makefile-ban átállítottam 20MHz-re de akkor sem jó!
Mit és hogy kellene még módosítanom, hogy rendesen játssza a dallamokat?
Üdv Sanyi!
(#) TavIR-AVR válasza szalaisanyi hozzászólására (») Szept 17, 2013 /
 
Belső biztosítékbitek beállítása?
A Makefile az csak a fordítónak kell, a chipet nem piszkálja!
(#) csabeszq válasza szalaisanyi hozzászólására (») Szept 17, 2013 /
 
Röviden: a chip ha 20MHz-n futna, akkor gyorsan játszaná a dallamot, de a tied lassan, ezért azt gyanítom, hogy 1MHz-en fut.

Kérlek próbáld a programot a következővel kezdeni (közvetlenül a main után, a két utasítás közé ne írj semmi más kódot):
  1. CLKPR = _BV(CLKPCE);
  2. CLKPR = 0;


Ez gyakorlatilag kikapcsolja a frekvenciaosztást (CKDIV8) és az IC-nek fel kellene pörögnie 8MHz-re az 1MHz-ről.
(#) szalaisanyi hozzászólása Szept 17, 2013 /
 
Köszönöm! Sikerült!
(#) szalaisanyi hozzászólása Szept 17, 2013 /
 
Volt egy ilyen rész:

  1. //-----------------------------------------------------------------------------
  2. void PlayNote(u08 note, u08 octave, u16 duration)
  3. //-----------------------------------------------------------------------------
  4. {
  5.   u16 adur;
  6.   // Oktáv számolás
  7.   switch (octave)
  8.   {
  9.     case 4 : break;
  10.     case 5 : note = note>>1; break;
  11.     case 6 : note = note>>2; break;
  12.     case 7 : note = note>>4; break;
  13.   }
  14.   adur = (3000/gTempo/duration);                        //idő kiszámolása
  15.  
  16.   if (note==0) m_delay_ms(adur); else {
  17.    timer0Clear();                                                       //Számláló törlés
  18.    timer0SetCompare(note);                                      //Új komp. szint - új freki
  19.    timer0CCPOn();                                                       //Jel bekapcs
  20.    m_delay_ms(adur);                                            //Várok hang hossznyit
  21.    timer0CCPOff();                                                      //Jel kikapcs
  22.   }
  23. }


Azt az "adur =" 6000-en volt és le vettem 3000-re így jó lett!
Mégegyszer köszönöm a segítséget!
(#) zombee válasza csabeszq hozzászólására (») Szept 17, 2013 /
 
"INT0 - SEI" - ez is gáz, gondolj bele, mi van ha az INT0 lenyomásakor tiltva van?
Akkor nem fog neked soha az életben engedélyeződni. Köv. hozzászólásomban rendes kódot írok.

"INT1 - CLI" - ez valóban hülyeség, de az elméleti lehetőség (assemblerben) megvan hozzá.
Ehhez csak az kell, hogy "reti" helyett "ret" legyen a végén. Sőt, ilyenkor elég ha az interrupt
egy "ret"-ből áll, még ugratni sem kell, csak a megfelelő pozícióra egy "ret"-et beírni...
(#) zombee válasza tecsa hozzászólására (») Szept 17, 2013 /
 
Adok egy rövid kódot (ATMega8/16 IC-re), ami - szerintem - korrektül kezeli a cuccodat.
A cli és sei utasítást nem használjuk interrupton belül, és nem vezérlünk vele semmit!
Ha valamit engedélyezni/tiltani akarsz, az interrupt maszkokat kell állítani!
A maszk engedélyezése előtt az interrupt flaget érdemes törölni, mert ha korábban már
bekövetkezett az interruptot generáló esemény, az engedélyezés pillanatában meg is hívódik!
Ez az INT0/INT1/INT2 esetén fokozottan igaz!

Inicializálás:
  1. MCUCR = 1<<ISC01; //INT0 lefutó élre generál interruptot.
  2. GIFR = 1<<INTF0; //törli az interrupt flaget, hogy INNENTŐL kezdje a figyelést
  3. GICR = 1<<INT0; //INT0 maszk - engedélyezés
  4. sei(); //már tudod...


INT0 megszakítása:
  1. ISR(INT0_vect)
  2. {
  3.   MCUCR = 1<<ISC11; //INT1 lefutó élre generál interruptot.
  4.   GIFR = 1<<INTF1; //törli az interrupt flaget, hogy INNENTŐL kezdje a figyelést
  5.   GICR = 1<<INT1; //INT1 maszk - engedélyezés, egyben tiltja az INT0-t
  6.   (...) //amit csinálni akarsz bekapcsoláskor, pl. port bekapcsolás, timer indítás, stb.
  7. }


INT1 megszakítása:
  1. ISR(INT1_vect)
  2. {
  3.   GICR = 0; //INT1 és INT0 maszkolás (tiltás!)
  4.   (...) //amit csinálni akarsz kikapcsoláskor, pl. port kikapcsolás, timer leállítás, stb.
  5.   (...) //ha újra az INT0-át akarod engedélyezni, csak beszúrod az inicializálást. (sei nélkül!)
  6. }
A hozzászólás módosítva: Szept 17, 2013
(#) tecsa válasza zombee hozzászólására (») Szept 17, 2013 /
 
Köszi a segítséget. Ezzel kb meg is van írva a proggramom nagy része. Ma este alaposan hozzá olvasom Fizikus kolléga írását az IT-ról a kettőből már remélem teljesennérteni fogom a helyzetet.
(#) Szabi1 hozzászólása Szept 18, 2013 /
 
Sziasztok!
Attiny2313 al akarok egy n-channel fettel (IRFZ44NPBF) DC motrot kapcsolni. Összekötöttem, de sajnos nagyon lassan forog, ha pedig össze érintem a SOURCE-t a DRAIN-el akkor gyorsan megy, próbáltam másik tiszta új ugyan ilyen nevű fettel, de ugyanaz a helyzet, mi a teendő?
(#) csabeszq válasza Szabi1 hozzászólására (») Szept 18, 2013 /
 
Egy FET kapcsolásához legalább 4.5V kell. Tud ennyit a tápod (3.3-ról is lehet az attiny-t járatni)?
A hozzászólás módosítva: Szept 18, 2013
(#) killbill válasza csabeszq hozzászólására (») Szept 18, 2013 /
 
Ezt igy nem jelentenem ki. Vannak 2.8V-ra specifikalt FET-ek (pl. IRFR3708), 4.5V-ra, de a legtobb 10V Vgs-re adja meg az Rdson parametert. Szoval a megfelelo FET-et kell valasztani a feladathoz. Speciel az IRFZ44 Rdson-ja az 10V Vgs-re van specifikalva (Gate threshold 2.0-4.0V), tehat 4.5V-ra nem garantalt, hogy kinyit rendesen.
(#) zombee válasza Szabi1 hozzászólására (») Szept 18, 2013 /
 
A legtöbb FET 4.5-5V gate feszültségen nem nyit ki annyira ami neked kell. 10-12V elég lehet.
Ha nincs más fajta akkor NPN tranzisztor és két ellenállás segítségével emitterkövető
kapcsolásban tudsz illeszteni 12V-os FET-et. Rajzot nem tudok, keress rá!
A hozzászólás módosítva: Szept 18, 2013
(#) csabeszq válasza killbill hozzászólására (») Szept 18, 2013 /
 
Igen, durván leegyszerűsítettem a dolgot. Az érintett FET (IRFZ44) 4.5V-nál kezd kinyitni, akkor a dokumentáció szerint 10A-t visz, de 35A amikor csúcsra van járatva. Ez az áram már bőven kívülesik az otthoni játékszereim nagyságán.

Úgy lehet elképzelni a 35A-t, hogy egy mosógép, egy 2000 W-os radiátor, egy 1600W-os porszívó mellett még egy 800W-os hajszárítót is bekapcsolunk. Ha ezt csinálom, akkor kelleni fog az a 10V a nyitófeszültségre.

Nyilván DC motor és DC motor között is van különbség, láttam már mozdonyból kiszerelt DC motort az egyetemen, valószínűleg nem 2.8V-on kapcsolták be.
(#) balulau hozzászólása Szept 19, 2013 /
 
Sziasztok!

Egy nagyon alap kérdésért bocsássatok meg, de nem tudok rájönni a hibára.
Adott 1 függvény amit meghívok , beolvassa 8láb logikai szintjét és visszaadja az eredmény.
Debug üzemmódban is végignézve a visszaadott érték 255 (0xFF) , ám a függvény ami ezt az olvasást meghívja már nem ezzel az értékkel dolgozik, hanem 224-el (0xE0).
  1. uint8t ReadByte(void)
  2. {
  3. uint8t data;
  4. ...
  5. return(data);   //itt a data értéke 255
  6. }
  7. ....
  8. void progi(void)
  9. {
  10. uint8t param;
  11. param=ReadByte();  //itt a param értéke 224...
  12. ...
  13. }


Szerintetek? Egy picit már idegesít hogy ezen akadok el... Mit nézek el ?
Köszönök minden hozzászólást!
(#) csabeszq válasza balulau hozzászólására (») Szept 19, 2013 /
 
Ha az 5-ös sorban a data értéke 255, akkor a 11-es sorban is annyinak kellene lennie, kivéve...

Használsz interruptot naked attribútummal? Lehet IC hiba?

  1. ISR(TIMER1_COMPA_vect, ISR_NAKED) {
  2. ...
  3. }
A hozzászólás módosítva: Szept 19, 2013
(#) balulau válasza csabeszq hozzászólására (») Szept 19, 2013 /
 
Szia!

Nincs jelenleg interrupt használva, konkrétan minden offline üzemmódban van, csak ez a rész működik . IC hibát nem tartom valószínűnek. És igen ha az 5ös sorban a debug szerint 255 van akkor a 11esben is annyinak kéne lenni de mégse , és ez bosszant.
(#) PA009 hozzászólása Szept 19, 2013 /
 
Sziasztok!

Én még nagyon kezdő vagyok és egy denevérdetektor szerűséget szeretnék építeni megtudnátok mondani hogy mi kell hozzá és hogy mit hová kell kötni?
(#) Szabi1 válasza zombee hozzászólására (») Szept 19, 2013 /
 
Megpróbálom IRF3205-el is, nemtudom miért, de nekem 5v Vgs-el elvileg kéne annyi ampert adjon, hogy a motor elég gyorsan forogjon, kipróbáltam és a 5,6v 300mA táppal direktbe kötve, megfelelő a forgási sebesség. Szerintem a FET halt meg benne és azért megyen lassan.
A hozzászólás módosítva: Szept 19, 2013
(#) Szabi1 hozzászólása Szept 19, 2013 /
 
Ha atmega8-at hasznalok akkor az XTAL lábakat használhatom output ként, úgy ha elég a belső órajel?
Ha használok két ADC portbitet, a többit használhatom outputként, ha csinálok 2 függvényt ami load/unload-olja a ADC mérés registerjeit.
A hozzászólás módosítva: Szept 19, 2013
(#) karika200 hozzászólása Szept 19, 2013 /
 
Üdv!

Egy egyszerűnek tűnő UART problémám van. Az itt közzétett egyszerű példaprogram segítségével remekül tudok kiküldeni adatot byteonként. Írtam egy egyszerű "send_line" függvényt, aminek egy stringet odaadva byteonként küldi ki az egész sort. Ha ezt a függvényt használom, akkor a kimenetem egy nagy csomó krix-krax, kivéve az első karaktert. Ha byteonként küldök akkor semmi gond. Szerintetek hol szúrom el? Órajelem természetesen stimmel. A forráskód részlet és a kimenet itt tekinthető meg. Előre is köszönöm a tanácsokat!

u.i.: Természetesen ez nem az egész forráskód, csak a lényeget ollóztam ki. Tehát van main() és egyebek..

üdv
A hozzászólás módosítva: Szept 19, 2013
(#) csabeszq válasza karika200 hozzászólására (») Szept 19, 2013 /
 
A topik tetején találod meg a megoldást:
  1. 3. UART/USART hibák 99,9% a rossz órajel miatt van


Személyes tapasztalatból megerősíthetem.

Amit érdemes átnézni:

- van-e kvarc kristály, a megfelelő fuse bitek be vannak-e állítva, hogy a kristályról menjen az IC, ne a belső oszcillátorról
- a kvarc 7.3728 MHz-es-e
- csak az egyik oldalt linkelted be, a másik oldalt nem látjuk. Nem tudjuk, hogy egyformán van-e mindkét oldal felkonfigurálva (sebesség, paritás, stop-bitek).
- a kábel hossza ne legyen több, mint 15m (9600 baudon ennyi a max)
(#) karika200 válasza csabeszq hozzászólására (») Szept 19, 2013 /
 
A terminál baud rate-je 9600 8N1. Ez szerintem jó kell legyen. A kábel hossza ~1,5 méter. A kvar 7.3728MHz, fuse bitek beállítva, kvarcról ketyeg az MCU. Azért gondolom, hogy nem órajel hiba(aztán lehet tévedek), mert byteonként remekül tudok küldeni/fogadni. Másik bizonyíték, hogy az órajelem rendben van: egy DS1631-es hőmérő IC-t kérdezgetek TWI-n keresztül és hibátlanul kapom a hőmérséklet értékeket. A TWI busz sebességét pedig csak az MCU órajel pontos ismeretében tudtam beállítani. Tehát garantáltan az MCU órajelem rendben van.

Ettől még elképzelhető, hogy valahol valami órajel probléma van az UART interfészemen, de én nem gondolnék erre.
(#) vzoole válasza karika200 hozzászólására (») Szept 19, 2013 /
 
A kódot átnézve jónak tűnik.
Egy különbség van ahhoz képest amit én használok, hogy nem const char van deklarálva.

  1. void rs232_send_line(char *str) {
  2.     while (*str) {rs232_send_byte(*str++);}
  3. }
(#) csabeszq válasza karika200 hozzászólására (») Szept 19, 2013 /
 
A TWI-t akár kézzel nyomógombbal is küldözgetheted, semmi köze a precíz órajelekhez. Azért kell neki bitrátát megadni, hogy a hardver ne találomra válasszon sebességet, hanem legyen hová igazodnia. Fogadóoldalon még a bitrátát sem kell állítanod.

Az SPI, TWI minimálisan érzékeny az órajelre, bizonyos freki felett nem megy, de alatta igen.

Az USART esetén 2% órajelingadozás már magávalrántja a kommunikációt.
(#) karika200 válasza csabeszq hozzászólására (») Szept 19, 2013 /
 
vzolee, próbáltam így is-úgy is, de ennek gyakorlatilag ilyen jelentősége nem lehet.

csabeszq, mit tanácsolsz, hogyan tudnék meggyőződni az órajel valódiságáról? A fuse bytejaim a következők:
H: 0xd9
L: 0xcf
(#) mps hozzászólása Szept 19, 2013 /
 
Sziasztok!
Van egy kis problémám az alábbi kóddal:
  1. #include <avr/io.h>
  2.  
  3.  
  4. int main(void)  
  5. {
  6.  
  7.         DDRB = 0b00111111;
  8.         DDRC = 0b0011111;
  9.         DDRD = 0b00000000;
  10.         PORTD |= (1<<PD5);
  11.        
  12.                         //76543210
  13.         PORTC |=  (1<<PINC1);  
  14.        
  15.         while(1)
  16.         {
  17.                        
  18.                 if (PIND5)  PORTB |=  (1<<PINB2); else  PORTB &=  (0<<PINB2);
  19.     }
  20.  
  21.  
  22. }

Egészen pontosan az, hogy én azt várnám, hogy amikor leteszem testre a PB5-öt, akkor akkor átvált a led, viszont semmi sem történik. (Egy nagyobb program része lenne, de mivel ez az első progim Avr-re, ezért már eddig lecsupaszítottam, ott is csak annyi lenne a szerepe, hogy két felé ágazik a program egy gombtól függően.)
Szóval a kérdés röviden: hogy kell egy láb állapotát lekérdezni?
Előre is köszönöm a segítséget!
(#) vzoole válasza mps hozzászólására (») Szept 19, 2013 / 1
 
  1. if( !(PIND & (1<<PIND5)) ) {PORTB = PORTB |  (1<<PINB2);}
  2. else                       {PORTB = PORTB & ~(1<<PINB2);}
A hozzászólás módosítva: Szept 19, 2013
(#) mps válasza vzoole hozzászólására (») Szept 19, 2013 /
 
Köszi szépen!
Ennél a shiftelgetős megoldásnál nincs egyszerűbb?
Következő: »»   561 / 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