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   485 / 840
(#) Reggie válasza Adam329 hozzászólására (») Okt 2, 2012 /
 
Nagyon egyszeru: a pufferben mindig a legregebbi erteket irod felul es ezt a poziciot megjegyzed egy valtozoban. Az FFT fuggvenyet ugy kell atirni, hogy az index valtozo ne 0-tol induljon, hanem ettol a poziciotol es ha elert a tomb vegere, akkor az elejerol folytassa a beolvasast egeszen a kezdopozicio-1-ig.
(#) Tomi_Bp hozzászólása Okt 3, 2012 /
 
Sziasztok! Volna egy problémám, melyben a segítségeteket kérném. Jelenleg egy "metrós órát" építek (aki pesti, az ismerheti a hármas/kék metróból, illetve a kisföldalattiból). A problémám az, hogy táp kihúzás, illetve csatlakoztatáskor néha, ritkán az RTC (DS1307) vissza áll alapállásba 2000.01.01. 00:00:00. Az órám szíve egy ATmega328 egy Arduino Nano 3.0 boardon, melyhez SPI-n csatlakozik felfűzve egy marék 74HC595, hozzá pedig egy marék LED. A tápot az Arduino panel USB csatlakozóján kapja.
Milyen szűrést, pufferelés kellene alkalmaznom az üzembiztos működéshez? 100nF + 16µF ? Ezek elé dióda, vagy ellenállás?
Egyáltalán szerintetek ez a hiba forrása? Jó irányban gondolkozom?
(#) zombee válasza Tomi_Bp hozzászólására (») Okt 3, 2012 /
 
Már bocs hogy megkérdezem, de hol az elem?
(#) Adam329 válasza Reggie hozzászólására (») Okt 3, 2012 /
 
Ezt kérlek fejtsd ki bővebben, melyik index változóra gondolsz?
Az FFT-m DIT Radix-2 típusú.
Először a mintát tartalmazó tömb indexeit bit-tükrözött sorrendbe helyezi majd utána fut le rajta az FFT ami 3 egymásba ágyazott for ciklusból áll. A külső a szinteken fut le, a második a diszkrét mintákon a legbelsőben történik a pillangó műveletek számítása. Hogy ne tört számokkal keljen számolni a műveletekhez lookup táblázatot használok.
(#) Tomi_Bp válasza zombee hozzászólására (») Okt 3, 2012 /
 
Az elem az RTC panel hátoldalán természetesen. Képek mellékelve a panelról és a működésről.
(#) kala1982a hozzászólása Okt 3, 2012 /
 
Attiny2313-as kontrollert hogyan tudnám feltámasztani: internal 128kHz, eddig működött is, aztán ezt még osztottam 8-al JTAG kell hozzá vagy másként is megoldható az órajel visszaállítás?
(#) vanzerr válasza kala1982a hozzászólására (») Okt 3, 2012 / 1
 
Szia!

ITT megtalálsz mindent a kérdéseddel kapcsolatosan. Én is sikeresen kizártam magam a chip-ből, megépítettem a mellékelt kapcsolást az ott található leírás, mellékletek alapján és láss csodát sikeresen működik azóta minden.
(#) sikolymester válasza kala1982a hozzászólására (») Okt 3, 2012 /
 
Nem lehet, hogy csak lejjebb kellene venned a programozód frekvenciáját?
(#) zombee válasza sikolymester hozzászólására (») Okt 4, 2012 /
 
Egyes klóntípusoknál vagy firmware verzióknál nem lehet. Pl. a tuxgraphics-os STK500 nem engedi,
de én egy kicsit átírtam a kódot és már lehet, a beállításhoz képest a valós freki is korrekt.
AVR-Doper esetében a SLOW-SCK jumpert kell beállítani, de a legújabb firmware mellett azt se kell.

28/8/4kHz = 4kHz. Ha megy vele a programozó attól még égetni nem enged, csak a FUSE bitek állíthatók.
A hozzászólás módosítva: Okt 4, 2012
(#) Reggie válasza Adam329 hozzászólására (») Okt 4, 2012 /
 
Amivel a puffert(mintat tartalmazo tombot) indexeled.
(#) kala1982a válasza sikolymester hozzászólására (») Okt 4, 2012 /
 
Lancos féle párhuzamos programozóm van, hol tudnám azon állítani a frekvenciát? Vagy szoftveresen kellene valahol? Bascomban szoktam a fuse-biteket állítani.
(#) Adam329 válasza Reggie hozzászólására (») Okt 4, 2012 /
 
Jelenleg a main függvényben van a 'real' tömb. Ezt adom át az FFT függvénynek.
Az FFT függvényben van egy 'rl' tömb ami megkapja a 'real' értékeit és ezen fut le az FFT. Ebben viszont nem tudom, hogy írjam át az indexelést anélkül, hogy ne tegyem tönkre.
Kellene még egy tömb?
(#) zombee válasza kala1982a hozzászólására (») Okt 4, 2012 /
 
PC szoftvere válogatja, de emlékeim szerint nem ajánlja fel egyik sem az ISP freki beállítását.
(#) Reggie válasza Adam329 hozzászólására (») Okt 5, 2012 /
 
Nem kell meg egy tomb, az csak noveli a memoriamuveletek szamat, ami csak lassitja az egeszet.

Eredeti kod:
  1. void fft(input[],output[]) {
  2. ...
  3. for(i=0;i<tomb_meret;i++) {
  4. ...
  5. ...input[i]...; igy hivatkozol az egyes elemekre beolvasaskor
  6. ...output[i]...; igy hivatkozol az egyes elemekre kiiraskor
  7. ...
  8. }
  9. ...
  10. }


modositott kod 1. lehetoseg:
  1. void fft(input[],output[],kezdopozicio) {
  2. ...
  3. for(i=0;i<TOMB_MERETt;i++) {
  4. ...
  5. ...input[(i+kezdopozicio)%TOMB_MERET]...; igy hivatkozol az egyes elemekre beolvasaskor
  6. ...output[i]...; igy hivatkozol az egyes elemekre kiiraskor
  7. }
  8. ...
  9. }


modositott kod 2. lehetoseg:
  1. void fft(input[],output[],kezdopozicio) {
  2. ...
  3. j=kezdopozicio;
  4. for(i=0;i<tomb_meret;i++,j++) {
  5.   if (j==TOMB_MERET) j=0;
  6. ...
  7. ...input[j]...; igy hivatkozol az egyes elemekre beolvasaskor
  8. ...output[i]...; igy hivatkozol az egyes elemekre kiiraskor
  9. }
  10. ...
  11. }
(#) Fargo hozzászólása Okt 7, 2012 /
 
Sziasztok
Számítógépen akarok valós időben megjeleniteni illetve tárolni különböző érzékelőktől jövő jelet erre alkalmas egy avr vagy valaki tud valami olcsó gyári megoldást.
Köszi
(#) Reggie válasza Fargo hozzászólására (») Okt 7, 2012 /
 
Ez attol fugg, hogy milyen es mennyi erzekelorol van szo. Peldaul, ha nehany homerot szeretnel, akkor alkalmas ra. Ha valamilyen igen komoly jelfeldolgozasra is szukseg van, akkor nem.
(#) Fargo válasza Reggie hozzászólására (») Okt 7, 2012 /
 
Főként egyszerű áthaladás érzékelőről lenne szó, 8-10db. Percenként 350-400 jelel/db.
(#) Reggie válasza Fargo hozzászólására (») Okt 7, 2012 /
 
Ehhez boven elegendo.
(#) Fargo válasza Reggie hozzászólására (») Okt 7, 2012 /
 
Még esetleg annyi kérdésem lenne, ha avr-ről ft232-vel beviszem usb-n keresztül a pc-be.Ott van valami egyszerű dolog hogy rögzítsem vagy keresek programozót?
(#) Reggie válasza Fargo hozzászólására (») Okt 7, 2012 /
 
Szerintem mindenkeppen szukseged lesz valamilyen programra. Gondolom az elmentett rekordokhoz celszeru lenne idobelyeget is hozzarendelni, mert kulonben nem lenne visszakeresheto egy-egy esemeny.
(#) Fargo válasza Reggie hozzászólására (») Okt 7, 2012 /
 
Köszi
(#) Fizikus válasza Fargo hozzászólására (») Okt 8, 2012 /
 
A Processing-ben eleg egyszeruen megoldhato a soros portrol jovo adatok feldolgozasa.
Processing
(#) szdavid hozzászólása Okt 8, 2012 /
 
Egy több processzoros rendszer kódját portoltam CodeVision-ből Atmel Studio 6-ba.
A processzorok közötti kommunikáció SPI-n történik. A teljes kommunikáció megszakítás(ok)ban zajlik. Hogy ne kavarjon be a főprogram, ezért globális flagekkel nézem, hogy milyen állapotú a kommunikáció.
Az optimalizációs beállításnál -O1-et adtam meg, és a következő furcsaságot találtam: az alábbi kódokat mind ugyanarra fordítja:
C
  1. while (notReady);

  1. do{}
  2. while (notReady);

  1. for (;notReady;);

  1. wait:
  2. if (notReady) goto wait;


ASM
  1. LDS R24, notReady
  2. TST R24
  3. BRNE PC+x
  4. ...
  5. "PC+x" RJMP PC-0x0000


Tehát a "notReady" globális változót (unsigned char típus) az SPI megszakítás állítgatja, ennek ellenére deadlockot generál az Atmel Studio.
-O0 optimalizációnál nincs ez a gond, viszont időkritikus részeknél kritikán aluli a fordított asm kód.
Átmenetileg megoldottam asm betéttel a problémát, de ezt nem tartom túl elegánsnak. Valakinek van valami jó tippje, mit próbáljak?
(#) szdavid válasza szdavid hozzászólására (») Okt 8, 2012 /
 
Kipróbáltam "volatile"-lal, így már jó kódot fordít. (Tudom, hogy benne van a keretes részben, de nem ISP-t, hanem GCC-t használtam. Az előző hozzászólást azért nem töröltem, mert nekem fél nap szívás volt, mire rájöttem miért fagy a kommunikáció)
(#) sikolymester válasza szdavid hozzászólására (») Okt 8, 2012 /
 
Idézet:
„de nem ISP-t, hanem GCC-t használtam”


Gondolom ISR-re gondoltál, ami megszakítást jelent. Az ISP az az In System Programmer.
Megjegyzem a fent olvasható alapszabályok, ahogyan írja is, a GCC fordítóra vonatkoznak.
(#) szdavid válasza sikolymester hozzászólására (») Okt 8, 2012 /
 
Már nem láttam az idegtől így az ISR-t IAR-nek olvastam, és ISP-nek írtam. Ettől függetlenül nekem nagy tanulság volt a dolog, szerintem nem baj, ha megmarad. Ha máshogy gondoljátok, a modik le tudják törölni. Egyébként hatalmas segítség ez a fórum, mert már tényleg el voltam veszve, idejöttem, és szó szerint 5 perc alatt megoldódott a problémám, amire a gugli 4 nap alatt nem volt képes... Ezért hála és köszönet
(#) Reggie válasza szdavid hozzászólására (») Okt 8, 2012 /
 
.....
A hozzászólás módosítva: Okt 8, 2012
(#) Sick-Bastard hozzászólása Okt 8, 2012 /
 
Üdv!

Csináltam egy módosított dasa programozót, amivel megy az AVR felprogramozás.
Avrdude-dal teszteltem és WinAVR-rel programoztam.
Példának az oldalon található egyik cikk 5. oldalán található kódját használtam.

A program fut, de vannak eltérések:
- A kezdésnél nem az első LED-del kezdi, hanem a 2.-al
- visszafele szintén nem a 8. LED-et használja hanem a 7.-et
- sebessége sokkal lassabb a videóhoz képest

AVR: ATMega8535-16PU
Így módosítottam(vastag betűsek):
  1. /*****************************************************************
  2.     //  Fajlenev : 74HC595.c
  3.     //  Verzio   : 1.0
  4.     //  Leiras   : SPI hasznalata 74HC595 8-bites shift regiszterrel
  5.     //  2011 Majus 14.
  6.     ******************************************************************/
  7.     #include <avr/io.h>
  8.     #include <util/delay.h>
  9.      
  10.     #define SPI_PORT PORTB
  11.     #define SPI_DDR  DDRB
  12.     #define SPI_74HC595_CS  [b]PB4[/b] // 74HC595 SPI-t aktivalo Chip Select lab
  13.     #define F_CPU 4000000UL // rendszer orajel: 4 MHz
  14.      
  15.     void SPI_74HC595_Write(unsigned char adatki)
  16.     {
  17.       // 74HC595 SPI bekapcsolasa (CS lab logikai alacsony szint)
  18.       SPI_PORT &= ~(1<<SPI_74HC595_CS);
  19.       _delay_us(1);
  20.       // Adattranszfer elinditasa (MOSI)
  21.       SPDR = adatki;
  22.       // Varakozas amig az adattranszfer befejezodik
  23.       while(!(SPSR & (1<<SPIF)));
  24.       // 74HC595 SPI kikapcsolasa, Latch kimenetek bekapcsolasa
  25.       SPI_PORT |= (1<<SPI_74HC595_CS);
  26.     }
  27.      
  28.     int main(void)
  29.     {
  30.           unsigned char cnt;
  31.       // AVR ATMega8 SPI periferia beallitasa
  32.       // MOSI es SCK kimenet, a tobbi bemenet
  33.       SPI_DDR = (1<<[b]PB7[/b])|(1<<PB5)|(1<<[b]PB4[/b]);
  34.       // SPI engedelyezese, Master mod, SPI orajel beallitasa
  35.       SPCR = (1<<SPE)|(1<<MSTR);
  36.          [b] SPSR = (1<<SPI2X);[/b]
  37.       // 74HC595 SPI kikapcsolasa, Latch kimenetek bekapcsolasa
  38.       SPI_PORT |= (1<<SPI_74HC595_CS);
  39.       // 74HC595 shift regiszter reszetelese
  40.       SPI_74HC595_Write(0);
  41.      
  42.       for(;;)
  43.       {
  44.         cnt=1;
  45.         while(cnt)
  46.         {
  47.           cnt=cnt<<1;
  48.           SPI_74HC595_Write(cnt);
  49.           _delay_ms([b]250[/b]);
  50.         }
  51.         cnt=0x80;
  52.         while(cnt)
  53.         {
  54.           cnt=cnt>>1;
  55.           SPI_74HC595_Write(cnt);
  56.           _delay_ms([b]250[/b]);
  57.         }
  58.       }
  59.       return 0;
  60.     }


Az eredetit nem másolom be, az oldalon megtalálható.
Lényegében azzal próbálkoztam, hogy a várakozást feleztem meg, ill. az SPI órajelét nem 16-oltam hanem csak feleztem, de így is olyan lassú maradt.

Mi lehet a gond?
(#) blackdog hozzászólása Okt 8, 2012 /
 
Sziasztok!

LM35 IC-vel szeretnék hőmérsékletet mérni 10-80 C tartományban 0,5 C kijelzéssel.
Az ADC-nek külső referencia feszülséget biztosítanék TL431 IC-vel.
Kérdésem, hogy ugye ebben az esetben az LM35 táp lábát ugye az AVR AREF lábára kell kötni és nem a VCC-re?
(#) zolee1209 válasza blackdog hozzászólására (») Okt 8, 2012 /
 
Szerintem ugyanúgy tápra kell kötnöd. Bár a 800mV-ot képes lehet kiadni a Ref. feszről is, én azért tápra kötném...
Következő: »»   485 / 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