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   493 / 840
(#) blackdog hozzászólása Nov 5, 2012 /
 
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?
(#) zsozsoX hozzászólása Nov 5, 2012 /
 
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.
(#) Topi válasza zsozsoX hozzászólására (») Nov 5, 2012 /
 
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.
(#) zombee válasza zsozsoX hozzászólására (») Nov 5, 2012 /
 
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
(#) TavIR-AVR válasza 06smici hozzászólására (») Nov 6, 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.
(#) Topi válasza zombee hozzászólására (») Nov 6, 2012 /
 
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
(#) zombee válasza Topi hozzászólására (») Nov 6, 2012 /
 
Valamit ma is tanultam. Köszönöm, Topi mester!
(#) elektros90 hozzászólása Nov 7, 2012 /
 
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:

  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3.  
  4. #define F_CPU 1000000UL
  5.  
  6. void m_delay_ms(unsigned char val)
  7.         {
  8.                 unsigned char i;
  9.                 for(i=0; i<val; i++)
  10.                {
  11.                        _delay_ms(1);
  12.                }
  13.         }
  14.      
  15.  
  16.  int main(void)
  17.  {
  18.  
  19.         DDRB  |= (1<<PINB0);
  20.         PORTB |= (1<<PINB0);
  21.                
  22.         while(1)
  23.         {
  24.                 m_delay_ms(1000);
  25.                 PORTB &= ~(1<<PINB0);
  26.         }
  27. }


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.
(#) Thomy válasza elektros90 hozzászólására (») Nov 7, 2012 /
 
Szia!

Tedd kicsit tisztába a logikai műveletekkel kapcsolatos ismereteidet!

A probléma, hogy a led-et egyfolytában kikapcsolod.

Szerintem helyesen:
  1. int main(void)
  2.  {
  3.  
  4.         DDRB  |= (1<<PINB0);
  5.                
  6.         while(1)
  7.         {
  8.                 PORTB |= (1<<PINB0);
  9.                 m_delay_ms(1000);
  10.                 PORTB &= ~(1<<PINB0);
  11.                 m_delay_ms(1000);
  12.         }
  13. }


Üdv,
Thomy
A hozzászólás módosítva: Nov 7, 2012
(#) elektros90 válasza Thomy hozzászólására (») Nov 7, 2012 /
 
Igazad van, köszi szépen.
Elfelejtettem, hogy a
  1. PORTB &= ~(1<<PINB0);
vel csak 0át írok bele. (Negációt gondoltam)
A delay valahogy nem jó, gyorsabb sokkal mint egy másodperc.
A hozzászólás módosítva: Nov 7, 2012
(#) Mikee91 válasza elektros90 hozzászólására (») 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.
(#) elektros90 válasza Mikee91 hozzászólására (») Nov 7, 2012 /
 
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.
(#) quky28 hozzászólása Nov 7, 2012 /
 
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
(#) sikolymester hozzászólása Nov 7, 2012 /
 
delay.h manual

Nem kell amúgy ilyenekkel bonyolítani, a _delay_ms() képes 6.5535 mp hosszú delayt csinálni.
(#) sikolymester válasza elektros90 hozzászólására (») Nov 7, 2012 /
 
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.
(#) sikolymester válasza quky28 hozzászólására (») Nov 7, 2012 /
 
Használd ezt:
  1. uint32_t foo;
(#) quky28 válasza sikolymester hozzászólására (») Nov 7, 2012 /
 
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));

}

>>>>>>
(#) sikolymester válasza quky28 hozzászólására (») Nov 7, 2012 /
 
Igen.
(#) quky28 válasza sikolymester hozzászólására (») Nov 8, 2012 /
 
Válasz köszi müködik
(#) blackdog hozzászólása Nov 8, 2012 /
 
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:
  1. .....
  2. unsigned int AdcBe(unsigned char aport) {
  3.  
  4. ADMUX = (ADMUX & 0xF0) | aport;
  5. ADCSRA |= (1<<ADSC);
  6.  
  7. while (ADCSRA & (1<<ADSC));
  8.  
  9. ADCSRA &= ~(1<<ADSC);
  10. _delay_ms(100);
  11.  
  12. return (ADCL | (ADCH<<8));
  13.  
  14. .....
  15.  
  16. int main(void) {
  17.  
  18. .....
  19.  
  20. // ADC beállítása
  21. ADMUX |= (1<<REFS0);    // Vcc mint referencia
  22. ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);  // ADC engedelyezese, ADC eloosztas = 128 (125 KHz)
  23.  
  24. ......
  25.  
  26. float ahom1;
  27. float homer;
  28. char homerseklet1[5];
  29.        
  30.         while(1) {
  31.  
  32.         ahom1 = AdcBe(0);
  33.         homer = (ahom1*500/1024)+1;
  34.  
  35.         int   hom1 = homer;
  36.         float fhom = homer - hom1;
  37.         int   hom2 = trunc(fhom * 10);
  38.         sprintf(homerseklet1,"%d.%01d",hom1,hom2);
  39.         lcd_gotoxy(1,1);
  40.         lcd_puts(homerseklet1);
  41.  
  42.         }
  43. ....
(#) Seton válasza blackdog hozzászólására (») Nov 8, 2012 /
 
Fórum hsz.

Hasonló anomáliába futottam bele én is, kínomban egy 1k-s ellenállással oldottam meg.
(#) blackdog válasza Seton hozzászólására (») Nov 8, 2012 /
 
É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
(#) quky28 hozzászólása 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

(#) sikolymester válasza blackdog hozzászólására (») Nov 9, 2012 /
 
Aa multimeter integralast vegez a feszultseg meresnel, azert tunik stabilnak a fesz. Te is atlagolj es nem fog ugralni.
(#) blackdog hozzászólása Nov 9, 2012 /
 
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?
(#) mcucoder hozzászólása Nov 10, 2012 /
 
Megy valakinél RFM70-el az adatátvitel ?
Érdekelne minden tapasztalat.
(#) blackdog hozzászólása Nov 10, 2012 /
 
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.
(#) eyess válasza blackdog hozzászólására (») Nov 10, 2012 /
 
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.
(#) blackdog válasza eyess hozzászólására (») Nov 10, 2012 /
 
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.
  1. ISR(USART0_RX_vect) { ...}

Most, hogy ezt orvosoltam megszűnt a hiba. Nem rezetel az MCU.
A hozzászólás módosítva: Nov 10, 2012
(#) Reggie válasza blackdog hozzászólására (») Nov 10, 2012 /
 
Beallitasz egy timert pwm kimenetre es ki kell szamolni.
Következő: »»   493 / 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