Страница 1 из 2

АЦП в pic16f72

Добавлено: Пн мар 03, 2014 19:18:03
Ghost in shell
Не работает!
Вроде все сделал по даташиту.
Спойлер

Код: Выделить всё

//начало объявления переменных и констант--------------------------------------------------------------------------------------------
volatile unsigned char cCountTransl;   // для получения 100 Гц из 500
volatile unsigned char count_r;       // счетчик 4-х циклов индикации за 1 прерывание
volatile unsigned short int Indik;         // вывод на индикацию
volatile unsigned char Zaderj;         // переменная для работы задержки
//----------
volatile struct strBIT  //объявление структуры strBIT типа volatile
{
unsigned bZaderj:1;   // бит на защелку 1 - срабатывание, 0 - нет.
unsigned bBIT1:1;   // бит на защелку  1 - срабатывание, 0 - нет.
unsigned bBIT2:1;   // бит на защелку 1 - срабатывание, 0 - нет.
unsigned bBIT3:1;   // бит на защелку 1 - срабатывание, 0 - нет.
}strBIT;
......
if(Zaderj > 0){Zaderj--;}  // ППОП, частота 500 Герц
----------
// функции, используемые в файле - oбъявления
void fnInit(void)         // настройка портов и таймеров
{
//ADCON1 = 0b111; // 0b111 - отключение АЦП
ADCON1 = 0b100; //
TRISA = 0b01011; // (0/1 - выход/вход, нумерация битов в регистре справо-налево)
TRISB = 0b00000000; // (0/1 - выход/вход, нумерация битов в регистре справо-налево)
TRISC = 0b00000000; // (0/1 - выход/вход, нумерация битов в регистре справо-налево)
RBPU = 1; // подтягивающие R (0-вкл, 1-выкл) бит регистра OPTION
//PORTA = 0;
PORTB = 0b11111111;
PORTC = 0b11110000;
//----------
GIE = 1;   // разрешены все немаскированные прерывания
PEIE = 1;  // разрешены все немаскированные прерывания от переферийных модулей

void nastrAD (void)   // срабатывание АЦП
{
//unsigned int varAD = 0;   //
ADCON0 = 0;         // запрет AD-преобразования.
TRISA = 0b111111; // (0/1 - выход/вход, нумерация битов в регистре справо-налево)
PCFG0 = 0; PCFG1 = 0; PCFG2 = 0; // (ADCON1) настройка порта А как аналог, Vref = Vdd (опорное = питанию)
ADCS0 = 0; ADCS1 = 0; // тактовый сигнал Fosc/2
CHS0 = 0; CHS1 = 0; CHS2 = 0; // (ADCON0) выбор первого канала (2 вывод)
ADON = 1;   // включить модуль A/D
ADIF = 0;   // чтобы после конвертирования МК поставил 1, регистр PIR1
ADIE = 1;   // разрешить прерывание от  A/D, регистр PIE1
if (strBIT.bBIT1==1)
{
   Zaderj = 250;      // задаем время зарядки CHOLD
   strBIT.bBIT1 = 0;   // защелкиваем до следующего преобразования
   //strBIT.bZaderj=1;   // запускаем задержку
}
while((Zaderj>0)&&(strBIT.bBIT1 == 0)){}   // ждем время зарядки CHOLD
ADCON0 = 1;         // начало AD-преобразования.
while(ADCON0 == 1){}// ждем конца AD-преобразования.
ADRES = Indik;      // вывод результата AD-преобразования на индикацию
strBIT.bBIT1 = 1;   // разрешить зарядку CHOLD
}
//----------
void main ()
{
fnInit();   // настройка портов и таймеров
TMR1ON = 1;            // запуск динамической индикации
//ADON = 1;
Indik = 0;
for(;;)
{
nastrAD();
fnIntToStr(Indik); // вывод на индикацию
}
}


Как были нули, так и стоят.

Re: АЦП в pic16f72

Добавлено: Вт мар 04, 2014 13:03:50
urry
ADCON0 = 1; // начало AD-преобразования.
while(ADCON0 == 1){}// ждем конца AD-преобразования.


Это что такое ? зачем переписан весь регистр ?
Должны установить 1 бит и его анализировать.
GODONE=1;
while(GODONE);

Re: АЦП в pic16f72

Добавлено: Вт мар 04, 2014 17:31:17
Ghost in shell
urry спасибо, но GODONE=1; не работает. Так же как и GO/DONE=1; GO/-DONE=1; компилятор ругается. GO тоже не катит. Имя 2-го бита - загадка...
К счастью, вы мне указали статью о битовых масках. Попробовал применить:
Спойлерvoid nastrAD (void) // срабатывание АЦП
{
TRISA = 0b111111; // (0/1 - выход/вход, нумерация битов в регистре справо-налево)
PCFG0 = 0; PCFG1 = 0; PCFG2 = 0; // (ADCON1) настройка порта А как аналог, Vref = Vdd (опорное = питанию)
ADCS0 = 0; ADCS1 = 0; // тактовый сигнал Fosc/2
CHS0 = 0; CHS1 = 0; CHS2 = 0; // (ADCON0) выбор первого канала (2-й вывод)
ADON = 1; // включить модуль A/D
ADIF = 0; // чтобы после конвертирования МК поставил 1, регистр PIR1
ADIE = 1; // разрешить прерывание от A/D, регистр PIE1
//PEIE и GIE установлены в "1" в fnInit();
if (strBIT.bBIT1==1) // начало зарядки CHOLD
{
Zaderj = 250; // задаем время зарядки CHOLD
strBIT.bBIT1 = 0; // защелкиваем до следующего преобразования
}
while((Zaderj>0)&&(strBIT.bBIT1 == 0)){} // ждем время зарядки CHOLD
ADCON0 = ADCON0 | (1<<2); // устанавливаем 2-й бит регистра ADCON0 для начала AD-преобразования.
while((ADCON0 & (1<<2)) == 1){}// пока 2-й бит регистра ADCON0 равен 1, ждем конца AD-преобразования.
ADRES = Indik; // вывод результата AD-преобразования на индикацию
strBIT.bBIT1 = 1; // разрешить зарядку CHOLD
}

Re: АЦП в pic16f72

Добавлено: Вт мар 04, 2014 17:49:58
dosikus
Ghost in shell писал(а):но GODONE=1; не работает. Так же как и GO/DONE=1; GO/-DONE=1; компилятор ругается. GO тоже не катит.


Ты еще танец нанайских мальчиков с бубном спляши, авось угадаешь... :)))
Не судьба хэдер открыть и посмотреть?

