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   338 / 840
(#) sikolymester válasza atideath hozzászólására (») Júl 5, 2011 /
 
Az amplitúdó mérése szerintem egyszerű. Ha valamely pillanatban kíváncsi vagy az aktuális amplitúdóra, akkor indítasz egy ADC sorozatot mindaddig, amíg a következő mérés az előzőnél nagyobb eredményt ad. Az utolsó ~20 mérést átlagolod, hogy ne egy zavarra hidd azt, hogy lokális maximumnál vagy. Amikor az átlagérték elkezd csökkenni, akkor tudod, hogy a lokális maximumnál vagy, tehát elérted az amplitúdó tetejét. Ugyanezt elvégzed az amplitúdó aljára nézve is, csak ott ugye lokális minimumot keresel

Azt, hogy milyen gyorsan vezet ez eredményre természetesen a mérendő jel frekvenciája fogja befolyásolni, hiszen meg kell várnod azt, amíg a jel a legalsó állapotából eléri a maximumot.

De szerintem mérési elvnek ez megállja a helyét. Anélkül, hogy megnézném az adatlapját az atmega8-nak én kimerem jelenti, hogy ezeket a frekvenciákat képes megmérni gond nélkül.
(#) atideath válasza sikolymester hozzászólására (») Júl 5, 2011 /
 
Megpróbáltam de sajnos nem sikerült valamiért. Beállítottam Proteusban egy 164Hz-s jelet 5V-os amplitudoval és csak 34-et kaptam vissza.. Pedig 1023-nak kellene lennie szerintem. A kód a következő Bascomba:

  1. $regfile = "m8def.dat"
  2. $crystal = 1000000
  3. 'Config Portd = Output
  4.  
  5.  
  6. Config Adc = Single , Prescaler = Auto , Reference = Avcc   'config ADC
  7. Start Adc
  8.  
  9. Dim Amp As Integer
  10. Dim Amp1 As Integer
  11.  
  12. Config Lcd = 20 * 4
  13. Config Lcdpin = Pin , Rs = Pind.7 , E = Pind.6 , Db4 = Pinb.7 , Db5 = Pinb.6 , Db6 = Pind.4 , Db7 = Pind.5
  14.  
  15. Amp = 0
  16. Amp1 = 0
  17.  
  18. Do
  19.    Gosub Amplimeres
  20.       Locate 1 , 1
  21.       Lcd "Amplitudo:"
  22.       Locate 2 , 1
  23.       Lcd Amp
  24.  
  25.    Waitms 200
  26.    Loop
  27. End
  28.  
  29. Amplimeres:
  30.    While Amp =< Amp1
  31.       Amp1 = Amp
  32.       Amp = Getadc(3)
  33.    Wend
  34. Return
(#) sikolymester válasza atideath hozzászólására (») Júl 5, 2011 /
 
Sajnos nincsen ráállva a szemem a Basic nyelvre. De nekem valami kapásból gyanús:
  1. Amplimeres:
  2.    While Amp =< Amp1
  3.       Amp1 = Amp
  4.       Amp = Getadc(3)
  5.    Wend


Ha jól látom Amp1 és Amp 0 ra van inicializálva, tehát a while ciklus elindul. Ezután bármi jön ki a Getadc(3) parancsból a 0-t kivéve azt eredményezi, hogy a while ciklus egyből leáll, mivel az nagyobb lesz az Amp1-nél.
Gondolom a proteus szimulátor, amire oda jut, hogy ADC-zen, akkor a generált jel mindig pont 34-es ADC értéknél van, ami az említett okok miatt egyből vissza is tér vele és kiírja.

Szóval gondold át ezt az algoritmust. Az elv amit mondtam szerintem jó. Csak a programozói skillen múlik, hogy menjen is.
(#) atideath hozzászólása Júl 6, 2011 /
 
Na úgy néz ki sikerült megoldani. Ez már megközelítőleg jó eredményt ad. Egy picit téved de ez már nem annyira vészes.

  1. $regfile = "m8def.dat"
  2. $crystal = 1000000
  3. 'Config Portd = Output
  4.  
  5.  
  6. Config Adc = Free , Prescaler = Auto , Reference = Avcc
  7. Enable Adc
  8.  
  9. Dim Amp As Integer
  10. Dim Maxim As Integer
  11. Dim Sebtomb(200) As Integer
  12.  
  13. Config Lcd = 20 * 4
  14. Config Lcdpin = Pin , Rs = Pind.7 , E = Pind.6 , Db4 = Pinb.7 , Db5 = Pinb.6 , Db6 = Pind.4 , Db7 = Pind.5
  15.  
  16.      Amp = 0
  17. Do
  18.      Gosub Amplimeres
  19.      Locate 1 , 1
  20.      Lcd "Amplitudo:"
  21.      Locate 2 , 1
  22.      Lcd Maxim
  23.      Waitms 500
  24.      Cls
  25.      Maxim = 0
  26.      Loop
  27. End
  28.  
  29. Amplimeres:
  30. Dim Index As Integer
  31. For Index = 0 To 200
  32.      Sebtomb(index) = Getadc(3)
  33.      If Maxim < Sebtomb(index) Then Maxim = Sebtomb(index)
  34. Next Index
  35.  
  36. Return


Kérdés az hogy ez mennyire pocsékolja nekem a memóriát? Mert az eddigi program is már 54%-ot ír fordításkor..
(#) yoman917 hozzászólása Júl 6, 2011 /
 
Sziasztok
Ezt hogyan tudnám beírni c-be? (AVR Studioba akarom, kép mellékelve)
(#) sikolymester válasza yoman917 hozzászólására (») Júl 6, 2011 / 1
 
Ezt használd: http://www.nongnu.org/avr-libc/user-manual/group__avr__math.html

Includeolod a math.h headert, majd szemezgetsz a szükséges függvényekből.
(#) Reggie válasza yoman917 hozzászólására (») Júl 6, 2011 / 1
 
A megoldast itt megtalalod.
(#) yoman917 hozzászólása Júl 6, 2011 /
 
Sziasztok
Van egy olyan problémám, hogy nem fut végig a programom, és nem tudom hogy miért. A programba beleírtam a fentebb már csatolt egyenletet, de amikor kiakarom íratni a helyiértékeket, onnantol error-t ír ki, és nem is nagyon tudom mire, "multiple definiton of __floatunisf"
  1. #include <avr/io.h>
  2. #include <avr/delay.h>
  3. #include <math.h>
  4. #define F_CPU 8000000UL
  5. #define Vref 5
  6. #define Rknown 10000UL
  7. #define Vcc 5
  8. #define B 4050UL
  9. #define R0 10000UL
  10. #define T0 298
  11. #define y (R0*(double)exp(-B/T0))
  12. #define KELVIN 273
  13.  
  14.  
  15.         uint32_t  Rthermistor, Tvalos;
  16.         uint8_t helyi1, helyi2;
  17.        
  18.  
  19.  
  20. void ADInit()
  21.          {
  22.                
  23.                 ADCSRA|= (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0) ;
  24.                
  25.                          
  26.                 }
  27.  
  28. unsigned long Beolvas10BitADC(uint8_t channel)
  29.        
  30.  
  31.         {
  32.                 ADMUX = (ADMUX & 0b11110000) | channel;
  33.                 ADCSRA |= (1<<ADIF);
  34.                 ADCSRA |= (1<<ADSC);
  35.                         while (!(ADCSRA & (1<<ADIF)));
  36.                                                        
  37.                         return ADC;
  38.                 }
  39.  
  40.         int main (void)
  41.         {
  42.                 DDRB=0xF;
  43.                 DDRA=0xC0;
  44.                 ADInit();
  45.                
  46.                 while(1)
  47.                 {
  48.  
  49.                 Rthermistor=((Vcc/Beolvas10BitADC(1))-1)*Rknown;       
  50.                 Tvalos =( B /((double)log(Rthermistor/y))) ;           
  51.                 helyi1 = (Tvalos-KELVIN) /10;
  52.                 helyi2 = (Tvalos-KELVIN) /1 % 10;
  53.                  
  54.                                                
  55.                                                
  56.                                                
  57.                                 PORTA=0x80;
  58.                                 PORTB=helyi1;
  59.                                 _delay_us(1300);
  60.                                 PORTB^=0x80;
  61.                                
  62.                                 PORTA=0x40;
  63.                                 PORTB=helyi2;
  64.                                 _delay_us(1300);
  65.                                 PORTB^=0x40;           
  66.                                                
  67.                        
  68.         }
  69.         }

Szerintetek mi lehet a hiba?
Üdv,
yoman
(#) zolee1209 válasza kiborg hozzászólására (») Júl 6, 2011 /
 
Igen, azok fix képek, amiket kirajzolok csak. De még 1bit-es színmélységgel is sok helyet foglal relatíve, így meg kell majd oldanom a rajzoltatást. Egyszerű, négyszögnél nem gond, ha lekerekítést is akarok, az már érdekes lesz... De egyelőre húzódik a projekt befejezése, találtam érdekesebbet...
(#) Reggie válasza yoman917 hozzászólására (») Júl 7, 2011 /
 
Szerintem masold ide a fordito outputjat, mert ez igy keves ahhoz, hogy segitsunk.
(#) TavIR-AVR válasza erdoszoli hozzászólására (») Júl 7, 2011 /
 
A kiolvasás elleni védelem:
- Verify & Read Flash section: DISABLE
- SPM & LPM BOOT section: DISABLE
- SPM & LMP Flash section: DISABLE


Ha ujra akarod irni a chipet ERASE chippel lehet... Ekkor a lockbit es a chip tartalom is törlődik.
(#) atideath hozzászólása Júl 7, 2011 /
 
Sziasztok. Olyat lehet esetleg AVR-ek esetében, hogy Khazama-ataval kiolvasom az EEPROM tartalmat és azt vissza tudom fejteni valami úton módon hogy a benne tárolt változóknak mi az értéke? Vagy ez hülyeség? Ki kellene valahogy szednem a gépen az EEPROM-ból az értékeket.
(#) yoman917 hozzászólása Júl 7, 2011 /
 
Sziasztok
Remélem erre gondoltatok az output alatt.
Üdv,
yoman

Build.JPG
    
(#) zombee válasza yoman917 hozzászólására (») Júl 7, 2011 /
 
Ülj le fiam, egyes!

A viccet félretéve:
1: Az "F_CPU"-t mindig a delay.h behívása előtt adjuk meg. Én mindig a legeslegelső sorba beírom.
2: Az elsőben még "#include " volt, de azt látom a képen, javítottad.
3: Az 1-es hiba javítása után az összes warning eltűnt...
(#) yoman917 válasza zombee hozzászólására (») Júl 7, 2011 /
 
Sejtettem hogy valami nagyon piti a hiba forrása. A warningok eltűntek, de sajnos error miatt megáll az egész. Nem tudok mire vetni
(#) guliver83 hozzászólása Júl 7, 2011 /
 
Üdv Mindenkinek!
Nincs meg véletlenül a következő AVR programozó nyákterve valakinek Sprint Layout formátumban?
Köszönöm!
(#) zombee válasza guliver83 hozzászólására (») Júl 7, 2011 /
 
Attól függ, mi számít "következő"-nek...
Amúgy én Eagle-ben dolgozom, ebben terveztem már AVR Doper, AVRISP, AVRISP-mkII, JTAG ICE programozót, a bufferelt AVRISP-mkII terve is majdnem kész...
(#) guliver83 válasza zombee hozzászólására (») Júl 7, 2011 /
 
A rajzot meg nem raktam fel!

AVR.PNG
    
(#) jhono hozzászólása Júl 7, 2011 /
 
Sziasztok!

Arduino-val kapcsolatos kérdésem lenne.

Van egy Arduino UNO-m és hozzá szeretnék egy CAN-BUS shieldet társítani. Ez működik már! De egy ADXL335 3 tengelyes gyorsulás mérő modul is kellene. A CAN shield az analóg bemeneteket is felhasználja. Gondoltam hogy be kellene ruházni egy Arduino ATMega 2560-re, mivel annak jóval több a analóg inputja. Lábkiosztása fizikailag megfelelő a CAN shield fogadására, de a digitális portok úgy tudom nem ugyan ott helyezkednek el mint az UNO-n.
Kérdésem, hogy ha a MEGA-ra kötöm a gyári CAN-BUS shieldet működni fog attól, hogy nem ugyan oda illeszkedik mint az UNO-n.

Előre is köszönöm a válaszokat.
(#) zombee válasza guliver83 hozzászólására (») Júl 7, 2011 /
 
Igen, ez majdnem egy Doper lesz, de ahogy nézem, inkább USBASP.
Megbántani nem akarlak, de én inkább egy STK500/AVRISP-re beszélnélek rá, nem bonyolultabb megtervezni és még gyorsabb is lesz, és AVR Studio is támogatja. USB illesztőnek MCP2200-át ajánlok, az elérhető SOIC változatban is.
(#) Fizikus válasza jhono hozzászólására (») Júl 8, 2011 /
 
Nem tudom milyen CAN shield-ed van (foleg azt nem hogy milyen egyeb eszkozoket raktak meg ra). Amit neten neztem, azon volt egy kis joystick, annak kellettek az analog bemenetek. Maga a CAN-BUS ha jol neztem csak az SPI-t hasznalja.
Egy megoldas lehet az is hogy a CAN shield-et nem rakod ra az Arduino-ra (pl rateszed egy probapanelra), es csak azokat a labakat kotod ra ami a shield tapellatasahoz, es a CAN kommunikaciohoz kell (SPI).
Az analog bemenetekre meg rakotod a gyorsulasmerot.
Ha nem akarsz vezetekdzsungelt, akkor hasznalhatsz egy Arduino + protoshield + CAN-BUS shield szendvicset is, ahol az analog bemeneteket a protoshield-en oldalra kivezeted, igy a rameno CAN shield analog csatlakozoja nem lesz az Arduino-ra kotve.
(#) TavIR-AVR válasza Fizikus hozzászólására (») Júl 8, 2011 /
 
Nem csereszabatosak a lábak.
A Mega Shield egy zsákutca.
A joystick az analog labon van-> I2C foglalt.

SPI - kissé vegyesfelvágott, de arra egy SPI->AD konverteren át felrakhatod.
Vagy egy 1Wire (DS2450) AD mérőre.

Egyszerűbb sokkal.....

(CAN panelt most élesztem én is a nyáklapok megjöttek, már csak ültetem és megy a kocsiba/próbapadra mérni )
Persze szintén Arduino alapon...
(#) jhono válasza Fizikus hozzászólására (») Júl 8, 2011 /
 
Köszönöm a gyors válaszokat!
A CAN-BUS modulom így néz ki:
Bővebben: Link
és a lefoglalt "lábak". Nem nagyon szeretnék proto shieldet használni,vagy maximum csinálok egyet.
A CAN shield-hez még van egy 2soros LCD meg egy EM-406 GPS modul is és uSD kártyára loggol.

Uhhh TavIR-AVR köszönöm, csak nem nagyon értem

Ez a kép szerint kompatibilis a shildekkel:
Bővebben: Link

Köszönöm
(#) TavIR-AVR válasza jhono hozzászólására (») Júl 8, 2011 /
 
A mega lábai NEM funkcióazonosak pozíció szerint.
Ezért macerás az átalakítás.

A szabad lábakat próbáltam körbejárni, hogy azokon analóg jelet hogyan lehet megfogni...
(#) TavIR-AVR válasza jhono hozzászólására (») Júl 8, 2011 /
 
A kiegészítő LCDről lehet tudni bővebbet?
A CAN-Shieldhez....
(#) wir12 hozzászólása Júl 8, 2011 /
 
Sziasztok adott egy program amit arduino-ra írtak ezt valahogy rá lehet húzni egy sima AVR-re?

A válaszotokat előre is köszönöm
(#) zombee válasza wir12 hozzászólására (») Júl 8, 2011 /
 
Rá.

Komolyra fordítva: amíg elég láb van addig mindent lehet.
De miért nem szúrod be a kódot?
(#) wir12 válasza zombee hozzászólására (») Júl 8, 2011 /
 
Mert ez csak egy elméleti kérdés volt tudod a kíváncsiság az igazat meg valva kezdő vagyok....
(#) TavIR-AVR válasza wir12 hozzászólására (») Júl 8, 2011 /
 
Az arduino is egy sima AVR:
ATMega8/168/328P chip 16 MHZ-n járatva...
Arduino alapok
(#) jhono válasza TavIR-AVR hozzászólására (») Júl 8, 2011 /
 
Persze!

Majdnem ugyan így néz ki az enyém is csak piros a CAN shield . A Lcd modul is ugyan ez.
Bővebben: Link
Következő: »»   338 / 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