Fórum témák
» Több friss téma |
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
Szia ezt interruptal szokás csinálni. Van egy egyszerű programom Slave receiver - ként működik, bár ez ATmega8 - ra íródott. A Slave adresst 255-re inkább ne állítsd.
A hozzászólás módosítva: Máj 24, 2015
Meglepne, hogy működne.
Már csak azért is, mert egy darab ACK-ot nem küld vissza. Van esély, hogy elsőre talán lefut, de valószínűsítem, hogy másodikra nem fog.
Pedig nekem működött gond nélkül...
TWEA bit be van kapcsolva szóval az ACK biteket visszaküldi A hozzászólás módosítva: Máj 24, 2015
Interruptba várakozást nem raknék, nálad 2 is van. Valahogy máshogy kellene megoldani.
A baj meg mindig az, hogy egy motor 0 aramat, illetve egy felso limitet kell detektalni. Ehhez az egvilagon semmi nem kell, csak a megfelelo ellenallassal lezart aramvalto kimenetet be kell vezetni az A/D-ba es software-esen merni. Feleslegesen bonyolodik az aramkor, de ettol meg a software nem lesz egyszerubb a kerdezo szintjen.
Hát azért kicsi a 100nF
![]() Az első ábra 100nF-os a második 5µF-os kondival modellezve készült. A kék görbe az RC előtti feszültség (bár ezt gyanítom kitaláltad volna magad is ![]()
Megnéztem, már a megszakítás sem jön létre. (Vagy nem tudom, hogy kéne kifejezni, nem fut bele a megszakításba?)
Masterként is AVR-t használsz?
Akkor történik megszakítás ha engedélyezed azt, illetve a Slave megkapja a slave adresst.
Jó hogy szólsz, kapkodtam és kihagytam a kódból a sei() parancsot
![]()
Sziaszok! Valaki ellenőrizné, hogy helyes-e ez a kód?
Atmega 8 mikrovezérlővel szeretnék egy olyan vezérlést készíteni, hogy ADC0-n mér feszültséget, (ellenállásosztóval 30V esetén 5V ot kap) ha eléri 27.9 V-ot akkor PB2-t bekapcsolja 5 másodpercre, utánna bekapcsolja PB1-et. Ha feszültség leesik 24V alá akkor pedig lekapcsolja PB1-et.
Szia! A 30.sor "voltage=(adc*30)/30;" résznek nem látom az értelmét. A 38.sorban ha 0-t vagyolsz az 1-re az 1 marad. Használd a PORTB&=~(0b00000100)-t, ezzel egy-egy bitet is ki tudsz kapcsolni könnyen(vagy hagyd el a | jelet). Ez igaz a 44.sorra is. A ReadADC() is gyanús, de ezt fejből nem tudom, majd a többiek kijavítják, ha kell.
A hozzászólás módosítva: Máj 25, 2015
Köszönöm. Most talán el tudok indulni, megvan az irány. A részleteket úgyis nekem kell finomhangolnom.
Mindenkinek köszönöm a segítséget, még biztosan fogok kérdezni, amint elakadok.
Jajj igen tényleg a "vagyolásnál" tényleg hiba van. A 30. sornak az a szerepe, hogy az ADC értéket átalakítja feszültséggé. Az ADC bemeneten egy feszültségosztó lesz, és 30-0V feszültségtartományban kap áramot, a feszültségosztó pedig arra kell, hogy 0-5V közötti feszültségtartományt kapjon az MCU. A képletet rosszúl írtam így volna helyes "voltage=(adc*30)/255" Tehát 5V ra az adc érték 255, és az 30V nak felel meg a feszültségosztó előtt. A reléket a feszültségosztó előtti feszültség alapján kell kapcsolja.
Az osztast amennyibol lehet erdemes kerulni, eleg idoigenyes tud lenni. Ebben az esetben az osztast fel lehet kerekiteni 256-ra, ami jobbra-tolast jelet 8-al.
Köszönöm szépen az eddigi hozzászólásotokat.
Bővebben: Link Elvi működés: Alap esetben a program kiirja az LCD-re az aktuális hőmérséklet és páratartalom értékeket. PIND5 első lenyomására az LCD-n megjelenik "Adatgyujtes..." felirat, majd elindul a mintavételezés, UART adatgyűjtés. PIND5 újbóli lenyomására kilépünk az adatgyűjtésből és visszatérünk a kiinduláshoz. Az adatgyűjtés inditásával van a probléma. Van, hogy elsőre, de jellemzően 5. 8. alkalomra sikerül csak elindítani az adatgyűjtést. Az elindítási próbálkozások során 0. sorszámot küldi el UART-on 5x-8x mindaddig amíg el nem sikerül "kapni" a helyes időpillanatot. Ettől kezdve már rendesen megy az adatgyűjtés. Meg tudnátok mondani mitől van ez?
A pergesmetesites rosszul van megoldva. Igy 30mS-nal rovidebb ideig kene lenyomva tartsd a gombot, h jol mukodjon. Legegyszerubben ugy tudod kiegesziteni, hogy a gomb lenyomasa utan teszel egy ciklust amig nyomva tartod a gombot.
Idézet: Feszultsegtartomanyban áramot??? Feszulteg vagy aram?„30-0V feszültségtartományban kap áramot” Idézet: Így sem helyes, mert a voltage valtozod sosem lesz 27.9, mivel a fenti muveletnek az eredmenye mindig egesz szam lesz. Szerintem te ezt akartad irni: voltage = (adc * 30.0) / 255. De egyebkent semmi ertelme lebegopontos szamitassal kinozni a mikrokontrollert. Ezt ugynevezett fixpontos aritmetikaval illik megoldani, megpedig igy:„így volna helyes "voltage=(adc*30)/255"”
Igy a voltage erteke 0-300 kozott lesz, ahol pl. a 21.4V a 214-es ertek. Idézet: Azon felul az egesz "voltage =" reszre semmi szukseg, mert az ADC erteket egybol 8 bites ertekekkel lehethe osszehasonlitani. Tehet pl:„Az osztast amennyibol lehet erdemes kerulni, eleg idoigenyes tud lenni. Ebben az esetben az osztast fel lehet kerekiteni 256-ra, ami jobbra-tolast jelet 8-al.”
A hozzászólás módosítva: Máj 26, 2015
A 8. sorban felulirja a 6. es 7. sorban beallitott MUX0 vagy MUX1 bitet.
ADMUX |= (1 << REFS0); akarna lenni. Vagy a harom sor sokkal egyszerubben: ADMUX = (ch == 0) ? (1 << MUX0) | (1 << REFS0) : (1 << MUX1) | (1 << REFS0);
Üdv!
A következőt szerettem volna elérni: A PC-ről egy USB-Soros átalakítón keresztül küldök adatot az AVRnek, ami a kapott adatokat egy mátrix-ba illeszti, majd a main()-ben elvégzem amit szeretnék és visszaküldöm UART-on a PC-nek. A mátrix egy-egy sorában az első 4 byte az PCtől jön, az 5.-dik byte az elvégzendő/elvégzett feladat azonosítására használom.
A gondom, hogy a fenti lebutított kódnak csak annyi lenne a feladata, hogy minden 4.-dik beérkezett byte után azokat visszaküldje, ám elcsúszva küldi vissza: Idézet: „sending: 0F 10 11 12 receiving: 0F 00 00 00 sending: 0F 13 14 15 receiving: 10 11 12 00 sending: 0F 16 17 18 receiving: 0F 11 12 00 sending: 0F 19 1A 1B receiving: 13 14 15 0F sending: 0F 1C 1D 1E receiving: 16 17 18 0F sending: 0F 1F 20 21 receiving: 0F 19 1A 0F sending: 0F 22 23 24 receiving: 1B 19 1A 0F sending: 0F 25 26 27 receiving: 0F 1C 1D 1E” Tanácstalan vagyok.
Sziasztok!
Nemrég rendeltem egy kis panelt egy atmega328-assal gyakorlásnak. Próbálkozok az AD beüzemelésével de valamiért nem működik, tudtok segíteni hogy mit rontottam el? A PORTD és PORTB-re ledeket kötöttem. A célom csupán annyi volt hogy a ledeken lássam a AD értékét, de ha az ADMUX-ban bármit állítok be, és az ADCn-lábakat bárhová is kötöm mindig világítanak a ledek (tehát PD=PB=0xff)
Az admux-nál a GND-t választod ki? MUX3..0 = 1111 ?
Van kondenzátor a referencia pin-en? Mérsz rajta feszültséget? És mi van az ADC-re akasztva? Egy poti? Melyik lábon? Ott is ellenőrizd le a feszültséget, hogy meg van-e. Az interrupt.h teljesen felesleges ide. A hozzászólás módosítva: Máj 28, 2015
Ha gnd-t választok akkor is azt csinálja (a fenti kódban pont az van).
Igen mértem rajta, mikor az AVc-re állítottam az Aref-et akkor 5V mikor a belső ref.fesz.-re akkor 1,1V volt az Aref lábon. Sajnos a kondenzátort nem tudom mert még nem silabizáltam ki a panelről, de megpróbálom kideríteni. Az ADC-re próbáltam a tápot rakni (amikor Aref=5V), vagy kettő vagy több ellenállással leosztott feszt raktam. Igen az csak ottmaradt egy másikból.
Szerintem a 13-14. sor értékadását a ciklusba kellene tenni mert így csak egyszer fut le, később hiába tekered a potit, nem adja át az értéket.
Egyelőre annak is örülnék ha a valós értéket akár egyszer is kiadná, de köszi az észrevételt
Próbáld ki free running módban, és adlar-t állítsd 1-re, és csak 8bit-es értéket olvass ki. Jó lábra van kötve a feszültség osztó, és jó lábat állítasz be az admux-nál? Én így csinálnám. Azt is írja az adatlap, hogy az első konverzió tovább is tart, meg néha el is szokták dobni. 1 mérés nem mérés.
Elvileg alapból abban működik mert hozzá se nyúltam a ADCSRB-hez. Átállítottam de semmi változás, csak a PD felső két bitje világít, tehát nincs változás, pedig ellenőriztem újra a lábakat, földre kötve is ugyan azokat adja ki a PD-re. Lehet a mikroC-m rossz...
![]()
Talán puskáz innen: ADC on Atmega328.
|
Bejelentkezés
Hirdetés |