Хотя, nastr ,Zaderj и indik говорят сами за себя... :)))

Re: АЦП в pic16f72

Добавлено: Вт мар 04, 2014 18:58:23
urry
Да, названия битов могут меняться даже в зависимости от версии одного и того же компилятора, когда-то это меня удивило.
:)
Так что в папку инклуд, выцепить оттуда заголовочный файл вашего камня, распечатать на принтере и держать перед глазами.

Re: АЦП в pic16f72

Добавлено: Вт мар 04, 2014 20:50:06
Ghost in shell
dosikus это все варианты названий из даташитов, куда так любят отсылать некоторые "знатоки".
Изучение хедера не помогло: по-прежнему нули.
P.S. Само собой, я проверил все биты регистров ADCON0 и ADCON1.

Re: АЦП в pic16f72

Добавлено: Вт мар 04, 2014 21:31:00
dosikus
Ghost in shell, компилятор и его версию озвучь.
А так же кусок кода ,а лучше целиком проект ...

Ghost in shell писал(а):это все варианты названий из даташитов, куда так любят отсылать некоторые "знатоки".


А ты так на "знатоков" обижен ... :)))
Читать надо оригиналы а не переводную чушь.
Тогда косяков подобных этому , не будет :

Код: Выделить всё

ADRES = Indik;      // вывод результата AD-преобразования на индикацию

Re: АЦП в pic16f72

Добавлено: Вт мар 04, 2014 22:44:23
Ghost in shell
Компилятор Hi-Tech PIC v9.60.

Перевода даташита на pic16f72 я не нашел. Обижаться на незнаек, с умным видом изрекающих истину в последней инстанции, глупо. Времени жалко на проверку их "гипотез".

Толку в том проекте... Там только динамический вывод на 4х разрядный индикатор. Вас смущают названия переменных в моем коде? После упорного навязывания во всех книгах

