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   720 / 850
(#) asch válasza Rober_4 hozzászólására (») Jan 8, 2022 / 1
 
Amit írtam, az az ATMega328-ra vonatkozott, ezen a csipen nem tudom van-e pullup vagy pulldown a pin-eken. (Adatlap, vagy internetes keresés megmondja, nem titok, csak én nem tudom.)

Az uint64_t típust használva tudsz 64 bites változót használni, ezen úgyanúgy meg van valósítva a shift művelet, minden ugyanúgy működik (C-ben, a lefordult kód persze több utasításból fog állni, mint 32 biten). Szóval ez nem lehet probléma. Vagy nem a C, hanem az A vagy B porton vannak ezek a PIN-ek. Szintén a csip és a board adatlapjából derül ki. Érdemes olyan PIN-out rajzot keresni, ahol rajta vannak a csipen értelmezett port nevek is a board-ra rajzolva, olyan alapján gyorsan lehet dolgozni. UNO-val én így szoktam csinálni.

Ha szintetizátorról van szó, akkor a mátrix-szal gond lehet, hogy az egyszerre lenyomott billentyűk összezavarhatják, nem minden kombináció egyértelműen dekódolható. Szintetizátor billentyűzetet én input shift regiszterrel olvasnék be, egyszerre kiolvasva direktben minden gombot, és beshiftelve az MCU-ba. Ezzel teljes polifónia megvalósítható az összes billentyűre, és összesen 3-4 MCU láb kell hozzá. Persze ha az áramkör ezen része nem hozzáférhető, akkor ezt nem lehet megcsinálni.
(#) dB_Thunder válasza asch hozzászólására (») Jan 8, 2022 1 /
 
Idézet:
ATMega328-ra vonatkozott, ezen a csipen nem tudom van-e pullup vagy pulldown”

Felhúzó szokott ezekben lenni...
(#) Rober_4 válasza asch hozzászólására (») Jan 8, 2022 /
 
Köszönöm!
Közben már meglett a 45. láb is:
  1. PioC = PIOC->PIO_PDSR ;
  2. gombval = (PioC & 1u << 18) >> 18  ;

Ez alapján már szerintem meg lesz a többi is az eltolásokkal.
Kimenetre meg úgy tudom állítani, hogy outputra teszem a portot, és egyszerűen beleírom az értéket a regiszterbe?
A hozzászólás módosítva: Jan 8, 2022
(#) Massawa válasza Rober_4 hozzászólására (») Jan 8, 2022 / 1
 
Semmi gond nincs ezzel, söt még nagyobb mátrixxal sem. Ez a 16 nyomogomb csak egy byte. 4 kimenet, 4 bemenet, rengeteg példa van erre.
Ellenállás sem kell. Pl. a jobb oldali vezetékek 4 (D0..3)portra kimeneti mennek.amiket egyenként kapcsolsz valamilyen szintre, mondjuk LOW-ra. A függöleges meg 4 másik port (D4..7) bemenetére megy. Azaz ha megnyomsz egy gombot akkor amikor a vizsintes sin LOW szinten van, ez a LOW szint jut valamelyik bemeneti portra. ( ott használhatod a belsö pull-up ellenállást). Azaz egy 4 bites kimenetre kapsz egy 4 bites bemenetet.
(#) vargham válasza Massawa hozzászólására (») Jan 8, 2022 /
 
Csak közben ott a ghost key probléma. Vagyis több billentyű lenyomásakor olyanokat is érzékel, amiket le sem nyomtál. Diódákkal lehet védekezni ellene.
(#) Massawa válasza vargham hozzászólására (») Jan 8, 2022 /
 
Valoban igy van, ezért diodákat illik berakni
(#) proba válasza Massawa hozzászólására (») Jan 8, 2022 /
 
Csak nincs hova ( a gombokhoz kellene egyenként.....) A lekérdezést kell jól megírni, akkor lehet detektálni a több gombot, és elvetni az eredményt, ha több. Vagy a klasszikus módon sorba lekérdezni, azután az elsőnél végrehajtani a feladatot, a többi meg veszett. Legtöbbször bőven jó,
(#) Massawa válasza proba hozzászólására (») Jan 8, 2022 /
 
Valoban lehet, hogy ezért került a boltokba, nincs más lehetöség elvágni a foliát és beforrasztani minden gombhoz egy SMD diodat.
A lekérdezés nem gond, több berendezést épettem, egyet 96 gombbal a többi 32 ill. 24, mind tökéletesen müködik.

Most hogy belegondolok lehet, hogy analog lekérdezésre szánták ezt a 16 gombot, hasonloän mint a régebbi mono szintikhez.
A hozzászólás módosítva: Jan 8, 2022
(#) sargarigo hozzászólása Jan 8, 2022 /
 
Nem értem a problémátokat! Minek a dióda?
Ha több gombot nyomok egyszerre az nem kellene hogy gondot okozzon szerintem! Nézzük az ábrát!
Tegyük fel, hogy egyszerre nyomom a bal felső és az alatta levő gombot! Indul a kereső jel a Col1-en, és mivel két gomb is nyomva van, ez a jel egyszerre megjelenik a Row1 és a Row2-n is. Annyi hogy be van állítva két bit! Ezután a kereső jel tovább megy a Col2-re, itt már nincs megnyomva semmi, nem jön ki a Row pineken.
Nyomjuk meg a bal felső sarok négy gombját is! Col1 hatására megjelenik a Row1, és a Row2-n is jel. Col2 hatására szintén Row1, és Row2. Minden egyes gombot egyesével ki tudunk olvasni! Csak annyi kell, hogy amikor érdekel a gombok állapota, akkor egymás után aktiváljuk a Col1, Col2.., kivezetéseket, és a Row kivezetéseken meg figyeljük a bitmintát. Én úgy állítanám be, hogy a row bemeneteken minden pin fel legyen húzva a belső (vagy ha az nincs akkor külső) felhúzó ellenállásokkal. A Col kivezetéseken meg egyesével LOW szintet tennék ki a vizsgálat idejére.

szerk.: Még csak az sem kell, hogy a lekérdezés folyamatos legyen, elég akkor végigfutni a vezetékeken amikor érdekel a gombok állapota! Láttam már olyan megoldást is, hogy ugyanezekre a vezetékekre volt kötve az lcd is. Általában az lcd-t hajtotta, de néha egy rövid időre ránézett a gombokra is.
A hozzászólás módosítva: Jan 8, 2022
(#) proba válasza sargarigo hozzászólására (») Jan 8, 2022 /
 
Én a ledes kijelző oszlopjelét használtam gombhoz is. Na ott nem volt normális kijelzés, ha egyszerre nyomtam több gombot. ( mondjuk értelme sem volt, max szórakozásból történt.)
(#) KBal76 válasza sargarigo hozzászólására (») Jan 8, 2022 / 1
 
Szerintem amikor 3 gombot lenyom L mintázatban (mindegy hol), akkor a 4. gombnak (a négyzet mintázat 4. sarka) fogja érzékelni a lenyomását, ami amúgy nincs lenyomva, merthogy visszafelé zár a három gombon ha nincs dióda.
(#) proba válasza sargarigo hozzászólására (») Jan 8, 2022 /
 
Azért 3 gombbal már adódnak problémák... A klasszikus számmezőben benyomott 5-6-8 már nem kiértékelhető egyszerűen dióda nélkül. Ha a 3-6-9 oszlopot jelölöd ki eredményként 6,9- et kapsz, ami nem valós, de ez nem is fontos legtöbbször. Számítógép tasztatúrában sincs dióda, és boldogan elgépelget több millió ember hibamentesen.
(#) KBal76 válasza proba hozzászólására (») Jan 8, 2022 /
 
PC billentyűzeten eléggé össze-vissza van a mátrix elrendezése, pont azért hogy ne legyen gond a 3 gombos kombinációkkal. Illetve mint ismert, játékosoknak direkt gyártanak ezt a problémát elkerülô "anti ghosting" billentyűzeteket. Viszont ez a kütyü egy hangszer billentyűzet akar lenni, gondolom MIDI, no ott azért elég könnyen összejön a "sok gomb egyszerre" esete.
(#) vargham válasza KBal76 hozzászólására (») Jan 8, 2022 /
 
Így van.
(#) Rober_4 válasza KBal76 hozzászólására (») Jan 8, 2022 / 1
 
Arról, hogy ez hangszerbillentyűzet legyen, már letettem, ahogy kipróbáltam. Csak szeretném, ha működne maga a mátrix, ami nekem megy is ezzel a programmal. Természetesen nem delay lesz a végső megoldásban, hanem a gombállapotokat tárolom. Amikor nem kapcsoltam be a pullup-ot, akkor néha elég furcsán viselkedett, de bekapcsolva stabilnak tűnik. Ez a program azért is jó, mert egyszerűen csak rádugom a mátrix nyomógombot az 51. lábtól. Még a digital write-okat fogom kicserélni, mihelyt elsajátítottam a portra írás képességét
  1. bool ROWS[4];
  2. int COLS[4] = {37, 39, 41, 43};
  3. uint64_t  PioC;
  4.  
  5. void setup() {
  6.   pinMode(45, INPUT_PULLUP);
  7.   pinMode(47, INPUT_PULLUP);  
  8.   pinMode(49, INPUT_PULLUP);
  9.   pinMode(51, INPUT_PULLUP);
  10.   pinMode(37, OUTPUT);
  11.   pinMode(39, OUTPUT);
  12.   pinMode(41, OUTPUT);
  13.   pinMode(43, OUTPUT);
  14.   Serial.begin(9600); //For printing out the output
  15. }
  16.  
  17. void loop() {
  18. for (int i=0; i<4;i++)
  19. {
  20.   PioC = PIOC->PIO_PDSR ;
  21.   digitalWrite(COLS[0], HIGH);
  22.   digitalWrite(COLS[1], HIGH);
  23.   digitalWrite(COLS[2], HIGH);
  24.   digitalWrite(COLS[3], HIGH);
  25.   digitalWrite(COLS[i], LOW);
  26.   delay(50);
  27.   ROWS[0] = (PioC & 1u << 18) >> 18;  //  45. gomb
  28.   ROWS[1] = (PioC & 1u << 16) >> 16;  //  47. gomb
  29.   ROWS[2] = (PioC & 1u << 14) >> 14;  //  49. gomb
  30.   ROWS[3] = (PioC & 1u << 12) >> 12;  //  51. gomb
  31.  
  32.   if ((ROWS[0] == LOW) && (ROWS[1] == HIGH) && (ROWS[2] == HIGH) && (ROWS[3] == HIGH)) {
  33.     Serial.println(i*4+1);
  34.   }
  35.   if ((ROWS[0] == HIGH) && (ROWS[1] == LOW) && (ROWS[2] == HIGH) && (ROWS[3] == HIGH)) {
  36.     Serial.println(i*4+2);
  37.   }
  38.   if ((ROWS[0] == HIGH) && (ROWS[1] == HIGH) && (ROWS[2] == LOW) && (ROWS[3] == HIGH)) {
  39.  
  40.     Serial.println(i*4+3);
  41.   }
  42.   if ((ROWS[0] == HIGH) && (ROWS[1] == HIGH) && (ROWS[2] == HIGH) && (ROWS[3] == LOW)) {
  43.     Serial.println(i*4+4);
  44.   }
  45.   delay(50);
  46. }
  47. }
(#) Josi777 válasza Rober_4 hozzászólására (») Jan 8, 2022 /
 
A közvetlen portra írás gyorsabb, ezért kell lecserélni a digitalWrite()-ot, mert az ugye lelassítja a programot, de azért ott figyel a loopban egy delay(50)
A hozzászólás módosítva: Jan 8, 2022
(#) Rober_4 válasza Josi777 hozzászólására (») Jan 8, 2022 /
 
Igen, írtam a delay kijön, csak nem akartam változásfigyeléssel bonyolítani most.
És igen a digitalwrite-ot akarom kicserélni, mihelyt ki-googléztam, de nekem ez mára elég volt
(#) sargarigo válasza proba hozzászólására (») Jan 8, 2022 /
 
Nem látom be a három gombos problémát, de lehet hogy csak én vagyok lassú. Az egyértelműség kedvéért beszámoztam a gombokat. Ha L alakban megnyomjuk mondjuk az 1, 2 valamint az 5-öt, akkor az első kérdezésnél (Col1) alacsonyba húzza a row1-et, és a row2-t. Utána megint minden magasba megy. Második kérdezésnél (Col2) alacsonyba húzza a row1-et. Miért kellene hogy a row2 is alacsonyba menjen??

kep.jpg
    
(#) Massawa válasza sargarigo hozzászólására (») Jan 8, 2022 /
 
Ha mondjuk a ROW1 - t szeretnéd leolvasni ( kiküldesz valamilyen szintet) és egyszerre megnyomod a 3 meg a 7 kapcsolot, rövidre zárod a ROW1 meg a ROW2 ilyenkor mi lesz a COL3 bemeneten?
(#) sargarigo válasza Massawa hozzászólására (») Jan 8, 2022 /
 
Valami félre megy itten kérem szépen!
Fentebb írtam hogy a col-okra teszem egyesével a low szintet, és a row-okat figyelem.
Nincs jelentősége, de eddig így írtam, ezért ragaszkodom hozzá. Lehetne fordítva is.

Ha megnyomom a 3-ast, és a 7-est is egyszerre, akkor a lekérdezés így néz ki:
col1 aktív alacsony, row1..4 nem változik, marad magas.
col2 aktív alacsony, row1..4 nem változik, marad magas.
col3 aktív alacsony, row1 alacsony, és row2 alacsony. row3,4 marad magas.
col4 aktív alacsony, row1..4 nem változik, marad magas.
Nincs a képletben senki aki bármit is rövidre tudna zárni.
(#) proba válasza sargarigo hozzászólására (») Jan 8, 2022 /
 
a 2-1-5 gombok rövidzárban. A row1 és 2 is ( 5-1 gomb sorba kötve ) Tehát a 6 gomb is be van nyomva elvileg... A valóságban viszont nem. Ja és a col1 és 2 is rövidzárban ( 1-2 gomb sorba kötve.)
A hozzászólás módosítva: Jan 8, 2022
(#) Massawa válasza sargarigo hozzászólására (») Jan 8, 2022 /
 
Igen de ha a COL1 a kimenet és megnyomod az 1 meg a 2 gombot akkor rövidzárt csinálsz a COL1 meg 2 között ( ahol az egyik ugye magas szintü), és mi lesz ilyenkor a ROW1-en?
Ha a 3 meg 7 nyomod meg akkor meg a COL 1 meg a COL2 lesz zárlatban.
(#) sargarigo hozzászólása Jan 8, 2022 / 1
 
És tényleg! Olyan így, mintha nem egyesével címezném az oszlopokat! Hát akkor pedig tényleg úgy van ahogy mondjátok! Köszönöm, én erre nem is gondoltam!
(#) rolandgw hozzászólása Jan 8, 2022 / 1
 
(#) benjami válasza Rober_4 hozzászólására (») Jan 9, 2022 / 1
 
Ebben pont nem teljesül, hogy egy időben csak egy sor meghajtása legyen kimenetre állítva, a többi meg legyen bemenet. Így több gomb egyidejű lenyomásakor összezáródhatnak az ellentétes állapotúra állított kimenetek.
(#) vargham válasza Rober_4 hozzászólására (») Jan 9, 2022 /
 
Nem jó. Az inaktív kimeneteket input, nopull-ra kell állítani.
(#) kapu48 válasza Rober_4 hozzászólására (») Jan 9, 2022 /
 
Szeretném megkérdezni, hogy milyen procinak van 18 bites bemenetű portja?

Bővebben: adatlap
A 7 bites PORTC-nek, hogyan maszkolhatod ki a 18. bitjét?
ROWS[0] = (PioC & 1u << 18) >> 18; // 45. gomb
(#) pisti hozzászólása Jan 9, 2022 /
 
Egy látszólag egyszerű programban akadtam el. Kérnék ötletet, hogy hogyan lehetne javítani. Egy sárga LED villog, ha egy külső jel érkezik (itt a 2-es pinre egy magas jel) akkor egy kék LED kezd villogni és teszi addig még ismét nem jön egy jel. villogás nélkül mikor a loop-ba csak a digitalWrite-ba a state ill !state változót írtam akkor működött. Nem ragaszkodom a megszakításhoz, de elsőre ez az ötlet jött.
  1. volatile int state = LOW;
  2. void setup()
  3. {
  4.   pinMode(8,OUTPUT);      //sárga
  5.   pinMode(9,OUTPUT);      //kék
  6.   attachInterrupt(0, allapot, CHANGE);      //2pin HIGH jel
  7. }
  8.  
  9. void loop()
  10. {
  11.   if (state=LOW)
  12.   {
  13.     to_KEK();
  14.   }
  15.   if (state=HIGH)
  16.   {
  17.     to_SARGA();
  18.   }
  19. }
  20.  
  21. void allapot()      
  22. {
  23.   state = !state;
  24. }
  25.  
  26.  
  27. void to_SARGA()
  28. {
  29.   digitalWrite(8,HIGH);
  30.   delay(500);
  31.   digitalWrite(8,LOW);
  32. }
  33.  
  34. void to_KEK()
  35. {
  36.   digitalWrite(9,HIGH);
  37.   delay(500);
  38.   digitalWrite(9,LOW);
  39. }
(#) vargham válasza pisti hozzászólására (») Jan 9, 2022 / 2
 
Ez if (state=LOW) értékadás, az egyenlőség vizsgálata pedig ez if (state==LOW)
(#) Kékróka válasza pisti hozzászólására (») Jan 9, 2022 / 1
 
Szia!
Ha jól látom, állapotváltozáskor a másik led épp olyan állapotban marad amilyenben éri a változás.
A másik pedig hogy a kikapcsolt állapot időzítése picit rövid (nincs neki) tehát mindig megy mind a kettő.

J
Következő: »»   720 / 850
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