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   555 / 840
(#) zombee válasza zombee hozzászólására (») Aug 19, 2013 /
 
Kis segítség a számoláshoz: a segédellenállás értékét úgy kell megválasztani, hogy az NTC mérési tartománya a lehető legnagyobb felbontásban legyen kihasználva. Az első esetnél a két véglet(80°C és 10°C) mellett mért ellenállás számtani közepe. Így a "középhőmérséklet" mellett a mért feszültség 2.5V lesz. Ha túl nagy áram folyik így az ellenálláson a 90°C-os résznél akkor növelni kell az ellenállást. Ez a lépés a felbontást rontja, közvetlenül a pontoságot nem.

A második képen, ha nem ismernéd fel, egy áramgenerátor szerepel. A soros kapcsolás miatt az NTC-n mindig* ugyanakkora áram folyik mint az R2 ellenálláson: I=Uref/R2.
Az AVR pedig ezt a feszültséget fogja megkapni: I*(R2+Rntc)=Uref*(1+Rntc/R2)
Itt megvan az a szabadság, hogy az Uref és R2 "kicsi" értékre történő megválasztásával a mérési tartomány majdnem 0V-tól 5V-ig terjed. A "+V" helyére nem kell kötni semmit, az csak ott van. A dolog hátulütője, hogy a műveleti erősítőnek +/- 12V-os tápot kell biztosítani. Ha Rail-to-Rail típus akkor 0V és +5V elég lesz neki.
(#) Gabó hozzászólása Aug 19, 2013 /
 
Ez nem programozási segítség kérés, inkább elektronikai lenne. Olyan megoldást keresek, amivel tudok 6 ledet vezérelni, ezek közül mindig csak 1 égne és még 6 ledet, de ezek közül több is égne. Ez ugye 12 led, és ha egyesével kötöm az avr-re akkor ugye 12lábat alapból elvesz. Olyan kapcsolás érdekelne, amivel tudok lábakat felszabadítani, de a ledek is megmaradnának.
(#) zombee válasza Gabó hozzászólására (») Aug 19, 2013 /
 
Gondolom óra akar lenni. Az első 6-os blokk esetén a "charlieplexing" a nyerő, így azok már
csak 3 lábat vesznek el, és statikusan is vezérelhető hiszen mindig csak 1 LED világít.
A másik 6-os blokkra is működik a dolog, de akkor időben folyamatosan kapcsolgatni kell hogy az összes kívánt LED-et lásd égni.
(#) Gabó válasza zombee hozzászólására (») Aug 19, 2013 /
 
Nem óra, hanem egy erősítőnek az "agya" lenne. Az első 6os blokk az a bemeneti helyzetet jelző ledeké, a másik 6os meg a többi módozatnak a ledjei (power, mute, stb).
(#) Gabó válasza (Felhasználó 15355) hozzászólására (») Aug 19, 2013 /
 
Áh köszönöm, valami hasonlón gondolkoztam én is, (valahol láttam ilyen megoldást, csak az kisebb volt) és nem tudtam mi a neve, és pontosan, hogy kell megcsinálni.
(#) Gabó válasza (Felhasználó 15355) hozzászólására (») Aug 19, 2013 /
 
Ez az IC-s megoldás jobban tetszik. A végleges panel még nincs kész, úgyhogy szerintem neki is állok valami tervnek.
Köszönöm a segítséget
(#) zombee válasza (Felhasználó 15355) hozzászólására (») Aug 19, 2013 /
 
Valami nem stimmel a rajzodban. Charlieplexing és 4 vezeték esetén 12 LED hajtható meg. A képlet: n vezetékkel n*(n-1) LED, (vagy nyomógomb). Meg is találtam a hibát: az első és a harmadik sor között hiányzik egy antiparalel páros. De ettől függetlenül 10 LED-re is működik.
A hozzászólás módosítva: Aug 19, 2013
(#) Fizikus válasza Gabó hozzászólására (») Aug 20, 2013 /
 
Az SPI es a shiftregiszter a 2 varazsszo ami neked kell! SPI-vel csak 4 vezetekkel vezerelhetsz shift regiszterek segitsegevel akarhany LED-et. Egy shift regiszterrel 8 LED-et tudsz meghajtani, de ha sorbafuzol ket darabot azzal mar 16 LED vezerelheto...

AVR SPI + shift regiszter
A hozzászólás módosítva: Aug 20, 2013
(#) TavIR-AVR válasza Gabó hozzászólására (») Aug 20, 2013 /
 
- SPI bővítő elvisz 3 (4) lábat (3: MOSI-kuld, SCK-orajel, CS-ChipSelect
8 I/O bővítő (75HC595...)
Sok I/O (TM1836, MAX7221/7219, HT3216)

- I2C busz az elvisz 2 lábat.
8 I/O bővítő (PCF8574, MCP2008...)
16 I/O bővítő (MCP23016, MCP2017)

-1Wire bővítő elvisz 1 lábat
8 I/O bővítő (DS2408)

Esetleg másik AVR a meghajtásra? És ide bármi protokollt tehetsz...
(#) zombee válasza (Felhasználó 15355) hozzászólására (») Aug 20, 2013 /
 
Nagyon szívesen! Bár egy pillanatra még azt hittem hogy én tévedek.
(#) Gabó hozzászólása Aug 20, 2013 /
 
Köszönöm mindenkinek az infókat! Ennyi módszerről nem is tudtam, de ennyi módszerből egy tuti jó lesz.
(#) szdani hozzászólása Aug 22, 2013 /
 
Sziasztok!
3x4-es matrix billentyűzetet használok, és 2x7szegmenses kijelzőre ír ki számokat, azt szeretném valahogy megírni hogy ha egymás után 2 számot ütök be, mondjuk 1-et meg 2-t akkor az 12 legyen. valaki tud rá esetleg megoldást?
Előre is köszönöm.
(#) kala1982a válasza szdani hozzászólására (») Aug 22, 2013 /
 
Beletenném a lenyomott gombokat karakterként egy stringbe, 12 gombod van az 10 szám(0-9), plusz visszatörlés és egy enter. Megszakításokkal van kezelve a gomb lenyomás akkor egyszerű: string régiérték + lenyomott gomb, enterre pedig egy típus konverzió. Biztosan lehet egyszerűbben is, így eszi a controller memóriáját a konverzió.
(#) blackdog hozzászólása Aug 22, 2013 /
 
Sziasztok!

Szeretnék egy régi-régi gondomra végleges megoldást találni. Eddig hőmérséklet mérést legsikeresebben NTC-vel tudtam megvalósítani. Próbálkoztam LM35-el, de hosszú vezetéken nagyon instabil volt.
Ami minden esetben elvárás lenne:
- 10m vezeték ne okozzon neki gondot
- 0,1 °C felbontásban tudjam kezelni a mért értéket
- Széles tartományban mérjen. Legalább -30°C és +110°C között.
- Meghibásodás esetén könnyen cserélhető legyen

Arra jutottam, hogy DS18 20 vagy DS1821 lenne a legmegfelelőbb választás.

Ami a gondom és nem egyértelmű a válasz:
- Saját hőtermelése mennyire problémás
- 0,1 °C felbontáshoz, ha jól látom kell a 11bit felbontás, de inkább a 12bit. Ekkor viszont szerintem lassú. 750ms és, ha másodpercenként akarom megjeleníteni egy LCD-n a mért értéket akkor szerintem leterhelem az AVR-t, de ebben pl. bizonytalan vagyok.
- Meghibásodás esetén, ha cserélni kell a szenzort akkor a szoftvert is frissíteni kell? Az IC címe miatt gondolom.
A hozzászólás módosítva: Aug 22, 2013
(#) zombee válasza blackdog hozzászólására (») Aug 22, 2013 /
 
DS18x20 esetén a 750 ms nem azt jelenti hogy az adatátvitel addig tart, hanem két mérés között minimum ennyit kell várni. Ezalatt azt csinál az AVR amit csak akarsz. A másodpercenkénti megjelenítéssel nem lesz gond, a mérés és az új érték kiíratása 100ms alatt megoldható.
Ha egy vezetékre csak 1 IC megy, akkor használhatod a "skip adress" parancsot, és ezzel meg van oldva a cserebere kérdése is. De létezik "adress detect" metódus, amivel feltérképezhető a vonalon lévő IC-k címe. Ha ráérsz leprogramozni akkor ezzel is meg van oldva a csere.
A hozzászólás módosítva: Aug 22, 2013
(#) blackdog válasza zombee hozzászólására (») Aug 22, 2013 /
 
Egy vezetékre csak egy szenzort szánok.
És vajon marad elég idő a többi feladatra is? Ez a 750ms zavar nagyon ill. a saját hőtermelését nem értem.

Szerk:
750ms most már értem. Az nem befolyásolja az AVR-t.
A hozzászólás módosítva: Aug 22, 2013
(#) zombee válasza blackdog hozzászólására (») Aug 22, 2013 /
 
Azt én honnan tudjam hogy marad-e elég idő másra is? Nem az én programom...
Szerintem felesleges ezen rágódni, mindennek van hőtermelése! Egy digitális szenzor esetén
biztosan odafigyelnek erre is, nem Te találtad fel a spanyolviaszt.
(#) szdani válasza kala1982a hozzászólására (») Aug 22, 2013 /
 
Köszönöm
(#) blackdog válasza (Felhasználó 15355) hozzászólására (») Aug 23, 2013 /
 
A digitális jel miatt gondolom kevésbé zavar érzékeny. Ill sok helyen olvastam már, hogy hosszú vezetéken jobb választás.

Az LM35 állandóan billeg +-1°C. Próbáltam az adatlap szerinti szűréseket elvégezni, de csak javult, de nem szűnt meg az instabilitása.
De, ha erre jól bevált és stabil megoldásod szívesen fogadom.
Ill. Még egy gondom volt az LM35-el.
Negatív hőmérséklet méréséhez az adatlap szerint kell (-) táp is.
A hozzászólás módosítva: Aug 23, 2013
(#) Topi válasza szdani hozzászólására (») Aug 23, 2013 /
 
Ezt úgy szokás megírni, hogy:

  1. szam *= 10;
  2. szam += billentyu;


kala1982a megoldásáról lebeszélnélek egyrészt a string kezelés okán, másrészt a borzasztó helypazarlása okán. Ez bármekkora méretű integerre működik (értelemszerűen az overflow-t ki kell védeni).
A hozzászólás módosítva: Aug 23, 2013
(#) TavIR-AVR válasza blackdog hozzászólására (») Aug 23, 2013 /
 
A DS1820 (1-wire busz) zavarerzeketlen. nem veletlen talaltak ki a 60-70 (illetve az ajanlasok betartasaval) a 200 m tavot.
1 vezetekre simen mehet tobb eszkoz. Nalam a csucs az 25 homero volt 30 m kabelen.


Sajat hotermeles _folyamatos_ meressel <0.1 fok hibat okozott (5V rendszerben).
A homero -40..+125 fokot siman tud.
Konnyu csere: nalam telefoncsatlakozos (szabvanyos) a meroillesztes. Azaz azonnal cserelheto a kabelvegen. Sima 4eres telefonkabelen megy a meres...

11 bit: 0.125fok, 12 bit:0.0625 fok.
750 ms a meres. azaz a merj! kiadasa (~3 msec) es a eredmeny kiolvashatosaganak _kezdete_ kozt eltelt idot illik kivarni. De ha tavtaplalt a rendszer (kap 5V-t is) akkor <200 ms a meres!
Masodpercenkent meres:
1. Hofok kiolvasas
2. meres inditasa
3. LCDre kiirni a hofokot
3a waitms 150
4 goto 1
Igy a meresi kesleltetesed a LCDre kiiras+varakozas, es _azonnal_ mindig ott a kesz hofokerteked!
A DS1820 ha csak 1 van: a SkipRom utasitassal kihagyhatod a chipazonositast. Igy a buszon 1 homero van, igy a :
- mindenki merjen
- barkitol kell a hofokadat
utasitasokra az egyszer momerod valaszol
Vagy prg inditasakor lekerdezed ki van a buszon es utana azon a cimen szolitgatod....
Fontos! CRC azert van benne, hogy a hibakat/zavarokat a kommunikacioban kiszurd!




Am ilyen hosszakra a parazita mod nem megy, hanem csak a tavtaplalat mod (3 vezetek).
Az LM 75 zavarerzekeny: kell melle a 100nF keramiakondi, a 1k5..2k2 felhuzo az I2C buszra es a max kabelhossz <1m.
A hozzászólás módosítva: Aug 23, 2013
(#) TavIR-AVR válasza blackdog hozzászólására (») Aug 23, 2013 /
 
LM75 az adatlap alapjan +/-1 fokot tud. Ne is varj tobbet tole....
Nem kell negativ tap a chipnek a minusz hofokokhoz!
(#) blackdog válasza TavIR-AVR hozzászólására (») Aug 23, 2013 /
 
Egy vezetékre max 1db érzékelőt tennék.
Ismét itt vannak a szöges ellentétek. Pt100 / Pt1000 jelét feldolgozni nehezebb mint a DS18x20 jelét. mV tartományban dolgozik nem fogom fel, hogy miért biztonságosabb mint a digitális jelfolyam.
DS18x20 -nál hol találok leírást az ilyen hosszú vezetékekre?
(#) TavIR-AVR válasza blackdog hozzászólására (») Aug 23, 2013 /
 
(#) matheattila hozzászólása Aug 24, 2013 /
 
Sziasztok!

Nemrég kezdtem el foglalkozni az AVR (ATmega8, ATmega16 és ATmega32) mikrovezérlőkkel (mert ezt követelték a munkakörülmények) és mivel megrögzött PIC-es vagyok ezért nagyon zavar az, hogy a makrók definiálásánál nem lehet külön egy PORT egyik bitjét elnevezni és majd erre hivatkozni a program további részében, legen akár bemenet vagy kimenet.
Pl:
PIC: (MPLAB C18-ban)
  1. #define LED LATBbits.LATB0
  2. #define GOMB PORTBbits.PORTB1
  3.  
  4. void main()
  5. {
  6.    TRISBbits.TRISB0 = 0; // kimenet a Lednek
  7.    TRISBbits.TRISB1 = 1; // bemenet a Gombnak
  8.    
  9.    LED = 0;  // azaz RB0 kimenet logikai 0-ba huzasa
  10.  
  11.    while(1)
  12.    {
  13.        if(GOMB == 0) LED = 1;  // mivel a gombot alltalaban negativ logikaval hasznaljuk
  14.        else LED = 0;
  15.        //delay...
  16.    }
  17. }

AVR: (AVR Studio-ban)
  1. #define LED_ON()  PORTB |=  (1 << PB0)
  2. #define LED_OFF() PORTB &= ~(1 << PB0)
  3.  
  4. #define GOMB_PIN PINB
  5. #define GOMB_BIT PB1
  6.  
  7. int main()
  8. {
  9.    DDRB |=  (1 << PB0); // kimenet
  10.    DDRB &= ~(1 << PB1); // bemenet
  11.      
  12.    LED_OFF(); // azaz PB0 kimenet logikai 0-ba huzasa
  13.  
  14.    while(1)
  15.    {
  16.        if(bit_is_clear(GOMB_PIN, GOMB_BIT)) LED_ON(); // mivel a gombot alltalaban negativ logikaval hasznaljuk
  17.        else LED_OFF();
  18.        //delay...
  19.    }
  20.    return 0;
  21. }

Itt egy egyszerű példa, eltekintve a prell jelenségtől és egyéb beállításoktól (uC típus, include-ok, CPU órajel, stb.) mindkét mikrovezérlő ugyanazt csinálja: ha lenyomjuk a gombot akkor kigyul a LED, mint a példából is látszik PIC-ek esetén sokkal egyszerűbb és átláthatóbb a program, mint AVR-ek esetén.
Nem lehet valamilyen módon ugyanúgy használni a bitek kezelését AVR-eknél is, mint PIC-eknél, mert sokszor idegesítő az a sok léptetés (1<<PXn), meg tagadás és egyéb műveletek egy bit beállítására?
Előre is köszönöm!

Üdv, Atti.
A hozzászólás módosítva: Aug 24, 2013
(#) TavIR-AVR válasza matheattila hozzászólására (») Aug 24, 2013 / 1
 
Bascom-AVR jó?
pl: kimenet: Portb.1
bemenet: pinb.1

  1. gomb alias pinb.1
  2. led alias portb.2
  3. config led=output
  4. gomb=1
  5.  
  6. do
  7. led = not (gomb) '
  8. loop
(#) fifadani hozzászólása Aug 24, 2013 /
 
Sziasztok!
Kérnék egy kis segítséget...
Van egy BCD-ből 7 szegmenses meghajtó IC-m.
PC5-től PC2-ig vannak a lábak bekötve a meghajtó IC-be.
PC5 - A, PC4 - B, PC3 - C, PC2 - D.
Elindítok egy számlálót 9-ig, ha eléri a 9-et 0-áz.
Ez oks. Viszont, hogy tudom a számot BCD-be átszámoltatni és a lábakra varázsolni?

Köszi!
(#) zombee válasza TavIR-AVR hozzászólására (») Aug 24, 2013 /
 
biztos jobban kezeli a Bascom ilyet, csak az a baj hogy az
1: nem C
2: 4KB felett teljes verzió kell
3: optimalizálás - van-e egyáltalán?
A hozzászólás módosítva: Aug 24, 2013
(#) zombee válasza matheattila hozzászólására (») Aug 24, 2013 / 1
 
A C megoldás lehet hogy nem olyan szép mint a Bascom-os, de azért használható:
  1. gomb = _bv(PINC,2)


De készíthetsz saját makrókat:
  1. #define PINC0 ((PINC>>0)&1)
  2. #define PINC1 ((PINC>>1)&1)
  3. #define PINC2 ((PINC>>2)&1)
  4. //(...)
(#) zombee válasza fifadani hozzászólására (») Aug 24, 2013 /
 
C-ben:
  1. DDRC = 0b00111100;
  2. uint8_t szam = 0;
  3. for(;;)  //végtelen ciklus
  4. {
  5.   PORTC = szam<<2;  //mivel a PC2 a legkisebb helyiértékű kimenet a BCD kijelzőre.
  6.   if(++szam==10) szam=0;
  7. }
Következő: »»   555 / 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