Показать сообщение отдельно
Старый 19.07.2009, 21:17   #1
452
Junior Member
 
Регистрация: 17.09.2008
Сообщений: 22
Вес репутации: 100/44
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 вне форума   Ответить с цитированием