Тестер видеосигнала.
- Войдите на сайт для отправки комментариев
Втр, 20/04/2021 - 05:02
Всем добра.
Помогите разобраться с кодом.
Подозрение на то что неверная ширина SYNC.
// HSync
// front porch (1.5 us)
PORTB = _BLACK;
delayMicroseconds(1.5);
//sync (4.7 us)
PORTB = _SYNC;
delayMicroseconds(4.7);
// breezeway (.6us) + burst (2.5us) + colour back borch (1.6 us)
PORTB = _BLACK;
delayMicroseconds(4.7);
Осциллограф видит RGB и Синхру, но синхра визуально как будто задом наперед и шиворот на вы ворот.
https://forum.arduino.cc/t/arduino-uno-colour-ntsc-output-with-ad725-bad-colours-issue/612007
[code] /* Adapted by phizone from: Arduino Tv framebuffer Alastair Parker 2007 Modified for use on NTSC monitors and displays 2009 Michael Pilcher */ // Video out voltage levels #define _SYNC B00000000 #define _BLACK B00000010 #define _RED B00000110 #define _GREEN B00001010 #define _BLUE B00010010 #define _YELLOW B00001110 #define _PINK B00010110 #define _CYAN B00011010 #define _WHITE B00011110 // dimensions of the screen #define WIDTH 35 // sets # of columns 0-34. Column 34 is oversized on some displays #define HEIGHT 15 // sets # of rows 0-14. row 0 wrapped around to the bottom //number of lines to display #define DISPLAY_LINES 255 //video pins #define BLUE_PIN 12 #define GREEN_PIN 11 #define RED_PIN 10 #define SYNC_PIN 9 // the video frameBuffer byte frameBuffer[WIDTH][HEIGHT]; // loop indices byte index, index2; // video line loop byte line; // current drawing line in framebuffer byte newLine; void setREDPixel(byte x,byte y) { frameBuffer[x][y]= _RED; } void setGREENPixel(byte x,byte y) { frameBuffer[x][y]= _GREEN; } void setBLUEPixel(byte x,byte y) { frameBuffer[x][y]= _BLUE; } void setYELLOWPixel(byte x,byte y) { frameBuffer[x][y]= _YELLOW; } void setPINKPixel(byte x,byte y) { frameBuffer[x][y]= _PINK; } void setCYANPixel(byte x,byte y) { frameBuffer[x][y]= _CYAN; } void setPixel(byte x,byte y) { frameBuffer[x][y]= _WHITE; } // draw a black pixel to the buffer void clearPixel(byte x,byte y) { frameBuffer[x][y]= _BLACK; } //draw BANDS TEST PATTERNS void drawScreen() { for (int x=0; x <= 34; x++){ for (int y=0; y <= 14; y++){ if ((x>=0) && (x<=4)) frameBuffer[x][y]= _WHITE; if ((x>=5) && (x<=8)) frameBuffer[x][y]= _YELLOW; if ((x>=9) && (x<=12)) frameBuffer[x][y]= _CYAN; if ((x>=13) && (x<=16)) frameBuffer[x][y]= _GREEN; if ((x>=17) && (x<=20)) frameBuffer[x][y]= _PINK; if ((x>=21) && (x<=24)) frameBuffer[x][y]= _RED; if ((x>=25) && (x<=28)) frameBuffer[x][y]= _BLUE; if ((x>=29) && (x<=32)) frameBuffer[x][y]= _BLACK; } } } /* //draw RANDOM PIXELS void drawScreen() { for (int x=0; x <= 34; x++){ for (int y=0; y <= 14; y++){ byte ran = random(8); if (ran==0) frameBuffer[x][y]= _WHITE; if (ran==1) frameBuffer[x][y]= _YELLOW; if (ran==2) frameBuffer[x][y]= _CYAN; if (ran==3) frameBuffer[x][y]= _GREEN; if (ran==4) frameBuffer[x][y]= _PINK; if (ran==5) frameBuffer[x][y]= _RED; if (ran==6) frameBuffer[x][y]= _BLUE; if (ran==7) frameBuffer[x][y]= _BLACK; } } } */ /* //draw CHESSBOARD void drawScreen() { // possible unusable column. may appear too wide on some displays setPixel(34,0); setPixel(34,1); setPixel(34,2); setPixel(34,3); setPixel(34,4); setPixel(34,5); setPixel(34,6); setPixel(34,7); setPixel(34,8); setPixel(34,9); setPixel(34,10); setPixel(34,11); setPixel(34,12); setPixel(34,13); setPixel(34,14); // row 0, this row displays at the bottom of the screen not the top setPixel(1,0); setPixel(2,0); setPixel(3,0); setPixel(4,0); setPixel(5,0); setPixel(6,0); setPixel(7,0); setPixel(8,0); setPixel(9,0); setPixel(10,0); setPixel(11,0); setPixel(12,0); setPixel(13,0); setPixel(14,0); setPixel(15,0); setPixel(16,0); setPixel(17,0); setPixel(18,0); setPixel(19,0); setPixel(20,0); setPixel(21,0); setPixel(22,0); setPixel(23,0); setPixel(24,0); setPixel(25,0); setPixel(26,0); setPixel(27,0); setPixel(28,0); setPixel(29,0); setPixel(30,0); setPixel(31,0); setPixel(32,0); setPixel(33,0); // checked test pattern, CHANGE THESE TO BUILD YOUR IMAGE setPixel(0,2); setPixel(0,4); setPixel(0,6); setPixel(0,8); setPixel(0,10); setPixel(0,12); setPixel(0,14); setPixel(1,1); setPixel(1,3); setPixel(1,5); setPixel(1,7); setPixel(1,9); setPixel(1,11); setPixel(1,13); setPixel(2,2); setPixel(2,4); setPixel(2,6); setPixel(2,8); setPixel(2,10); setPixel(2,12); setPixel(2,14); setPixel(3,1); setPixel(3,3); setPixel(3,5); setPixel(3,7); setPixel(3,9); setPixel(3,11); setPixel(3,13); setPixel(4,2); setPixel(4,4); setPixel(4,6); setPixel(4,8); setPixel(4,10); setPixel(4,12); setPixel(4,14); setPixel(5,1); setPixel(5,3); setPixel(5,5); setPixel(5,7); setPixel(5,9); setPixel(5,11); setPixel(5,13); setPixel(6,2); setPixel(6,4); setPixel(6,6); setPixel(6,8); setPixel(6,10); setPixel(6,12); setPixel(6,14); setPixel(7,1); setPixel(7,3); setPixel(7,5); setPixel(7,7); setPixel(7,9); setPixel(7,11); setPixel(7,13); setPixel(8,2); setPixel(8,4); setPixel(8,6); setPixel(8,8); setPixel(8,10); setPixel(8,12); setPixel(8,14); setPixel(9,1); setPixel(9,3); setPixel(9,5); setPixel(9,7); setPixel(9,9); setPixel(9,11); setPixel(9,13); setPixel(10,2); setPixel(10,4); setPixel(10,6); setPixel(10,8); setPixel(10,10); setPixel(10,12); setPixel(10,14); setPixel(11,1); setPixel(11,3); setPixel(11,5); setPixel(11,7); setPixel(11,9); setPixel(11,11); setPixel(11,13); setPixel(12,2); setPixel(12,4); setPixel(12,6); setPixel(12,8); setPixel(12,10); setPixel(12,12); setPixel(12,14); setPixel(13,1); setPixel(13,3); setPixel(13,5); setPixel(13,7); setPixel(13,9); setPixel(13,11); setPixel(13,13); setPixel(14,2); setPixel(14,4); setPixel(14,6); setPixel(14,8); setPixel(14,10); setPixel(14,12); setPixel(14,14); setPixel(15,1); setPixel(15,3); setPixel(15,7); setPixel(15,5); setPixel(15,9); setPixel(15,11); setPixel(15,13); setPixel(16,2); setPixel(16,4); setPixel(16,6); setPixel(16,8); setPixel(16,10); setPixel(16,12); setPixel(16,14); setPixel(17,1); setPixel(17,3); setPixel(17,5); setPixel(17,7); setPixel(17,9); setPixel(17,11); setPixel(17,13); setPixel(18,2); setPixel(18,4); setPixel(18,6); setPixel(18,8); setPixel(18,10); setPixel(18,12); setPixel(18,14); setPixel(19,1); setPixel(19,3); setPixel(19,5); setPixel(19,7); setPixel(19,9); setPixel(19,11); setPixel(19,13); setPixel(20,2); setPixel(20,4); setPixel(20,6); setPixel(20,8); setPixel(20,10); setPixel(20,12); setPixel(20,14); setPixel(21,1); setPixel(21,3); setPixel(21,5); setPixel(21,7); setPixel(21,9); setPixel(21,11); setPixel(21,13); setPixel(22,2); setPixel(22,4); setPixel(22,6); setPixel(22,8); setPixel(22,10); setPixel(22,12); setPixel(22,14); setPixel(23,1); setPixel(23,3); setPixel(23,5); setPixel(23,7); setPixel(23,9); setPixel(23,11); setPixel(23,13); setPixel(24,2); setPixel(24,4); setPixel(24,6); setPixel(24,8); setPixel(24,10); setPixel(24,12); setPixel(24,14); setPixel(25,1); setPixel(25,3); setPixel(25,5); setPixel(25,7); setPixel(25,9); setPixel(25,11); setPixel(25,13); setPixel(26,2); setPixel(26,4); setPixel(26,6); setPixel(26,8); setPixel(26,10); setPixel(26,12); setPixel(26,14); setPixel(27,1); setPixel(27,3); setPixel(27,5); setPixel(27,7); setPixel(27,9); setPixel(27,11); setPixel(27,13); setPixel(28,2); setPixel(28,4); setPixel(28,6); setPixel(28,8); setPixel(28,10); setPixel(28,12); setPixel(28,14); setPixel(29,1); setPixel(29,3); setPixel(29,5); setPixel(29,7); setPixel(29,9); setPixel(29,11); setPixel(29,13); setPixel(30,2); setPixel(30,4); setPixel(30,6); setPixel(30,8); setPixel(30,10); setPixel(30,12); setPixel(30,14); setPixel(31,1); setPixel(31,3); setPixel(31,5); setPixel(31,7); setPixel(31,9); setPixel(31,11); setPixel(31,13); setPixel(32,2); setPixel(32,4); setPixel(32,6); setPixel(32,8); setPixel(32,10); setPixel(32,12); setPixel(32,14); setPixel(33,1); setPixel(33,3); setPixel(33,5); setPixel(33,7); setPixel(33,9); setPixel(33,11); setPixel(33,13); } */ // clear the screen void clearScreen() { for (index = 0; index < WIDTH; index++) for (index2 = 0; index2< HEIGHT; index2++) { frameBuffer[index][index2] = _BLACK; } /*clears stray pixel at (34,0) that doesn't get cleared by the above for() loops. If the loop that reads for (index = 0; index < WIDTH; index++) reads for (index = 0; index <= WIDTH; index++) the timing is thrown off and the image gets scrambled */ frameBuffer[35][0] = _BLACK; } // the setup routine void setup() { cli(); pinMode (SYNC_PIN, OUTPUT); pinMode (RED_PIN, OUTPUT); pinMode (GREEN_PIN, OUTPUT); pinMode (BLUE_PIN, OUTPUT); digitalWrite (SYNC_PIN, HIGH); digitalWrite (RED_PIN, HIGH); digitalWrite (GREEN_PIN, HIGH); digitalWrite (BLUE_PIN, HIGH); clearScreen(); drawScreen(); } void loop() { // iterate over the lines on the tv for ( line =0;line< DISPLAY_LINES;++line) { // HSync // front porch (1.5 us) PORTB = _BLACK; delayMicroseconds(1.5); //sync (4.7 us) PORTB = _SYNC; delayMicroseconds(4.7); // breezeway (.6us) + burst (2.5us) + colour back borch (1.6 us) PORTB = _BLACK; delayMicroseconds(4.7); //calculate which line to draw to newLine = line >>4; delayMicroseconds(1); //display the array for this line // a loop would have been smaller, but it messes the timing up PORTB = frameBuffer[0][newLine]; delayMicroseconds(1); PORTB = frameBuffer[1][newLine]; delayMicroseconds(1); PORTB = frameBuffer[2][newLine]; delayMicroseconds(1); PORTB = frameBuffer[3][newLine]; delayMicroseconds(1); PORTB = frameBuffer[4][newLine]; delayMicroseconds(1); PORTB = frameBuffer[5][newLine]; delayMicroseconds(1); PORTB = frameBuffer[6][newLine]; delayMicroseconds(1); PORTB = frameBuffer[7][newLine]; delayMicroseconds(1); PORTB = frameBuffer[8][newLine]; delayMicroseconds(1); PORTB = frameBuffer[9][newLine]; delayMicroseconds(1); PORTB = frameBuffer[10][newLine]; delayMicroseconds(1); PORTB = frameBuffer[11][newLine]; delayMicroseconds(1); PORTB = frameBuffer[12][newLine]; delayMicroseconds(1); PORTB = frameBuffer[13][newLine]; delayMicroseconds(1); PORTB = frameBuffer[14][newLine]; delayMicroseconds(1); PORTB = frameBuffer[15][newLine]; delayMicroseconds(1); PORTB = frameBuffer[16][newLine]; delayMicroseconds(1); PORTB = frameBuffer[17][newLine]; delayMicroseconds(1); PORTB = frameBuffer[18][newLine]; delayMicroseconds(1); PORTB = frameBuffer[19][newLine]; delayMicroseconds(1); PORTB = frameBuffer[20][newLine]; delayMicroseconds(1); PORTB = frameBuffer[21][newLine]; delayMicroseconds(1); PORTB = frameBuffer[22][newLine]; delayMicroseconds(1); PORTB = frameBuffer[23][newLine]; delayMicroseconds(1); PORTB = frameBuffer[24][newLine]; delayMicroseconds(1); PORTB = frameBuffer[25][newLine]; delayMicroseconds(1); PORTB = frameBuffer[26][newLine]; delayMicroseconds(1); PORTB = frameBuffer[27][newLine]; delayMicroseconds(1); PORTB = frameBuffer[28][newLine]; delayMicroseconds(1); PORTB = frameBuffer[29][newLine]; delayMicroseconds(1); PORTB = frameBuffer[30][newLine]; delayMicroseconds(1); PORTB = frameBuffer[31][newLine]; delayMicroseconds(1); PORTB = frameBuffer[32][newLine]; delayMicroseconds(1); PORTB = frameBuffer[33][newLine]; delayMicroseconds(1); PORTB = frameBuffer[34][newLine]; delayMicroseconds(1); // klugdge to correct timings PORTB = PORTB; delayMicroseconds(1); PORTB = PORTB; delayMicroseconds(1); PORTB = PORTB; PORTB = PORTB; PORTB = PORTB; delayMicroseconds(1); } //vsync PORTB = _SYNC; // wait for the remainder of the sync period delayMicroseconds(125); } [/code]
используй "щёчик фор", и не слушай его, что "a loop would have been smaller, but it messes the timing up"
Осциллограф был настроен не верно, потому и синхру неправильно показывал. Сейчас диаграмка норм, желтый это синхра.
Красный
Синий
Зеленый.
127486, выбросьте этот код в помойку. Его явно писал человек, не имеющий ни малейшего представления о программировании.
Другого к сожалению нету (
127486, выбросьте этот код в помойку. Его явно писал человек, не имеющий ни малейшего представления о программировании.
"в отсутствии жены общаются с домработницей" )))
Как энтомолог-любитель интересуюсь: а для какого контроллера это "код" предназначен?
Как энтомолог-любитель интересуюсь: а для какого контроллера это "код" предназначен?
ты с утреца удивил однако, там жеж прямо написано -
Arduino UNO COLOUR NTSC Output with AD725 - Bad colours issue…
Поковырял TvOut библиотеку, на ней синхра работает.
Только соответственно у него нету RGB выходов, чисто видео.
Поковырял TvOut библиотеку, на ней синхра работает.
Только соответственно у него нету RGB выходов, чисто видео.
вообще-то синхронизирующий для TV трёхровневый, на кадровый с уровнем порядка 1.2 вольта садятся строчные, двухуровневые, это если делать по фэншую
Да с уровнями все норм.
Да с уровнями все норм.
а со строками? данные не с первой строки начинаются, резервируются для измерительных импульсов, точно уже не вспомню, до какой строки, но 21-я вроде точно измерительная была )))
Ну в общем я поскольку чайник, пошел неандертальским путем.
Одну ардуину прошил tvout
Вторую оставил с проблемным кодом.
Подключил осциллограф к обеим синхрам.
Играя с цыифрами в
delayMicroseconds(1.5);
//sync (4.7 us)
PORTB = _SYNC;
delayMicroseconds(4.7);
// breezeway (.6us) + burst (2.5us) + colour back borch (1.6 us)
PORTB = _BLACK;
delayMicroseconds(4.7);
подогнал синхру по tvout .
По итогу сигнал пришёл, но кривой.
Завтра зафоткаю.
Ну вот я компонент почитал. Тоже показалось что 3 параметра для синхры должно быть.
// Timing settings for NTSC
#define _NTSC_TIME_SCANLINE 63.55
#define _NTSC_TIME_OUTPUT_START 12
#define _NTSC_LINE_FRAME 262
#define _NTSC_LINE_START_VSYNC 0
#define _NTSC_LINE_STOP_VSYNC 3
#define _NTSC_LINE_DISPLAY 216
#define _NTSC_LINE_MID ((_NTSC_LINE_FRAME - _NTSC_LINE_DISPLAY) / 2 + _NTSC_LINE_DISPLAY / 2)
#define _NTSC_CYCLES_SCANLINE ((_NTSC_TIME_SCANLINE * _CYCLES_PER_US) - 1)
#define _NTSC_CYCLES_OUTPUT_START ((_NTSC_TIME_OUTPUT_START * _CYCLES_PER_US) - 1)
эмм... а функции delayMicroseconds(1.5) и delayMicroseconds(4.7) действительно обеспечивают дробные задержки?
ИМХО, для подобных интервалов следует применять "более другие" решения.
Не. Там другие получились.
Уже под конец дня делал. Не запомнил. Завтра обязательно сфоткаю все и расскажу как я да такого докатился
Че-т мне кажется ещё одного от гугла отключили за парнуху.
Энтих тестовых сигналов там - как г-на в общественном туалете.
https://www.nongnu.org/avr-libc/user-manual/group__util__delay.html
_delay_us() даёт делать дробные майкросекондсы
Где-то сегодня уже маячила информация про 14.7456
Че-т мне кажется ещё одного от гугла отключили за парнуху.
Энтих тестовых сигналов там - как г-на в общественном туалете.
Не. Норм работает.
Гуглю уже неделю.
Везде либо композит , либо vga. А мне RGBS нужен.