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   579 / 840
(#) zombee válasza zombee hozzászólására (») Dec 28, 2013 /
 
Tessék két példa. Régiek, de remélem hasznos lesz. A "dummy" megoldás is működik, gondolom
az utolsó csatolmányod is valami ilyesmit akart takarni. Elegáns, de ritkán használják...
A hozzászólás módosítva: Dec 28, 2013
(#) kiborg válasza zombee hozzászólására (») Dec 28, 2013 /
 
IGEN! Az én eredeti mintám a második mintádra hasonlít programom csak én nem dummy-nak nevezem, hanem a rendes nevén hívom, mindegyiknek megvan a saját címke párja, de az összesnek a egy a vége: reti
(amit rolandgw mutatott minta az az én interupt kezelésemnek a legvége !, lásd az ereti programot, ne csak a kiragadott részletet)

más: köszönöm az ötletet, kipróbálom az LC szűrést.
(#) zombee válasza kiborg hozzászólására (») Dec 28, 2013 /
 
Az a baj ezzel hogy így nem látod át egyből, melyik interrupt van megvalósítva, és melyik
megy rá a "közös" dummy részre. Nézd azt az időráfordítást amit arra fordítasz hogy új
interruptot szúrsz be, vagy veszel ki a programból. A sok görgetés, mire a végére érsz
már elfelejted mi lett volna a következő lépés. Egyszerűbb ha minden ott van az elején!
(#) Koncsar hozzászólása Dec 28, 2013 /
 
Sziasztok! Segítségre lenne szükségem.
A hibaüzenet:
Sketch mérete: 4 188 byte (maximálisan lehetséges: 30 720 byte)
avrdude: stk500_getsync(): not in sync: resp=0x00

Az STK500 rá van kötve az Arduinora ICSP csatin. A bootloadert rátudtam tenni az Atmega328P-PU ra, de már a progi nem megy fel.
(#) kiborg válasza zombee hozzászólására (») Dec 28, 2013 /
 
Ebben igazad van.
(#) rolandgw válasza kiborg hozzászólására (») Dec 28, 2013 /
 
Hasonlít,de hibás,éppen a kiragadott részlet miatt. Ebben azért jussunk közös nevezőre
(#) kiborg válasza rolandgw hozzászólására (») Dec 28, 2013 /
 
Hibásnak semmiképpen nem hibás. Lehetne szebb is (zombee ajánlása alapján), de megfelelően működik.
Hogy ezt belásd, tedd meg a következő próbát:
Hozz létre 5 címkét egymás után és csak az 5. után írj egy nop-t. Ha diassemblerben visszanézed csak egy cím fog szerepelni valószínűleg, de ha programból BÁRMELYIK cimkére ugrasz, akkor az 5. címke utáni nop-re fog ugrani!
Lehet tesztelni szimulátorban.
  1. cimke_1:
  2. cimke_2:
  3. cimke_3:
  4. cimke_4:
  5. cimke_5:
  6.    nop
kb így gondoltam.
Az általam használt rész is pont ugyanígy működik.
Kiborg
(#) Koncsar hozzászólása Dec 28, 2013 /
 
Az STK500 at nem akarja látni a gépem, de, hogy miért van ez azt sajnos még nem látom. Tud valaki segíteni?
(#) rolandgw válasza kiborg hozzászólására (») Dec 28, 2013 /
 
Szerintem ezzel ne fárasszuk tovább a fórumozókat.Itt különálló megszakításokról van szó és pont az a lényeg mi van a disassembler-ben,tehát a példa nem jó !Márpedig a verziódnál megjelenik a felsorolt első megszakítás reti-vel lezárva és ennyi
(#) kiborg válasza Koncsar hozzászólására (») Dec 28, 2013 /
 
Nem igazán ismerem az ARDuino-t, de ha van rajta bootloader,akkor a programot már nem sorosan kell rátölteni ? (STK500 nélkül)

rolandgw Szerintem se fárasszuk egymást. Kipróbáltad szimulátorban a példámat? Ha igen, akkor rájöhettél, hogy miért mondom amit mondok.
Idézet:
"zombee": Szerintem azért nem lesz meg a többi címke, mert az ÖSSZES címke ugyanoda mutat, arra az egy szerencsétlen "reti"-re. Ugyanis a címke az nem része a programkódnak, csak egy szimbólum amit a fordító egy valós cím-re fordít le.
Illetve példámnál maradva a nop-ra. Számomra így megfelel, téma lezárva.
(#) TavIR-AVR válasza Koncsar hozzászólására (») Dec 28, 2013 /
 
Melyik STK500?
Doper? MKII, EverTool, Tuxgraphics, USBASP vagy eredeti gyári Atmel STK500?
(#) TavIR-AVR válasza Koncsar hozzászólására (») Dec 28, 2013 /
 
Az Arduino fórumban is feltetted a kérdést. A válasz ott van.
(#) Koncsar válasza TavIR-AVR hozzászólására (») Dec 28, 2013 /
 
Tavír-os USB-s, zöld.
A hozzászólás módosítva: Dec 28, 2013
(#) TavIR-AVR válasza Koncsar hozzászólására (») Dec 28, 2013 /
 
Az a TuxGraphics-os. Csak FT232RL chippel szerelt.
Azzal megy.
(#) Koncsar hozzászólása Dec 28, 2013 /
 
Még szeretnék pár infót kérni az Atmega328p-Pu és az ICSP bekötésére, lábkiosztására, mely lábakat kell kivezetnem a tüskék felé. Valakinek van egy linkje, rajza ossza meg velem. Köszi.
(#) TavIR-AVR válasza Koncsar hozzászólására (») Dec 28, 2013 /
 
Mire akarod használni?

Külső programozófoglalat?
Tipp: Arduino kapcsolási rajz.

Programozáshoz kell:
- MOSI/MISO/SCK/RESET/VCC/GND
- GND, Vcc közé 100nF
- Aref és GND közé 100nF
- Vcc és VccA ill GND és GNDA összekötendő,
- xtal1/xtal2 közé kvarc (1...16 MHz tetszőleges) és az adatlap alapján a 2 db 12..33pF kondi
- reset és Vcc közé 4k7...10k,
- reset és gnd közé 100nF,
- és vagy önálló táp, vagy mehet a programozó felől is
(#) fifadani hozzászólása Dec 29, 2013 /
 
Sziasztok!
Feszültségmérőt készítek a tápomhoz.
32,7 a max fesz amit a táp tud.
Ezt osztottam 10k-val és egy 10k-s trimmerrel.
Beállítottam 5V-ot, trimmer középső lábán 500mV van.

Ezzel a kóddal mérek:
  1. void inits(void) //alapvető beállítások
  2. {  
  3.         DDRD = (1<<PD0); //PD0 ki
  4.         DDRC &= ~(1<<PC5); //PC5 be
  5.         PORTB = (1<<PB0);
  6.         PORTC = 0b00000000;
  7. }
  8.  
  9.  
  10. void ADCkonfig8bit()
  11. {
  12.         ADMUX |= (1<<REFS0) | (1<<ADLAR);       // Vcc belso mint referencia, balra rendezett
  13.     ADCSRA |= (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
  14.         // ADC engedelyezese, ADC eloosztas = 128 (125 KHz)
  15. }
  16.  
  17. unsigned char ADCbeolvas8bit(unsigned char csatorna)
  18. {
  19.         ADMUX = (ADMUX & 0b11110000) | csatorna;   // ADC csatorna kivalasztasa
  20.         ADCSRA |= (1<<ADSC);    // ADC konverzio elinditasa
  21.         while (ADCSRA & (1<<ADSC));    // varas az atalakitasra
  22.         ADCSRA |= (1<<ADSC);         // konverzió elindítás
  23.         while (ADCSRA & (1<<ADSC));    // varas az atalakitasra
  24.         return (ADCH);
  25.         // ADC ertek visszaadasa
  26. }
  27.  
  28.  
  29. volatile unsigned char ADCmeres;
  30. float osztas,ADCfesz,Aref;
  31.  
  32. int main()
  33. {
  34.  
  35. inits();
  36. ADCkonfig8bit();
  37. ADCmeres = 0;
  38.     ADCfesz = 0;
  39.         Aref=4.68;
  40.         osztas=Aref/254;
  41.  
  42.         while(1)
  43.         {
  44.         ADCmeres = ADCbeolvas8bit(5);
  45.         ADCfesz = ADCmeres*osztas;
  46.         ADCfesz=ADCfesz*100;
  47.         DebugInit();
  48.         DebugClear();
  49.  
  50.         if(ADCfesz>100)
  51.         {
  52.         DebugSendStr("V: ");
  53.         DebugSendU8_1(ADCfesz);
  54.         }
  55.  
  56.         else
  57.         {
  58.         DebugSendStr("V: ");
  59.         DebugSendU8_2(ADCfesz);
  60.         }
  61.  
  62.        
  63.        
  64.         DebugNL();
  65.         m_delay_10ms(7);
  66.         }


Szépen írja is a kijelzőre, hogy 5V stbstb.
De amint közelítek a max Uki-hez, vagy a min Uki-hez a tápon, a mérés elkezd pontatlanná válni.
S a pontatlanság növekszik ahogy közeledem a szélsőértékekhez...
(egyébként Atmega8 @16Mhz)

Mit rontottam el?
(#) zombee válasza fifadani hozzászólására (») Dec 29, 2013 /
 
Kérdés hogy a "közel a határhoz" az mennyire van közel, mi van ilyenkor az osztó kimenetén.
(#) fifadani hozzászólása Dec 30, 2013 /
 
Szia!
Nos, megcsináltam a méréseket:
Ube (táp), Utr (trimmer), Um (avr-el mért fesz)

Ube: 5,06V Utr: 0,509V Um: 4,95V
Ube: 2,57V Utr: 0,259V Um: 2,38V
Ube: 1,03V Utr: 0,104V Um: 0,91V
Ube: 0,514V Utr: 0,049V Um: 0,36V

5V-tól mentem lefelé. Felfelé kicsit nagyobb léptékekkel.

Ube: 10,00V Utr: 1,00V Um: 9,91V
Ube: 14,95V Utr: 1,50V Um: 14,8V
Ube: 19,95V Utr: 2,00V Um: 19,8V
Ube: 24,95V Utr: 2,51V Um: 24,9V
Ube: 29,99V Utr: 3,00V Um: 29,9V
Ube: 32,42V Utr: 3,25V Um: 32,4V

A tápból "kijövő" feszt egy maxwell-el mértem, szóval én azt veszem valódinak.
Picit tévedtem, mert a max érték felé közeledve "pontos" az avr. A rizikós rész a 10V és környéke.
Az alsó tájékot kellene pontosítanom. 8 bites ADC van jelenleg. 4,68V van az Aref lábon, ezt osztom 255-el, 18,3mV-os pontosság. Jól gondolom?
Mit kellene másként csinálnom?
A hozzászólás módosítva: Dec 30, 2013
(#) Koncsar hozzászólása Dec 30, 2013 /
 
Sziasztok! Atmega328P-PU nál , ha már arduinón kívűl használom egy kapcsolásban, akkor mind a 2 db GND ot be kell kötnöm (GND, AGND)? Meg még van a VCC és az AVCC . Ezek legyenek mindíg összekötve? Még egy kérdés, hogy az arduino2009 miért használ LM358 at, amikor ott van mellette a 7805 stab IC. Köszönöm.
(#) fakóló hozzászólása Dec 30, 2013 /
 
Sziasztok! Segítséget kérnék egy atmega 162 felprogramozásában. Minipro programmal és programozó eszközzel csinálnám, meg van az atmega eeprom és fw tartalom is, viszont a programnál olyat választhatok a "buff select"-nél, hogy "code memo" és "data memo". A data memo az eeprom (az az a flash tartalom lenne)? A code memo pedig az fw tartalom lenne?
Válaszokat előre is köszönöm.
(#) Massawa hozzászólása Dec 30, 2013 /
 
Hol találok egy 8bites LCD meghajtot aktiv busy flaggal?

4 bitesem van.

Kösz
(#) kiborg válasza fifadani hozzászólására (») Dec 31, 2013 /
 
Szia!
Az ADC minden esetben 10 bites. De valószínűleg te akkor csak a felső 8 bitet veszed figyelembe.(a felbontás növelésével lehet növelni a pontosságot)
A/D-nél alapszabály, hogy minimum 1 bitnyi pontatlansága lehet! Nálad ez már 18 mV ami már erősen összemérhető a bemeneti feszültségeddel 49mV-al. Itt már egy bitnyi eltérés is viszonylag nagy eltérést okoz.
Az AVCC-t megfelelően szűrted(LC szűrés)? Külső vagy belső referenciát használsz? Az AD átalakítás idejére le lehet állítani az MCU-t, így a többi részegységek nem zavarják az AD átalakítót.(ADC Niose Canceler)
Egyébként a legkisebb bit értéke 4,57mV, csak ez nem megfelelő szűrés esetén hajlamos ugrálni, neked meg kellene, mert elég nagy tartományt akarsz mérni.
Üdv Kiborg
(#) fifadani hozzászólása Dec 31, 2013 /
 
Külső referenciát használok, ami 4,68V.
(#) kiborg válasza fifadani hozzászólására (») Dec 31, 2013 /
 
Használd a válasz gombot !!!

Annak a tápfeszültsége kellően szűrve van? És a többiről infó ?
Kiborg
A hozzászólás módosítva: Dec 31, 2013
(#) fifadani válasza kiborg hozzászólására (») Dec 31, 2013 /
 
Aref szűrve van. Közvetlenül a lábnál, van egy 100nF-os kondi.
Vcc szűrve, szintén 100nF-al.
A hozzászólás módosítva: Dec 31, 2013
(#) kiborg válasza fifadani hozzászólására (») Dec 31, 2013 /
 
Biztos, hogy elég? Soros 100uH induktivitás és utána a 100nF szűrés.
Ha ez nem elég, akkor marad az ADC Noise Canceler.
(#) csabeszq válasza fifadani hozzászólására (») Jan 1, 2014 / 2
 
A feszültségmérés az igencsak kemény dolog AVR alatt. Nálam a 6. próbálkozásra sikerült odáig eljutnom, hogy rendesen mérjen (ne +/- 1.5V pontossággal). Mutatja a min-maxot, felismeri a négyszögjelet, a szinuszt, méri a frekvenciát, kitöltési tényezőt négyszögjelnél és képes átlag/effektívértéket számolni +- 40V között. Minél kisebb a feszültség, annál pontosabb.

Megosztom a tapasztalataimat:

- Ha +/- 32V-ot mérsz, akkor 0.0625V egy osztás. Az ADC a legjobb esetben is 3 kvantumot ugrál, szóval máris 0.2V-nál jársz, ami valljuk be elég durva. A 4.8V és az 5V nem ugyanaz.
- Arduino-n lehet feszültséget mérni, de a kimeneteket ne váltogasd menet közben, mert a VCC és az AVCC össze van kötve, tehát a digitális zaj azonnal megjelenik az analóg eszközökön. A végleges nem Arduinos megoldásnál le lesz az AVCC aluláteresztő szűrővel választva.
- Külső referenciát érdemes használni a tápfesz helyett, ez nálam 2.5V
- Az ADC bemeneti ellenállása 10k körüli értékre lett optimaliálva, ami valljuk be feszültségmérésre alkalmatlan, ezért erősítened kell.

Hogyan csináltam én?
- 2.5V-os referencia előállítása: MCP1525 IC segítségével
- ezt ellenállásosztóval osztom 2-vel (az lesz a nulla pontod)
- műveleti erősítővel erősíted a referenciát és a nulla pontod (ami 1.25V). (MCP6024-es műveleti erősítő, 10MHz, 10 Gohm bemeneti ellenállás, rail-to-rail).
- LM324 közelébe ne nézz, a valaha készített legzajosabb műveleti erősítő, ADC-re alkalmatlan

Feszültség mérése:
- Két ellenállásos osztó 330k / 10k (1%) ref/2-re - ez 33-mal osztja a bemenő feszültséget
- MCP6S26 SPI-n programozható erősítésű műveleti erősítő, képes 1x, 2x, 4x, 5x, 8x, 10x, 16x, 32x szorzásra, de nálam breadboardon 8x volt elérhető, ami még pontos, a 10x nálam már időnként mellészámolt
- ez ugyanúgy 10Gohm/10MHz/R2R, 6 programból állítható csatornája van
- a 2.5V-ra meg az 1.25V-ra azért kellett műveleti erősítő, mert az MCP6S26 megköveteli a 0.1 ohmos ellenállást VREF-re

Amikor mérek, akkor az 1x-szel kezdem a mérést, ha a jel kicsi 1s-en át, akkor beállítom hogy szorozzon 1x, 2x, 4x, 8x-szel.

Nézz utána, mert az oszcilloszkópokban az MCP6S26-ot használnak.
Lehet, hogy elsőre brutális amit leírtam, de legalább megy.

Hidd el, szívtam eleget az ADC-vel, ez volt az első sikeres próbálkozásom, ami nem csinálta orrba-szájba a zajt.
A hozzászólás módosítva: Jan 1, 2014
(#) zombee válasza csabeszq hozzászólására (») Jan 1, 2014 /
 
Átlagolás is volt? Egyébként butaság a 100nF, szerintem egy ilyenhez nagyon kevés! Én minimum 1µF-t használok a szűrésnél. Az AVCC-re kell a táp szűrés(100-220uH tekercs és 1-10µF kondi), az AREF-re CSAK kondi kell, oda 100-220nF. Az AREF-re NE köss tápot! Mikor beállítod a referenciát, várni kell míg a kondi is felveszi az értéket. Én általában a 2.56V-os referenciát használom.
ÉS ÁTLAGOLOK!!!
A hozzászólás módosítva: Jan 1, 2014
(#) csabeszq válasza zombee hozzászólására (») Jan 1, 2014 /
 
Átlagolni nem tudsz min-max számításnál. Az effektívértéket és az átlagértéket az áramkör zaja nem zavarja túlzottan.

Rengeteget szívtam azzal, hogy a multiméter kiírta, hogy 4.7V magas, tehát minden rendben. Akkor miért nem megy?

Az, hogy 4.7V nem jelent semmit, mert mi van ha 1-2ms-re leesik a feszültség 2.2V-ra, ami már alacsony. Ezért van szükségem rendes min-max számításra. Mettől-meddig és milyen.

Emellett kirajzolom az LCD-re 3 karakteren (15x8 pont) a jel változó részét (miniszkóp).

Az LM324 átlagban rendesen mért, de a zaj rajta 20-30 fokozat simán megvolt. Amikor min-maxot mértem, akkor simán mellélőtt, de a torzítása is brutális. Mérsz 17V-ot, megfordítod a vezetéket és -15.8 lesz.

Most jutottam el addig, hogy minden egyes mintavétel tökéletes, ezzel a megoldással. Nyilván nem olcsó, a felsorolt IC-k összesen 1300 Ft-ba kerültek, de megy.
A hozzászólás módosítva: Jan 1, 2014
Következő: »»   579 / 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