шестнадцатиричного значения в регистрах? TRISD = 0xb3; - просто образец профессионализма! Это только такой чайник как я, не может в уме перевести в двоичную систему как 0b10110011. И такая чушь во всех книгах. :shock:
Как мне удобно, так и пишу. Для себя самого и так сойдет, абы работало.
Спойлер//pic16f72
#include <pic.h>
__CONFIG (XT & WDTDIS & PWRTDIS & BOREN & UNPROTECT);
#define XTAL_FREQ 4000000 // задание частоты кварца для расчета частоты таймера
//Начало насторойки TMR1------------------------------------------------------------------
#define FTMR_IN XTAL_FREQ/4 // задание Fosc/4 (входная частота для таймера)
#define FTMR1_OUT 500 // частота после таймера (в данно случае, 500 Hz на индикаторы)
#define TMR1_ALL 65536 - (FTMR_IN/FTMR1_OUT) // получение значения предделителя
#if TMR1_ALL > 65635
#error "слишком низкая частота ! измените значения пределителя !"// генерится при компиляции
#endif
//----------
#define TMR1_H TMR1_ALL>>8 // определение значения старшего байта предделителя TMR1 для 500 Hz
// сдвиг на 8 байт вправо? для 500Гц - F8
#define TMR1_L (int)TMR1_ALL&0x00FF // определение значения младшего байта предделителя TMR1 для 500 Hz
// а как? 0x00FF в 16-рич = 255 в 10-тич - для 500Гц - 30
//Конец насторойки TMR1------------------------------------------------------------------
#define FTMR2_OUT 4000*2 // задание выходной частоты TMR2 (4000 Hz на зудение)
#define TMR2_ALL 256 - (FTMR_IN/FTMR2_OUT) // получение значения предделителя
#if TMR2_ALL > 250
#error "слишком низкая частота ! измените значения пределителя !"// генерится при компиляции
#endif
//----------
#define all_1 RC7 // общие провода 1-4 разрядов
#define all_2 RC6
#define all_3 RC5
#define all_4 RC4
//начало объявления переменных и констант--------------------------------------------------------------------------------------------
volatile unsigned char cCountTransl; // для получения 100 Гц из 500
volatile unsigned char count_r; // счетчик 4-х циклов индикации за 1 прерывание
volatile unsigned short int Indik; // вывод на индикацию
volatile unsigned char Zaderj; // переменная для работы задержки
//----------
volatile struct strBIT //объявление структуры strBIT типа volatile
{
unsigned bZaderj:1; // бит на защелку 1 - срабатывание, 0 - нет.
unsigned bBIT1:1; // бит на защелку 1 - срабатывание, 0 - нет.
unsigned bBIT2:1; // бит на защелку 1 - срабатывание, 0 - нет.
unsigned bBIT3:1; // бит на защелку 1 - срабатывание, 0 - нет.
}strBIT;
// strBIT.bBIT1 - пример обращения к переменной из этой структуры.
//----------
unsigned char arr[4];
// массив цифрогенератора для индикаторов с общим анодом для реальной платы
const unsigned char arr_seg [10] =
{
/*
0bHDCEFBGA <– расположение сегментов по битам */
0b10000010, // «0»+ (нумерация битов в регистре справо-налево) 0-светит
0b11011011, // «1»+
0b10101000, // «2»+
0b10011000, // «3»+
0b11010001, // «4»+
0b10010100, // «5»+
0b10000100, // «6»+
0b11011010, // «7»+
0b10000000, // «8»+
0b10010000, // «9»+
};
//конец объявления переменных и констант------------------------------------------------------------------
//
void interrupt isr(void) // обработчик прерываний
{
static char temp;
if (TMR1IF && TMR1IE) // опрос флага прерывания по переполнению TMR1.
// TMR1 работает на динамическую индикацию. Частота 500 Гц.
{
TMR1H = TMR1_H; //
///Важно !!!! ----------
TMR1L += TMR1_L; //
// Приплюсовывая к младшему регистру таймера, мы компенсируем задержки,
// вызванные сохранением контекста и пр - улучшаем точность счета
TMR1IF = 0; // сброс флага прерывания по переполнению TMR1
// начало блока вывода на индикатор----------------------------------------------
switch (count_r)
{
case 0: // ветвь для 4 разряда
all_1 = 1; // выключили 1 разряд
temp = arr [count_r];
PORTB = arr_seg [temp];
all_4 = 0; // включили 4 разряд
break; // принудительный выход из цикла
case 1: // ветвь для 3 разряда
all_4 = 1;
temp = arr [count_r];
PORTB = arr_seg [temp];
all_3 = 0;
break;
case 2: // ветвь для 2 разряда
all_3 = 1;
temp = arr [count_r];
PORTB = arr_seg [temp];
all_2 = 0;
break;
case 3: // ветвь для 1 разряда
all_2 = 1;
temp = arr [count_r];
PORTB = arr_seg [temp];
all_1 = 0;
break;
}
count_r++; // добавили 1 в счетчик разрядов
if(count_r >= 4){count_r = 0;} // если крайнее значение, обнуляем счетчик
if(Zaderj > 0){Zaderj--;}
}// конец блока вывода на индикатор----------------------------------------------------
}// конец обработчика прерываний
//----------
// функции, используемые в файле - oбъявления
void fnInit(void) // настройка портов и таймеров
{
//ADCON1 = 0b111; // 0b111 - отключение АЦП
ADCON1 = 0b100; //
//TRISA = 0b01011; // (0/1 - выход/вход, нумерация битов в регистре справо-налево)
TRISB = 0b00000000; // (0/1 - выход/вход, нумерация битов в регистре справо-налево)
TRISC = 0b00000000; // (0/1 - выход/вход, нумерация битов в регистре справо-налево)
RBPU = 1; // подтягивающие R (0-вкл, 1-выкл) бит регистра OPTION
//PORTA = 0;
PORTB = 0b11111111;
PORTC = 0b11110000;
//----------
GIE = 1; // разрешены все немаскированные прерывания
PEIE = 1; // разрешены все немаскированные прерывания от переферийных модулей
// настройка TMR1------------------------------------------------------------------------------------------
// регистр T1CON
T1CKPS1 = 0; // выбор коэфф. деления предделителя
T1CKPS0 = 0; // выбор коэфф. деления предделителя
T1OSCEN = 0; // выключить внутренний тактовый генератор модуля TMR1
TMR1CS = 0; // 1 - выбран внешний (0 - внутренний, Fosk/4) источник тактового сигнала модуля TMR1
TMR1H = TMR1_H; // старший байт предзагрузки TMR1
TMR1L = TMR1_L; // младший байт предзагрузки TMR1 63536
TMR1IE = 1; // Разрешение прерывания по переполнению TMR1
TMR1IF = 0; // сброс флага прерывания по переполнению TMR1
TMR1ON = 1; // включить TMR1
// конец настройки TMR1------------------------------------------------------------------------------------
// настройка TMR2 пока не используется
TOUTPS3 = 0; // настройка выходного делителя
TOUTPS2 = 0; // настройка выходного делителя
TOUTPS1 = 0; // настройка выходного делителя
TOUTPS0 = 0; // настройка выходного делителя
T2CKPS1 = 0; // настройка предделителя - 1 k 1
T2CKPS0 = 0; // настройка предделителя
PR2 = 0; // PR2 (Timer2 Match value) не сбрасывается при переполнении
TMR2IE = 0; // Разрешение прерывания по переполнению TMR2
TMR2IF = 0; // сброс флага прерывания по переполнению TMR2
TMR2ON = 1; // включить TMR2
//----------
// настройка TMR0 пока не используется
T0CS = 0; // bit 5 TMR0 Выбор источника сигнала 0 - Fosc/4 (внутренний); 1 - подача на T0CKI
T0SE = 0; // bit 4 TMR0 Выбор фронта приращения TMR0 при внешнем тактовом сигнале (0-передний фронт)
PSA = 0; // bit 3 Выбор включения предделителя: 0 - перед TMR0, 1 - перед WDT
PS2 = 1; // bit 2 Настройка предделителя
PS1 = 1; // bit 1 Настройка предделителя
PS0 = 1; // bit 0 Настройка предделителя
T0IE = 0; // запрет прерывания по переполнению
T0IF = 0; // сброс флага прерывания по переполнению
TMR0+=178; // запись предзагрузки
}
//----------
void fnIntToStr(unsigned int tmp) // преобразование 1-го десятичного числа в 4 цифры разрядов (для индикации фальшфиниша)
{ // начало функции преобразования 4-значного числа в 4 числа (определение значащих цифр для индикации)
const unsigned int step[4] = {1000,100,10,1}; // объявлен массив "step" из переменных типа
unsigned char i;
unsigned int val, temp, atemp;
val = tmp;
for (i=0; i<4; i++)
{
temp = step[i];
atemp = 0;
while (val >= temp)
{
atemp++;
val = val - temp;
}
arr[i] = atemp;
}
} // конец функции преобразования десятичного числа в 4 байта (для индикации)

