Fórum témák

» Több friss téma
Fórum » Arduino
A klónok CH340 Soros-USB illesztőjének drivere (Letöltés)
Lapozás: OK   553 / 839
(#) jointsilver36 válasza vargham hozzászólására (») Aug 28, 2019 /
 
Igen.Atmegat égettem vele.
(#) vargham válasza jointsilver36 hozzászólására (») Aug 29, 2019 /
 
Ez is ATMega, menni fog ez is. Csináld pont úgy, ahogy a múltkor.
(#) zaza99 hozzászólása Aug 30, 2019 /
 
Sziasztok!
Hogyan tudok kitöltési tényezőt állítani az alábbi pwm-ben:
  1. void setup() {
  2. pinMode(5, OUTPUT);
  3. pinMode(6,OUTPUT);
  4. TCCR0A=0;//reset the register
  5. TCCR0B=0;//reset tthe register
  6. TCCR0A=0b01010011;// fast pwm mode
  7. TCCR0B=0b00001010;// prescaler 8 and WGM02 is 1
  8. OCR0A=39;//control value
  9. }
  10.  
  11. void loop() {
  12.  
  13. }
(#) mateatek válasza zaza99 hozzászólására (») Aug 30, 2019 /
 
Ilyen beállításban nem tudom. Mit szeretnél elérni? Úgy tudom, ha a 8 bites timernél frekvenciát és kitöltési tényezőt is állítasz, akkor csak 1 kimeneten tudsz PWM-et állítani.
Így a 6-os lábon lesz PWM-ed és a delay(), illetve a millis() függvényed eléggé elállítódott lesz.:
  1. pinMode(6,OUTPUT);
  2. TCCR0A=0;//reset the register
  3. TCCR0B=0;//reset tthe register
  4. TCCR0A=0b00100011;// fast pwm mode
  5. TCCR0B=0b00001010;// prescaler 8 and WGM02 is 1
  6. OCR0A=39;//control value
  7. OCR0B=10;//kitoltesi tenyezo, 0 a minimum, 39 a maximum.
(#) zaza99 hozzászólása Aug 30, 2019 /
 
Egy olyan programot szeretnék amiben tudom állítani a frekvenciát 1KHz-től Kb 100KHz-ig és a kitöltési tényező is állítható. Nem gond ha csak egy kimeneten lesz pwm.
Kipróbáltam amit írtál de uno-n nem csinál semmilyen jelet.
(#) djusee válasza zaza99 hozzászólására (») Aug 31, 2019 /
 
Szia, esetleg próbálkozz a TimerOne könyvtárral.
(#) mateatek válasza zaza99 hozzászólására (») Aug 31, 2019 /
 
Furcsállom, hogy nem működik, mert nálam igen.
Ha ezt szeretnéd, amit írtál, akkor a 16 bites timer1-et használjad. Sokkal jobb felbontásod lesz és ott mindkét kimenetet tudod használni PWM-módban.
A frekvenciát az ICR1-es regiszterbe tudod beírni. A PWM-et az OCR1A és OCR1B regiszterekbe. A PWM maximum értéke mindig az ICR1 lesz. Tehát ahogy növekszik a frekvencia, úgy csökken a PWM felbontása.

  1. pinMode(5, OUTPUT);
  2. pinMode(6,OUTPUT);
  3. TCCR1A = 0;
  4. TCCR1B = 0;
  5. TCCR1A = _BV(WGM11) | _BV(COM1A1) | _BV(COM1B1);
  6. TCCR1B = _BV(WGM13) | _BV(CS10) | _BV(WGM12);
  7. ICR1   = 3199; //frekvencia
  8. OCR1A = 1599;//kitoltes
  9. OCR1B = 1000;//kitoltes


Szerk: Igazad van, nem működött nálad, mert rosszul írtam. Nem a 6-os, hanem az 5-ös lábon van a PWM jel, azt kell a kódban engedélyezni. Bocs.
A hozzászólás módosítva: Aug 31, 2019
(#) mateatek válasza mateatek hozzászólására (») Aug 31, 2019 /
 
Kapkodás van, mert ezt a kódot is elsiettem, a 9-es és a 10-es lábat kell kimenetként engedélyezni. Helyesen a kód:
  1. pinMode(9, OUTPUT);
  2.     pinMode(10,OUTPUT);
  3.     TCCR1A = 0;
  4.     TCCR1B = 0;
  5.     TCCR1A = _BV(WGM11) | _BV(COM1A1) | _BV(COM1B1);
  6.     TCCR1B = _BV(WGM13) | _BV(CS10) | _BV(WGM12);
  7.     ICR1   = 3199; //frekvencia
  8.     OCR1A = 1599;//kitoltes
  9.     OCR1B = 1000;//kitoltes
(#) zaza99 válasza mateatek hozzászólására (») Aug 31, 2019 /
 
Működik tökéletesen.
Köszönöm szépen!
(#) mateatek válasza zaza99 hozzászólására (») Aug 31, 2019 /
 
A frekvencia állítgatásánál még van lehetőséged a timer órajel osztóját is állítgatni, illetve ha az egyéb számítási műveletek elvégzése sokadrangú, akkor állítgathatod az órajel előosztót is.
(#) KoblogPerGyok hozzászólása Szept 8, 2019 /
 
Sziasztok!

char[] tömb elemeit szeretném float-ra változtatni. A függvényt kiszervezem meg is hívódik, de a sscanf() nem működik. Másik függvényben a sscani() tökéletesen megy. Az atoi és aotf működik, de annak meg kevesebb a hiba jelzése. Azokat nem szeretném használni.

float r;
char be[] //Ezt a függvény megkapja, csak a példáért írom

sscanf(be,"%f",*r);
Seriel.println(r,7)
return r;

Ehhez hasonló amit írtam, de vagy ovf-hibával száll el, vagy 0.00 a végeredmény. (fejből írtam)
Kipróbálnátok a saját Arduinoval ezt?

Mintha egyszer kaptam volna helyes eredményt akkor, mikor a char-tömb 5. elemét '\n'-re cseréltem. Utána elírtam valamit, azóta semmi. Annyit tudni kell, hogy a be[] tömb mielőtt feltöltődne a soros monitorról 0-val van feltöltve. Nem karakterrel, hanem számmal. Olvastam olyasmit, hogy az Arduino IDE-ben mintha hibás lenne, de ellent mondtak annak aki ezt írta. Hajlok rá, hogy igaza van, de remélem tévedek!

Próbáljátok ki légyszi és a kódot mellékeljétek, ha megy!
(#) vargham válasza KoblogPerGyok hozzászólására (») Szept 9, 2019 /
 
Nem írod, hogy milyen mikrokontrollert használsz. Gondolom, ATMega328-at. A hardver limitációi miatt érdermes lenne kerülni a lebegőpontos számok használatát. A CPU nem támogatja, a fordító pedig alapesetben nem is fordítja bele a szoftveres támogatást (printf, scanf), mert túl nagy helyet foglal. Külön be kell kapcsolnod, ha mégis ragaszkodsz hozzá.
Bővebben: AVR Libc vfscanf()
(#) KoblogPerGyok válasza vargham hozzászólására (») Szept 9, 2019 /
 
Ez nem jó hír.

Utána nézek, hogy a serial-miket tud. Már ott elvégzem a kapott adatok kinyerését.
(#) KoblogPerGyok válasza vargham hozzászólására (») Szept 11, 2019 /
 
Szia!

Küzdök még elég erősen. Nem is annyira egyszerű. Kigondoltam, hogy egy függvény switch cas-el kiválogatja, hogy melyik szám van megadva numerikus karakterként. Visszatér az adott karakternek megfelelő számmal. Ez sem ment könnyen, bármilyen meglepő. A jelenlegi gondom az, hogy ha i egy ciklusváltozó akkor a függvényben a pow()-sem megy.... Atof-el kellene esetleg átalakítanom a ciklusváltozót. Épp azt szeretném elkerülni.

int valami(char be[])
{
int i;
int egesz;
for (i=0; i<= be hossza-1; i++)
{
char temp=be[i];
volatile int er1= CharDigitToNum(temp);

//ez megy:
egesz+=er1; Ilyenkor szépen összeadja...
//Ez már nem megy:
egesz+=pow(10,i)
}
}

int CharDigitToNum(char be)//Saját függvény
{
….
}


Megoldottam pointerekkel is sok problémát de végül nem kellett, csak a volatile-t felejtettem le.. Nem biztos, hogy ez a kód jó, csak példaként írtam.
(#) sargarigo válasza KoblogPerGyok hozzászólására (») Szept 11, 2019 /
 
Idézet:
„Nem biztos, hogy ez a kód jó, csak példaként írtam.”
Hát pedig az ördög a részletekben szokott lakozni.
(#) KoblogPerGyok válasza sargarigo hozzászólására (») Szept 11, 2019 /
 
Beteszem amit összeraktam, de már az is szanaszét van. A lényeg, hogy a pow() nem működik, ha a kitevő a ciklusváltozó és az egesz rész egy másik függvény visszatérési értéke.

Ha gépközelben leszek bemásolom.
(#) meddu hozzászólása Szept 13, 2019 /
 
sziasztok!
Van arra lehetőség hogy 8db nyomógombot (csengő nyomo gomb)
és 16relé modult csatlakoztassak 1db arduinohoz(UNO, MEGA)?
A működés úgy nézne ki hogy minden nyomógombhoz 2db relé lenne hozzárendelve. ami úgy működne hogy minden egyes gombnál :
az első gombnyomásra meghúz az első relé
a másodikra elenged
a harmadikra meghúz a második relé
a negyedikre meg elenged.
állapottól függetlenül 90mp után visszaállna alapállapotba (az első gombnyomást várni)
Ha ez megvalósítható akkor melyiket válasszam az UNO-t vagy a MEGA-t és hogyan tudom egymáshoz illeszteni a nyomógombokat illetve a relé modult?
(#) pipi válasza meddu hozzászólására (») Szept 13, 2019 /
 
Ha kevés a lábad, akkor megtoldhatod egy-két shiftregiszterrel, vagy i2c extenderrel...
(#) KoblogPerGyok válasza meddu hozzászólására (») Szept 13, 2019 /
 
Szia!

Van. A 4x4 keypad is 8 lábat használ. Ha megérted annak a bekötését, akkor a nyomógombokkal is mennie kell. Azok is azok!!!
(#) Kovidivi válasza meddu hozzászólására (») Szept 13, 2019 /
 
Shift regisztert neki, kimenet/bemenet annyi lesz, amennyit akarsz, és elhasznál kb. 3-4 lábat, tehát Mega sem kell.
(#) meddu válasza KoblogPerGyok hozzászólására (») Szept 13, 2019 /
 
Erre gondoltál?
(#) morgo válasza meddu hozzászólására (») Szept 13, 2019 /
 
Az is megoldás lehet, hogy a nyomógombokat ellenállásosztón keresztül valamelyik analóg bemenetre kötöd. Így csak egy kivezetést használsz a gomboknak. Az osztó méretezésétől függően akár 20-30 nyomógomb is kezelhető így. Gugliban sok magyarázatot találhatsz ha rákeresel az "analóg keyboard"-ra.
(#) GPeti1977 válasza morgo hozzászólására (») Szept 13, 2019 /
 
Az autóiparban is használják ezt a megoldást.
(#) KoblogPerGyok válasza meddu hozzászólására (») Szept 14, 2019 /
 
Ha minden igaz igen. Erre gondolok. A kód nem is bonyolult hozzá.

morgo:

Király ötlet!
(#) Massawa hozzászólása Szept 16, 2019 /
 
Sziasztok, ujdoncként küzdök az Arduino program nyelvével és egy olyan feladat van, ahol két port konfigurácioját egy harmadiktol kell függöve tenni.

Itt van néhány programmrészlet. A void setupban definiálom többek között ezt:
Int Dir=A0;
Int wsense=P9;
Int esense=P8;

Majd ezt

PinMode(Dir,Input)

Itt már nem tudom definiálni a P8 meg a P9-t mert azok állapota az A0-n levö jeltöl függ.

Ha a Dir<500

Akkor a
PinMode(wsense,OUTPUT)
PinMode(esense,INPUT)

És forditva
Ha a Dir>500 akkor
PinMode(wsense,INPUT)
PinMode(esense,OUTPUT)

Ez a definicio 6 különbözö egyébb feladat része a loopban, azaz menet közben kell a portokat átdefiniálni) és igy beolvasni illetve kiirni egy-egy állapotot a p8/p9-re.

Hogyan kell ezt megoldani? Kösz!
A hozzászólás módosítva: Szept 16, 2019
(#) mateatek válasza Massawa hozzászólására (») Szept 16, 2019 /
 
Ha az A0-ás lábad, azaz a "Dir" analóg bemenet (ADC), akkor azt nem kell INPUT-ként definiálnod, mert akkor digitális bemenetként használható. Ne csináljál vele semmit, akkor az ADC bemenet lesz.
Illetve feltétel vizsgálat előtt egy AnalogRead(Dir) paranccsal mérjed meg a bemenetén lévő jelet, mert nem fog tudni mihez hasonlítani.
(#) Massawa válasza mateatek hozzászólására (») Szept 16, 2019 /
 
Kösz a DIR már megy csak itt irtam el . Nekem a gondom a P8 meg a P9-l van amit a 6 állapotu alprogram minden állapotában ujra kell definialni, s nem vagyok abban biztos, hogy ezt lehet vagy nem. Mindjárt megyek probalni. A fö adat a Dir, majd az alprogramban (1 a hat közül) a P8 vagy. P9 bemenettöl függöen kell változnia többi (itt nem tárgyalt) kimenetnek.
Ilyet még nem találtam a minták között azért rágodok hogyan tovább.
A hozzászólás módosítva: Szept 16, 2019
(#) mateatek válasza Massawa hozzászólására (») Szept 16, 2019 /
 
A ki-bemeneteket program közben úgy definiálod, ahogyan akarod. Annyiszor és ahogyan szeretnéd. De olyan apróságokra figyeljél, hogy ha kimenetként van definiálva és ilyenkor kiadsz egy DigitalWrite(HIGH) parancsot, akkor a belső felhúzó ellenállás aktív lesz, amitől a bemenet, ha nagy impedancián is, de magas szintű lesz, ami zavart okozhat adott esetben.
(#) Kovidivi válasza Massawa hozzászólására (») Szept 16, 2019 /
 
Akármikor változtathatod, hogy egy láb bemenet vagy kimenet legyen, nem okoz gondot. De ezzel a P8 P9-cel még nem találkoztam, nem csak simán 8 és 9?
(#) Massawa válasza Kovidivi hozzászólására (») Szept 16, 2019 /
 
Kösz

Bocs, a fejem még az ASM-ben jár itt csak a 8as meg a9-s portokrol van szo.

Ha loopba beirom hogy:
Int valA0=analogRead (DIR);
Int valA2=analogRead (Occup);

Majd itt dönteni kell, hogy most mekkora a
ValA0<500
Akkor
printMode(esense,INPUT)
PrintMode(wsense,OUTPUT)
Majd be kellene olvasnom az esense értéket, és kiküldeni a wsense egyet a valA2 függvényében.
Majd forditva, ha a valA0>500

Itt bonyolodtqm a dologba.
Következő: »»   553 / 839
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.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