![]() |
|
|
Продукция MICROCHIP Технические вопросы по всей продукции Microchip |
![]() |
|
Опции темы | Опции просмотра |
![]() |
#1 |
Junior Member
Регистрация: 17.09.2008
Сообщений: 22
Вес репутации: 100/47 ![]() ![]() |
![]()
Нужно сделать Генератор импульсов на 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) */ } } |
![]() |
![]() |
![]() |
#2 |
Senior Member
|
![]() |
![]() |
![]() |
![]() |
#3 |
Junior Member
Регистрация: 17.09.2008
Сообщений: 22
Вес репутации: 100/47 ![]() ![]() |
![]()
У меня платка есть спаяная =)
Кстати на 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 |
![]() |
![]() |
![]() |
#4 |
Senior Member
|
![]()
Вот пример из Микроси для 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 } }
__________________
Если проблему можно решить за деньги, то это не проблема, это расходы. Еврейская мудрость. |
![]() |
![]() |
![]() |
#5 |
Junior Member
Регистрация: 17.09.2008
Сообщений: 22
Вес репутации: 100/47 ![]() ![]() |
![]()
Спасибо,
но никак не пойму как можно с помощью встроенными библиотечными функциями сделать длительность импульса 3 мкс а период 6... я так понял что PWM1_Set_Duty(current_duty); меняет и одно и другое вместе... а тут нужно чтобы по отдельности выставлять разные размеры импульса... они не пропорциональны, лог единица должна быть допустим 12 мкс а лог 0 , 1 мкс... Последний раз редактировалось 452; 20.07.2009 в 02:41. |
![]() |
![]() |
![]() |
#6 | |
Senior Member
Регистрация: 10.06.2008
Возраст: 59
Сообщений: 2,982
Вес репутации: 4193/117 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() Цитата:
Это потому, что даташит наизусть не выучил... ![]() Кстати... Джиттер PLL не пугает??? |
|
![]() |
![]() |
![]() |
#7 |
Junior Member
Регистрация: 17.09.2008
Сообщений: 22
Вес репутации: 100/47 ![]() ![]() |
![]()
=)))может и испугало б но не знаю что ет Джиттер ... =)))
это хорошо =) а как можно изменить PWM1_Init(5000); в реальном времени...? =) я вообще не пойму как нормально пользоваться этой стандартной библиотекой =) она какая то странная... так вот если с помощью этой библ.. можно создавать ток такие сигали..., и нельзя в реальном времени выставить 2 мкс или 8 мкс..., по разному длительность и период..., тогда нужно ...? не знаю что нужно... Потому и сделал генератор импульсов с помощью таймеров... он работает но не меньше 13 мкс можно выставить... |
![]() |
![]() |
![]() |
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
Опции темы | |
Опции просмотра | |
|
|