void nastrAD (void) // срабатывание АЦП
{
TRISA = 0b111111; // (0/1 - выход/вход, нумерация битов в регистре справо-налево)
PCFG0 = 0; PCFG1 = 0; PCFG2 = 0; // (ADCON1) настройка порта А как аналог, Vref = Vdd (опорное = питанию)
ADCS0 = 0; ADCS1 = 0; // тактовый сигнал Fosc/2
CHS0 = 0; CHS1 = 0; CHS2 = 0; // (ADCON0) выбор первого канала (2-й вывод)
ADON = 1; // включить модуль A/D
ADIF = 0; // чтобы после конвертирования МК поставил 1, регистр PIR1
ADIE = 1; // разрешить прерывание от A/D, регистр PIE1
//PEIE и GIE установлены в "1" в fnInit();
if (strBIT.bBIT1==1) // начало зарядки CHOLD
{
Zaderj = 250; // задаем время зарядки CHOLD
strBIT.bBIT1 = 0; // защелкиваем до следующего преобразования
}
while((Zaderj>0)&&(strBIT.bBIT1 == 0)){} // ждем время зарядки CHOLD
//ADCON0 = ADCON0 | (1<<2); // устанавливаем 2-й бит регистра ADCON0 для начала AD-преобразования.
ADGO = 1; // устанавливаем 2-й бит регистра ADCON0 для начала AD-преобразования.
//while((ADCON0 & (1<<2)) == 1){}// пока 2-й бит регистра ADCON0 равен 1, ждем конца AD-преобразования.
while(ADGO == 1){}// пока 2-й бит регистра ADCON0 равен 1, ждем конца AD-преобразования.
ADRES = Indik; // вывод результата AD-преобразования на индикацию
strBIT.bBIT1 = 1; // разрешить зарядку CHOLD
}
//----------
void main ()
{
fnInit(); // настройка портов и таймеров
TMR1ON = 1; // запуск динамической индикации
//ADON = 1;
Indik = 0;
for(;;)
{
nastrAD();
fnIntToStr(Indik); // вывод на индикацию
}
}

