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   363 / 840
(#) TavIR-AVR válasza chocob hozzászólására (») Okt 2, 2011 /
 
Aref többféle lehet:
- belső referenciafesz
- külső referenciafesz
- belső tápfesz.

Én - biztos ami biztos - 100nF kerámiakondival szűröm a GND fele. Viszont ténylegesen csak az ADC használja.

De az AVCC, GNDA mindig bekötendő.
(#) Robi98 hozzászólása Okt 3, 2011 /
 
Sziasztok!
Készítettem egy LED-es futófényt ami 8 LED-ből áll és ha egy potmétert tekerünk a futófény villogási sebessége nő.
A baj csak az lenne, hogy a fordító talált benne egy hibát amit abszolút nem tudok kijavítani mert nem jövök rá, hogy az adott sorban mi a hiba; valamint egy figyelmeztetést is adott de arra sem jöttem rá.

Ezért most leírom a kódot:
  1. #include<avr/io.h>
  2. #include<util/delay.h>
  3.  
  4. int main(){
  5.  
  6. DDRD|=0xFF;
  7. ADMUX=(1<<REFS0)|(1<<ADLAR);
  8. ADCSRA=(1<<ADEN)|(1<<ADPS1)|(1<<ADPS0);
  9.  
  10. void ADConverter(unsigned char csatorna)
  11. {
  12. ADMUX|=csatorna;
  13. ADCSRA|=(1<<ADSC);
  14. while(ADCSRA & (1<<ADSC));
  15. return ADCH;
  16. };
  17.  
  18. unsigned char potmeter,i,j;
  19.  
  20. void szunet(unsigned char n)
  21. {
  22.  
  23. for(j=1;j<=n;j++) _delay_ms(5);
  24. }
  25.  
  26. while(1){
  27.  
  28. i=0b10000000;
  29.  
  30. potmeter=ADConverter(1);
  31.  
  32. while(i){
  33. i=i>>1;
  34. PORTD=i;
  35. szunet(potmeter);
  36. }
  37.  
  38. i=0b00000001;
  39. while(i)
  40. {
  41. i=i<<1;
  42. PORTD=i;
  43. szunet(potmeter);
  44. }
  45.  
  46. };
  47.  
  48. };

A hibát a potméter változó definiálásánál, míg a figyelmeztetést a " return (ADCH) " sornál találta.

És végül a hibaüzenetek:../main.c:16: warning: 'return' with a value, in function returning void
és

../main.c:31: error: void value not ignored as it ought to be

Köszönöm mindenkinek a lehetséges választ.
(#) covek válasza Robi98 hozzászólására (») Okt 3, 2011 /
 
Ha a függvényed visszatérési értéke void is meg nem is akkor ne csodálkozz a warning miatt. Aztán akkor se ha egy visszatérési értékként void-ot adsz át egy változónak.
(#) UbiLinux válasza Robi98 hozzászólására (») Okt 3, 2011 /
 
Ugye, nem zavar, hogy már megkaptad a választ, attól még újra meg tudod kérdezni.
http://www.hobbielektronika.hu/forum/topic_hsz_1073162.html#1073162
(#) Robi98 válasza covek hozzászólására (») Okt 3, 2011 /
 
Sajnos kezdő vagyok és elég hülye is hozzá és nem tudum, hogyan lehetne kijavítani a hibákat.
És mivel a programozást csak hobbiból tanultam és nem iskolában ezért elég sok mindent rosszul csinálok.
(#) Robi98 válasza UbiLinux hozzászólására (») Okt 3, 2011 /
 
Ezer bocsánat!Ép akkor alakították az oldalt és nagyon lassan lett elküldve én meg azt hittem, hogy nem is küldte el, mert hiba történt. :bummafejbe:
Ha ezt tudtam volna nem kérdeztem volna meg újra.
(#) lorant hozzászólása Okt 3, 2011 /
 
Sziasztok
Segítségre lenne szükségem.
Van egy arduino duemilanom és ezzel szeretnék egy relét kapcsolni de egy tv távirányítóval. Megoldható valahogy? Van TSOP 1738-am. Kerestem google ban sok sok forráskódot próbálgattam is őket de igazán egyik sem működött. A távirányitó univerzális programozható. Valaki ha tudna segíteni az nagyon jó lenne előre is köszönöm
(#) UbiLinux válasza Robi98 hozzászólására (») Okt 3, 2011 /
 
De a problémát érted? A main soha nem érhet véget, az egy örök ciklus kell legyen. A procedurákat innen hívogatod.
(#) trudnai válasza Robi98 hozzászólására (») Okt 3, 2011 / 1
 
Idézet:
„És mivel a programozást csak hobbiból tanultam és nem iskolában ezért elég sok mindent rosszul csinálok.”


En a mai napig ugy tartom, hogy iskolaban nem lehet megtanulni programozni. Adhatnak egy szamarvezetot, ami alapjan megtanulhatod, de mindenkeppen otthon es passzibol kell tanulni, kenyszerbol az nem megy.

Amugy meg mindig lehet ujat tanulni, szoval ne aggodj azon ha valamit nem tudsz. Elso a googli hasznalata -- foleg ha angolul tudsz, az esetek 90%-ban hamar meg lehet talalni, hogy valaki mar kerdezett ilyet, avagy valami leiras epp a kerdesedet targyalja. Ha pedig nem talalsz infot akkor itt vannak a segitokesz emberek
(#) sikolymester válasza lorant hozzászólására (») Okt 4, 2011 / 1
 
Persze, hogy megoldható.

Jó lenne tudni, hogy mégis milyen a távirányítód jele. A TSOP1738-as 38kHz -es jelhez ideális.

Megméred a távirányító jelet valahogy. Pl oszcilloszkóppal rámérsz a távirányítóra, vagy egy fototranzisztorral, ami az arduinodra van kötve. Utóbbit sötétben, hogy ne zavarjanak be fényforrások.

Nos, ha már tudod, hogy milyen a jel, amit venned kell, akkor már csak meglesed a TSOP1738 adatlapot és megnézed, hogy a mérendő jelet milyen módon szűri meg és adja ki a kimeneten.

Ennyi.
(#) TavIR-AVR válasza lorant hozzászólására (») Okt 4, 2011 / 1
 
A taviranyito kodjele nem mindegy. Protokoll lehet:
RC5, RC6, RC65 (Philips), NEC, Sony és még vagy 4 féle...
Az RC5 és a Sony-ra vannak meg a dekódolóprogramok arduino fórumokban...

A frekvencia lehet 30--32-34-36-38-40-56 kHz
A 36 a leggyakoribb. Ha ezt 38k-s vevővel veszed, az kb. felere visszaesett hatotavval szamolhato.
(#) Reggie válasza lorant hozzászólására (») Okt 4, 2011 / 1
 
Van egy nagyon jo linuxos project, aminek LIRC a neve. Ha ezt letoltod, akkor az adatbazisabol kikeresheted a taviranyito tipusat es azt a definicios fajlt fel tudod hasznalni a kezeleshez. Ha nincs benne az adatbazisaban, akkor telepitsd fel a programot es vedd fel az adatbazisba a taviranyitot (felteve, hogy van infra vevod a szamitogepedhez).
(#) zsidanyi hozzászólása Okt 4, 2011 /
 
Hello!

Tudom hogy nem szorosan a témához kapcsolódik a kérdésem, mégis úgy érzem nem tudom másik topic-ban feltenni (mentségemre szóljon hogy a feladatot AVR-el szeretném megoldani ).
A kérdésem a következő: tud valaki valamilyen oldalról, segédanyagról, ami az auto EQ-ról szól? Értem ezalatt, a működés elvét, különböző megvalósításokat stb.
Körbenéztem kicsit, de eddig semmit nem sikerült összeszednem róla és nagyon fontos lenne....
Még egyszer bocs a kicsit eltérő témáért, és előre is kösz a válaszokat
(#) Reggie válasza zsidanyi hozzászólására (») Okt 4, 2011 /
 
Mit szeretnel konkretan megvalositani? Alapvetoen az automatic equalizer eleg egszeru bemeno jel -> fouriert -> komponensek amplitudojanak modositasa -> inverz fourier -> kimeno jel.
Ha te a ezt igy szeretned megcsinalni, akkor sima AVR felejto, mert nem eleg a teljesitmenye. Ha csak a vezerlest szeretned digitalisra es a kulonbozo frekvenciaju komponenseket analog aramkorokkel akarod modositani, akkor elegendo, bar igy sok analog elemre lesz szugseged.
Ha a digitalisat szeretned megvalositani, akkor javaslom, hogy tanulmanyozd egy kicsit az Atmel AVR32 EVK1105 demonstracios panelt, amely pont az ilyen jelformalassal/generalassal/mp3 dekodolassal foglalkozik.
(#) Lúd-fi hozzászólása Okt 4, 2011 /
 
Sziasztok!

Még mielőtt abszolút nullára kerül önbecsülésem, kérlek segítsetek. Nem értem ... már öt napja nem.

Tehát, a szitu az, hogy tc0-t elindítom és figyelem a túlcsordulást. Túlcsorduláskor léptetem eggyel a timer változót. Amikor a megszakításhoz írom a feltételt (1. eset), akkor timer = 100-nál nullázódik és PORTA = 1. Ez sima ügy. DE amikor a főprogiba szeretném ugyanezt (2. eset), akkor már nem működik a feltétel. Próbáltam már feltétel előtt/után ki/be kapcsolni a megszakítást, de az sem segített. Érthetően írtam le a szitut? Remélem sikerül megoldást találni, mert már se éjjelem, se nappalom. Előre is köszi sokat.

  1. ISR (TIMER0_OVF_vect)
  2.  
  3. {
  4.  
  5. timer = timer + 1;
  6.  
  7.  
  8. // 1. eset
  9. if (timer == 100)
  10. {
  11. PORTA = 1;
  12. timer = 0;
  13. }
  14. else
  15. ;
  16.  
  17.  
  18. }
  19.  
  20.  
  21. int main(void)
  22. {
  23.  // timer indítom
  24.    
  25. while(1)
  26. {
  27.  
  28. // megy a progi ciklus
  29.  
  30. // 2. eset
  31. if (timer == 100)
  32. {
  33. PORTA = 1;
  34. timer = 0;
  35. }
  36. else
  37. ;
  38.  
  39.  
  40. }
(#) UbiLinux válasza Lúd-fi hozzászólására (») Okt 4, 2011 /
 
1.Miből gondolod, hogy nem működik a feltétel? Nem látod bebillenni a portot?
2. Feltételezhetően a programod nem csak ennyi, mert pl. a DDRA-t sem látom inicializálni, az interrupt felprogramozásából sem látni semmit, pedig úgy tűnik, hogy a nem közölt részekben van a gond. Amit írtál, abban minden rendben - feltéve, hogy a timer globális változó.
(#) UbiLinux válasza UbiLinux hozzászólására (») Okt 4, 2011 /
 
3. Ha nem használon az 'else' ágat, akkor felesleges az önmagában álló értelmetlen 'else'.
if (feltétel)
{
akkor ez
meg ez
}
és a bezáró kapcsos zárójellel vége is történetnek.
(#) Reggie válasza Lúd-fi hozzászólására (») Okt 4, 2011 /
 
Mivel a megszakitasban noveled a timer erteket, igy itt eri el a 100-at, viszont a megszakitasbol torteno kilepes elott lenullazod, ha 100 az erteke, igy a foprogramban csak 0-99 kozotti ertekeket fogsz belole kiolvasni.
Ha ezt el akarod kerulni, akkor a timer==100 ellenorzest a timer=timert+1 ele kell irnod, es akkor mar 1..100 kozott fog felvenni ertekeket.
Ha a timer==100 else agaba rakod a timer noveleset, akkor 0..100 kozott fog felvenni ertekeket.
(#) KSTEFFY hozzászólása Okt 4, 2011 /
 
Halli! Ha valakit érdekel LOW COST AVR ISP MKII clone
akkor nézze meg ezt semmi spec ic 1db proci!
Hátránya nem méri a target board feszültségét
USB-röl táplált a target boargnak tud 5volt és 3,3voltot
bisztositani! megépitéséhez nem kell programozó!!!!
Önmagát programoza ATMEL FLIP.en keresztül.
(#) lorant válasza sikolymester hozzászólására (») Okt 4, 2011 /
 
Hm ez a fototranzisztoros dolog tetszik. De rákötöm és mégis mit figyaljek vagy milyen programot irjak a kezelésére?
(#) luxmanpower hozzászólása Okt 4, 2011 /
 
HEllo! Következő a problémám: soros porton kap a proci egy stringet, mely hatására vissza kellne írnia egy másikat. ez a függvény amit meghívok
  1. void UartChar( char *szovegmutato)
  2. {
  3. while(*szovegmutato)
  4. {
  5. while(! (UCSR0A & (1<<UDRE0)));
  6. UDR0 = *szovegmutato;
  7. szovegmutato++;
  8. }
  9. }


De csak akkor hajlandó működni ha egy break pontot rakok a függvény elé, megáll a program, majd a folytatásra nyomok. Ha folyamatosan megy akkor nem. Próbáltam hogy kikapcsolom előtte a megszakításokat, de az sem használt. Van valakinek valami ötlete? Köszi.
(#) zsidanyi válasza Reggie hozzászólására (») Okt 4, 2011 /
 
Csak a vezérlést kéne mikrokontrolleresen megoldani, igazából akkor egy egyszerű DFT-t kell implementálni a mikrokontrollerre, és egy ideális spektrumhoz képesti eltérést kéne kiszámolni, és ezt az információt továbbítani.
De mindenképpen megnézem a demonstrációs panelt, és köszi a segítséget .
Egyébként arra gondoltam, hogy milyen mérőjelet szoktak használni, milyen algoritmust használnak az ideális spektrum megközelítéséhez?
(#) Lúd-fi hozzászólása Okt 4, 2011 /
 
Kedves Ubilinux és Reggie!

Beszúrom a két esetet teljes egészében. Amikor a megszakításban van a feltétel, akkor semmi probléma kb. másodpercenként kiír egy csillagot az LCD-re. Ez stimmel, mert 7xMhz az órajel, 1024-es az osztó és 8bit számláló.
Amikor ugyanezt a feltételt a főprogiba teszem, akkor már semmit nem ír az LCD, tehát, nem valósul meg a feltétel.
Megj: az else-ket majd kiveszem, csak most értem haza és még nem szedtem ki őket, meg az LCD késleltetést is kiszedem jöhet az adat megoldásra, csak idő kérdése

Valamit nagyon benézek, de nem tudom mit és bocs a hosszú kódért.

Működő kód:
  1. #define F_CPU 7372800UL // rendszer orajel: 7.3728 MHz
  2. #define USART_BAUDRATE 9600 // soros kommunikacio sebessege: 9600 bps
  3.  
  4. #define GOMB_OK 64
  5. #define BACK 128
  6. #define RSE PORTD
  7. #define DB PORTB
  8.  
  9. #include <avr/io.h>
  10. #include <util/delay.h>
  11. #include <avr/interrupt.h>
  12.  
  13. int timer;
  14.  
  15. ISR (TIMER0_OVF_vect)
  16.  
  17. {
  18. timer = timer + 1;
  19. if (timer == 20)// itt látszik a * az LCD-n
  20. {
  21. RSE = 192;
  22. _delay_us(100);
  23. DB = 42;// LCD: *
  24. RSE = 0;
  25. timer = 0;
  26. }
  27. sei();
  28. }
  29.  
  30. int main(void) // Foprogram
  31. {
  32.    
  33.   DDRA = 31;// ez egy másik project beállítása, de ide is jó
  34. DDRB = 255;
  35. DDRC = 0;
  36. DDRD = 192;
  37.  
  38. timer = 0;
  39. LCDinit();
  40. TIMSK0 = (1 << TOIE0);// overflow int bekapcs
  41. sei();
  42.  
  43. while(1)
  44. {
  45. if ((PINC & GOMB_OK) == 0)// timer bekapcs
  46. TCCR0B = (1 << CS00) | (1 << CS02);
  47. else if ((PINC & BACK) == 0) // LCD töröl, timer kikapcs
  48. {
  49. _delay_us(100);
  50. DB = 1;
  51. RSE = 0;
  52. TCCR0B = 0;
  53. }
  54. else
  55. ;
  56.  
  57.  
  58.  
  59. }
  60.  
  61. }
  62.  
  63.  
  64.  
  65. void LCDinit()
  66. {
  67. RSE = 128;
  68. _delay_ms(100);
  69. DB = 59;
  70. RSE = 0;
  71.  
  72. RSE = 128;
  73. _delay_us(100);
  74. DB = 56;
  75. RSE = 0;
  76.  
  77. RSE = 128;
  78. _delay_us(100);
  79. DB = 12;
  80. RSE = 0;
  81.  
  82. RSE = 128;
  83. _delay_us(100);
  84. DB = 1;
  85. RSE = 0;
  86.  
  87. RSE = 128;
  88. _delay_ms(10);
  89. DB = 6;
  90. RSE = 0;
  91. }


És a nem működő kód:
  1. ISR (TIMER0_OVF_vect)
  2.  
  3. {
  4. timer = timer + 1;
  5.  
  6. sei();
  7. }
  8.  
  9. int main(void) // Foprogram
  10. {
  11.    
  12.   DDRA = 31;// ez egy másik project beállítása, de ide is jó
  13. DDRB = 255;
  14. DDRC = 0;
  15. DDRD = 192;
  16.  
  17. timer = 0;
  18. LCDinit();
  19. TIMSK0 = (1 << TOIE0);// overflow int bekapcs
  20. sei();
  21.  
  22. while(1)
  23. {
  24. if ((PINC & GOMB_OK) == 0)// timer bekapcs
  25. TCCR0B = (1 << CS00) | (1 << CS02);
  26. else if ((PINC & BACK) == 0) // LCD töröl, timer kikapcs
  27. {
  28. _delay_us(100);
  29. DB = 1;
  30. RSE = 0;
  31. TCCR0B = 0;
  32. }
  33. else
  34. ;
  35.  
  36. if (timer == 20)// itt nem látszik semmi az LCD-n
  37. {
  38. RSE = 192;
  39. _delay_us(100);
  40. DB = 42;// LCD: *
  41. RSE = 0;
  42. timer = 0;
  43. }
  44.  
  45.  
  46. }
  47.  
  48. }
(#) Reggie válasza Lúd-fi hozzászólására (») Okt 4, 2011 / 1
 
A timer valtozo nem volatile. Ha egy valtozot hasznalsz foprogramban es megszakitasban, akkor mindig legyen volatile, kulonben kioptimalizalja a kodot es ha regiszterben tartja, akkor a memoriaban nem frissul, igy ket eltero erteket lat a megszakitas es a foprogram.

(Topicban az 1. pont, mielott kerdezel azt a listat fussad at mindig)
(#) Reggie válasza Reggie hozzászólására (») Okt 4, 2011 /
 
Elfelejtettem hozzatenni: a timer 8 bites valtozo legyen, mert az AVR szohossza 8 bit, igy egy lepesben csak ekkora valtozon tudsz muveletet vegezni. Ha nagyobb valtozot akarsz, akkor a teszteles idejere le kell tiltani a megszakitasokat, vagy segedvaltozoba kell masolni a timer-t es a segedvaltozot kell tesztelni, de a masolas idejere szinten le kell tiltani a megszakitasokat.
(#) Robi98 hozzászólása Okt 4, 2011 /
 
Sziasztok!
Azt szeretném kérdezni, hogy mi különbség van egy void és egy uint8_t típusú fügvény között?
(#) Ricsi89 válasza Robi98 hozzászólására (») Okt 4, 2011 /
 
Void-nál általában nincs visszatérési érték, visszatérés nélküli függvény. Nem is igazából függvény, hanem eljárásnak szokás nevezni ezt a típust. A másiknál pedig a visszatérési érték típusát adod meg ilyen módon. Tehát ha egy függvény uint8_t típusú, akkor a visszatérési értéke 8bites pozitív egész szám lesz. (0-255-ig)
(#) Reggie válasza Ricsi89 hozzászólására (») Okt 4, 2011 /
 
Nem altalaban, sosincs. Ezert void.
(#) lorant hozzászólása Okt 4, 2011 /
 
Sikerült megoldanom az IR távirányitó problémát
találtam ezt az oldalat:
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1176098434

itt a forráskód tökéletesen megy Sony protokollal
Köszönöm mindenkinek a segitséget.
(#) Lúd-fi válasza Reggie hozzászólására (») Okt 4, 2011 /
 
Köszi Reggie! Olvastam az 1. pontot, csak nem tudtam, mit jelent. Remélem egyszer majd én is tudok értelmes tanácsot adni másoknak.
Következő: »»   363 / 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