Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Продукция MICROCHIP

Продукция MICROCHIP Технические вопросы по всей продукции Microchip

Ответ
 
Опции темы Опции просмотра
Старый 19.07.2009, 21:17   #1
452
Junior Member
 
Регистрация: 17.09.2008
Сообщений: 22
Вес репутации: 100/43
452 will become famous soon enough452 will become famous soon enough
Smile Генератор импульсов PIC18F4550 Microc Delphi

Нужно сделать Генератор импульсов на PIC18F4550.
Сделал как смог =))) так как практики программирования у меня нет то сделал его с помощью 2 таймеров, Timer0 & Timer1. Timer0 дает 1 высокий уровень Timer1 дает 0 низкий уровень, значения задержек таймера изменяю в программке с под винди... написал на Delphi протокол HID данные меняются без проблем... потом сразу прошиваются в EEPROM, все это дело работает нормально... но ток когда начинаю выставлять в генераторе ширину импульса в 2 мкс то не ставится... минимум 13 мкс... ниже не идет..., да мог бы сделать с модулем CCP но не умею и тем болие на microc... я самоучка так что многого не знаю и не умею...,
Что я сделал неправильно что минимальная задержка получается 13 мкс а нужно чем поменьше =) ну хоть 1 мкс...
В архиве проект и файл протеуса... ток проект на microc pro 8...
Прошу не пинать... знаю что ничего не знаю, прошу совета и идей =) может кто на ccp делал в microc =)

Кстати за комментировал почти все потому что думал что мож это из за юсб не можно поставить меньшие задержки..., оказалось не важно... и на протеусе проверял... на реальном железе тоже ... с осциллографом...