Re: АЦП в pic16f72

Добавлено: Вт мар 04, 2014 22:57:48
dosikus
Ghost in shell писал(а):
Вас смущают названия переменных в моем коде?

Есть "народное" поверье - программы с идентификаторами на транслите, работают через ж... - как написано так и работает :)))


Ghost in shell писал(а):шестнадцатиричного значения в регистрах? TRISD = 0xb3; - просто образец профессионализма!
Это только такой чайник как я, не может в уме перевести в двоичную систему как 0b10110011.
И такая чушь во всех книгах. :shock:

А какая разница? И то и другое - не читаемые "магические" числа.


Ghost in shell писал(а):Как мне удобно, так и пишу. Для себя самого и так сойдет, абы работало.

И не сомневаюсь см. выше...

В предыдущем своем посте я указал на главную проблему...

Re: АЦП в pic16f72

Добавлено: Вт мар 04, 2014 23:45:18
Ghost in shell
Так для СССР и СНГ всегда было нормой все делать через ж...! Т.е. я на верном пути.

В вашем предыдущем посте за флудом трудно увидеть рациональное зерно. Как и в прочих постах.

А двоичное число в регистрах специального назначения лично мне очень даже понятно.

Re: АЦП в pic16f72

Добавлено: Ср мар 05, 2014 11:08:45
dosikus
Когда начнешь различать рациональное от флуда, тогда у тебя все заколосится, а пока у тебя сие не получается... :)))

Могу еще раз ткнуть, о чем думал когда сие строчил ?

Код: Выделить всё

ADRES = Indik;      // вывод результата AD-преобразования на индикацию

Re: АЦП в pic16f72

Добавлено: Ср мар 05, 2014 11:13:41
urry
Так для СССР и СНГ всегда было нормой все делать через ж...! Т.е. я на верном пути.
Как мне удобно, так и пишу. Для себя самого и так сойдет, абы работало.

