Fórum témák
- • LCD monitor probléma
- • SONY TA-F 590ES MOSFET végfok átalakítása
- • Szárítógép problémák
- • Elfogadnám, ha ingyen elvihető
- • Li-Po - Li-ion akkumulátor és töltője
- • Tápegység
- • Felajánlás, azaz ingyen elvihető
- • Hűtőgép probléma
- • Codefon kaputelefon
- • Kapcsolóüzemű tápegység
- • Oszcilloszkóp vétel, mit gondoltok?
- • Autós indító és indításrásegítő
- • Quad 405-ös erősítő tapasztalatok és hibák
- • Számítógép hiba, de mi a probléma?
- • Inverteres hegesztőtrafó
- • Érdekességek
- • Adatlapot keresek
- • Opel Astra elektromos hibák
- • Audiofil, High End Audio
- • Kapunyitás gombnyomásra olcsón! - avagy automata kapu házilag
- • Erősítő mindig és mindig
- • Áram mérése
- • Hegesztő inverter javítás
- • Napelem alkalmazása a lakás energia ellátásában
- • Leválasztó transzformátor
- • Kombinált gáztűzhely
- • Arduino
- • Oszcilloszkóp, avagy hogyan kell használni?
- • LCD TV probléma
- • Crystal radio - detektoros rádió
- • Autós erősítős kérdések, problémák
- • Milyen mikroszkópot vásároljak?
- • Emos dori led lámpa villogó hiba
- • Motorgyújtás
- • Plazma TV
- • Rendelés külföldről (eBay - Paypal)
- • Indukciós főzőlap javítása
- • Akkumulátor töltő
- • Dansk 3f-T3535, és minden, ami vele kapcsolatos
- • Ezt az alkatrészt honnan bontsam ki? (miben találunk ilyen alkatrészt)
- • Szobatermosztát bekötése
- • Vicces - mókás történetek
- • Savas akkumulátor
- • Kondenzátor
- • Parkside akkuk javìtása
- • DVB-S Műholdas digitális TV problémák
- • Műveleti erősítő
- • Nyomtató probléma
- • Kávéfőzőgép hiba
- • Kamerás megfigyelőrendszer
- • Transzformátor készítés, méretezés
- • Retro számítógépek
- • Ventilátor vezérlés - ha lekapcsolom a villanyt
- • Lítium akummulátor bővítése
- • Túlfeszültségvédő
» Több friss téma
|
A klónok CH340 Soros-USB illesztőjének drivere ( Letöltés)
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.):
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
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? /***************************************************
EastRising Technology Co.,LTD
Micro SD Card (TF Card) Demonstration
Examples for ER-TFTM070-4V2.1(800x480 Pixels)
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.
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.
Don't foget to copy images from bmp folder to your TF card and insert to SD card slot of arduino shield.
Tested and worked with:
Arduino Mega 2560,Arduino Due
Works with Arduino 1.6.0 IDE
****************************************************/
#include <Wire.h>
#include <UTFT.h>
#include <SPI.h>
#include <SD.h>
// TFT display and SD card will share the hardware SPI interface.
// Hardware SPI pins are specific to the Arduino board type and
// cannot be remapped to alternate pins.
// Standard Arduino Mega/Due shield : <display model>,38,39,40,41
// Remember to change the model parameter to suit your display module!
UTFT myGLCD(SSD1963_800480,38,39,40,41); //(byte model, int RS, int WR, int CS, int RST, int SER)
#define SD_CS 47
int dispx, dispy;
void setup(void) {
// Setup the LCD
myGLCD.InitLCD();
// -------------------------------------------------------------
pinMode(8, OUTPUT); //backlight
digitalWrite(8, HIGH);//on
// -------------------------------------------------------------
Serial.begin(9600);
myGLCD.setColor(255, 0, 0);
myGLCD.fillRect(0, 0, 799, 479);
dispx=myGLCD.getDisplayXSize();
dispy=myGLCD.getDisplayYSize();
Serial.print("Initializing SD card...");
if (!SD.begin(SD_CS)) {
Serial.println("failed!");
}
Serial.println("OK!");
bmpDraw("helpnagy.bmp", 100, 100);
delay(1000);
}
void loop() {
}
// This function opens a Windows Bitmap (BMP) file and
// displays it at the given coordinates. It's sped up
// by reading many pixels worth of data at a time
// (rather than pixel by pixel). Increasing the buffer
// size takes more of the Arduino's precious RAM but
// makes loading a little faster. 20 pixels seems a
// good balance.
#define BUFFPIXEL 20
void bmpDraw(char *filename, int x, int y) {
File bmpFile;
int bmpWidth, bmpHeight; // W+H in pixels
uint8_t bmpDepth; // Bit depth (currently must be 24)
uint32_t bmpImageoffset; // Start of image data in file
uint32_t rowSize; // Not always = bmpWidth; may have padding
uint8_t sdbuffer[3*BUFFPIXEL]; // pixel in buffer (R+G+B per pixel)
uint16_t lcdbuffer[BUFFPIXEL]; // pixel out buffer (16-bit per pixel)
uint8_t buffidx = sizeof(sdbuffer); // Current position in sdbuffer
boolean goodBmp = false; // Set to true on valid header parse
boolean flip = true; // BMP is stored bottom-to-top
int w, h, row, col;
uint8_t r, g, b;
uint32_t pos = 0, startTime = millis();
uint8_t lcdidx = 0;
boolean first = true;
if((x >= dispx) || (y >= dispy)) return;
Serial.println();
Serial.print(F("Loading image '"));
Serial.print(filename);
Serial.println('\'');
// Open requested file on SD card
if ((bmpFile = SD.open(filename)) == NULL) {
Serial.println(F("File not found"));
return;
}
// Parse BMP header
if(read16(bmpFile) == 0x4D42) { // BMP signature
Serial.println(F("File size: "));
Serial.println(read32(bmpFile));
(void)read32(bmpFile); // Read & ignore creator bytes
bmpImageoffset = read32(bmpFile); // Start of image data
Serial.print(F("Image Offset: "));
Serial.println(bmpImageoffset, DEC);
// Read DIB header
Serial.print(F("Header size: "));
Serial.println(read32(bmpFile));
bmpWidth = read32(bmpFile);
bmpHeight = read32(bmpFile);
if(read16(bmpFile) == 1) { // # planes -- must be '1'
bmpDepth = read16(bmpFile); // bits per pixel
Serial.print(F("Bit Depth: "));
Serial.println(bmpDepth);
if((bmpDepth == 24) && (read32(bmpFile) == 0)) { // 0 = uncompressed
goodBmp = true; // Supported BMP format -- proceed!
Serial.print(F("Image size: "));
Serial.print(bmpWidth);
Serial.print('x');
Serial.println(bmpHeight);
// BMP rows are padded (if needed) to 4-byte boundary
rowSize = (bmpWidth * 3 + 3) & ~3;
// If bmpHeight is negative, image is in top-down order.
// This is not canon but has been observed in the wild.
if(bmpHeight < 0) {
bmpHeight = -bmpHeight;
flip = false;
}
// Crop area to be loaded
w = bmpWidth;
h = bmpHeight;
if((x+w-1) >= dispx) w = dispx - x;
if((y+h-1) >= dispy) h = dispy - y;
// Set TFT address window to clipped image bounds
for (row=0; row<h; row++) { // For each scanline...
// Seek to start of scan line. It might seem labor-
// intensive to be doing this on every line, but this
// method covers a lot of gritty details like cropping
// and scanline padding. Also, the seek only takes
// place if the file position actually needs to change
// (avoids a lot of cluster math in SD library).
if(flip) // Bitmap is stored bottom-to-top order (normal BMP)
pos = bmpImageoffset + (bmpHeight - 1 - row) * rowSize;
else // Bitmap is stored top-to-bottom
pos = bmpImageoffset + row * rowSize;
if(bmpFile.position() != pos) { // Need seek?
bmpFile.seek(pos);
buffidx = sizeof(sdbuffer); // Force buffer reload
}
for (col=0; col<w; col++) { // For each column...
// Time to read more pixel data?
if (buffidx >= sizeof(sdbuffer)) { // Indeed
// Push LCD buffer to the display first
if(lcdidx > 0) {
myGLCD.setColor(lcdbuffer[lcdidx]);
myGLCD.drawPixel(col, row);
lcdidx = 0;
first = false;
}
bmpFile.read(sdbuffer, sizeof(sdbuffer));
buffidx = 0; // Set index to beginning
}
// Convert pixel from BMP to TFT format
b = sdbuffer[buffidx++];
g = sdbuffer[buffidx++];
r = sdbuffer[buffidx++];
myGLCD.setColor(r,g,b);
myGLCD.drawPixel(col, row);
} // end pixel
} // end scanline
// Write any remaining data to LCD
if(lcdidx > 0) {
myGLCD.setColor(lcdbuffer[lcdidx]);
myGLCD.drawPixel(col, row);
}
Serial.print(F("Loaded in "));
Serial.print(millis() - startTime);
Serial.println(" ms");
} // end goodBmp
}
}
bmpFile.close();
if(!goodBmp) Serial.println(F("BMP format not recognized."));
}
// These read 16- and 32-bit types from the SD card file.
// BMP data is stored little-endian, Arduino is little-endian too.
// May need to reverse subscript order if porting elsewhere.
uint16_t read16(File f) {
uint16_t result;
((uint8_t *)&result)[0] = f.read(); // LSB
((uint8_t *)&result)[1] = f.read(); // MSB
return result;
}
uint32_t read32(File f) {
uint32_t result;
((uint8_t *)&result)[0] = f.read(); // LSB
((uint8_t *)&result)[1] = f.read();
((uint8_t *)&result)[2] = f.read();
((uint8_t *)&result)[3] = f.read(); // MSB
return result;
}
A hozzászólás módosítva: Nov 8, 2021
A 172, 186 és 194 sorokat írd át erre:
myGLCD.drawPixel(x+col, y+row);
Köszi szépen, működik
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.:
if((x+col < dispx) && (y+row < dispy))
myGLCD.drawPixel(x+col, y+row);
A hozzászólás módosítva: Nov 9, 2021
Tényleg ki kellene próbálni, de szerintem ezt hardveresen megoldja. Nem hiszem hogy bajt csinál vele..
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.
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!
constexpr int cDefaultValue = 0;
int integer = -123;
integer = integer < 0 ? cDefaultValue : integer;
A hozzászólás módosítva: 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...
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...
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...
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.
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)
if (szam & 0x8000) { ... }
Vagy ha úgy tetszik:
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.
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.
Köszönöm! Ez lehet megoldja amit szeretnék.
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.
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
Honnan jön az érték, ami túlcsordulást okozhat?
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
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!
Nem voltam egyértelmű. A jelet ADC-vel méred vagy valamilyen más módon jutsz az értékekhez?
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.
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...
Nem lenne megoldás a bemenő jelet osztani és nagyobb felbontású ADC-t használni? Így nem lehetne túlcsordulás.
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
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.
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.
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.
|
|