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   635 / 837
(#) dokidoki válasza Amarton hozzászólására (») Dec 22, 2014 /
 
Hello.
Mielőtt HV-progizót építesz, érdemes külső oszcillátorral meghajtani, ha a külső kvarc nem lenne elég az induláshoz. OSC-in lábra 1-8Mhz külső jelforrást kapcsolni, mert lehet, hogy Ext-osct sikerült konfigurálni.
Ez még így mindig kevesebb meló, mint egy HV progizó, bár egy fusebit - doktor mindig jó ha van a házánál.
(#) Amarton válasza dokidoki hozzászólására (») Dec 22, 2014 /
 
Annak ellenére, hogy van rajta külső oszcillátor?
(#) dokidoki válasza Amarton hozzászólására (») Dec 22, 2014 /
 
Mármint kvarc? Mert azt önmagában nem rezgeti, akkor, ha ext-osc van beállítva, egyszerűen várja az órajelet. Az ext osc, és a külső kvarc közötti annyi a különbség, hogy utóbbinál van rezgéskeltő áramkör a konfigban, míg ext oszcillátornál nincsen.
ext osc, ext xt nem ugyanaz.
Ha tényleg külső oszcillátorral sem indul, akkor pasz, kell a fusebit doktor.
A hozzászólás módosítva: Dec 22, 2014
(#) Koleus válasza dokidoki hozzászólására (») Dec 22, 2014 /
 
Feltételezem,
Idézet:
„ha ext-osc van beállítva, egyszerűen várja az órajelet”
"External Clock"-ra gondoltál, ami CKSEL=0000.
Ext. Crystal/Resonator esetén megy a kvarc + 2x12-22pF kondi a GND-re.
(#) dokidoki válasza Koleus hozzászólására (») Dec 22, 2014 /
 
Igen, sajnos, most néztem meg az avr-studioban, mert mint kiderült félreérthetően fogalmaztam meg. Ott is így írják, ext. Crystal Osc alatt valójában csak a kvarcot értik a kondikkal. ext. clock meg külső órajel, amit valójában egyszerűbben külső oszcillátor kvarcal, mint jelforrás adhat.
(#) yoman917 hozzászólása Dec 23, 2014 /
 
Sziasztok

EEPROM-ba szeretnék kimenteni pár adatot két percenként. Ez megy gond nélkül, és a kiolvasás is, csak a 100.000-es írási limittel ez hamar elhasználja azt a pár cellát amiben vannak. Olvastam wear-leveling technikáról (ahol "vándoroltatják" a cellákat), de nem találtam számomra értelmezhető mintapéldákat. Ha valaki használja ezt a technikát, az tudna velem osztani egy mintakódot, amiben átlátom mit és hogy kéne? (Atmega328p)
(#) rasty hozzászólása Dec 26, 2014 /
 
Sziasztok.
A napokban építettem két avr égetőt: Bővebben: Link és Bővebben: Link
Mindegyiknél ugyan az a hiba: a céleszköz nem válaszol.
Szerintetek ez miért lehet, én már kezdek a számítógép lpt portjára gyanakodni.
(Operációs rendszer: Windows XP)
A válaszokat előre is köszönöm.
(#) IMi válasza rasty hozzászólására (») Dec 27, 2014 /
 
Szia!
Ugye kap tápot a cél az avr? Az első linken lévő égetőnek is kell táp!
(#) Kovidivi hozzászólása Dec 27, 2014 /
 
Sziasztok!
Bővebben: Link 1perc40-től van az első videóban egy forgó animáció a számok váltására. Mit gondoltok, hogyan lehetne ezt könnyen megoldani? Van egy tömb, ami 30 elemből áll, a 0. elem az első oszlopot jelenti, és így tovább. Ahogy módosítom a tömböt, az szinte azonnal kikerül a kijelzőre megszakításból, azzal nem kell törődni. Én arra gondoltam, hogy létre kell hozni ennek a forgó animációnak minden képkockáját, és azzal kell bitművelettel módosítani a tömböt, esetleg egy ideiglenes tömbben létrehozni a megfelelő képkockát, és bemásolni az eredeti helyére.
A másik kérdésem, hogy most delay-ekkel oldottam meg az animációjaimat, így olyankor semmi más nem történik. Ezt hogyan lehetne interrupt-tal megoldani? Két animációm van jelenleg, másodpercenként megtörténő, amikor a mp megváltozik, a másik pedig fix időnként átváltok időről hőmérsékletre. Ami zavar, pl. mikor a másodperc animálódik, akkor ha változik a perc, akkor megvárja az egész, amíg kész a másodperc animáció, majd vált a perc is. Köszönöm.
(#) killbill válasza Kovidivi hozzászólására (») Dec 27, 2014 /
 
Nem jo a link.
(#) Kovidivi válasza killbill hozzászólására (») Dec 27, 2014 /
 
Köszi. Bővebben: Link
(#) killbill válasza Kovidivi hozzászólására (») Dec 27, 2014 /
 
Hol van itt video? Itt csak ket kep van es 1-2 link, de videohoz egyiks sem visz. Pedig izgalmas tema lenne.
(#) Kovidivi válasza killbill hozzászólására (») Dec 27, 2014 /
 
Ez már jó lesz: link
(#) killbill válasza yoman917 hozzászólására (») Dec 28, 2014 /
 
Egy egyszeru modszer: Egy strukturaba szervezed adatkupacodat, amit ket percenkent el akarsz menteni. A strukturahoz hozzateszel meg egy szorszam mezot (24 bit) meg egy checksum mezot. Felosztod a rendelkezesre allo EEPROM teruletet n darab ilyen struktura tarolasara alkalmas reszre. Ahanyszor ki kell irni az adatokat, a szamlalot eggyel noveled, kiszamolod a checksum-ot, es kiirod az egesz strukturat a soron kovetkezo helyre az EEPROM-ban. Ha a vegere ertel az EEPROM-nak, akkor kezded az elejerol. Ettol ugye szetszorva van az adat az EEPROM-ban, egy-egy cellara kevesebb iras jut. Amikor szukseg van a legutolso adatra, akkor vegigmesz az EEPROM-on, es megkeresed a legnagyobb sorszamu, hibatlan checksum-u bejegyzest. A 24 bites szamlalo ~63 ev alatt fordul korbe. Meg lehet csinalni 8 vagy 16 bites szamlaloval is, de akkor az utolso bejegyzes megkeresese lenyegesen bonyolultabb. A cheksum-ot a strukturara szamolod beleertve a sorszamot is. A checksum maga lehet egy 8 bites CRC. Lehet mas check is, de a CRC eleg biztosnsagos es nem nehez szamolni.
(#) killbill válasza Kovidivi hozzászólására (») Dec 28, 2014 /
 
Idézet:
„A másik kérdésem, hogy most delay-ekkel oldottam meg az animációjaimat, így olyankor semmi más nem történik. Ezt hogyan lehetne interrupt-tal megoldani?”
Ezt nem interrupttal kellene megoldani, mert az nem erre valo. De ha azzal is oldod meg, a megoldas kulcsa mindenkeppen a state machine-ben van, amit állapotgépnek is hivnak. Ennek az a lenyege, hogy pl. a te esetedben tarolod, hogy az animacioban eppen hol tartasz. Ahanyszor meghivod a state machine fuggvenyt, az mindig tudja, hogy eppen most mit kell csinalnia, es mindig valtoztatja a sajat allapotat a kovetkezo lepesre. Magat a fuggvenyt csak x idonkent hivod meg, praktikusan az animacio sebessegenek megfeleloen. Ha tobb ilyen allapotleirod is van, akkor ezzel tudsz egyszerre tobb animaciot is csinalni. Maga a fuggveny gyorsan lefut, nincs benne semmifele delay.

A korbeanimaciot en ugy oldanam meg, hogy letarolnam egy tombben a pixelek 5x7 matrixon beluli koordinatait olyan sorrendben, ahogy modositani akarom oket. Tehat bal felso saroktol indulva lefele, aztan kanyarodik jobbra, majd fel, aztan balra, egy sorral beljebb lefele, stb. Tehat azt a csigavonalat. Azert tarolnam le, mert egyszerubb letarolni, mint menet kozben kiszamolni. Meg ezzel a modszerrel akarmilyen utvonalat is bejarhat az animaciod, csak a tablazat hatarozza meg, a programot nem kell modositani.

Szoval az allapotgep meg minden meghivasnal a soron kovetkezo pixel erteket az uj szamjegynek megfeleloen ki- ill bekapcsolna. Az allapotgep strukturajaba meg tarolni kell, hogy:
- a kijelzon melyik karaktert animalod (0..5)
- mi az uj karakter, amit ki kell irni
- a tablazat cimet, ami az animacio utvonalat mutatja
- hanyadik pixelnel tartunk az animacioban.

Igy ugyanazzal a fuggvennyel egyszerre tobb karaktert is tudsz animalni, akar kulonbozo modon, csak tobb allapotleiro struktura kell hozza. Elsore talan bonyolultnak tunik, de nem az.
(#) rolandgw válasza Kovidivi hozzászólására (») Dec 28, 2014 /
 
HC595/4953-al van megoldva az interfész ? Van valahol kapcsolási rajz is ?
(#) Kovidivi válasza rolandgw hozzászólására (») Dec 28, 2014 /
 
Szia. Van egy LED mátrix téma, nemrég nyílt egy, ott fent van minden dokumentáció! Ha nem találod, szólj! Egyébként igen, 595tel van megoldva a kijelző meghajtás.
(#) fifadani hozzászólása Dec 29, 2014 /
 
Sziasztok!
Kérhetnék egy pici segítséget?
Írtam egy hőmérő programot, LM35DZ-vel.
Szépen működik is viszont, amikor nől vagy csökken a hőmérséklet, akkor az egyesek helyiértékén a szám villogva vált.
Ezt valamilyen átlagszámítással tudom kiküszöbölni? De ha átlagot számolok, akkor a kijelzésbe nem fog bezavarni?

Ez lenne a kód.
  1. //LM35, m8 @16MHz ,homero v1.0
  2.  
  3. #include <avr/io.h>
  4. #include <util/delay.h>
  5. #include <avr/interrupt.h>
  6. #define F_CPU 16000000UL
  7.  
  8. void init(void)
  9. {
  10.  
  11.         DDRD = 0b11111111; //PD kimenet
  12.         DDRB = 0b00000011; //PB0,1 kimenet, tobbi bemenet
  13.         DDRC = 0b11111110; //PC0 bemenet, tobbi kimenet
  14.  
  15. }
  16.  
  17. void Konfig8bitADC()    // ADC konfiguralas (beallitas)
  18. {
  19.  
  20.     ADMUX |= (1<<ADLAR) | (1<<REFS0);    // Vcc mint referencia, balra rendezett ADC eredmeny
  21.     ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);  // ADC engedelyezese, ADC eloosztas = 8 (125 KHz), ADC megszakitas
  22.  
  23. }
  24.  
  25. unsigned char Beolvas8bitADC(unsigned char csatorna)
  26. {
  27.  
  28. ADMUX = (ADMUX & 0b11110000) | csatorna;   // ADC csatornat kivalasztom
  29. ADCSRA |= (1<<ADSC);    // ADC elinditasa
  30. while (ADCSRA & (1<<ADSC));    // varas az atalakitasra
  31. ADCSRA |= (1<<ADSC);         // ADC inditas
  32. while (ADCSRA & (1<<ADSC));    // varas az atalakitasra
  33. return (ADCH);     // ADC ertek visszaadasa (csak a felso 8 bit (ADCH), az also 2 zajos bit elhagyasa)
  34.  
  35. }
  36.  
  37. int szam,i;
  38. volatile unsigned int ADCmeres,hom;
  39.  
  40. int main(void)
  41. {
  42.        
  43.         init();
  44.         Konfig8bitADC();
  45.  
  46.         while(1)
  47.         {
  48.        
  49.         ADCmeres = Beolvas8bitADC(0);
  50.  
  51.         hom = ADCmeres/5;
  52.        
  53.         //ADC*2 mert, LM35 1 fok C = 10mV. ADC felbontasa kb 20mV.
  54.         //Ezert ADC erteket 2vel szorozni kell, Mivel 10es erositest alkalmazok,
  55.         //osztani kell 10-el. *2/10 az ugyanaz mint ha osztanek 5el.
  56.        
  57.         PORTB = (1<<PB0);
  58.  
  59.         PORTD = (hom%10<<PD0);
  60.  
  61.         _delay_ms(5);
  62.  
  63.         PORTB = (1<<PB1);
  64.  
  65.         PORTD = (hom/10<<PD0);
  66.  
  67.         _delay_ms(5);
  68. }
  69.  
  70. return 0;
  71. }
(#) fifadani hozzászólása Dec 29, 2014 /
 
Ha a Timer0_ovf-be rakom a kijelzést...
Amikor az túlcsordul, akkor 16Mhz / 1024-es osztással, akkor ki rakom a kijelzőre a számokat.
Így az a baj, hogy nem halandó csak az első mérés eredményét kijelezni.
Hmm valamit nagyon megbonyolítok.
(#) fifadani hozzászólása Dec 29, 2014 /
 
Jajj de buta vagyok.
Már értem.
Na szóval, a kijelzést rakam a fő programba.
A mérés meg megy ISR-ben. Ha a timer0 255-nél tovább csordul, akkor mér az ADC.
Ez így megint gyors változást jelentene. Azt mondom az ISR-ben, hogy ha a timer0 túlcsordul, akkor egy változóhoz adjon hozzá 1et. Ha a változó értéke nagyobb mint 61, akkor mér ADC-t majd nullázza a változót.
(16Mhz/1024/255 = 61Hz)
Szóval, ha jól gondolom akkor most 1 másodpercenként mérek ugye?


  1. //LM35, m8 @16MHz ,homero v1.0
  2.  
  3. #include <avr/io.h>
  4. #include <util/delay.h>
  5. #include <avr/interrupt.h>
  6. #define F_CPU 16000000UL
  7.  
  8.  
  9. void m_delay_10ms(unsigned int val)
  10.         {
  11.                 unsigned int j;
  12.  
  13.                 for(j=0;j<val;j++)
  14.                 {
  15.                 _delay_ms(10);
  16.                 }
  17.         }
  18.  
  19.  
  20. void init(void)
  21. {
  22.  
  23.         DDRD = 0b11111111; //PD kimenet
  24.         DDRB = 0b00000011; //PB0,1 kimenet, tobbi bemenet
  25.         DDRC = 0b11111110; //PC0 bemenet, tobbi kimenet
  26.  
  27.         TIMSK=(1<<TOIE0); //timer0
  28.         TCNT0=0; //timer0 erteke 0;
  29.         TCCR0 = (1<<CS02) | (1<<CS00); //1024es osztassal orajel a timer0nak
  30.  
  31.         sei();
  32.  
  33. }
  34.  
  35. void Konfig8bitADC()    // ADC konfiguralas (beallitas)
  36. {
  37.  
  38.     ADMUX |= (1<<ADLAR) | (1<<REFS0);    // Vcc mint referencia, balra rendezett ADC eredmeny
  39.     ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);  // ADC engedelyezese, ADC eloosztas = 8 (125 KHz), ADC megszakitas
  40.  
  41. }
  42.  
  43. unsigned char Beolvas8bitADC(unsigned char csatorna)
  44. {
  45.  
  46. ADMUX = (ADMUX & 0b11110000) | csatorna;   // ADC csatornat kivalasztom
  47. ADCSRA |= (1<<ADSC);    // ADC elinditasa
  48. while (ADCSRA & (1<<ADSC));    // varas az atalakitasra
  49. ADCSRA |= (1<<ADSC);         // ADC inditas
  50. while (ADCSRA & (1<<ADSC));    // varas az atalakitasra
  51. return (ADCH);     // ADC ertek visszaadasa (csak a felso 8 bit (ADCH), az also 2 zajos bit elhagyasa)
  52.  
  53.  
  54.  
  55. }
  56.  
  57. int szam,i;
  58. volatile unsigned int ADCmeres,hom, count;
  59.  
  60.  
  61. ISR(TIMER0_OVF_vect)
  62. {
  63.         count++;
  64.         if(count==61)
  65.         {
  66.         ADCmeres = Beolvas8bitADC(0);
  67.  
  68.         hom = ADCmeres/5;
  69.         count=0;
  70.         }
  71. }
  72.  
  73.  
  74.  
  75. int main(void)
  76. {
  77.        
  78.         init();
  79.         Konfig8bitADC();
  80.  
  81.    
  82.        
  83.         while(1)
  84.         {
  85.        
  86.  
  87.         PORTB = (1<<PB0);
  88.         PORTD = (hom%10<<PD0);
  89.  
  90.         _delay_ms(10);
  91.  
  92.  
  93.         PORTB = (1<<PB1);
  94.  
  95.         PORTD = (hom/10<<PD0);
  96.  
  97.         _delay_ms(10);
  98.  
  99.  
  100.  
  101.  
  102.         //ADC*2 mert, LM35 1 fok C = 10mV. ADC felbontasa kb 20mV.
  103.         //Ezert ADC erteket 2vel szorozni kell, Mivel 10es erositest alkalmazok,
  104.         //osztani kell 10-el. *2/10 az ugyanaz mint ha osztanek 5el.
  105.  
  106.         }
  107.  
  108. return 0;
  109. }
A hozzászólás módosítva: Dec 29, 2014
(#) kapu48 válasza fifadani hozzászólására (») Dec 29, 2014 / 1
 
Én ennyit javítanák a munkádon:
  1. //LM35, m8 @16MHz ,homero v1.0, ATMEGA64
  2.  
  3. #include <avr/io.h>
  4. #include <util/delay.h>
  5. #include <avr/interrupt.h>
  6. #define F_CPU 16000000UL
  7.  
  8. /*
  9. void m_delay_10ms(unsigned int val)
  10. {
  11.         unsigned int j;
  12.        
  13.         for(j=0;j<val;j++)
  14.         {
  15.                 _delay_ms(10);
  16.         }
  17. }
  18. */
  19.  
  20. void init(void)
  21. {
  22.        
  23.         DDRD = 0b11111111; //PD kimenet
  24.         DDRB = 0b00000011; //PB0,1 kimenet, tobbi bemenet
  25.         DDRC = 0b11111110; //PC0 bemenet, tobbi kimenet
  26.        
  27.         TIMSK=(1<<TOIE0); //timer0
  28.         TCNT0=0; //timer0 erteke 0;
  29.         TCCR0 = (1<<CS02) | (1<<CS00); //1024es osztassal orajel a timer0nak
  30.        
  31.         sei();
  32.        
  33. }
  34.  
  35. void Konfig8bitADC()    // ADC konfiguralas (beallitas)
  36. {
  37.        
  38.         ADMUX |= (1<<ADLAR) | (1<<REFS0);    // Vcc mint referencia, balra rendezett ADC eredmeny
  39.         ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);  // ADC engedelyezese, ADC eloosztas = 8 (125 KHz), ADC megszakitas
  40.        
  41. }
  42.  
  43. unsigned char Beolvas8bitADC(unsigned char csatorna)
  44. {
  45.        
  46.         ADMUX = (ADMUX & 0b11110000) | csatorna;   // ADC csatornat kivalasztom
  47.         ADCSRA |= (1<<ADSC);    // ADC elinditasa
  48.         while (ADCSRA & (1<<ADSC));    // varas az atalakitasra
  49.         ADCSRA |= (1<<ADSC);         // ADC inditas
  50.         while (ADCSRA & (1<<ADSC));    // varas az atalakitasra
  51.         return (ADCH);     // ADC ertek visszaadasa (csak a felso 8 bit (ADCH), az also 2 zajos bit elhagyasa)
  52.        
  53.        
  54.        
  55. }
  56.  
  57. int szam,i;
  58. volatile unsigned int ADCmeres,hom, count, count2;
  59.  
  60.  
  61. ISR(TIMER0_OVF_vect)
  62. {
  63.         count++;
  64.         count2++;
  65. }
  66.  
  67.  
  68.  
  69. int main(void)
  70. {
  71.        
  72.         init();
  73.         Konfig8bitADC();
  74.        
  75.        
  76.        
  77.         while(1)
  78.         {
  79.                
  80.         if(count2==30000)       // // Igy közben másra is használhatod a Proci időt!
  81.         {              
  82.                 PORTB = (1<<PB0);
  83.                 PORTD = (hom%10<<PD0);
  84.                
  85.         //      _delay_ms(10); //A várakozás helyet inkább ídőzitést ajánlok!
  86.         }      
  87.        
  88.         if(count>=61)   // Ez a mérési folyamat túl hosszú, hogy INT-be rakd!
  89.         {
  90.                 ADCmeres = Beolvas8bitADC(0);
  91.                
  92.                 hom = ADCmeres/5;
  93.                 count=0;
  94.         }
  95.        
  96.         if(count2>=60000)       // Ezt a számlálót állisdbe a te izlésed szerint.
  97.         {                      
  98.                 PORTB = (1<<PB1);
  99.                 PORTD = (hom/10<<PD0);
  100.                 count2=0;
  101.         //      _delay_ms(10); 
  102.         }              
  103.                
  104.                
  105.                
  106.                 //ADC*2 mert, LM35 1 fok C = 10mV. ADC felbontasa kb 20mV.
  107.                 //Ezert ADC erteket 2vel szorozni kell, Mivel 10es erositest alkalmazok,
  108.                 //osztani kell 10-el. *2/10 az ugyanaz mint ha osztanek 5el.
  109.                
  110.         }
  111.        
  112.         return 0;
  113. }
A hozzászólás módosítva: Dec 29, 2014
(#) fifadani hozzászólása Dec 30, 2014 /
 
Áh, nem is olyan bonyolult ez. Értem, okszi.
Köszi szépen.
(#) fifadani hozzászólása Dec 30, 2014 /
 
Értem a lényegét a változtatásnak. Viszont annyi a problémám vele, hogy nem tudok akkora frekvenciát belőni a két digit váltásához, hogy villódzásmentes legyen.
A megoldás most az, hogy a timer0-nak nem 1024-es osztott jelet adok hanem mondjuk 256-ot?

up1: (Oh, igen. 16Mhz/256/255= 245Hz-el lépeget a timer0. Frankó. Megértettem. Köszi szépen!)
A hozzászólás módosítva: Dec 30, 2014
(#) kapu48 válasza fifadani hozzászólására (») Dec 30, 2014 /
 
Még ezen a „ADC*2 mert” kijelentéseden gondolkozunk keveset!

A mérés közben keletkezett rövidebb tüskék kiszűrésére szoktuk alkalmazni, az egymásután többszörös mérést és átlagolást.

Ez a te rutinodban hiányosnak tűnik! (Hol az átlagolás?)
(#) fifadani hozzászólása Dec 30, 2014 /
 
Megmondom őszintén azért nem raktam bele, mert nem jöttem rá magamtól még, hogy tudnék átlagot számolni. Gondolom for ciklus kell. Tudnál segíteni picit?
(#) tej válasza fifadani hozzászólására (») Dec 30, 2014 /
 
x mintavételt összeadsz és elosztod x-el.
(#) kapu48 válasza fifadani hozzászólására (») Dec 30, 2014 / 1
 
Átlag érték=A mért eredmények összege, osztva a mérések számával.
A osztás művelet helyett a könnyebb jobbra shiftet használunk.
Ezért a mérések számát 2 valamelyik legkisebb hatványának vesszük, amely már megfelelő eredményt hoz.
  1. unsigned char Beolvas8bitADC(unsigned char csatorna)
  2. {
  3.         unsigned int Volt, j;
  4.         Volt = 0;
  5.         ADMUX = (ADMUX & 0b11110000) | csatorna;   // ADC csatornat kivalasztom
  6.        
  7.         for(j=0;        j<8;    j++){   // kezdjük 8 méréssel?
  8.                 ADCSRA |= (1<<ADSC);         // ADC inditas
  9.                 while (ADCSRA & (1<<ADSC));    // varas az atalakitasra
  10.                 Volt += ADCH;          
  11.         }       // /8 Az eredményt átlagoljuk
  12.         return (Volt >> 3);     // ADC ertek visszaadasa (csak a felso 8 bit (ADCH), az also 2 zajos bit elhagyasa)
  13.        
  14. }
A hozzászólás módosítva: Dec 30, 2014
(#) fifadani hozzászólása Dec 30, 2014 /
 
Értem már. Működik is szépen.

Viszont az ADC méréssel kapcsolatban:

Az ADC értékét azért úgy számolom mert... (lehet rosszul gondolom)
Szóval az érzékelőm felbontása 10mV/C°.
Hogy ne mV-okat kelljen mérnem, raktam be egy műv.erősítőt. 10x-es erősítéssel.
Ha az ADC felső 8 bitjét veszem figyelembe, az ADC felbontása 1 ADC = kb 20mV.

(Ha 4°C van, akkor az LM35-ből 40mV jön ki. Mivel az ADC-m 20mV-os pontossággal dolgozik, ezért a mért eredményt szorzom 2-vel és így kapom vissza a mért adatot.
Mivel én szorzom 10-el műv.erősítővel, lesz ugye 400mV belőle.
De ezt osztanom kell 10-el a szofverben.
Na már most, ha szorzok 2-vel és aztán osztok 10-el, az ugyanaz mint ha 5-el osztanék. )

Így ha 10°C van akkor: 1000 / 20 = 50 ADC. Ezt osztom 5el és megkapom a hőmérsékletet.

Lehet, hogy ez így nagy badarság. Szóljatok, ha hülye vagyok!
(#) kapu48 válasza fifadani hozzászólására (») Dec 30, 2014 / 1
 
Ez a levezetésed szerintem OK!

Én a mérőpont és a feldolgozó ADC között levő jelvezetéken létrejövő zaj okozta, gyors értékváltozás miatt fellépő, kijelzett érték villogásának kiszűrését próbáltam megoldani.

Bár szerintem külső ADCREF szűréssel, és a jelvezeték HW. L-C-tag szűréssel töbre mennél!
A hozzászólás módosítva: Dec 30, 2014
(#) Massawa hozzászólása Dec 30, 2014 /
 
Egy kérdés:

Adva van egy logikai bemenet. Ugyanez a port visszajelzést is ad ( ilyenkor kimenet), hogy milyen állapotban van. Azaz ha a bementre 0 V megy, amikor az impulzus megszünik ugyanazon a csatlakozon egy 0, vagy 5 V jelenik meg jelezve, hogy milyen állapotban van a berendezés.
Ezt kellene kezelnem egy AVR-rel, azaz elöször el kell olvasni a port állapotát, és ez alapján dönteni, hogy át-e kell kapcsolni vagy sem.
Mi lenne a legjobb algoritmus erre?

Kösz.
Következő: »»   635 / 837
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.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