Хуже отмазки просто не придумать.
dosikus - а лучше послушать.
Правила программирования написаны кровью, которая капала из глаз людей, читающий плохой код.
Константы - только заглавными. Никаких абсолютных значений в тексте !
Магические числа - это абсолютные значения. Нравятся числа и жить без них не можете -- задефайните и вывалите в шапку.
Самое замечательное свойство человеческого ума - это забывать. Это сейчас вы считаете, что на всю жизнь запомнили, чему соответствует 2 бит в регистре. Через месяц- другой, посмотрев на разбухшую программу, придется вспоминать. Если бы вместо цифры 2 стояло название, вспоминать уже будет проще.
В общем, не хочу повторять -
http://www.pic24.ru/doku.php/osa/articl ... out_errors
http://www.google.com.ua/url?sa=t&rct=j ... 6460,d.bGE

Re: АЦП в pic16f72

Добавлено: Ср мар 05, 2014 19:01:11
dosikus
urry писал(а):......


Одно скажу, я безмерно благодарен Стасу и Юре, как моим учителям.

Re: АЦП в pic16f72

Добавлено: Пт мар 07, 2014 13:00:36
Ghost in shell
urry
Спасибо за линки. Но там как в Библии: каждый творит что угодно, ссылаясь, само собой, на божий глас.
Пример:
Именование переменных
Слова начинаются с заглавной буквы
Ниже читаем:
О «венгерской нотации»
Некоторые используют систему именования, в которой каждой переменной приписывается префикс, показывающий ее тип. Это часто может оказаться полезным при анализе чужого (а часто и собственного) кода. Например:
Префиксы:

Префикс области видимости
Без префикса – локальная или параметр функции
s_ - статическая
m_ - локальная для модуля
g_ - глобальная
i_ - Обрабатывается в прерывании
Префикс типа
uc – unsigned char
sc – signed char
ui – unsigned int (n)
si – signed int (w)

И т.д.

Код: Выделить всё

static unsigned char s_ucRecCounter;


т.е. сии труды надо читать с оглядкой, как и все прочее.
Мне как-то попалось описание работы динамической индикации. Теория, так сказать. Но оно годится только для замгачивания головы студентам. Да, я и сейчас согласен с тем, что написано правильно. Но никаких идей о практической реализации. Вот почему я предпочитаю рабочий код.
Я как будно не объявлял константы в тексте. Только массив для динамической индикации. :dont_know:

Re: АЦП в pic16f72

Добавлено: Пт мар 07, 2014 13:48:29
dosikus
Ghost in shell писал(а):т.е. сии труды надо читать с оглядкой, как и все прочее.

Ну и что же так смутило тебя?

Ghost in shell писал(а):Мне как-то попалось описание работы динамической индикации. Теория, так сказать. Но оно годится только для замгачивания головы студентам. Да, я и сейчас согласен с тем, что написано правильно. Но никаких идей о практической реализации. Вот почему я предпочитаю рабочий код.

Что такого сложного в динамической индикации?
Вывод буфера, заполняемого в главном цикле, в прерывании ...

Однако спрошу еще раз- что делает сия строка ? :)))

Код: Выделить всё

ADRES = Indik;      // вывод результата AD-преобразования на индикацию

Re: АЦП в pic16f72

Добавлено: Пн мар 10, 2014 21:55:19
Ghost in shell
dosikus
я писал выше, что мне непонятно в этой книге. Имена переменных.

Re: АЦП в pic16f72

Добавлено: Вт мар 11, 2014 23:47:50
dosikus
О как ...
Однако что может быть непонятного ? :)))
Имя переменной содержит в себе описания и типа и квалификатора в виде префиксов .
Наверное стоит почитать, что такое самодокументируемый код ?

Ты на мой вопрос когда ответишь? :)))

Re: АЦП в pic16f72

Добавлено: Ср мар 12, 2014 12:32:40
korsaj
Никогда не ответит, так как его в нем ничего не смущает..

Re: АЦП в pic16f72

Добавлено: Вт мар 25, 2014 13:45:44
HSA
Господа! Подскажите схему программатора для этой микросхемы, чем можно прошить?

Re: АЦП в pic16f72

Добавлено: Вт мар 25, 2014 15:55:06
Zhuk72
Если на один раз, то какой-нибудь на СОМ-порт с внешним питанием (если СОМ порт на компе имеется). Если вообще ПИКи будете время от времени прошивать, то купите или соберите PICKIT2.