unsigned char userWR_buffer[64], userRD_buffer[64];
unsigned char k;
#define PIN_SCR (PORTD.RD0)
union//TMR0HL
{
unsigned char TMR0HL[2];//TMR0
unsigned int TMR0;
}INF_TMR0;
union//TMR1HL
{
unsigned char TMR1HL[2];//TMR1
unsigned int TMR1;
}INF_TMR1;
void interrupt()
{
if(INTCON.TMR0IF){
T0CON.TMR0ON = 0;
TMR0H = INF_TMR0.TMR0HL[1];//preset for Timer0 MSB register
TMR0L = INF_TMR0.TMR0HL[0];//preset for Timer0 LSB register
PIN_SCR=0;
T1CON.TMR1ON =1;
INTCON.TMR0IF=0;
}
if(PIR1.TMR1IF){
T1CON.TMR1ON = 0;
TMR1H = INF_TMR1.TMR1HL[1];//preset for Timer0 MSB register
TMR1L = INF_TMR1.TMR1HL[0];//preset for Timer0 LSB register
PIN_SCR=1;
T0CON.TMR0ON = 1;
PIR1.TMR1IF=0;
}
//HID_InterruptProc();
}
char estr;
int i;
void main() {
TRISD=0x0;
/*// Timer0 Registers:// 16-Bit Mode; Prescaler=1:1; TMRH Preset=$3C; TMRL Preset=$B0; Freq=100,00Hz; Period=10,00 ms
T0CON.TMR0ON = EEPROM_Read(0x0);//1;// Timer0 On/Off Control bit:1=Enables Timer0 / 0=Stops Timer0
T0CON.T08BIT = EEPROM_Read(0x1);//0;// Timer0 8-bit/16-bit Control bit: 1=8-bit timer/counter / 0=16-bit timer/counter
T0CON.T0CS = EEPROM_Read(0x2);//0;// TMR0 Clock Source Select bit: 0=Internal Clock (CLKO) / 1=Transition on T0CKI pin
T0CON.T0SE = EEPROM_Read(0x3);//0;// TMR0 Source Edge Select bit: 0=low/high / 1=high/low
T0CON.PSA = EEPROM_Read(0x4);//1;// Prescaler Assignment bit: 0=Prescaler is assigned; 1=NOT assigned/bypassed
T0CON.T0PS2 = EEPROM_Read(0x5);//0;// bits 2-0 PS2:PS0: Prescaler Select bits
T0CON.T0PS1 = EEPROM_Read(0x6);//0;
T0CON.T0PS0 = EEPROM_Read(0x7);//0;
TMR0H = EEPROM_Read(0x8);//0x3C; // preset for Timer0 MSB register
TMR0L = EEPROM_Read(0x9);//0xB0; // preset for Timer0 LSB register
*/
// Timer0 Registers:// 16-Bit Mode; Prescaler=1:1; TMRH Preset=$FF; TMRL Preset=$F1; Freq=333*333,33333Hz; Period=3,00 µs
T0CON.TMR0ON = 1;// Timer0 On/Off Control bit:1=Enables Timer0 / 0=Stops Timer0
T0CON.T08BIT = 0;// Timer0 8-bit/16-bit Control bit: 1=8-bit timer/counter / 0=16-bit timer/counter
T0CON.T0CS = 0;// TMR0 Clock Source Select bit: 0=Internal Clock (CLKO) / 1=Transition on T0CKI pin
T0CON.T0SE = 0;// TMR0 Source Edge Select bit: 0=low/high / 1=high/low
T0CON.PSA = 1;// Prescaler Assignment bit: 0=Prescaler is assigned; 1=NOT assigned/bypassed
T0CON.T0PS2 = 0;// bits 2-0 PS2:PS0: Prescaler Select bits
T0CON.T0PS1 = 0;
T0CON.T0PS0 = 0;
TMR0H = 0xFF; // preset for Timer0 MSB register
TMR0L = 0xF1; // preset for Timer0 LSB register
/*// Timer1 Registers:
// Prescaler=1:1; TMR1 Preset=40536; Freq=200,00Hz; Period=5,00 ms
T1CON.T1CKPS1 = EEPROM_Read(0x0A);//0;// bits 5-4 Prescaler Rate Select bits
T1CON.T1CKPS0 = EEPROM_Read(0x0B);//0;//
T1CON.T1OSCEN = 1;// bit 3 Timer1 Oscillator Enable Control: bit 1=on
T1CON.T1SYNC = 1;// bit 2 Timer1 External Clock Input Synchronization Control bit: 1=Do not synchronize external clock input
T1CON.TMR1CS = 0;// bit 1 Timer1 Clock Source Select bit: 0=Internal clock (FOSC/4) / 1 = External clock from pin T13CKI (on the rising edge)
T1CON.TMR1ON = 1;// bit 0 enables timer
TMR1H = EEPROM_Read(0x0C);//0x9E; // preset for timer1 MSB register
TMR1L = EEPROM_Read(0x0D);//0x58; // preset for timer1 LSB register
*/
// Timer1 Registers:
// Prescaler=1:1; TMR1 Preset=65531; Freq=1*000*000,00Hz; Period=1,00 µs
T1CON.T1CKPS1 = 0;// bits 5-4 Prescaler Rate Select bits
T1CON.T1CKPS0 = 0;//
T1CON.T1OSCEN = 1;// bit 3 Timer1 Oscillator Enable Control: bit 1=on
T1CON.T1SYNC = 1;// bit 2 Timer1 External Clock Input Synchronization Control bit: 1=Do not synchronize external clock input
T1CON.TMR1CS = 0;// bit 1 Timer1 Clock Source Select bit: 0=Internal clock (FOSC/4) / 1 = External clock from pin T13CKI (on the rising edge)
T1CON.TMR1ON = 1;// bit 0 enables timer
TMR1H = 0xFF; // preset for timer1 MSB register
TMR1L = 0xFB; // preset for timer1 LSB register
INF_TMR1.TMR1HL[0] = TMR1L;
INF_TMR1.TMR1HL[1] = TMR1H;
INTCON.GIE=1;
INTCON.PEIE=1;
INTCON.TMR0IE=1;
PIE1.TMR1IE=1;
//HID_Enable(&userRD_buffer,&userWR_buffer);
while(1){
/*k = HID_Read();
if(k>0){
if(userRD_buffer[0] == 'r'){
HID_Disable();
HID_Enable(&userRD_buffer, &userWR_buffer);
}//if(userRD_buffer[0] == 'r')
if(userRD_buffer[0] == 't'){
INTCON.T0IE = 0; // Enable Timer 0 Interrupt Enable
T0CON.TMR0ON = 0;// Timer0 On/Off Control bit:1=Enables Timer0 / 0=Stops Timer0
T0CON.T08BIT = userRD_buffer[2];// Timer0 8-bit/16-bit Control bit: 1=8-bit timer/counter / 0=16-bit timer/counter
T0CON.T0CS = 0;// TMR0 Clock Source Select bit: 0=Internal Clock (CLKO) / 1=Transition on T0CKI pin
T0CON.T0SE = 0;// TMR0 Source Edge Select bit: 0=low/high / 1=high/low
T0CON.PSA = userRD_buffer[3];// Prescaler Assignment bit: 0=Prescaler is assigned; 1=NOT assigned/bypassed
T0CON.T0PS2 = userRD_buffer[4];// bits 2-0 PS2:PS0: Prescaler Select bits
T0CON.T0PS1 = userRD_buffer[5];
T0CON.T0PS0 = userRD_buffer[6];
TMR0H = INF_TMR0.TMR0HL[1]= userRD_buffer[7];//preset for Timer0 MSB register
TMR0L = INF_TMR0.TMR0HL[0]= userRD_buffer[8];//preset for Timer0 LSB register
T0CON.TMR0ON = EEPROM_Read(0x0);//1;// Timer0 On/Off Control bit:1=Enables Timer0 / 0=Stops Timer0
EEPROM_Write(0x1,T0CON.T08BIT);//0;// Timer0 8-bit/16-bit Control bit: 1=8-bit timer/counter / 0=16-bit timer/counter
EEPROM_Write(0x2,T0CON.T0CS);//0;// TMR0 Clock Source Select bit: 0=Internal Clock (CLKO) / 1=Transition on T0CKI pin
EEPROM_Write(0x3,T0CON.T0SE);//0;// TMR0 Source Edge Select bit: 0=low/high / 1=high/low
EEPROM_Write(0x4,T0CON.PSA);//1;// Prescaler Assignment bit: 0=Prescaler is assigned; 1=NOT assigned/bypassed
EEPROM_Write(0x5,T0CON.T0PS2);//0;// bits 2-0 PS2:PS0: Prescaler Select bits
EEPROM_Write(0x6,T0CON.T0PS1);//0;
EEPROM_Write(0x7,T0CON.T0PS0);//0;
EEPROM_Write(0x9,TMR0L);//0xB0; // preset for Timer0 LSB register
EEPROM_Write(0x8,TMR0H);//0x3C; // preset for Timer0 MSB register
T0CON.TMR0ON = userRD_buffer[1];// Timer0 On/Off Control bit:1=Enables Timer0 / 0=Stops Timer0
INTCON.T0IE = 1; // Enable Timer 0 Interrupt Enable
}//if(userRD_buffer[0] == 't')
if(userRD_buffer[0] == 's'){
PIE1.TMR1IE=0;
T1CON.TMR1ON = 0;// bit 1 enables timer
T1CON.T1CKPS1 = userRD_buffer[2];// bits 5-4 Prescaler Rate Select bits
T1CON.T1CKPS0 = userRD_buffer[3];
TMR1H = INF_TMR1.TMR1HL[1]= userRD_buffer[4]; // preset for timer1 MSB register
TMR1L = INF_TMR1.TMR1HL[0]= userRD_buffer[5]; // preset for timer1 LSB register
EEPROM_Write(0x0A,T1CON.T1CKPS1);//0;// bits 5-4 Prescaler Rate Select bits
EEPROM_Write(0x0B,T1CON.T1CKPS0);//0;//
EEPROM_Write(0x0D,TMR1L);//0x58; // preset for timer1 LSB register
EEPROM_Write(0x0C,TMR1H);//0x9E; // preset for timer1 MSB register
T1CON.TMR1ON = userRD_buffer[1];// bit 1 enables timer
PIE1.TMR1IE=1;
}//if(userRD_buffer[0] == 's')
if(userRD_buffer[0] == 'p'){
userWR_buffer[0]='p';
userWR_buffer[1]=T0CON.TMR0ON;
userWR_buffer[2]=T0CON.T08BIT;
userWR_buffer[3]=T0CON.PSA;
userWR_buffer[4]=T0CON.T0PS2;
userWR_buffer[5]=T0CON.T0PS1;
userWR_buffer[6]=T0CON.T0PS0;
userWR_buffer[8]=TMR0L;
userWR_buffer[7]=TMR0H;
while (!HID_Write(&userWR_buffer,64)) ;
}//if(userRD_buffer[0] == 'p'
}//if(k>0)
*/
}
}
Вложения
Тип файла: pdf Impulsgenerator.rar.pdf (62.3 Кб, 10 просмотров)
452 вне форума   Ответить с цитированием
Старый 19.07.2009, 21:27   #2
IgorV
Senior Member
 
