Ну почему, у меня есть ВТЦ32 (он даже тут засветился). Я его вполне быстро подстроил (уменьшил размер растра и подкрутил фазу). Правда, сделал я это для Сеги а не спеца, но спец там тоже на отлично показывал.
Ну почему, у меня есть ВТЦ32 (он даже тут засветился). Я его вполне быстро подстроил (уменьшил размер растра и подкрутил фазу). Правда, сделал я это для Сеги а не спеца, но спец там тоже на отлично показывал.
Напряжение в БП подстраивал? Это просто единственное, что я не делал.
@HardWareMan спасибо, помогло !
Пункт первый не понадобился, а вот второй - помог. Замкнул конденсатор на выходе и немного уменьшил амплитуду выходного сигнала впаяв последовательно с резистором 100 ОМ ещё один такой же. Теперь на LCD телевизоре изображение отличное и стабильное. На CRT изображение тоже стабильнее, но первого столбца так и не видно ...
А я добавил в библиотеку PetitFat функции
- Создать файл/папку.
- Удалить файл/папку.
- Изменить размер файла.
Отладить всё и можно полноценно с файловой системой работать.
Как то так. Если кто то заметит ошибку, кричите.
Код:/*-----------------------------------------------------------------------*/ /* Format name for directory entry */ /*-----------------------------------------------------------------------*/ // Стандартная функция create_name изменяет второй аргумент, а это // нам не надо. static FRESULT create_name_2(DIR* dj, const char* name) { return create_name(dj, &name); } /*-----------------------------------------------------------------------*/ /* Save sector */ /*-----------------------------------------------------------------------*/ // Сохранить сектор на диск static DRESULT disk_write(const BYTE* buf, DWORD sector) { DRESULT r; // Начало операции записи if(r = disk_writep(0, sector)) return r; // Запись данных if(r = disk_writep(buf, 512)) return r; // Окончание операции записи return disk_writep(0, 0); } /*-----------------------------------------------------------------------*/ /* Reset free space counters on start */ /*-----------------------------------------------------------------------*/ // Вызов этой функции надо добавить в конец pf_mount // // if(fs->fs_type==FS_FAT32 && LD_WORD(buf+BPB_RsvdSecCnt-13)>0) // if(resetFreeSpace(bsect+1, buf512)) // return FR_DISK_ERR; static DRESULT resetFreeSpaceFat32(unsigned long bootSectorPlus1, BYTE* buf512) { DRESULT r; if(r = disk_readp(buf512, bootSectorPlus1, 0, 512)) return r; if(*(unsigned long*)buf512 != 0x41615252) return RES_OK; if(*(unsigned long*)(buf512+0x1E4) != 0x61417272) return RES_OK; if(*(unsigned long*)(buf512+0x1FC) != 0xAA550000) return RES_OK; *(unsigned long*)(buf512+0x1E8) = 0xFFFFFFFF; *(unsigned long*)(buf512+0x1EC) = 0xFFFFFFFF; return disk_write(buf512, bootSectorPlus1); } /*-----------------------------------------------------------------------*/ /* Save fat sector in all FAT tables */ /*-----------------------------------------------------------------------*/ static char saveFatSector(unsigned long sector, const BYTE* buf) { if(sector == -1) return 0; if(FatFs->fatbase2) if(disk_write(buf, FatFs->fatbase2 + sector)) return 1; return disk_write(buf, FatFs->fatbase + sector); } /*-----------------------------------------------------------------------*/ /* Alloc cluster */ /*-----------------------------------------------------------------------*/ static FRESULT allocClusterFat32(unsigned long* cluster, BYTE* buf) { unsigned char i; unsigned long s, sectorsInFat, *a; // Кол-во секторов в таблице FAT sectorsInFat = (FatFs->n_fatent + 127) / 128; // В первом секторе первых 2 числа пропускаем i = 2, a = ((unsigned long*)buf)+2; // Последовательно перебираем сектора for(s = 0; s < sectorsInFat; s++) { if(disk_readp(buf, FatFs->fatbase + s, 0, 512)) return FR_DISK_ERR; // Среди 128 чисел в секторе ищем 0 for(; i < 128; i++, a++) { if(*a == 0) { // Мы могли вылететь за пределы таблицы FAT *cluster = i + s * 128; if(*cluster >= FatFs->n_fatent) return FR_NO_FREE_SPACE; // Помечаем кластер как последний *a = 0x0FFFFFFF; // Сохраняем изменения if(saveFatSector(s, buf)) return FR_DISK_ERR; // Ок return FR_OK; } } // Для цикла выше. i = 0, a = (unsigned long*)buf; } // Свобожных кластеров нет. return FR_NO_FREE_SPACE; } /*-----------------------------------------------------------------------*/ /* Add cluster in chain */ /*-----------------------------------------------------------------------*/ static char setNextClusterFat32(unsigned long cluster, unsigned long nextCluster, BYTE* buf512) { unsigned long sector; sector = cluster/128; if(disk_readp(buf512, FatFs->fatbase + sector, 0, 512)) return 1; ((unsigned long*)buf512)[cluster % 128] = nextCluster; return saveFatSector(sector, buf512); } /*-----------------------------------------------------------------------*/ /* Alloc directoy entry */ /*-----------------------------------------------------------------------*/ static FRESULT allocEntryFat32(DIR* dj, const char* name, BYTE* buf512, BYTE** outEntry) { FRESULT res; BYTE c, *a; unsigned char i; DWORD cluster; // Форматируем имя if(res = create_name_2(dj, name)) return res; // Ищем это имя в папке res = dir_find(dj, buf512); if(res != FR_NO_FILE) { if(res == FR_OK) return FR_FILE_EXISTS; return res; } // Перематываем папку в начало if(res = dir_rewind(dj)) return res; // Ищем в папке пустой описатель res = FR_NO_FILE; while (dj->sect) { if (disk_readp(buf512, dj->sect, 0, 512)) return FR_DISK_ERR; for(i=0, a=buf512; i<16; i++, a+=32) { if((a[DIR_Attr] & AM_VOL) == 0 && (*a == 0 || *a == 0xE5)) { // Если мы добавляем в последний элемент, то надо надо создать последний элемент if(*a==0) { if(i<15) { memset(a+32, 0, 512-32-i*32); } else if(dj->index/16+1 < FatFs->csize) { // Это последний элемент в секторе, но не в кластере memset(buf512, 0, 512); if(disk_write(buf512, dj->sect+1)) return FR_DISK_ERR; // Восстанавливаем буфер if(disk_readp(buf512, dj->sect, 0, 512)) return FR_DISK_ERR; } } // Инициализируем найденный элемент memset(a, 0, 32); goto break2; } } // Следующий сектор dj->index += 15; if(res = dir_next(dj)) { if(res != FR_NO_FILE) return res; // В папке может быть не более 65535 файлов if((unsigned short)dj->index==65535) return FR_DIR_FULL; // Добавить еще один кластер к папке. if(res = allocClusterFat32(&cluster, buf512)) return res; if(setNextClusterFat32(dj->clust, cluster, buf512)) return FR_DISK_ERR; dj->clust = cluster; dj->sect = clust2sect(cluster); // Инициализируем сектор memset(buf512, 0, 512); a = buf512; break; } } break2: // Запоняем имя dj->fn = a; create_name_2(dj, name); // Возвращаем указатель на найденный элемент if(outEntry) *outEntry = a; // Ок return FR_OK; } /*-----------------------------------------------------------------------*/ /* Free cluster chain */ /*-----------------------------------------------------------------------*/ static FRESULT freeChain(unsigned long cluster, BYTE* buf512) { unsigned long s, s1, *a; s1 = -1; while(cluster >= 2 && cluster < FatFs->n_fatent) { s = cluster/128; if(s!=s1) { if(saveFatSector(s1, buf512)) return FR_DISK_ERR; s1 = s; if(disk_readp(buf512, FatFs->fatbase+s, 0, 512)) return FR_DISK_ERR; } a = (unsigned long*)(buf512 + (cluster%128)*4); cluster = *a; *a = 0; } if(saveFatSector(s1, buf512)) return FR_DISK_ERR; return FR_OK; } /*-----------------------------------------------------------------------*/ /* Is empty folder */ /*-----------------------------------------------------------------------*/ static FRESULT isEmptyFolder(DWORD cluster, BYTE* buf512) { DIR dir; FRESULT res; BYTE* a; unsigned char i; // Для последовательного четния всех секторов папки dir.sclust = cluster; if(res = dir_rewind(&dir)) return res; // Первые два элемента пропускаем (должны быть .. и .) i = 2, a = buf512 + 64; // Обрабатываем все сектора while(dir.sect) { if(disk_readp(buf512, dir.sect, 0, 512)) return FR_DISK_ERR; // В секторе 16 описателей for(; i < 16; i++, a += 32) { // Это был последний описатель if(*a == 0) return FR_OK; // Найден файл или папка, ошибка if((a[DIR_Attr] & AM_VOL) == 0 && *a != 0xE5) return FR_DIR_NOT_EMPTY; } // Следующий сектор dir.index += 15; if(res = dir_next(&dir)) { // Это был последний сектор, всё ок. if(res == FR_NO_FILE) return FR_OK; // Ошибка return res; } // Для цикла выше i = 0, a = buf512; } } /*-----------------------------------------------------------------------*/ /* Convert bytyes to clusters */ /*-----------------------------------------------------------------------*/ static unsigned long bytesToClusters(unsigned long sizeInBytes) { unsigned long bytesInCluster; bytesInCluster = FatFs->csize*512; return (sizeInBytes + bytesInCluster - 1) / bytesInCluster; }
Код:/*-----------------------------------------------------------------------*/ /* Create file */ /*-----------------------------------------------------------------------*/ FRESULT pf_createFile(const char *path, const char* new_name, BYTE* buf512) { DIR dir; FRESULT res; if(FatFs->fs_type != FS_FAT32) return FR_NO_FREE_SPACE; // Ищем папку if(res = pf_opendir(&dir, path)) return res; // Добавляем в папку описатель if(res = allocEntryFat32(&dir, new_name, buf512, 0)) return res; // Сохраняем описатель на диск if(disk_write(buf512, dir.sect)) return FR_DISK_ERR; return FR_OK; } /*-----------------------------------------------------------------------*/ /* Create Directory */ /*-----------------------------------------------------------------------*/ FRESULT pf_createDir(const char *path, const char* new_name, BYTE* buf512) { DIR dir; FRESULT res; BYTE* entry; DWORD cluster; if(FatFs->fs_type != FS_FAT32) return FR_NO_FREE_SPACE; // Ищем папку if(res = pf_opendir(&dir, path)) return res; // Выделяем кластер if(res = allocClusterFat32(&cluster, buf512)) return res; // Добавляем в папку описатель if(res = allocEntryFat32(&dir, new_name, buf512, &entry)) return res; // Заполняем описатель entry[DIR_Attr] = AM_DIR; *(unsigned short*)(entry+DIR_FstClusHI) = cluster>>16; *(unsigned short*)(entry+DIR_FstClusLO) = (unsigned short)cluster; // Сохраняем описатель на диск if(disk_write(buf512, dir.sect)) return FR_DISK_ERR; // Создаем пустую папку memset(buf512, 0, 512); memset(buf512, ' ', 11); buf512[0] = '.'; buf512[DIR_Attr] = 0x10; *(unsigned short*)(buf512+DIR_FstClusHI) = cluster>>16; *(unsigned short*)(buf512+DIR_FstClusLO) = (unsigned short)cluster; memset(buf512+32, ' ', 11); buf512[32+0] = '.'; buf512[32+1] = '.'; buf512[32+DIR_Attr] = 0x10; if(dir.sclust>2) { *(unsigned short*)(buf512+32+DIR_FstClusHI) = dir.sclust>>16; *(unsigned short*)(buf512+32+DIR_FstClusLO) = (unsigned short)dir.sclust; } // Сохраняем папку if(disk_write(buf512, clust2sect(cluster))) return FR_DISK_ERR; return FR_OK; } /*-----------------------------------------------------------------------*/ /* Delete file or folder */ /*-----------------------------------------------------------------------*/ FRESULT pf_delete(const char *path, BYTE* buf512) { DIR dir; FRESULT res; long cluster; if(FatFs->fs_type != FS_FAT32) return FR_NO_FREE_SPACE; // Ищем файл dir.fn = buf512 + 32; if(res = follow_path(&dir, buf512, path)) return res; // Это корневая папка if(buf512[0] == 0) return FR_NO_PATH; // Первый кластер файла или папки cluster = LD_CLUST(buf512); // В папке не должно быть файлов if(buf512[DIR_Attr] & AM_DIR) { if(res = isEmptyFolder(cluster, buf512)) return res; } // Удаляем описатель if(disk_readp(buf512, dir.sect, 0, 512)) return FR_DISK_ERR; buf512[(dir.index % 16) * 32] = 0xE5; if(disk_write(buf512, dir.sect)) return FR_DISK_ERR; // Освобождаем цепочку кластеров return freeChain(cluster, buf512); } /*-----------------------------------------------------------------------*/ /* Change file length */ /*-----------------------------------------------------------------------*/ FRESULT pf_setSize(const char *path, unsigned long fileSize, BYTE* buf512) { DIR dir; FRESULT res; BYTE* entry; unsigned long cluster, needClusters, firstCluster, prevCluster; if(FatFs->fs_type != FS_FAT32) return FR_NO_FREE_SPACE; // Ищем файл dir.fn = buf512 + 32; res = follow_path(&dir, buf512, path); if(res != FR_OK) return res; if(buf512[0]==0 || (buf512[DIR_Attr]&AM_DIR)!=0) return FR_NO_PATH; // Это корневая папка или папка // Первый кластер файла cluster = LD_CLUST(buf512); if(cluster < 2 || cluster >= FatFs->n_fatent) cluster=0; // Коррекция ошибки firstCluster = cluster; // Расчет кол-ва кластеров needClusters = bytesToClusters(fileSize); // Пропуск кластеров prevCluster = 0; while(cluster && needClusters) { needClusters--; prevCluster = cluster; cluster = get_fat(cluster); if(cluster < 2 || cluster >= FatFs->n_fatent) cluster=0; } if(needClusters) { // Добавление кластеров for(;needClusters; --needClusters) { res = allocClusterFat32(&cluster, buf512); if(res != FR_OK) return res; if(prevCluster) setNextClusterFat32(prevCluster, cluster, buf512); else firstCluster = cluster; prevCluster = cluster; } } else if(cluster) { // Удаление кластеров if(prevCluster) setNextClusterFat32(prevCluster, 0x0FFFFFFF, buf512); else firstCluster = 0; freeChain(cluster, buf512); } // Корректируем описание файла if(disk_readp(buf512, dir.sect, 0, 512)) return FR_DISK_ERR; entry = buf512 + (dir.index % 16) * 32; *(unsigned long *)(entry+DIR_FileSize ) = fileSize; *(unsigned short*)(entry+DIR_FstClusHI) = firstCluster>>16; *(unsigned short*)(entry+DIR_FstClusLO) = (unsigned short)firstCluster; if(disk_write(buf512, dir.sect)) return FR_DISK_ERR; return FR_OK; }
Последний раз редактировалось vinxru; 16.04.2013 в 11:12.
vinxru, ты наверное единственный кто ваяет программы не на ассемблере. Так что извините, не бульмесиум...
vinxru, два вопроса:
1. Компилируешь своим компилятором С? Когда релиз?
2. Либы FAT что ты юзаешь, используют 32-битные типы? Почему спрашиваю: я в свое время использовал FatFS от Chan, использованные там 32-битные типы серьезно ограничивали в выборе компилятора.
Лучше сделать и жалеть, чем не сделать и жалеть.
Некоторые из моих поделок тут: https://github.com/serge-404
Это компилируется для AVR микроконтроллера.
Эти функции, это расширение для сверх-популярной библиотеки PetitFat от Chan. Большая FatFS от Chan не влезает в 1 Кб оперативки и 8 Кб ПЗУ, которые есть у ATMega8.
---------- Post added at 18:15 ---------- Previous post was at 18:15 ----------
Сразу после Специалистов займусь. Пока он крайне сырой.
Причем. Я был "в отпуске" последние недели, все мои компьютеры и паяльники были упакованы в коробки. И завтра я возвращаюсь к себе в офис-мастерскую!
Более того, на майских праздниках будет много свободного времени.
---------- Post added at 18:16 ---------- Previous post was at 18:15 ----------
Да, использую
Последний раз редактировалось vinxru; 17.04.2013 в 19:21.
Уважаемые Специалисты, помогите в ремонте.
Изначально при включении не было ни видео, ни звуков. Заменил ИЕ1 и проц, теперь загружается, но выдает следующее:
Обзвонил несколько сервисов, на возможность прошить РФ тестом, но пока, безрезультатно.
В каком порядке проверять?
У меня Специалист, явно "ТЕМП", на РУ5
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)