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   507 / 840
(#) sikolymester válasza Massawa hozzászólására (») Jan 13, 2013 /
 
Semmi baja nem lesz, hogyha 20kHz fölötti PWM-mel vezérli a motort. Legalább tényleg nem fog sípolni. A vesztesség mindenesetre nőni fog a végfokban a magasabb kapcsolgatási frekvencia miatt.
Arra kell ügyelni, hogy a FET/IGBT/Tranzisztor vagy akármi is képes legyen erre a sebességre, meg persze a flyback dióda is.
(#) csabeszq válasza bbb hozzászólására (») Jan 13, 2013 /
 
Sajnos a kapcsolásodhoz a RESET lábat is be kell állítani, nemcsak az órajelet.

Nem rontottad el, így kell csinálni. Csakhát utána nem tudod programozni. Biztos, hogy nem működik egyáltalán?

Ha letöltötted a programot, beállítottad a RESET-et, jó az órajel frekvencia, akkor mennie kellene.
(#) csabeszq válasza csabeszq hozzászólására (») Jan 13, 2013 /
 
bbb, gondolom Linux alól próbálod, mert a honlap Linux kerneles driverről is ír.

Ha az lsusb -v után látod az ezközt, akkor driver hiba lesz a probléma oka.
(#) kiborg válasza zombee hozzászólására (») Jan 13, 2013 /
 
Szia!
Akkor mégse értem a gondolatmenetedet.
Az IF sor (benne a megszakításban) végignézi a komparátorokat, ez eddig szintén ok. De hogy tudja az az egy sor ki is meg be is kapcsolni az átmeneti tároló adott bitjét(bekapcsolás OK, de kikapcsolás nem)? Ezt megint nem értem.
Tudsz esetleg konkrét kódot/kódrészletet mutatni?

@sikolymester: EZT a FEt-et használom a kapcsolásban. Szerintem bírja a 20kHz-et. Én is a zúgás/sípolás miatt választottam ekkora frekvenciát.

Üdv Kiborg
A hozzászólás módosítva: Jan 13, 2013
(#) Massawa válasza sikolymester hozzászólására (») Jan 13, 2013 /
 
Baj nem lesz, csak éppenséggel nem azt teszed amit akarsz. A motorok impedanciája 10 kHz felett már olyan nagy, hogy az impulzusokat alig tudod rajta átnyomni, azaz eléggé felesleges a munka. (Amugy ez a kérdés már sokszor ki lett itt is, meg máshol is tárgyalva.)

Ha valoban a PWM jellel akarod a motor vezérelni (azaz kihasználni a PWM adta lehetöségeket, szuper lassu, de erös indulást, precizios fordulatszám vezérlést stb.), akkor sokkal kisebb freki kell.
Ha csak az energiát akarod átvinni, akkor lehet akár 20 kHz is, csak a motor nem egészen ugy reagál erre ahogy müködne lassabb frekin.


(Amugy a frekvenciát érdemes az adott motorra optimalizálni - mert szinte mindegyik másképp reagál).

Abszolut nem a diodákról meg a tranzisztorokrol van szo, hanem egyszerü fizikárol.
(#) kiborg válasza Massawa hozzászólására (») Jan 13, 2013 /
 
Szia!
Egy szénkefés modellmotorról van szó.
Üdv Kiborg
(#) Massawa válasza kiborg hozzászólására (») Jan 13, 2013 /
 
Gondoltam - annak kimondottan nem jo az ilyen ultrahang.....
(#) zombee válasza kiborg hozzászólására (») Jan 13, 2013 /
 
Az átmeneti tárolót azért használom, hogy ha több komparátor van, a sok IF miatt késlekedés lenne.
A legvégén az átmeneti tároló értékét átviszem a PortX-be, azaz itt be-és ki is kapcsolja őket.
Az átmeneti tárolót pedig a létrehozásakor nullázni kell, ez lehet hogy lemaradt.
(#) mario1111 hozzászólása Jan 13, 2013 /
 
Sziasztok!

Xmegás problémába futottam bele. Egy ATXMEGA 256 A3 AU szivat.
Szeretném használni az A ADC konverterét. Hellyel közzel működik is.
A gond, hogy egy 4k7-1k feszosztót mérek vele, amit a felsőbb tartományokban helyesen mér, de amikor 200 mV körüli jel jut az ADC-re, akkor elkezd hamisan mérni. De nem úgy hamisan, hogy rossz értéket ad a mérés, hanem visszadolgozik a feszosztóra.
Amikor pl 0,21 V-ot kap a feszosztó akkor, ott 36 mV-nak kellene a feszosztó kimenetén lenni, és ha nincs összekötve a feszosztó az AD lábbal, akkor annyi is. Ha rákötöm, akkor meg 55 mV-ot ra felhúzza.

Készítettem egy diagramot is, hogy hogyan módosítja a feszosztót. A 10. mérési pontban annyira eltorzul , mintha nem egy 4k7-1k , hanem egy 4k7-1k5 feszosztó lenne eredetileg.

Már próbáltam mindent, ami eszembe jutott. Bemenetnek van konfigurálva, PINnCTRL-oknál kikapcsolva a digital input buffer... Signed, unsigned módban is, de valamiért visszadolgozik.

Valami ötlet?

Márió
(#) kiborg válasza mario1111 hozzászólására (») Jan 13, 2013 /
 
Szia!
Nincs véletlenül bekapcsolva a porton a belső felhúzó ellenállás?
Üdv Kiborg
(#) mario1111 válasza kiborg hozzászólására (») Jan 13, 2013 /
 
Itt már máshogy kell konfigolni, mint atmeganal. Itt a PINnCTRL-al lehet állítgatni, hogy milyen típusú legyen a kimenet/bemenet és itt ki van minden kapcsolva, ahogy az adatlap javasolja analóg dolgokhoz még a digital input buffert is kikapacsoltam.

Márió
(#) Sick-Bastard hozzászólása Jan 13, 2013 /
 
Üdv!

Mostani alkalommal úgy gondoltam, hogy egy SPI-s EEPROM-mal ismerkedem (25LC320).

Valami, mint általában, most is hiányzik...

Egyből írni akartam a chipet, de nem ment, így váltottam a "szimpla" chipben lévő státusz regiszter olvasásába és némi módosításába (írás engedélyesés és tiltás).

Hogy megtudjam, mit is érek el, a kiolvasott adatokat egy 74HC595-es shift registerrel és ledekkel iratom ki.

Mellékeltem a kódokat.

Mint általában most is biztos sok hiányossága van.

Az egész kódból csak a ROMRDSR() (eeprom.h-ban), SPIWR() (SPI.h-ban), SPI_Init() (SPI.h-ban) macrokat (ha jól tudom ezeket hívják macronak) használom.

2 hibaforrásra gondoltam:
1. hogy a biteket fordítva töltöm fel, MSB - LSB felcserélése
2. az adatok írásánál a ROM az SCK felfutó élére shifter, az olvasásnál meg a lefutó élre (ha jól értettem az adatlapot)

Ha nem ezek közül az egyik, vagy mind2, a hiba akkor mi lehet?

AVR: ATMega8535 belső oszcillátor @ 8Mhz, 4-4,5V

SB
(#) bbb válasza csabeszq hozzászólására (») Jan 13, 2013 /
 
Igen, az oldal utasítását követtem, hogy állítsam be a RESET lábat, persze azt már nem írta, hogy utána már csak HVSP-vel lehet gyilkolászni...

Windows alól próbálom, mivel úgy gondolom, ha működik, akkor itt is mennie kellene. A windows viszont azt mondja, hogy leállította az eszközt mert az hibát jelzett. Illetve a másik kedvence, hogy amikor rádugom, akkor mondja, hogy az eszközt nem lehetett felismerni (lásd a mellékletekben).

Viszont felcsillant az a remény, hogy egy kedves barátomnak van egy barátja, aki Atmelekkel foglalkozik, s ő valószínűleg tud majd segíteni egy HVSP programozóval
Na meg úgy legalább meg tudjuk majd nézni, hogy valóban azt töltöttem-e bele, meg úgy állítottam-e be, ahogy kell.

Azt már csak halkan merem megjegyezni, hogy nem gondoltam volna, hogy ekkora szívás lesz vele. Én ha valamit kiadok a kezemből, hogy más is utánam tudja csinálni, akkor azért az ilyen "apróságokat", minthogy ha letiltod a RESET lábat utána nem tudod úgy programozni, ahogy eddig, azért ki szoktam írni.

De sebaj, ahogy a PIC12F629-nél is belefutottam az OSCCAL kitörlésének és helyreállításának élményébe, úgy az Atmel világ egyik alapsz*ba is sikerült beleszaladni Hát ezt is megjegyzem egy életre...
A hozzászólás módosítva: Jan 13, 2013
(#) csabeszq válasza bbb hozzászólására (») Jan 13, 2013 /
 
bbb, "az eszközt nem lehet felismerni:" A Windows akkor eszközt LÁT a túloldalon.

Ha egy ellenállást ráraksz az USB portra, nem fogja kiírni, hogy nem lehet felismerni az eszközt...
(#) kurosaki hozzászólása Jan 13, 2013 /
 
Sziasztok.
Lehet én vagyok a nagyon béna de nem kapcsol be a led ha a PIND1 es lábon jelet kap. vagy én értelmeztem rosszul?
Elképzelés: PIND - PD lábon kap 1 jelet ekkor az AVR jelet ad a PB-PORTB4 es lábon de nem jön össze.
  1. #include<avr/io.h>
  2.         #define C4_ON()    PORTB |=  (1<<PB4)
  3.         #define C4_OFF()    PORTB &= ~(1<<PB4)
  4.        
  5.        
  6.     int main(void){
  7. DDRB = (1<<PINB4);
  8.     {
  9.             while(PIND1&1);
  10.             C4_ON();
  11.     }}
(#) tecsa válasza kurosaki hozzászólására (») Jan 13, 2013 /
 
A while után a ; le is zárja a ciklust. Így a következő sor csak egy sima saját függvény meghívás.

  1. while(melyik port melyik lába)
  2. {
  3. // Ide írod a programod
  4. }
A hozzászólás módosítva: Jan 13, 2013
(#) kurosaki válasza tecsa hozzászólására (») Jan 13, 2013 /
 
nemértem miert nem megy. pedig mennie kene
  1. #include<avr/io.h>
  2.         #define C4_ON()    PORTB |=  (1<<PB4)
  3.         #define C4_OFF()    PORTB &= ~(1<<PB4)
  4.  
  5.     int main(void){
  6.         DDRB = (1<<PINB4);
  7.     {
  8.             while(PIND&1) //probaltam while(PIND1&1),while(PIND1) - de semeik
  9.             C4_ON();
  10.     }}
(#) Istvanpisti válasza kurosaki hozzászólására (») Jan 13, 2013 /
 
Többek között az is baj amit tecsa írt, de programodnak is vége lesz hirtelen (1 lefutás után), ez nem egy célszerű dolog.
Próbáld így !


Az is megérne egy misét, hogy miért C4-nek hívod a makrót, amikor nem a C portra hat, bár ettől működni kellene, csak nehezen lesz érthető a kód.
  1. #include<avr/io.h>
  2. #define C4_ON()    PORTB |=  (1<<PB4)
  3. #define C4_OFF()   PORTB &= ~(1<<PB4)
  4.  
  5. int main(void)
  6. {
  7.     DDRB = (1<<PINB4);
  8.     PORTD|=(1<<PD1);  //felhúzó ellenállás bekapcsolása a D1-en
  9.     while(1)
  10.     {
  11.        if(PIND1&1)
  12.        {
  13.            C4_OFF();  //ha nem csinálsz semmit akkor ez fut le, mert a D1 magas szintű lesz
  14.        } else
  15.        {
  16.          C4_ON();     //Ha a D1-et lehúzod a földre, akkor világít a led
  17.        }
  18.     }
  19. }
A hozzászólás módosítva: Jan 13, 2013
(#) bbb válasza csabeszq hozzászólására (») Jan 13, 2013 /
 
Igen, csakhogy ilyenkor van az, hogy az eszköz nem jól működik, valami gebasz van a "fejében". Ha az "Ismeretlen eszköz" néven illeti, akkor meg már hiába is adnék neki megfelelő drivert, nem ismeri fel, hogy az jó lenne hozzá.
(#) huba válasza bbb hozzászólására (») Jan 13, 2013 /
 
Rossz órajelről müködik a processzorod, mivel program feltöltés előtt nem állítottad be a megfelelő oszcillátort a fuse biteknél. Mivel a reset lábadat elvesztetted, nem tudod mostmár programozni. Marad a fuse doctor vagy a másik mikrovezérlő.
(#) kurosaki válasza Istvanpisti hozzászólására (») Jan 13, 2013 /
 
Amit kaptam kódot semmit se csinál. rákötöm a PD1 re azt a VCC re kötöm semmi,GND semmi.
A C4 az elözö projectem ahol egy Led villogot es gondoltam itt is működni fog csak anyival hogy akkor kapcsol be mikor kap egy jelet az egyik oldalt.

USBASP ém van égetésnél ezt kapom mindig:
Error Setting USBASP ISP Clock.
ettöl független ráégeti de zavar. Mitöl lehet?
A hozzászólás módosítva: Jan 13, 2013
(#) bbb válasza huba hozzászólására (») Jan 13, 2013 /
 
Hogyaza...

Kicsit felbosszantott, hogy elvileg minden jól van benne, mégis hibás... Megnéztem megint az eredeti kapcsolási rajzot, meg az enyémet is. Most nekilátok kijavítani a különbséget a kettő között. Ugyanis az én rajzomon a D+ van felhúzva VCC-re, az eredetin meg a D- !!! Nem nagy dolog kijavítani, ha megtörtént, akkor beszámolok a végeredményről.
(#) kurosaki hozzászólása Jan 13, 2013 /
 
Felcseréltem a LED be és KI parancsot hogy lássam hol a hiba.Valamiért a bemenetet nem érzékeli hogy a PD1 en bármi is történne.

  1. #include<avr/io.h>
  2.       #define LED_ON()    PORTB |=  (1<<PB4)
  3.       #define LED_OFF()   PORTB &= ~(1<<PB4)
  4.      
  5.       int main(void)
  6.       {
  7.               DDRB = (1<<PB4);
  8.               PORTD|=(1<<PD1);  //felhúzó ellenállás bekapcsolása a D1-en
  9.               while(1)
  10.               {
  11.                       if(PIND1&1)
  12.                       {
  13.                               LED_ON();   //ha nem csinálsz semmit akkor ez fut le, mert a D1 magas szintű lesz
  14.                       } else
  15.                       {
  16.                               LED_OFF();     //Ha a D1-et lehúzod a földre, akkor világít a led
  17.                       }
  18.               }
  19.       }
(#) tecsa válasza kurosaki hozzászólására (») Jan 13, 2013 /
 
  1. PORTD |= (0<<PD1); //majd úgy bementként kezeli
(#) kurosaki válasza tecsa hozzászólására (») Jan 13, 2013 /
 
Se GND se VCC agra nem reagal. Attiny2313 AVR hasznalok van egy Attiny45 ösöm is.
(#) Istvanpisti válasza kurosaki hozzászólására (») Jan 13, 2013 /
 
Ha felcserélted és akkor sem megy, akkor ott valami más lehet a baj, hiszen az if mindkét ágát kipróbálva menni kellene legalább az egyik esetben.

Idézet:
„USBASP ém van égetésnél ezt kapom mindig:
Error Setting USBASP ISP Clock.
ettöl független ráégeti de zavar. Mitöl lehet?”


Biztos vagy benne, hogy rátölti? Szerintem túl nagy az ISP frekvencia, állítsd lejjebb.
(#) kurosaki válasza Istvanpisti hozzászólására (») Jan 13, 2013 /
 
igen rátölti máskép nem menne lehet egy noob kérdés de Programozoban allitsam lejjeb igaz? marmint amivel rá égetem?.

kiprobaltam a PD5 ös lábbal de semmi....
(#) Sasmadár válasza kurosaki hozzászólására (») Jan 13, 2013 /
 
  1. if(bit_is_set(PIND,PIND1))

Esetleg feltehetnéd a fordított asm file-t.
(#) kurosaki válasza Sasmadár hozzászólására (») Jan 13, 2013 /
 
Köszönöm ez volt a jo megfejtés.
asm?? Atmel Studiot hasznalok és GCC C project kent irom a programot nem Asemben.
(#) Sasmadár válasza kurosaki hozzászólására (») Jan 13, 2013 /
 
Örülök! Nem Ismerem az Atmel Studiot (nem használok Atmel procikat). A C fordító által generált assembly file-ra gondoltam, de szerencsére már tárgytalan!
Következő: »»   507 / 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