Аватар для IgorV
 
Регистрация: 25.02.2007
Адрес: всем пока
Возраст: 49
Сообщений: 4,100
Вес репутации: 1883/107
IgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant future
Отправить сообщение для IgorV с помощью Skype™
По умолчанию Re: Генератор импульсов PIC18F4550 Microc Delphi

Цитата:
Сообщение от 452 Посмотреть сообщение
Нужно сделать Генератор импульсов на PIC18F4550.
1.Ставим тег CODE
2. Пробуем модули по отдельности. CCP задались целью пользовать - значит изучить вдоль и поперек. Я не признаю протез, так не ленился спаял макетку - и вперед, изучать какой модуль как работает.
IgorV вне форума   Ответить с цитированием
Старый 19.07.2009, 21:58   #3
452
Junior Member
 
Регистрация: 17.09.2008
Сообщений: 22
Вес репутации: 100/43
452 will become famous soon enough452 will become famous soon enough
По умолчанию Re: Генератор импульсов PIC18F4550 Microc Delphi

У меня платка есть спаяная =)
Кстати на Microc & CCP
Вот что нарыл и сделал... но у меня вопрос... (я нифига не знаю) можно ли этим модулем менять длительность и период по отдельности, и можно ли их сделать чтобы длительность импульса была 3 мкс а период 6 мкс, если можно наведите пример как? Ну хоть тогда скажите можно ли =) я правда не знаю...

