#include <16F628A.h> #FUSES NOWDT //Sem watch dog #FUSES HS //Cristal alta velocidade #FUSES PUT //Timer de alimentação #FUSES NOPROTECT //Código desprotegido #FUSES NOBROWNOUT //Sem reset de brown out #FUSES NOMCLR //Master Clear usado como I/O #FUSES NOLVP //Programação em alta voltagem #FUSES NOCPD //Sem proteção de memória eeprom #use delay(clock=20000000) // cristal de 20 Mhz #use rs232(baud=9600, xmit=PIN_B2, rcv=PIN_B1) //define porta serial #include //Rotinas de leitura do controle de playstation #define LED_STATUS PIN_A2 //Led indicador de funcionamento //----------------------------------------------------- // DEFINIÇÕES E VARIAVEIS DA INTERRUPÇÃO DE SERVIÇO - TIMER0 //----------------------------------------------------- int int_count; //----------------------------------------------------- // DEFINIÇÕES E VARIAVEIS DA INTERRUPÇÃO DA USART //----------------------------------------------------- #define BUFFER_SIZE 32 int buffer[BUFFER_SIZE]; int bufferSize; //----------------------------------------------------- // VARIAVEIS GERAIS //----------------------------------------------------- int contador; // contador genérico int repeticao; //tempo para o próximo envio de dados int1 repeticao_habilitada; //Indica que o envio de dados será repetido o tempo todo int1 envia; //indica que os dados devem ser enviados int1 envio_na_mudanca; //Indica que um envio de dados ocorrerá quando qualquer coisa mudar no controle int1 estado; //estado do led // --------------------------------------------- // Interrupção de serviço // --------------------------------------------- #int_TIMER0 void clock_isr() { int_count--; if(int_count==0) { //Cada vez que zerar, envia dados if(repeticao_habilitada == true) envia = true; int_count = repeticao; set_timer0(0); } } #int_rda void serial_isr() { buffer[bufferSize]=getc(); bufferSize++; //Verifica o tamanho do Buffer if(bufferSize==1) //Testa se recebeu algo { if( buffer[0] == 255) // se chegou 255 (ff), marca para enviar dados envia = true; //Limpa o Buffer bufferSize = 0; } } void main() { //--------------- // INICIALIZAÇÕES //--------------- //Limpa as variáveis do sistema do joystick for(contador=0;contador<5;contador++) { psxDado[contador] = 0; psxDadoAnt[contador] = 0; } repeticao = 35; repeticao_habilitada = true; bufferSize = 0; envio_na_mudanca = false; //Seta a interrupção de serviço TIMER0 set_timer0(0); setup_counters( RTCC_INTERNAL, RTCC_DIV_256 | RTCC_8_BIT); enable_interrupts(INT_TIMER0); //Seta a interrupção da USART enable_interrupts(int_rda); enable_interrupts(GLOBAL); while(1) { //Le o controle psxLeControle(); //verifica se a tecla start foi pressionada, se foi envia os dados if( btnStart == true ){ envia = true; delay_ms(100); } //verifica o botão select. Esse botão habilita a mudança de velocidade de envio if( btnSelect == true ) { //Botão start + select liga/desliga modo de repetição if( btnStart == true ){ repeticao_habilitada = !repeticao_habilitada; output_bit(LED_STATUS,repeticao_habilitada); delay_ms(500); } //botão up (seta para cima lado esquerdo) aumenta a velocidade if(btnUp == true){ if(repeticao > 0) repeticao--; delay_ms(100); } //botão down abaixa a velocidade de repetição if(btnDown == true){ if(repeticao < 100) repeticao++; delay_ms(100); } //botão L1 habilita o envio apenas quando muda alguma coisa no controle if(btnL1 == true){ envio_na_mudanca = true; delay_ms(100); } //desliga o envio na mudança if(btnL2 == true){ envio_na_mudanca = false; delay_ms(100); } } //testa se os dados mudaram... if(psxMudou==true && envio_na_mudanca==true) envia = true; //Se for o caso, envia os dados pela serial... if(envia){ disable_interrupts(INT_TIMER0); //evita disparo da interrupção de serviço envia = false; //envia pela porta serial os dados do controle putc(254); putc(psxDado[0]); putc(psxDado[1]); putc(psxDado[2]); putc(psxDado[3]); putc(psxDado[4]); putc(psxDado[5]); putc(255); estado=!estado; output_bit(LED_STATUS,estado); enable_interrupts(INT_TIMER0); //religa interrupção de serviço } } //Fim do laço principal }//Fim do programa