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   711 / 850
(#) asch válasza Zoli_bácsi hozzászólására (») Nov 3, 2021 /
 
Tudtommal Arduino-hoz nem kell feltétlen programozó, hogy kiolvasd, a "szokásos" USB-Serial átalakítóval is ki lehet olvasni. Tudtommal az Arduino Nano-ra rá van alapból építve ez az USB-serial átalakító, ezt éred el PC-ről, ha rádugod az USB-jét PC-re.

Elvileg ez a parancs működik (a -P után platformodtól függően azt a portot kell beírni, amin keresztül az Arduino látszik, pl COM1, COM2... /dev/ttyACM0, stb.):

  1. avrdude -p m328p -P usb -c carduino -U flash:r:flash.bin:r


vargham válaszához képest az a különbség, hogy ehhez nem kell plusz hardvert építened. Ha nagyon nem akarod elveszíteni a programot, akkor én ezt először egy másik ugyanolyan hardveren próbálnám ki, nehogy hibás paraméterezéssel felülírd pont amit ki akarsz olvasni...

Még egy kiegészítés: ez akkor működik, ha az Arduinón a standard bootloader fenn van. Ezt is felülírhatta aki a terméket csinálta.

Szerk.: a programtól függően előfordulhat, hogy az Eprom tartalmát is menteni kell, hogy visszaálljon az eredeti működés. Illetve akkor már a FUSE biteket is a teljesség kedvéért. Ez az összes nem felejtő állapottároló a csippen ismereteim szerint, ezek teljes mentése teljes backupnak számít.
A hozzászólás módosítva: Nov 3, 2021
(#) roland9 hozzászólása Nov 8, 2021 /
 
Sziasztok!

Segítségeteket szeretném kérni.
Van egy 7 col-os kijelzőm Link amin képet szeretnék megjeleníteni SD kártyáról olvasva, ezzel nincs is semmi gond mert a kép megjelenik, viszont a kép pozícióját nem tudom változtatni, hiába írom át a "bmpDraw("helpnagy.bmp", 100, 100);" számokat, a kép mindig a bal felső sarokban jelenik meg.
Tudnátok segíteni a probléma magoldásában?
  1. /***************************************************
  2. EastRising Technology Co.,LTD
  3. Micro SD Card (TF Card) Demonstration
  4. Examples for ER-TFTM070-4V2.1(800x480 Pixels)
  5.  
  6. ER-TFTM070-4V2.1 with no touch panel sets power supply to 5V and 8080-16BIT parallel interface.Meanwhile the Hardware SPI on shield should be short and Software SPI should be open.Capacitive Touch Screen on shield should be short and Resistive Touch Panel should be open.
  7.  
  8. ER-TFTM070-4V2.1 with Resistive touch panel sets power supply to 5V and 8080-16BIT Parallel interface. Meanwhile the Hardware SPI on shield should be open and Software SPI should be short.Capacitive Touch Screen on shield should be open and Resistive Touch Panel should be open either.
  9.  
  10. Don't foget to copy images from bmp folder to your TF card and insert to SD card slot of arduino shield.
  11.  
  12. Tested and worked with:
  13. Arduino Mega 2560,Arduino Due
  14. Works with Arduino 1.6.0 IDE
  15. ****************************************************/
  16.    
  17. #include <Wire.h>  
  18. #include <UTFT.h>
  19. #include <SPI.h>
  20. #include <SD.h>
  21.    
  22. // TFT display and SD card will share the hardware SPI interface.
  23. // Hardware SPI pins are specific to the Arduino board type and
  24. // cannot be remapped to alternate pins.  
  25.    
  26. // Standard Arduino Mega/Due shield            : <display model>,38,39,40,41
  27.  
  28. // Remember to change the model parameter to suit your display module!
  29. UTFT myGLCD(SSD1963_800480,38,39,40,41);  //(byte model, int RS, int WR, int CS, int RST, int SER)
  30.    
  31. #define SD_CS 47
  32. int dispx, dispy;  
  33.  
  34. void setup(void) {
  35.  
  36.   // Setup the LCD
  37.   myGLCD.InitLCD();
  38.  // -------------------------------------------------------------
  39.   pinMode(8, OUTPUT);  //backlight
  40.   digitalWrite(8, HIGH);//on
  41. // -------------------------------------------------------------
  42.  
  43.   Serial.begin(9600);
  44.  
  45.   myGLCD.setColor(255, 0, 0);
  46.   myGLCD.fillRect(0, 0, 799, 479);  
  47.  
  48.   dispx=myGLCD.getDisplayXSize();
  49.   dispy=myGLCD.getDisplayYSize();  
  50.    
  51.   Serial.print("Initializing SD card...");
  52.   if (!SD.begin(SD_CS)) {
  53.     Serial.println("failed!");
  54.   }
  55.   Serial.println("OK!");
  56.    
  57.      bmpDraw("helpnagy.bmp", 100, 100);
  58.    delay(1000);
  59.  
  60. }
  61.    
  62. void loop() {
  63. }
  64.    
  65. // This function opens a Windows Bitmap (BMP) file and
  66. // displays it at the given coordinates.  It's sped up
  67. // by reading many pixels worth of data at a time
  68. // (rather than pixel by pixel).  Increasing the buffer
  69. // size takes more of the Arduino's precious RAM but
  70. // makes loading a little faster.  20 pixels seems a
  71. // good balance.
  72.    
  73. #define BUFFPIXEL 20
  74.  
  75. void bmpDraw(char *filename, int x, int y) {
  76.   File     bmpFile;
  77.   int      bmpWidth, bmpHeight;   // W+H in pixels
  78.   uint8_t  bmpDepth;              // Bit depth (currently must be 24)
  79.   uint32_t bmpImageoffset;        // Start of image data in file
  80.   uint32_t rowSize;               // Not always = bmpWidth; may have padding
  81.   uint8_t  sdbuffer[3*BUFFPIXEL]; // pixel in buffer (R+G+B per pixel)
  82.   uint16_t lcdbuffer[BUFFPIXEL];  // pixel out buffer (16-bit per pixel)
  83.   uint8_t  buffidx = sizeof(sdbuffer); // Current position in sdbuffer
  84.   boolean  goodBmp = false;       // Set to true on valid header parse
  85.   boolean  flip    = true;        // BMP is stored bottom-to-top
  86.   int      w, h, row, col;
  87.   uint8_t  r, g, b;
  88.   uint32_t pos = 0, startTime = millis();
  89.   uint8_t  lcdidx = 0;
  90.   boolean  first = true;
  91.  
  92.   if((x >= dispx) || (y >= dispy)) return;
  93.  
  94.   Serial.println();
  95.   Serial.print(F("Loading image '"));
  96.   Serial.print(filename);
  97.   Serial.println('\'');
  98.  
  99.   // Open requested file on SD card
  100.   if ((bmpFile = SD.open(filename)) == NULL) {
  101.     Serial.println(F("File not found"));
  102.     return;
  103.   }
  104.  
  105.   // Parse BMP header
  106.   if(read16(bmpFile) == 0x4D42) { // BMP signature
  107.     Serial.println(F("File size: "));
  108.     Serial.println(read32(bmpFile));
  109.     (void)read32(bmpFile); // Read & ignore creator bytes
  110.     bmpImageoffset = read32(bmpFile); // Start of image data
  111.     Serial.print(F("Image Offset: "));
  112.     Serial.println(bmpImageoffset, DEC);
  113.  
  114.     // Read DIB header
  115.     Serial.print(F("Header size: "));
  116.     Serial.println(read32(bmpFile));
  117.     bmpWidth  = read32(bmpFile);
  118.     bmpHeight = read32(bmpFile);
  119.  
  120.     if(read16(bmpFile) == 1) { // # planes -- must be '1'
  121.       bmpDepth = read16(bmpFile); // bits per pixel
  122.       Serial.print(F("Bit Depth: "));
  123.       Serial.println(bmpDepth);
  124.       if((bmpDepth == 24) && (read32(bmpFile) == 0)) { // 0 = uncompressed
  125.         goodBmp = true; // Supported BMP format -- proceed!
  126.         Serial.print(F("Image size: "));
  127.         Serial.print(bmpWidth);
  128.         Serial.print('x');
  129.         Serial.println(bmpHeight);
  130.  
  131.         // BMP rows are padded (if needed) to 4-byte boundary
  132.         rowSize = (bmpWidth * 3 + 3) & ~3;
  133.  
  134.         // If bmpHeight is negative, image is in top-down order.
  135.         // This is not canon but has been observed in the wild.
  136.         if(bmpHeight < 0) {
  137.           bmpHeight = -bmpHeight;
  138.           flip      = false;
  139.         }
  140.  
  141.         // Crop area to be loaded
  142.         w = bmpWidth;
  143.         h = bmpHeight;
  144.         if((x+w-1) >= dispx)  w = dispx  - x;
  145.         if((y+h-1) >= dispy) h = dispy - y;
  146.  
  147.         // Set TFT address window to clipped image bounds
  148.  
  149.         for (row=0; row<h; row++) { // For each scanline...
  150.           // Seek to start of scan line.  It might seem labor-
  151.           // intensive to be doing this on every line, but this
  152.           // method covers a lot of gritty details like cropping
  153.           // and scanline padding.  Also, the seek only takes
  154.           // place if the file position actually needs to change
  155.           // (avoids a lot of cluster math in SD library).
  156.           if(flip) // Bitmap is stored bottom-to-top order (normal BMP)
  157.             pos = bmpImageoffset + (bmpHeight - 1 - row) * rowSize;
  158.           else     // Bitmap is stored top-to-bottom
  159.           pos = bmpImageoffset + row * rowSize;
  160.           if(bmpFile.position() != pos) { // Need seek?
  161.             bmpFile.seek(pos);
  162.             buffidx = sizeof(sdbuffer); // Force buffer reload
  163.           }
  164.  
  165.           for (col=0; col<w; col++) { // For each column...
  166.             // Time to read more pixel data?
  167.             if (buffidx >= sizeof(sdbuffer)) { // Indeed
  168.               // Push LCD buffer to the display first
  169.               if(lcdidx > 0) {
  170.                 myGLCD.setColor(lcdbuffer[lcdidx]);
  171.                 myGLCD.drawPixel(col, row);
  172.                 lcdidx = 0;
  173.                 first  = false;
  174.               }
  175.  
  176.               bmpFile.read(sdbuffer, sizeof(sdbuffer));
  177.               buffidx = 0; // Set index to beginning
  178.             }
  179.  
  180.             // Convert pixel from BMP to TFT format
  181.             b = sdbuffer[buffidx++];
  182.             g = sdbuffer[buffidx++];
  183.             r = sdbuffer[buffidx++];
  184.             myGLCD.setColor(r,g,b);
  185.             myGLCD.drawPixel(col, row);
  186.           } // end pixel
  187.  
  188.         } // end scanline
  189.  
  190.         // Write any remaining data to LCD
  191.         if(lcdidx > 0) {
  192.            myGLCD.setColor(lcdbuffer[lcdidx]);
  193.           myGLCD.drawPixel(col, row);
  194.         }
  195.  
  196.         Serial.print(F("Loaded in "));
  197.         Serial.print(millis() - startTime);
  198.         Serial.println(" ms");
  199.  
  200.       } // end goodBmp
  201.     }
  202.   }
  203.  
  204.   bmpFile.close();
  205.   if(!goodBmp) Serial.println(F("BMP format not recognized."));
  206.  
  207. }
  208.  
  209. // These read 16- and 32-bit types from the SD card file.
  210. // BMP data is stored little-endian, Arduino is little-endian too.
  211. // May need to reverse subscript order if porting elsewhere.
  212.  
  213. uint16_t read16(File f) {
  214.   uint16_t result;
  215.   ((uint8_t *)&result)[0] = f.read(); // LSB
  216.   ((uint8_t *)&result)[1] = f.read(); // MSB
  217.   return result;
  218. }
  219.  
  220. uint32_t read32(File f) {
  221.   uint32_t result;
  222.   ((uint8_t *)&result)[0] = f.read(); // LSB
  223.   ((uint8_t *)&result)[1] = f.read();
  224.   ((uint8_t *)&result)[2] = f.read();
  225.   ((uint8_t *)&result)[3] = f.read(); // MSB
  226.   return result;
  227. }
A hozzászólás módosítva: Nov 8, 2021
(#) majkimester válasza roland9 hozzászólására (») Nov 8, 2021 / 1
 
A 172, 186 és 194 sorokat írd át erre:
  1. myGLCD.drawPixel(x+col, y+row);
(#) roland9 válasza majkimester hozzászólására (») Nov 8, 2021 /
 
Köszi szépen, működik
(#) kapu48 válasza roland9 hozzászólására (») Nov 9, 2021 /
 
Azért le kellene ellenőrizni, hogy mi történik olyankor ha, az eltolások miatt a BMP területe túl nyúl a TFT területén?
Mert igy arra a területre is rajzolna a program.

Ha ez zavaró? Akkor be lehet tenni ellenőrzést, minden rajzolás elé pl.:
  1. if((x+col < dispx) && (y+row < dispy))
  2.     myGLCD.drawPixel(x+col, y+row);
A hozzászólás módosítva: Nov 9, 2021
(#) sargarigo válasza kapu48 hozzászólására (») Nov 9, 2021 /
 
Tényleg ki kellene próbálni, de szerintem ezt hardveresen megoldja. Nem hiszem hogy bajt csinál vele..
(#) majkimester válasza kapu48 hozzászólására (») Nov 9, 2021 / 1
 
Le van az is kezelve, ha figyelmesen megnézed.
93. Sor ha teljesen kivül esne, akkor nem csinál semmit.
145-146 sor, ha részben kilógna, akkor csak a kepernyő területere eső részre mennek a ciklusok.
(#) kapu48 válasza majkimester hozzászólására (») Nov 9, 2021 /
 
Igazad van!
(#) Rober_4 hozzászólása Nov 10, 2021 /
 
Sziasztok!
Túlcsordulást szeretnék vizsgálni.
Valahogy ki szeretném zárni, hogy egy változó értéke túlcsordulás esetén ellentétes előjelbe menjen át! Már az is segítene, ha valahogy gyorsan egyszerűen tudnám vizsgálni egy számról (long vagy int), hogy milyen az előjele, mert ha változott, akkor visszaállítanám az előjeltől függően max vagy min értékre.
Segítségeteket köszönöm!
(#) vargham válasza Rober_4 hozzászólására (») Nov 10, 2021 / 1
 
  1. constexpr int cDefaultValue = 0;
  2. int integer = -123;
  3. integer = integer < 0 ? cDefaultValue : integer;
A hozzászólás módosítva: Nov 10, 2021
(#) tbarath válasza Rober_4 hozzászólására (») Nov 10, 2021 /
 
Nem teljesen értem. Ha előjeles dologról beszélünk, akkor egy sima if-fel vizsgálod, hogy kisebb-e mint 0, és ha igen, akkor beállítod a default értékét.
Bár célszerű lehet a túlcsordulást inkább megelőzni...
(#) Rober_4 válasza tbarath hozzászólására (») Nov 10, 2021 /
 
Teljesen igazad van, de bitet szerettem volna vizsgálni, amennyiben lehetséges, szerintem úgy gyorsabb lehetek. Körülbelül csak annyi kellene nekem, hogy hogyan tudnám mondjuk egy intnél az előjelbitet vizsgálni...
(#) Rober_4 válasza Rober_4 hozzászólására (») Nov 10, 2021 /
 
Tehát betenném az előjelbitet egy változóba, és azt vizsgálnám, hogy nem egyenlő, ezzel nem kellene kisebb nagyobb műveletekkel dolgoznom, else ágra menne stb...
Csak arra nincs ötletem sem, hogy hogyan tudom az előjelbitet kiszedni a változóból...
(#) vargham válasza Rober_4 hozzászólására (») Nov 10, 2021 /
 
Nem lesz gyorsabb. A fordító gondoskodik róla, hogy a lehető legjobb gépi kód legyen a forrásodból. Nem igazán tudsz trükközni vele.
(#) majkimester válasza Rober_4 hozzászólására (») Nov 10, 2021 / 1
 
Csak elméletben, de nem javaslom:

Arduino-n az int 2 byte (nem mindenhol annyi), csak annyit kellene tenned, hogy a legfelső bitet megnézed. Ha az 1 akkor a szám negatív. (kettes komplemens-nek olvass utána)

  1. if (szam & 0x8000) { ... }


Vagy ha úgy tetszik:

  1. elojel = szam >> 15;


Hasonló módszert én gyakran használtam PIC assembly-ben több byte-os adatoknál annak ellenőrzésére, hogy a szám negatív-e, mert ott tényleg csak a legfelső byte legfelső bitjét kellett megnézni, ráadásul volt rá bit teszt utasítás.

De őszintén szólva, a C fordító esetén nem fogsz nyerni vele semmit a vargham által javasolt megoldáshoz képest. Továbbá azt sem garantált egyik esetben sem, hogy az eredményed túlcsordult, amikor negatív eredményt kapsz, mert 0-ra is túlcsordulhat, nem csak negatívra és akár normális lehet a negatív eredmény is, ha mondjuk egy összeadásnál az egyik tag eleve negatív volt.
(#) tbarath válasza Rober_4 hozzászólására (») Nov 10, 2021 /
 
Szia,

Bővebben: Link
Idézet:
„int’s store negative numbers with a technique called (2’s complement math). The highest bit, sometimes referred to as the "sign" bit, flags the number as a negative number. The rest of the bits are inverted and 1 is added.”

És asszem little endian.
De baromi egyszerű letesztelni. Fogsz egy intet (long, stb.), adsz neki értékekeket (1, 2, 3, -1, -2, -3) és kiiratod binárisan, egyből kibukik hol van az előjelbit.
(#) Rober_4 válasza majkimester hozzászólására (») Nov 10, 2021 /
 
Köszönöm! Ez lehet megoldja amit szeretnék.
(#) majkimester válasza Rober_4 hozzászólására (») Nov 10, 2021 /
 
Figyelj, mert mint írtam, az összeadás eredménye 0-ra is túlcsordulhat, egy szorzás eredménye meg simán pozitívra is: 300 x 300 = 90000, de te eredményül 24464-et fogsz kapni, ami pozitív, és amit nem tudsz így detektálni.

A processzor Carry flag-jét kellene megnézni a művelet után, de azt C-ben nem lehet.
(#) Rober_4 válasza majkimester hozzászólására (») Nov 10, 2021 /
 
Nagyon köszönöm! De ezek nálam már nagyon extrém kilengések. Sajnos mivel ez egy audió jel, a legnagyobb problémám, hogy egy túlcsordulás egy óriási impulzust generál, kb max amplitúdóval. Pedig, ha csak simán elveszne, ami több, észre sem lehetne venni...
És ha nem c, akkor meg tudnám nézni a carry flaget? Mondjuk beágyazott assemly kóddal?
A hozzászólás módosítva: Nov 10, 2021
(#) Bakman válasza Rober_4 hozzászólására (») Nov 10, 2021 /
 
Honnan jön az érték, ami túlcsordulást okozhat?
(#) Rober_4 válasza Bakman hozzászólására (») Nov 10, 2021 /
 
Egy audióbuffer hanghullámformákból. Néha elszabadul némelyik görbe, és maxérték felett számol. Bár itt most eltolási problémák is vannak, de ez a lényegen nem változtat...
A hozzászólás módosítva: Nov 10, 2021

tulcsori.png
    
(#) sargarigo válasza Rober_4 hozzászólására (») Nov 10, 2021 /
 
Azt lehet tudni hogy mi viszi be a hibát? Ebben a konkrét esetben limitálnék mondjuk -255 -re (ex has, csak szemléltetésnek), és ami negatívabb, azt eldobnám/korrigálnám. De enné azért jobb lenne a hiba megjelenésénél megcsípni!
(#) Bakman válasza Rober_4 hozzászólására (») Nov 10, 2021 /
 
Nem voltam egyértelmű. A jelet ADC-vel méred vagy valamilyen más módon jutsz az értékekhez?
(#) vargham válasza Rober_4 hozzászólására (») Nov 10, 2021 /
 
1. Nem lesz gyorsabb.
2. Kevésbé olvasható. Pont ezért tiltják a biztonsági előírások (MISRA, HIC, stb), hogy előjeles típuson bitműveleteket végezzünk. Persze téged nem kötelez semmi, de általában is érdemes megfogadni az ajánlásokat.
(#) Rober_4 válasza Bakman hozzászólására (») Nov 10, 2021 /
 
Ez egy Due, van rajta egy Dac ami kap egy buffert. A kép konkrétan Audacityel készült, de hallható is a túlcsordulás. Sajnos a hiba sokhelyről jöhet. Vagy alapvetően a modulátor amplitúdója nagy, vagy a reverb algoritmus gerjed fel, teljesen mindegy, ha túlcsordulás van a buffer változómban azt el kellene kapnom...
(#) Bakman válasza Rober_4 hozzászólására (») Nov 10, 2021 /
 
Nem lenne megoldás a bemenő jelet osztani és nagyobb felbontású ADC-t használni? Így nem lehetne túlcsordulás.
(#) Rober_4 válasza Bakman hozzászólására (») Nov 10, 2021 / 1
 
Nem akartam belemenni a projektbe, mert már uncsi, hogy 2 éve ezt csinálom
FMszinti
A legújabb forráskód itt:
Forrás
(#) sargarigo válasza Rober_4 hozzászólására (») Nov 10, 2021 / 1
 
Tegyük fel hogy elkaptad. Akkor mit tennél vele? Hangnál behallatszik minden anomália nem?
Egyébként én a jel meredekségét figyelném, ha túl nagy az amplitúdóváltozás túl rövid idő alatt, akkor trigger van.
(#) Kovidivi válasza sargarigo hozzászólására (») Nov 10, 2021 /
 
Nem értem én se a problémát. Ha kisebb, mint nulla, eldobjuk. Hogy ez most 1 vagy 3 órajel, olyan mindegy. Sima if és kész.
(#) pipi válasza Kovidivi hozzászólására (») Nov 10, 2021 / 2
 
Kritikus helyen én inkább választok nagyobb tartományú számábrázolást, ami tuti nem csordul túl,
az előforduló értékekkel, olyan sokkal nem lesz hosszabb/lassúbb a kód.
Következő: »»   711 / 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