Извините но кнопка правки уже пропала... не знаю как изменить 1 сообщение... вставить тег...

Код:
void interrupt(){
 if(PIR1.TMR2IF){
 //TMR2=0;
 PIR1.TMR2IF=0;
 }
}
void main(){
TRISC=0x0;
// Timer2 Registers:
// Prescaler=1:16; TMR2 PostScaler=1:1; PR2=0 - Freq = 62*500,00Hz - Period = 16*000 ns
//T2CON |       = 0;// bits 6-3 Post scaler 1:1 thru 1:16
//T2CON.TOUTPS3 = 0;
//T2CON.TOUTPS2 = 0;
//T2CON.TOUTPS1 = 0;
//T2CON.TOUTPS0 = 0;
//T2CON.TMR2ON  = 0;// Timer2 on bit: 1=Timer2 is on;
//T2CON.T2CKPS1 = 1;// bits 1-0  Prescaler Rate Select bits
//T2CON.T2CKPS0 = 0;
T2CON = 0b00000011;
PR2 = 0xFF;           // PR2 (Timer2 Match value)
CCP1CON=0b00001111;
CCPR1L=0xDCB0;
CCPR1H;
TMR2=PR2+1;
INTCON.GIE=1;
INTCON.PEIE=1;
PIR1.TMR2IE=1;
while(1)
{
}//while(1)
}//main
452 вне форума   Ответить с цитированием
Старый 20.07.2009, 00:48   #4
masterzx
Senior Member
 
Аватар для masterzx
 
Регистрация: 21.09.2007
Адрес: Барнаул
Возраст: 34
Сообщений: 1,507
Вес репутации: 826/69
masterzx is a splendid one to beholdmasterzx is a splendid one to beholdmasterzx is a splendid one to beholdmasterzx is a splendid one to beholdmasterzx is a splendid one to beholdmasterzx is a splendid one to beholdmasterzx is a splendid one to behold
Отправить сообщение для masterzx с помощью ICQ
По умолчанию Re: Генератор импульсов PIC18F4550 Microc Delphi

Вот пример из Микроси для pic16f887
Код:
unsigned short current_duty, old_duty, current_duty1, old_duty1;

void InitMain() {
  ANSEL  = 0;                         // Configure AN pins as digital I/O
  ANSELH = 0;
  PORTA = 255;
  TRISA = 255;                        // configure PORTA pins as input
  PORTB = 0;                          // set PORTB to 0
  TRISB = 0;                          // designate PORTB pins as output
  PORTC = 0;                          // set PORTC to 0
  TRISC = 0;                          // designate PORTC pins as output
  PWM1_Init(5000);                    // Initialize PWM1 module at 5KHz
  PWM2_Init(5000);                    // Initialize PWM2 module at 5KHz
}

