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   541 / 840
(#) vzoole válasza kurosaki hozzászólására (») Jún 12, 2013 /
 
Szia!

Ezt nézted már ADC-vel kapcsolatban?
Bővebben: Link

Igaz ATMega8 konkrétan, de a menetét leírtam részletesen.
És pont azt csinálja, hogy az ADC eredményétől függően ki-be kapcsolgat egy LED-et.
A hozzászólás módosítva: Jún 12, 2013
(#) kurosaki válasza vzoole hozzászólására (») Jún 13, 2013 /
 
Épp most nezem de ez bonyolult nem tudok eligazodni rajta ://
Idézet:
„dB_Thunder irt egy RGB kódot”
(teid alatt 1-2 vel van)de sajna az ővése megy akár hogy csinálom pedig az Attiny45. Ezeket a DDRC = 0b1011111; stb ne mértem.
(#) fecus válasza fecus hozzászólására (») Jún 13, 2013 /
 
Nem a mérésben van a hiba. Az átlagoló rutinom rossz. Segítene valaki mit rontottam el?
  1. uint16_t Average(uint8_t ch)
  2.         {
  3.                 uint8_t  count;
  4.                 uint16_t avg_temp;
  5.                 for (count = 0; count < 8;      count++)
  6.                 {
  7.                         avg_temp += ReadADC(ch);
  8.                 }
  9.                 avg_temp /= 0x0008;
  10.                 return(avg_temp);              
  11.         }

10 biten mérek.
(#) zombee válasza fecus hozzászólására (») Jún 13, 2013 /
 
1: Mennyi az "avg_temp" kezdőértéke? - Akkor most mégegyszer: biztos???
2: Nem hiba az osztás, de a legvégén inkább shifteld jobbra 3-al, az "takarékosabb".
Persze jó esetben a fordító is pontosan így csinálja (felsimeri!) és nem osztásként értelmezi...
(#) csabeszq válasza zombee hozzászólására (») Jún 13, 2013 /
 
zombee válasza jó volt, de azért kifejteném bővebben, mert valószínűleg nem vagy C guru.

Amikor deklarálod az avg_temp-et, akkor a fordító kiválaszt vagy egy regisztert a processzorban (tipikus), vagy egy memóriacímet a vermen és ott fogja tárolni az értéket. A deklaráció C-ben szemben más programnyelvekkel nem ad alapértelmezett értéket a változónak. Az értéke az lesz, ami a lefoglalt memóriában, vagy a kiválasztott regiszterben idáig volt. Erről még véletlenül se feltételezd azt, hogy nulla lesz, mert általában nem az. Az értéke megjósolhatatlan, hol ez, hol az, kismillió dologtól függ.

A C az egyik legidősebb nyelv, a nála fiatalabb nyelvek már vagy fordítási hibát jeleznek, vagy alapértelmezett értéket adnak a változónak.

A javítás:
  1. uint16_t avg_temp = 0;
A hozzászólás módosítva: Jún 13, 2013
(#) vzoole válasza kurosaki hozzászólására (») Jún 13, 2013 /
 
Akkor még a LED villogtatásáig se jutottál el?

DDRC-vel a port irányát állíthatod be.
DDRA az A port
DDRB a B port

Na most minden portot 8 biten tudsz beállítani. Persze előfordulhat hogy nincs is annyi láb egy adott porton, de ez nem gond.

Na most az ATiny45-nek csak B portja van, az is 0-5-ig.
De pl az PB5-ös láb a RESET láb is egyben, ami alapból csak reset-ként működik. Fuse biteknél be tudod állítani, hogy az is használható láb legyen, de akkor a reset funkció megszűnik, és ezzel a soros programozási lehetőség is.

A PB3 és PB4 lábak alpból digitális ki/bemenetek. De ha külső kristályt kötsz rá és be is állítod, akkor ez a két láb is kiesett.

Vegyünk egy alap esetet.
Neked kell egy analóg bemenet (ADC) és egy digitális kimenet a LED-nek.

Kiválasztod melyik legyen az analóg bemenet. Adatlapon megkeresed hol van ADC.
A PB2 az ADC1 is egyben. Ha ez az ADC láb szimpatikus, akkor ezt bemenetre kell állítani.

Kell egy kimenet a lednek. Ide bármelyik szabad port használható. Legyen a PB0. Ez már kimenet lesz.

Ezzel tudjuk, hogyan kell beállítani a lábakat (port-ot), csak le kell programozni.

Ahogy írtam a DDRB regiszterrel állítod be az irányát. Ez egy 8bites regiszter, tehát mind a 8 lábat be tudod vele állíteni, persze amiből most csak 5 használható van (0-4-ig).
Ezt több módon is belehet.

DDRB = 0b00000001;
DDRB az "irányregiszter"
= ezzel az operandussal adsz neki értéket
0b az, hogy ezt binárisan adod meg
00000001 itt adod meg a konkrét értékét, azaz irányát. Ahol 0 ott bemenet, ahol 1 az kimenet. PB7-es lábbal kezdődik aztán szépen sorba... PB7 PB6... PB0

Tehát ha olvasod az értéket, látod, hogy a PB0 lábnál 1-es van, tehát az kimenet.
Én így szeretem beállítani.
Belehet hexadecimális értékkel is, ami így nézne ki, de ugyanazt jelentené.
DDRB = 0x01;

Vagy az értékek rá shiftelésével is:
DDRB = DDRB | (1<<PB0);
Vagy ugyanazt jelenti ez is:
DDRB |= (1<<PB0);
(mivel alapból minden láb 0 azaz bemenet, ezért csak a kimenetekre kell 1-est shiftelni.

Mára ennyi
A hozzászólás módosítva: Jún 13, 2013
(#) kurosaki válasza vzoole hozzászólására (») Jún 14, 2013 /
 
Waow na mostmér kezdem érteni csak a 0000001 stb miatt voltam gondba amit használtál.Nem soká jelentkezem, hogy sikerült-e.Köszönöm az eddigi segitséget.
  1. // IO portok beállítása
  2. void InitPORT() {
  3.  
  4. //           6543210
  5.     DDRB = 0b1011111;
  6. //  PC5-ADC5 bemenet, többi kimenet
  7.    
  8.     DDRB = 0xFF;
  9.  
  10. //           76543210
  11.     DDRB = 0b10000000;
  12. //  PD7 kimenet(LED), többi bemenet
  13.     PORTB=0x00;
  14. }
  15.  
  16. // ADC beállítása
  17. //--------------------------------------------
  18. void InitADC() {
  19.  
  20. //********************************************
  21. //            76543210
  22.     ADMUX = 0b01000000;
  23. //********************************************
  24. //    7  REFS1
  25. //    6  REFS0
  26. //       00 - Referencia az AREF láb, belső referencia lekapcsolva.
  27. //       01 - Referencia az AVCC láb, AREF láb kondenzátorral testre kötve.
  28. //       10 - Foglalt
  29. //       11 - Belső 2.56 Voltos referencia, AREF láb kondenzátorral testre kötve.
  30. //--------------------------------------------
  31. //    5  ADLAR
  32. //--------------------------------------------
  33. //    4  nem használt
  34. //--------------------------------------------
  35. //    3  MUX3
  36. //    2  MUX2
  37. //    1  MUX1
  38. //    0  MUX0
  39. //       ADC port választás binálisan megadva. Itt érdemes 0000 értéket megadni,
  40. //       mert lekérdezéskor állítjuk be a portot.
  41.  
  42. //********************************************
  43. //             76543210
  44.     ADCSRA = 0b10000111;
  45. //********************************************
  46. //    7  ADEN
  47. //       ADC engedélyezve ha értéke 1, kikapcsolva ha 0.
  48. //--------------------------------------------
  49. //    6  ADSC
  50. //       Egyszeri mérésnél 1-re kell állítani, hogy megtörténjen a mérés.
  51. //       Folyamatos mérésné ha 1-re állítjuk elindul a mérés,
  52. //       ami utánna folyamatosan fut.
  53. //--------------------------------------------
  54. //    5  ADFR
  55. //       Ha 1 akkor folyamatos mérés fut, ha 0 akkor egyszeri.
  56. //--------------------------------------------
  57. //    4  ADIF
  58. //       Interrupt Flag - nem kell piszkálni
  59. //       Ha 1 akkor a megszakítás jött létre.
  60. //--------------------------------------------
  61. //    3  ADIE
  62. //       Ha 1 akkor a mérés végén megszakítás jön létre.
  63. //       Ha 0 akkor a megszakítás kikapcsolva.
  64. //--------------------------------------------
  65. //    2  ADSP2
  66. //    1  ADSP1
  67. //    0  ADSP0
  68. //       Előosztás
  69. //       000 - 1
  70. //       001 - 2
  71. //       010 - 4
  72. //       011 - 8
  73. //       100 - 16
  74. //       101 - 32
  75. //       110 - 64
  76. //       111 - 128
  77.  
  78. } // InitADC
  79.  
  80.  
  81. //--------------------------------------------
  82. uint16_t ReadADC(uint8_t ch) {
  83.  
  84.     ADMUX = (ADMUX & 0b11110000) | ch;
  85. //              példa ha ADC 5-ös portot olvasunk. ch értéke (5) binárisan (00000101)
  86. //  01000001    ADMUX jelenlegi állapota (1-es ADC csatorna beállítva)
  87. //& 11110000    ezzel töröljük az előző portk kiválasztást
  88. //= 01000000    eredménynek kapjuk az eredeti ADMUX beállítást
  89. //| 00000101    "ráírjuk" az ADC csatornát
  90. //= 01000101    
  91.  
  92.     ADCSRA|=(1<<ADSC);          // konverzió elindítás
  93.  
  94.     while(ADCSRA & (1<<ADSC));  // várás az átalakításra
  95.  
  96.     return (ADCL | (ADCH<<8));  // adc érték visszaadása
  97.  
  98. } // ReadADC
Na igen itt akadtam el speciel.
A hozzászólás módosítva: Jún 14, 2013
(#) Ricsi89 válasza kurosaki hozzászólására (») Jún 14, 2013 /
 
A gond ott kezdődik, hogy egymás után 3szor állítod a B port kimenetét, miközben kommentben más portokról írsz. A C portot DDRC-vel, a D portot DDRD-vel kell állítani. Tehát a DDRx-ben a DDR jelzi, hogy adatirány regiszterről van szó(data direction register), a kis x pedig a port betűjele, amit állítani akarunk. Ugyanígy van a PORTx esetében is, ahol az x helyére az adott port betűjelét kell írni.
(#) kurosaki válasza Ricsi89 hozzászólására (») Jún 14, 2013 /
 
Waow na igen ehez hülye vagyok jelenleg még bascom ban se tudtam beallitani hogy > 120 hiába allitgatom ugyan úgy kapcsol.
adat a fényellenálásrol:
Ellenállás:
- 500 kOhm (0 lux)
- 94 kOhm (10 lux)
- 8 kOhm (100 lux)
Hullámhossz a max. érzékenységnél : 600 nm
(#) fifadani hozzászólása Jún 14, 2013 /
 
Sziasztok!
Tudnátok adni nekem tananyagot?
Lényeg: AVR-t hogy kell C-ben programozni. Tudnivalók stbstb.
(#) Fizikus válasza fifadani hozzászólására (») Jún 15, 2013 /
 
Olvassad el ezeket a cikkeket:
AVR nyolc lábbal
AVR perifériák
(#) fecus válasza csabeszq hozzászólására (») Jún 15, 2013 /
 
csabeszq, zombee!

Működik. Ez volt a gond. Most minden változónak adok kezdőértéket.
Köszönöm!!!
(#) fifadani hozzászólása Jún 15, 2013 /
 
Sziasztok!
Elolvastam a cikkeket, de én nem láttam még C-t soha.
Szóval tényleg a elejéről kellene kezdenem.
(#) kurosaki válasza fifadani hozzászólására (») Jún 15, 2013 /
 
Szia mit szeretnél elkésziteni ird le ha egyszerü LED stb.Abban tudok segiteni ha gondolod keres meg Privátban.

Srácok kis segitség kéne:
  1. $crystal = 14745600                                         'Sebesseg
  2. $regfile = "ATtiny45.DAT"                                   'Chip
  3.  
  4. $swstack = 32
  5. $hwstack = 32
  6. $framesize = 40
  7.  
  8. 'Pinout ATtiny25/45/85
  9. '1.: (PCINT5/RESET/ADC0/dW) PB5
  10. '2.: (PCINT3/XTAL1/CLKI/OC1B/ADC3) PB3
  11. '3.: (PCINT4/XTAL2/CLKO/OC1B/ADC2) PB4
  12. '4.: GND
  13.  
  14. '8.: VCC
  15. '7.: PB2 (SCK/USCK/SCL/ADC1/T0/INT0/PCINT2)
  16. '6.: PB1 (MISO/DO/AIN1/OC0B/OC1A/PCINT1)
  17. '5.: PB0 (MOSI/DI/SDA/AIN0/OC0A/OC1A/AREF/PCINT0)
  18.  
  19. 'Fotoelem
  20. Config Adc = Single , Prescaler = Auto , Reference = Internal_2.56_nocap
  21.  
  22.  
  23.  
  24. Config Portb.2 = Output
  25. Config Portb.1 = Output                                     'LED a PortB.3
  26.  
  27. Dim Fenyelem As Word
  28.  
  29. Do
  30.   Start Adc
  31.   Waitms 35
  32.   Fenyelem = Getadc(0)
  33. If Fenyelem <= 2990 Then                                   '
  34. Set Portb.1
  35. Elseif Fenyelem <= 2995 Then                                'use elseif for more tests
  36.  
  37.    Set Portb.2
  38.  
  39. End If
  40.  
  41.   Stop Adc
  42.   Waitms 35
  43. Loop
  44.  
  45. End
Akár hogy állítom az Elseif et csak is egy led kapcsol.(ugynézki áttérek Bascom ra mivel C ben nem tudtam meg valósítani az ADC mert tul bonyolult és nem találok egy rendes leirást ami csak is egy ledet kapcsol vagy legalább adna egy értéket pl: 120 at eléri és a string et 1 re állitja azaz bekapcsolja.
(#) zombee válasza kurosaki hozzászólására (») Jún 15, 2013 /
 
Ne haragudj, de ez a kód Bascom, nem C.
(#) kurosaki válasza zombee hozzászólására (») Jún 15, 2013 /
 
Igen tudom bocsi hülyén irtam.Áttéerek Bascomra inkább mert C ben még eddigse jutottam el mint bascomban.De jobb lenne a C de ahoz nem találok kódot csak amit lekéne csupaszítanom de ha nem értem mi mit csinál akkor hiába :/ .
(#) kapu48 válasza kurosaki hozzászólására (») Jún 15, 2013 /
 
Pár dolgot tisztázni kellene a HardWeredről?!
Ez a sor azt mondja, hogy külső Kristályról megy az ATtiny:
$crystal = 14745600 'Kristály Sebessége 14745600 Hz Ez Igaz?
Pin 1.: (ADC0) PB5 Ide van kötve a Fény ellem ?
Config Portb.5 = Input ’ ADC0 PB5 Bemenetre kapcsoljuk!

If Fenyelem < 2991 Then 'kisebb< 2991 nél
Set Portb.1 ’PB.1=1
Reset Portb.2 ’PB.2=0
Elseif Fenyelem > 2996 Then 'Nagyobb > 2996-nál. use elseif for more tests
Reset Portb.1 ’PB.1=0
Set Portb.2 ’PB.2=1
End If

A végére nagyobb várakozást tegyél! Mert így nem látsz semmit!
Legalább:
Waitms 500

Loop

End
(#) vzoole válasza kurosaki hozzászólására (») Jún 15, 2013 /
 
Pedig C hez rengeteg könyv van. Egyet legalább ki kéne olvasni. Könyvtárakban keress.
A C nagyon hasznos, mert pl. a PHP és Java is ezen alapszik.
(#) TavIR-AVR válasza kurosaki hozzászólására (») Jún 15, 2013 /
 
Hibalista:

1, A kód Bascom, nem C

2, If Fenyelem <= 2990 Then...
ADC értéke 0...1023 közt lehet

3, Reference = Internal_2.56_nocap
Ez mi? Ilyen nincs a bascomban!
internal_2.56 vagy internal

4.
Config Portb.1 = Output 'LED a PortB.3
Ilyen nincs. Vagy portb.1 vagy portb.3...

5. $crystal = 14745600
A Tiny45 esetén a be is állítod a biztosítékbiteknél, hogy külső kvarc? Belső 1200000 Hz RC miért nem jó? (1.2 MHz)

Javaslat Bascom esetére: Olvasd el a http://avr.tavir.hu -> Bascom könyv leírást...
C esetén kezdj az Arduinoval a http://www.tavir.hu/60nap ingyenes tanfolyam az alapokat legalább megadja...
A hozzászólás módosítva: Jún 15, 2013
(#) kurosaki válasza TavIR-AVR hozzászólására (») Jún 15, 2013 /
 
A programot 2-3 oldalall ezelött készitette egy felhasználó.Én azt használom.Igazábol a LUX ot nem tom hogy számitsam ki maga az értéket ADC ben megadni akar hogy allitom semmi szoval <= 1023 ez a legg fényesebb 10 meg a leggsötétebb?
(#) TavIR-AVR válasza kurosaki hozzászólására (») Jún 16, 2013 /
 
DC: a bemeneti feszültséosztón mért jel, azaz a fotoellenállás/tranzisztor és az ellenállás aránya.
A LUX az http://hu.wikipedia.org/wiki/Fotometria itt van leírva.
Ami neked hiányzik:
- fényforrás és mérőrész távolsága
- mérőeszköz kalibrációja (beesési fényszög, beeső fény hullámhossza, az alapján a jelváltozás...

Szóval ez nem ilyen egyszerű.....

Az ADC 0...1023 közt változhat.


Szóval LUX-ot inkább egy ismert, kalibrált eszköz és az általad készített összehasonlító mérésével lehet megoldani.
(#) kurosaki válasza TavIR-AVR hozzászólására (») Jún 16, 2013 /
 
Értem és hogyan tudom belőni 0 és 1023 ? mert akárhogy állitom sötétet érzékeli de a világoságot nem.
  1. '$crystal = 14745600                                         'Sebesseg
  2. $regfile = "ATtiny45.DAT"                                   'Chip
  3.  
  4. $swstack = 32
  5. $hwstack = 32
  6. $framesize = 40
  7.  
  8. 'Pinout ATtiny25/45/85
  9. '1.: (PCINT5/RESET/ADC0/dW) PB5
  10. '2.: (PCINT3/XTAL1/CLKI/OC1B/ADC3) PB3
  11. '3.: (PCINT4/XTAL2/CLKO/OC1B/ADC2) PB4
  12. '4.: GND
  13.  
  14. '8.: VCC
  15. '7.: PB2 (SCK/USCK/SCL/ADC1/T0/INT0/PCINT2)
  16. '6.: PB1 (MISO/DO/AIN1/OC0B/OC1A/PCINT1)
  17. '5.: PB0 (MOSI/DI/SDA/AIN0/OC0A/OC1A/AREF/PCINT0)
  18.  
  19. 'Fotoelem
  20. Config Adc = Single , Prescaler = Auto , Reference = Internal_2.56_nocap 'amint atirom Internal vagy Internal_2.56 ra errort ad
  21.  
  22.  
  23.  
  24. Config Portb.0 = Output
  25. Config Portb.1 = Output                                    
  26.  
  27. Dim Fenyelem As Word
  28.  
  29. Do
  30.    Start Adc
  31.    Waitms 35
  32.    Fenyelem = Getadc(0)
  33.  
  34. If Fenyelem < 10 Then
  35.    Set Portb.1
  36.    Reset Portb.0
  37. Elseif Fenyelem > 11 Then
  38.    Set Portb.0
  39.    Reset Portb.1
  40. Else
  41.   Set Portb.1
  42.   Set Portb.0
  43. End If
  44.  
  45.    Stop Adc
  46.    Waitms 35
  47. Loop
  48.  
  49. End
semmi hatása. 100K,47ohm 1K ellenállásal probálkoztam de az eredmény ugyan az.Ha semeikre nem igaz akkor mind a 2 led világit.
(#) TavIR-AVR válasza kurosaki hozzászólására (») Jún 16, 2013 /
 
Rosszul kötötted be az érzékelőt. Fordítsd meg.
Javaslat: A Tiny-t felejtsd el. Nincs debugod. Azaz nem látod mi történik a chipen belül. Cseréld ki pl. ATMega8-ra...

+5V------Ellenállás pl. 47k..100k----+AVR ADC lába-----Fotoellenállás/fototranzisztor----GND


Ez a kód el van baltázva:
  1. 34.
  2. If Fenyelem < 10 Then
  3.  
  4.  35.
  5.    Set Portb.1
  6.  
  7.  36.
  8.    Reset Portb.0
  9.  
  10.  37.
  11. Elseif Fenyelem > 11 Then
  12.  
  13.  38.
  14.    Set Portb.0
  15.  
  16.  39.
  17.    Reset Portb.1
  18.  
  19.  40.
  20. Else
  21.  
  22.  41.
  23.   Set Portb.1
  24.  
  25.  42.
  26.   Set Portb.0
  27.  
  28.  43.
  29. End If



Javítsd hogy ha kisebb: egyik LED ég, ha nagyobb a másik.
  1. ha fénylelem <128 then
  2. set led1
  3. reset led2
  4. else
  5. set led2
  6. reset led1
  7. endif


Ezt nem értem:
"Értem és hogyan tudom belőni 0 és 1023 ?"

Olvass: ADC Bascom-ban
(#) kurosaki válasza TavIR-AVR hozzászólására (») Jún 16, 2013 /
 
Korulbelul igy?(paint ben egy gyors vazlat)
Meg probálom az álltalad irt modositásokat.USBasp emse tud debug modot vagy tevedek?
(#) fifadani hozzászólása Jún 16, 2013 /
 
Sziasztok!
Amíg várom az alkatrészeket az STK500-hoz, szeretnék kezdetleges dolgokat írni.
Láttam, hogy a studio 4ben van AVR Simulator.
Őt hogy kell használni?
Tud valaki segíteni?
(#) TavIR-AVR válasza kurosaki hozzászólására (») Jún 16, 2013 /
 
Ajaj.... Ebből _soha nem lesz visszajelző, ha így kapkodsz....
Plusz elvihibás a rajzod is.


A rajzot lsd melléklet. A GETADC(1) olvassa be a megvilágításjelet...


Au USBASP-vel meg szívatod is majd magadat. Igaz, amikor használod a kapcsolást az USBASP nincs rádugva?
Debug: AVR-Dragon tudja csak. Ill. az ennél jóval drágábbak...
"Mottó: olcsó húsnak híg a leve"
(#) Hooligan01 válasza fifadani hozzászólására (») Jún 16, 2013 /
 
Szia!

Az AVR Studio kb. a 6.1 verziónál jár, szóval érdemes lenne váltani a 4-ről.. Bár erről megoszlanak a vélemények ezen a fórumon. Nyilván sokan használnak még windows 3.1-et.

A szimulátort egyszerűen csak el kell indítani debug módban, a debug fül alatt találod a dolgokat hozzá. Pl. így.
(#) fifadani hozzászólása Jún 16, 2013 /
 
STK500-at fogok építeni, s azt olvastam, hogy a studio 6-al kevesebb mcu-t tudok programozni.
(#) Hooligan01 válasza fifadani hozzászólására (») Jún 16, 2013 /
 
Érdekes szempont, lelked rajta
(#) fifadani hozzászólása Jún 16, 2013 /
 
Mert ez nem igaz? Világosíts fel kérlek.
Következő: »»   541 / 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