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   276 / 839
(#) gtk hozzászólása Nov 4, 2010 /
 
Feltoltottem az lcd_driver javitott valtozatat. Moderatori engedelyezesre var,..
(#) Hurka hozzászólása Nov 4, 2010 /
 
Hellosztok

Szeretném kérdezni, hogy egy ATMEGA644-es A portját lehet-e egyszerre digitális portként és ADC-ként is használni? (a PA.0-ra menne a jel a többi egy grafikus lcd vezérléséhez kell (KS107/108))?

Segítségeteket előre is köszönöm: Hurka
(#) Reggie válasza Hurka hozzászólására (») Nov 4, 2010 /
 
Igen, de az athallas miatt a mintavetelezett analog jel zajosabb lesz.
(#) gtk válasza Hurka hozzászólására (») Nov 4, 2010 /
 
Lehet, de valoszinuleg meg fogja szorni tuskekkel az ADC-t.
Nincs egy olyan ajanlas az adatlapban, hogy ha ADCnek hasznalod a portot, ne hasznald I/O - nak is ?
(#) Tomi_Bp válasza gtk hozzászólására (») Nov 4, 2010 /
 
Nehari! Nem ugráltatni, vagy utasítgatni szerettelek volna, csak másnak is előfordulhat, hogy más portra kerülnek a lábak.
(#) Hurka válasza Reggie hozzászólására (») Nov 4, 2010 /
 
Köszönöm, akkor megpróbálom megoldani, hogy a mintavételezés ideje alatt ne legyen LCD vezérlés (fix, 2 sec hosszú mintákkal dolgozom, 548 ( ) Hz lesz a mintavételi frekvencia (azért ennyi, mert ezt tudom stabilan (viszonylag kis hőfokfüggéssel), egyszerűen előállítani - kristály nélkül, bár lehet, hogy azzal lesz véglegesen megoldva).Így talán elkerülhető lesz az áthallás.

Üdvözlettel: Hurka
(#) Robi98 hozzászólása Nov 4, 2010 /
 
Sziasztok!
Készítettem egy 2 LED-et 1 másodpercenként felváltva villogtató forráskódot,de nem tudom ,hogy jó e, ezért gondoltam,hogy megkérdezem még mielőtt beégetném a mikrokontrollerbe.

A LED-ek a PB3ésPB4-en van

  1. #include<avr/io.h>
  2. #include<util/daley.h>
  3.  
  4. //------------------------
  5. int main(void) {
  6. //------------------------
  7.  
  8. DDRB=(1<<PINB3)|(1<<PINB4);
  9.  
  10. while(1)
  11.  
  12. {
  13.  
  14. PORTB|=(1<<PINB3);
  15.  
  16. _delay_ms(500);
  17.  
  18. _delay_ms(500);
  19.  
  20. PORTB &=~(1<<PINB3);
  21.  
  22. PORTB|=(1<<PINB4);
  23.  
  24. _delay_ms(500);
  25.  
  26. _delay_(500);
  27.  
  28. PORTB &=~(1<<PINB4)
  29.  
  30. };
  31.  
  32. }
(#) gtk válasza Tomi_Bp hozzászólására (») Nov 4, 2010 /
 
Haragrol szo sincs. Ugyis mindenki sajat belatasa szerint cseleszik. Folosleges mellebeszeleseket kerem torolni (ezzel egyutt),.. ez az egyik leghasznosabb topic :smoke:
(#) Reggie válasza Hurka hozzászólására (») Nov 4, 2010 /
 
Igen, ugy mehet a dolog. Sot az a legjobb ha hasznalod a noise reduction sleep mode-ot. Ekkor leall a mintavetelezes idejere a proci futasa.
(#) Reggie válasza Robi98 hozzászólására (») Nov 4, 2010 /
 
Hasznald a hozzaszolas irasakol a Kod gombot, mert nelkule elvesz a kod nagy resze.
(#) Moderátor hozzászólása Robi98 hozzászólására (») Nov 4, 2010
 
Használd máskor a kód beillesztés gombot kérlek.
(#) Robi98 válasza (») Nov 4, 2010 /
 
Köszi!
Most már értem.
(#) Robi98 hozzászólása Nov 4, 2010 /
 
Itt van a kód újból :
  1. #include<avr/io.h>
  2. #include<util/daley.h>
  3.  
  4. //------------------------
  5. int main(void) {
  6. //------------------------
  7.  
  8. DDRB=(1<<PINB3)|(1<<PINB4);
  9.  
  10. while(1)
  11.  
  12. {
  13.  
  14. PORTB|=(1<<PINB3);
  15.  
  16. _delay_ms(500);
  17.  
  18. _delay_ms(500);
  19.  
  20. PORTB &=~(1<<PINB3);
  21.  
  22. PORTB|=(1<<PINB4);
  23.  
  24. _delay_ms(500);
  25.  
  26. _delay_(500);
  27.  
  28. PORTB &=~(1<<PINB4)
  29.  
  30. };
  31.  
  32. }
(#) Hurka válasza Reggie hozzászólására (») Nov 4, 2010 /
 
Igen, de ezzel az lehet a probléma, hogy én ezt a mintavételi frekvenciát egy 555-el állítom elő, és INT0-val megszakításokban kérném le az adc állapotát. Fontos a jel elemzésének szempontjából a NAGYJÁBÓL pontos (néhány tized százalék eltérés max) mintavételi frekvencia. Így is működhet a noise reduction sleep mode?

Üdvözlettel: Hurka
(#) Ricsi89 válasza Robi98 hozzászólására (») Nov 4, 2010 /
 
Majdnem jó.
  1. #include<util/daley.h>

ehelyett ez:
  1. #include <util/delay.h>

meg az include után kellene egy szóköz.
És a végén az utolsó előtti bezáró kapcsoszárójel után nem kell pontosvessző. meg persze a 28- sorban a "_delay_" után kimaradt az "ms". Jah és a 30. sor végén lemaradt egy pontosvessző.
(#) Reggie válasza Hurka hozzászólására (») Nov 4, 2010 /
 
En azt nem ertem, hogy az idoziteshez minek hasznalsz 555-ot, amikor van szamlalo a mikrokontrollerben. Ha kvarcot raksz az AVR-re, akkor pontosabb lesz mint barmilyen 555-os kapcsolas. Amugy igy 555-tel is meg lehet oldani, csak akkor az int0-ra kell egy interrupt kezelo fuggvenyt irni, ami inditja az atalakitast a sleep moddal.
(#) Reggie válasza Robi98 hozzászólására (») Nov 4, 2010 /
 
  1. (1<<PINB3)
helyett
  1. (1<<PB3)
kell es ugyan igy PB4 PINB4 helyett.
(#) Hurka hozzászólása Nov 5, 2010 /
 
Szervusztok!

Problémába ütköztem:
  1. $regfile = "m644pdef.dat"                                   ' specify the used micro
  2. $crystal = 11059200                                         ' used crystal frequency
  3. $baud = 19200                                               ' use baud rate
  4. $hwstack = 32                                               ' default use 32 for the hardware stack
  5. $swstack = 10                                               ' default use 10 for the SW stack
  6. $framesize = 40                                             ' default use 40 for the frame space
  7.  
  8.  
  9. $lib "glcdKS108.lib"
  10.  
  11.  
  12. Wait 2
  13.  
  14.  
  15. 'konfigolni kell a kijelzőt!!!
  16. Config Adc = Single , Prescaler = 4 , Reference = Aref
  17. Config Graphlcd = 128 * 64sed , Dataport = Portc , Controlport = Porta , Ce = 3 , Ce2 = 4 , Cd = 7 , Rd = 6 , Reset = 2 , Enable = 5
  18. Config Portd.7 = Output
  19. Config Int0 = Falling
  20.  
  21. 'The dataport is the portname that is connected to the data lines of the LCD
  22. 'The controlport is the portname which pins are used to control the lcd
  23. 'CE =CS1  Chip select
  24. 'CE2=CS2  Chip select second chip
  25. 'CD=Data/instruction
  26. 'RD=Read
  27. 'RESET = reset
  28. 'ENABLE= Chip Enable
  29.  
  30. 'változók definiálása
  31. Dim Ecg(1152) As Byte
  32. Dim W As Word
  33. Dim V As Double
  34. Dim Count As Long
  35. Dim I As Long
  36. Dim Y As Double
  37. Setfont Font8x8
  38. 'rajzolováltozók
  39.  
  40. Declare Sub Rajzolas()
  41. Cls
  42. On Int0 Megszakitas
  43. Start Adc
  44.  
  45. Enable Interrupts
  46. Set Portd.7
  47. Enable Int0
  48.  
  49.  
  50. Do
  51. Waitus 1
  52. Loop
  53.  
  54. End
  55.  
  56.                                                       'end program
  57. Megszakitas:
  58. Count = Count + 1
  59. W = Getadc(0)
  60. V = W / 4
  61. Ecg(count) = Int(v)
  62. If Count >= 1152 Then
  63. Disable Int0
  64. Disable Interrupts
  65. Reset Portd.7
  66. Call Rajzolas()
  67. End If
  68. Return
  69.  
  70. Sub Rajzolas
  71. Cls
  72. For I = 1 To 128
  73. I = I * 9
  74. Y = Ecg(i)
  75. Y = Y / 4
  76. Y = Int(y)
  77. Y = 64 - Y
  78. I = I / 9
  79. Y = 0
  80. Pset I , Y , 1
  81. Lcdat 1 , 1 , I , 1
  82. Lcdat 2 , 4 , Ecg(i) , 1
  83. Waitms 100
  84. Next I
  85. End Sub
  86.  
  87. $include "font8x8.font"


Az adc bemenetéről mindig 0-t kapok. Mi okozhatja ezt? Az LCD controlportja van a porta-n....

Segítségeteket előre is köszönöm: Hurka
(#) Tomi_Bp hozzászólása Nov 5, 2010 /
 
Sziasztok! Egy újabb probléma vetődött fel. Sokat olvastam az I2C kommunikációról, de most, mikor szeretnék AVR-el kommunikálni velük, fogalmam sincs, hogy álljak neki... Amik a rendelkezésemre állnak: DC-SS503 Digitális iránytű, DS1621 Hőmérő és DS3232 Real Time Clock. Az volna a kérdésem, hogy valaki aki nyilván kommunikált hasonló, vagy ilyen eszközzel, az tudna nekem egy forráskódot felrakni? Biztos azzal is elakadok majd, de szeretnék I2C-n kommunikálni. Előre is köszi a segítséget! Nem mással akarom megíratni a kódot, hanem meg szeretném tanulni, de sajnos egyik AVR-es cikk sem foglalkozik I2C-vel. sem a 8lábu 4 cikk, se a robotos 3, pedig jó lenne ebben a témában is.
Azt tudom, hogy
  1. TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
ez a start,
  1. TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
ez a stop.
(#) Ricsi89 válasza Tomi_Bp hozzászólására (») Nov 5, 2010 /
 
Én ezt használom i2c kommunikálásra, ezt nézegesd ha sajátot akarsz csinálni, vagy használd ezt. Bővebben: Link
(#) Reggie válasza Tomi_Bp hozzászólására (») Nov 5, 2010 /
 
Vagy az Atmel Application Note-ok kozott nezd meg az AVR315.
(#) Hurka hozzászólása Nov 5, 2010 /
 
Hellosztok!

Bascomban egy bájtba bele tudom gyömöszölni a 10 bites ADC értéket úgy, hogy leosztom 4-el és veszem annak egészrészét (vagy kerekítek egészre), nem? Csak mert valamiért nem működik...

Segítségeteket előre is köszönöm: Hurka
(#) ATtiny válasza Hurka hozzászólására (») Nov 5, 2010 /
 
Bár a Bascom -ot nem ismerem konkrétan, de a megoldáshoz nem is kell ismerni a konkrét programnyelvet, hiszen az AVR-ek hardware -ből tudják a 8bites ADC -t mindenféle varázslás nélkül. Mivel a 10bites ADC eredmény csak 2 regiszterben fér el, így van az ADC-nek ADCH és ADCL regisztere. Ezek normál esetben jobbra igazítottak. Tehát az ADCL -ben van az ADC eredmény alsó 8 bitje, míg a ADCH alsó 2 bitje pedig tárolja az ADC eredmény 9. és 10. bitjét. A megoldás a problémádra, hogy úgy kell bekonfigurálni az ADC-t, hogy a szokásos jobbra igazítás helyett balra igazítást alkalmazzon. Tehát az ADC eredmény felső 8 bitje lesz az ADCH regiszterben, míg a az ADC eredmény alsó 2 bitje meg az ADCL regiszter 8. és 7. bitje lesz. Mivel neked csak 8 bit kell, így ki kell olvasni az ADCH regisztert és kész is van a 8bites ADC. Az ADCL regiszterrel nem kell foglalkoznod.
(#) TavIR-AVR válasza Hurka hozzászólására (») Nov 6, 2010 /
 
Igen.
De a GetADC amit visszakapsz WORD típusú!



DIM a as word
dim b as byte

a=getadc(1)
A=A/4
b=a


Ha közvetlenöl a byte-ba akarod beolvasnia getadc-t
b=getadc(1)
akkor az _alsó_ byte kerül bele! Azaz hiba
(#) Tomi_Bp válasza Ricsi89 hozzászólására (») Nov 6, 2010 /
 
Köszönöm a válaszokat és a későbbiekben hasznosítom is majd, amiket megosztottatok velem, de azt hiszem, megvárom Fizikus cikkét a hasonló Honeywell HMC6352 digitális iránytűmodulról. Próbálgattam, meg olvasgattam, de még nem látom át annyira, hogy tudjam mit kérdezzek következőre. Ha jól gondolom, akkor inicializálom az I2C-t és küldök egy kérvényt, hogy mondja meg, merre van észak, majd próbálok fogadni és amint jött valami, feldolgozom... talán... Nagyon sokat google-öztem is, de nem találtam semmi "minta" programot sem. Ha valakinek a hétvégén nagyon sok ideje lenne, szívesen venném, ha elmagyaráznátok, de ha nem, legrosszabb esetben megvárom tényleg Fizikus cikkét.
(#) prody hozzászólása Nov 6, 2010 /
 
A Következő lenne az én problémám:

Írtam egy kis programot ATmega162-re amivel csak sima soros port kommunikációt akarok létrehozni a PC-vel.
Ez megy is de, miért van az hogy a uC-el küldök egy C betűt a terminál elsőre egy fals Karaktert lát ez érthető is, valszeg még akkor hangolódik rá, majd végig a jó karaktert látja, de ha például egy sorosport figyelő programmal nézem, hogy mi megy át (Serial Port Monitor) Akkor már nem ugyanaz a karakter jelenik meg... Illetve van egy Perl programom ami szintén működik, szépen olvas, és ír is, de pont ugyanaz a probléma, ugyanazt a fals karaktert olvassa mint a sorosport figyelő, nem pedig azt amit a terminál, nem a helyeset :S
Karakter kódolással lehet valami vagy mi?
(#) zolee1209 válasza prody hozzászólására (») Nov 6, 2010 /
 
Azonos sebességgel kommunikál a két eszköz? Az AVR sebességéhez megfelelő kvarcot tettél?
(#) Tomi_Bp válasza prody hozzászólására (») Nov 6, 2010 /
 
Szia! Én ezt a kis "gagyi" progit használom, de szerintem nagyon okos és jól működik. Próbáld ki, ha gondolod!

terminal.rar
    
(#) Reggie válasza prody hozzászólására (») Nov 6, 2010 /
 
Jol ertem, hogy ket kulonbozo szoftver ket kulonbozo adatot olvas be, elvileg ugyan arrol a portrol? (Amugy ez most win vagy linux?) Mert ebben az esetben, nem is a uC korul kene eloszor keresni a hibat. Probald meg egy masik szamitogeppel osszedugni a gepedet, es onnan kuldeni valamit.
(#) prody válasza Reggie hozzászólására (») Nov 6, 2010 /
 
hát ez a probléma, a kavarc tuti stimmel atmega162 mellé egy 16 MHz-es kvarc fuse jó F_CPU baud UBRR minden oks, hisz akkor nem is menne át semmi, a baj az csak ez hogy a terminál (Windows alatt) az látja egy rossz karakter után a jó karaktereket, a perl, illetve egy másik sorosport figyelő szoftver pedig ugyanazt a hibás karakter látja :S
Ezt a másik gépen próbáld ki ez egyenlőre nem kivitelezhető, csak majd csütörtökön leghamarabb tehát esetleg valami más tanács?
Következő: »»   276 / 839
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