void main() {
  InitMain();
  current_duty  = 16;                 // initial value for current_duty
  current_duty1 = 16;                 // initial value for current_duty1

  PWM1_Start();                       // start PWM1
  PWM2_Start();                       // start PWM2
  PWM1_Set_Duty(current_duty);        // Set current duty for PWM1
  PWM2_Set_Duty(current_duty1);       // Set current duty for PWM2

  while (1) {                         // endless loop
    if (RA0_bit) {                    // button on RA0 pressed
      Delay_ms(40);
      current_duty++;                 // increment current_duty
      PWM1_Set_Duty(current_duty);
     }

    if (RA1_bit) {                    // button on RA1 pressed
      Delay_ms(40);
      current_duty--;                 // decrement current_duty
      PWM1_Set_Duty(current_duty);
     }

    if (RA2_bit) {                    // button on RA2 pressed
      Delay_ms(40);
      current_duty1++;                // increment current_duty1
      PWM2_Set_Duty(current_duty1);
     }

    if (RA3_bit) {                    // button on RA3 pressed
      Delay_ms(40);
      current_duty1--;                // decrement current_duty1
      PWM2_Set_Duty(current_duty1);
     }

    Delay_ms(5);                      // slow down change pace a little
  }
}
тут используеться встроеная библиотека...
__________________
Если проблему можно решить за деньги, то это не проблема, это расходы. Еврейская мудрость.
masterzx вне форума   Ответить с цитированием
Старый 20.07.2009, 02:36   #5
452
Junior Member
 
Регистрация: 17.09.2008
Сообщений: 22
Вес репутации: 100/43
452 will become famous soon enough452 will become famous soon enough
По умолчанию Re: Генератор импульсов PIC18F4550 Microc Delphi

Спасибо,
но никак не пойму как можно с помощью встроенными библиотечными функциями сделать длительность импульса 3 мкс а период 6...
я так понял что PWM1_Set_Duty(current_duty); меняет и одно и другое вместе...
а тут нужно чтобы по отдельности выставлять разные размеры импульса... они не пропорциональны, лог единица должна быть допустим 12 мкс а лог 0 , 1 мкс...

Последний раз редактировалось 452; 20.07.2009 в 02:41.
452 вне форума   Ответить с цитированием
Старый 20.07.2009, 03:41   #6
HHIMERA
Senior Member
 
Регистрация: 10.06.2008
Возраст: 58
Сообщений: 2,866
Вес репутации: 3992/110
HHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond repute
По умолчанию Re: Генератор импульсов PIC18F4550 Microc Delphi

Цитата:
Сообщение от 452 Посмотреть сообщение
Спасибо,
я так понял что PWM1_Set_Duty(current_duty); меняет и одно и другое вместе...
Неправильно понял... PWM1_Set_Duty(current_duty); - это длительность импульса, а PWM1_Init(5000); - это частота выходного сигнала, т.е. по сути здесь задаётся период...

Это потому, что даташит наизусть не выучил...

Кстати... Джиттер PLL не пугает???
HHIMERA вне форума   Ответить с цитированием
Старый 20.07.2009, 12:03   #7
452
Junior Member
 
Регистрация: 17.09.2008
Сообщений: 22
Вес репутации: 100/43
452 will become famous soon enough452 will become famous soon enough
По умолчанию Re: Генератор импульсов PIC18F4550 Microc Delphi

=)))может и испугало б но не знаю что ет Джиттер ... =)))
это хорошо =) а как можно изменить PWM1_Init(5000); в реальном времени...? =)
я вообще не пойму как нормально пользоваться этой стандартной библиотекой =) она какая то странная...
так вот если с помощью этой библ.. можно создавать ток такие сигали..., и нельзя в реальном времени выставить 2 мкс или 8 мкс..., по разному длительность и период..., тогда нужно ...? не знаю что нужно... Потому и сделал генератор импульсов с помощью таймеров... он работает но не меньше 13 мкс можно выставить...
452 вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +3, время: 12:52.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot