Esempio n. 1
0
static int put_debugreg(long pid, unsigned int regno, long data)
{
	int ret = 0;
	register int old_srs;

#ifdef CONFIG_ETRAX_KGDB
	/* Ignore write, but pretend it was ok if value is 0
	   (we don't want POKEUSR/SETREGS failing unnessecarily). */
	return (data == 0) ? ret : -1;
#endif

	/* Simple owner management. */
	if (!bp_owner)
		bp_owner = pid;
	else if (bp_owner != pid) {
		/* Ignore write, but pretend it was ok if value is 0
		   (we don't want POKEUSR/SETREGS failing unnessecarily). */
		return (data == 0) ? ret : -1;
	}

	/* Remember old SRS. */
	SPEC_REG_RD(SPEC_REG_SRS, old_srs);
	/* Switch to BP bank. */
	SUPP_BANK_SEL(BANK_BP);

	switch (regno - PT_BP) {
	case 0:
		SUPP_REG_WR(0, data); break;
	case 1:
	case 2:
		if (data)
			ret = -1;
		break;
	case 3:
		SUPP_REG_WR(3, data); break;
	case 4:
		SUPP_REG_WR(4, data); break;
	case 5:
		SUPP_REG_WR(5, data); break;
	case 6:
		SUPP_REG_WR(6, data); break;
	case 7:
		SUPP_REG_WR(7, data); break;
	case 8:
		SUPP_REG_WR(8, data); break;
	case 9:
		SUPP_REG_WR(9, data); break;
	case 10:
		SUPP_REG_WR(10, data); break;
	case 11:
		SUPP_REG_WR(11, data); break;
	case 12:
		SUPP_REG_WR(12, data); break;
	case 13:
		SUPP_REG_WR(13, data); break;
	case 14:
		SUPP_REG_WR(14, data); break;
	default:
		ret = -1;
		break;
	}

	/* Restore SRS. */
	SPEC_REG_WR(SPEC_REG_SRS, old_srs);
	/* Just for show. */
	NOP();
	NOP();
	NOP();

	return ret;
}
Esempio n. 2
0
void wait(unsigned long t) {
    unsigned long o = __time;
    while (o+t > __time) {
        NOP();
    }
}
Esempio n. 3
0
int main(void){

	unsigned char ordem = 0;//usada para compararar uma sequência de dados recebidos com uma string.
	unsigned char etapa=0;
	unsigned char funcao=0;//utilizada para determinar qual função o PIC vai executar (abrir porta, fornecer histórico, fornecer status atual)
	unsigned char conta=0;
	unsigned char conta_a_ser_alterada=0;
	unsigned char cont=0;
	unsigned char qtd_total_contas=0;	
	unsigned char ultimo_caractere_recebido=0;

	//CONFIGURAÇÃO OSCILADOR
	OSCCON=0XF0;

	//CONFIGURAÇÃO INTERRUPÇÕES
	INTCON = 0b11100000;
	INTCON2 =0b00000000;
	PIE1=0b00100001;
	RCONbits.IPEN = 0;

	
	//CONFIGURAÇÃO TIMER0(CONTAGEM HORAS)
	T0CON = 0b10000111;
	TMR0H=0xC2; //TMR0=34446(1 interrupção = 1s para FOSC=16MHz)
	TMR0L= 0xF7;

	//CONFIGURAÇÃO DAS PORTAS
	LATD=0; //4 primeiros bits = LEDs para debug(indicam se algo aconteceu, como o pressionamento do botão do teclado matricial ou o funcionamento do timer0(relógio) )
			//4 ultimos bits -> Teclado matricial
	
	
	TRISB=0xF0; // 4 ultimos bits-> teclado matricial
	LATB=0x0F; 
	TRISC=0xC3;
	TRISD=0x00;
	ADCON1=0XFF;
	CMCON=0X07;

	//CONFIGURAÇÃO TIMER1(CONTAGEM DE TEMPO NO MODO_T9)
	T1CON = 0b00001110;
	TMR1H=0XC0; //TMR1 = 49152 (1 interrupção = 0.5s para cristal de 32,768khz)
	TMR1L=0;


	if(eeprom_read(0) == 0xFF){eeprom_config_inicial();}

	configurar_serial(35);

	qtd_total_contas = verificar_num_contas();
	numero_para_ascii(qtd_total_contas);

		for(conta=0;conta<qtd_total_contas;conta++){
				carregar_senha(conta, senha);}

	conta=0;
	RCIE=1;

	data_atual.ano=0;
	data_atual.mes= Janeiro;
	data_atual.dia=1;
	data_atual.dia_da_semana= dia_da_semana(data_atual.ano,data_atual.mes,data_atual.dia);
	data_atual.hora=0;
	data_atual.minuto=0;
	data_atual.segundo=0;
	PORTB_SR=PORTB;//Leitura do PORTB antes de habilitar a interrupção para evitar uma interrupção não desejada.
	RBIE=1;
	RBIF=0;
	cont=0;

	while(1){

		if(receber == 1){
         receber=0;
         numero_para_ascii(qtd_total_contas);
         TXREG = '\n';
         while(!TRMT){}
         char j;
            for(j=0;j<qtd_caracteres_recebidos_serial;j++){
               TXREG = buffer_serial[j];
               while(!TRMT){}
                  }
         
         TXREG = '\n';
         while(!TRMT){}
   
            for(cont=0;cont<qtd_caracteres_recebidos_serial;cont++){

   
               if(testar_bit(FLAGS_1,TRANSICAO_ETAPA)){
   
                              if(buffer_serial[cont] != PROXIMA_ETAPA) {
                                                setar_bit(FLAGS_1,ERRO_PROTOCOLO);}
   
                              resetar_bit(FLAGS_1,TRANSICAO_ETAPA);
                              ordem=0;
                              etapa++;}
                        
                        else if(etapa == etapa_inicial){//Inicio da comunicação
                                 
            
                                 if(buffer_serial[cont] != INICIO) {setar_bit(FLAGS_1,ERRO_PROTOCOLO);}
         
                              setar_bit(FLAGS_1,TRANSICAO_ETAPA);
                                 }
            
                        else if(etapa == etapa_recebe_funcao){

                                     funcao = buffer_serial[cont++];
                                       if(funcao<ABERTURA_PORTA || funcao>MUDAR_SENHA) {setar_bit(FLAGS_1,ERRO_PROTOCOLO);}

                                    conta = ((buffer_serial[cont]) - '0');
                                             
                                       if(!(conta<QTD_MAX_CONTAS)) setar_bit(FLAGS_1,ERRO_IDENTIF_CONTA);
   
                                    setar_bit(FLAGS_1,TRANSICAO_ETAPA);
                                                
                                    }
         
                        
            
                        else if(etapa == etapa_login){//executa funcao
         
                              for(ordem=0;senha[conta][ordem]!= 0;ordem++){
                                    if(senha[conta][ordem] != buffer_serial[cont++]) {
                                                setar_bit(FLAGS_1,ERRO_SENHA);
                                                TXREG = senha[conta][ordem]; while(!TRMT){}
                                                TXREG = buffer_serial[--cont]; while(!TRMT){}
                                                                              }
                                       }
                              cont--;
                              setar_bit(FLAGS_1,TRANSICAO_ETAPA);
                                    
                                 }   
         
            
                        else if(etapa == etapa_detalha_funcao){
                                 if(funcao == ABERTURA_PORTA || funcao == REQUERIMENTO_STATUS_ATUAL){

                                    for(ordem=0;ordem<2;ordem++){
                                       if( buffer_serial[cont++] != ('N'+(ordem))) {setar_bit(FLAGS_1,ERRO_PROTOCOLO);}
                                          }
         
                                       setar_bit(FLAGS_1,TRANSICAO_ETAPA);
                                    }
                        
                                 else if(funcao == REQUERIMENTO_HISTORICO){
                                             if(ordem==0){
                                                   endereco_inic_eeprom = (1794 + (buffer_serial[cont] *26));
                                                
                                             ordem++;
                                                }
         }
         //Não implementado
   
                                 else if(funcao == RECONFIGURAR_PIC){
                                       //ordem 0 ajuste de ano
                                       //ordem 1 ajuste de mes
                                       //ordem 2 ajuste de dia
                                       //ordem 3 ajuste de hora
                                       //ordem 4 ajuste de minuto
                                       //ordem 5 ajuste de segundo
                                       //ordem 6 ajuste de dia_da_semana(não pode ser ignorado se o dia for alterado também)

                                       ptr_data= &data_atual.ano;

                                       for(ordem=0;ordem<7;ordem++){
                                             if(buffer_serial[cont] == IGNORAR) {//Pula para o próximo ajuste
                                                         ordem++;
                                                         cont+=2;} 

                                          *ptr_data = ascii_para_numero('0',buffer_serial[cont],buffer_serial[cont+1]);
                                          cont+=2;}
                                          cont--;
                                                }
   
                                 else if(funcao == MUDAR_SENHA){

                                       conta_a_ser_alterada = (buffer_serial[cont] - '0');
         
                                       if(   conta_a_ser_alterada != conta && (!(testar_bit(nivel_acesso,PERMISSAO_RECONFIGURAR_OUTRAS_CONTAS)))   ){
                                                      setar_bit(FLAGS_1,ERRO_NIVEL_DE_ACESSO);
                                                               }
                                       
                                       for(ordem=0;ordem<(TAMANHO_SENHA-1);ordem++){
                                          cont++;

                                             if(buffer_serial[cont] == '<') {
                                                      if(ordem<5) setar_bit(FLAGS_1,ERRO_PROTOCOLO);
               
                                                      else {
                                                         if(ordem<TAMANHO_SENHA-2) eeprom_write( ((conta_a_ser_alterada*16)+ordem) , 0);
                                                         break;}
                                             }
                                                               

                                             else{
                                                   
                                                senha[conta_a_ser_alterada][ordem] = buffer_serial[cont];
                                                eeprom_write( ((conta_a_ser_alterada*16)+ordem) ,buffer_serial[cont]);}

                                                }   
                        
                                          setar_bit(FLAGS_1,TRANSICAO_ETAPA);}
                  }
            
                        else if(etapa == etapa_final){//Fim da comunicação
                                 if(buffer_serial[cont] != FIM) {setar_bit(FLAGS_1,ERRO_PROTOCOLO);}
                                 enviar=1; receber=qtd_caracteres_recebidos_serial=0;}
         
                        
                        
                        if(FLAGS_1>3 ) {
                                    resetar_bit(FLAGS_1,TRANSICAO_ETAPA);
                                    TXREG = '0' + etapa;
                                    etapa = etapa_inicial;   
                                    enviar=1;
                                    receber=qtd_caracteres_recebidos_serial=0;}
   
                  }
      
         numero_para_ascii(qtd_total_contas);}
		
		if(enviar==1){

			enviar=0;
			qtd_caracteres_recebidos_serial=0;
			etapa = etapa_inicial;
			cont=0;
			enviar_caractere_serial(NOVA_LINHA);
			enviar_caractere_serial(INICIO);

						if(FLAGS_1<4 && etapa == etapa_final){ //Não houve erros
										etapa = etapa_inicial;
										LATDbits.LD2^=1;

										char OK[] = {"OK"};
										enviar_string_serial(OK);

												if(funcao == REQUERIMENTO_STATUS_ATUAL){
														numero_para_ascii(data_atual.ano);
														numero_para_ascii(data_atual.mes);
														numero_para_ascii(data_atual.dia_da_semana);
														numero_para_ascii(data_atual.dia);
														numero_para_ascii(data_atual.hora);
														numero_para_ascii(data_atual.minuto);
														numero_para_ascii(data_atual.segundo);
														numero_para_ascii(qtd_total_contas);
														numero_para_ascii(QTD_MAX_CONTAS);
														numero_para_ascii(SENSOR_ABERTURA_FECHADURA);}


												else if(funcao == MUDAR_SENHA){
													char i=0;	
														do{
															senha[conta_a_ser_alterada][i] = nova_senha[i];
															eeprom_write(((conta_a_ser_alterada*16) + i),nova_senha[i]);
															while(WR){}
															i++;} while(nova_senha[i-1]  && i<TAMANHO_SENHA);
														}
							
												else if(funcao == ABERTURA_PORTA){
														while(SENSOR_ABERTURA_FECHADURA == 0){
															//cont++; //quantidade de vezes que se tentou destravar a fechadura
															FECHADURA=1;
															delay_ms(325);
															FECHADURA=0;
																if(SENSOR_ABERTURA_FECHADURA == 0) delay_ms(100);
															}
												}

										}
						
						else{
						
						LATDbits.LD3^=1;

							if(testar_bit(FLAGS_1,ERRO_NIVEL_DE_ACESSO)){

												char EN[] = {"EN"};
												enviar_string_serial(EN); 
												resetar_bit(FLAGS_1,ERRO_NIVEL_DE_ACESSO);}

							if(testar_bit(FLAGS_1,ERRO_PROTOCOLO)){ 

												char EP[] = {"EP"};
												enviar_string_serial(EP);
													if(funcao == MUDAR_SENHA){
																TXREG = 'S'; //indica que a nova senha tem menos que 6 caracteres;
																while(!TRMT){} 
														} 
												
												resetar_bit(FLAGS_1,ERRO_PROTOCOLO);}

							if(testar_bit(FLAGS_1,ERRO_COMUNICACAO)){
											
											char EC[] = {"EC"};
											enviar_string_serial(EC);
											resetar_bit(FLAGS_1,ERRO_COMUNICACAO);}
						
				
							if(testar_bit(FLAGS_1,ERRO_SENHA)){
											char ES[] = {"ES"};
											enviar_string_serial(ES);
											resetar_bit(FLAGS_1,ERRO_SENHA);}
				
							if(testar_bit(FLAGS_1,ERRO_IDENTIF_CONTA)){ 
											char EI[] = {"EI"};
											enviar_string_serial(EI);
											resetar_bit(FLAGS_1,ERRO_IDENTIF_CONTA);}
								}
															


				enviar_caractere_serial(FIM);
				PORTB_SR = PORTB;
				RBIE=1;}



		if((PORTB&0xF0) == 0xF0 && RBIE==0 && debounce==1 && MODO_TECLADO_MATRICIAL){//Tratamento de debounce. Espera-se até que nenhum botão esteja pressionado e que o debounce esteja autorizado
																			//(existem situações em que RBIE=0 e não se quer fazer tratamento de debounce
					delay_ms(60);

						if(!(testar_bit(FLAGS_2,MODO_T9))){//Modo_t9 desativado, o caractere_recebido é armazenado diretamente
								receber=1;
							}

						else if(caractere_recebido == MODO_T9_ON_OFF ||caractere_recebido == MAIUSCULA_MINUSCULA){//Caracteres não são armazenadas
									NOP();}


						else if(caractere_recebido == ultimo_caractere_recebido){

								if(++qtd_vezes_mesma_tecla_pressionada > Letras_por_tecla || ( (qtd_vezes_mesma_tecla_pressionada>Letras_por_tecla-1) && caractere_recebido == '9')){
									TMR1ON=0;
									TMR1H=0xC0;
									qtd_vezes_mesma_tecla_pressionada=0;}

								else  ultimo_caractere_recebido= caractere_recebido; //atualiza ultimo caractere recebido

								}
							
						

						else if(testar_bit(FLAGS_2,MODO_T9)){ //caractere_recebido != do ultimo caractere recebido e modo t9 ativado

								if(qtd_vezes_mesma_tecla_pressionada>0) receber=1; 

								ultimo_caractere_recebido= caractere_recebido;//atualiza ultimo caractere recebido
								 
								
						}
					

					PORTB_SR=PORTB;//leitura do PORTB antes de ativar a interrupção para evitar uma interrupção não desejada.
					RBIE=1;
					debounce=0;
		}


}
}
Esempio n. 4
0
File: huge.c Progetto: Al-th/matlab
void huge ( )
{
    cholmod_sparse *A, *C ;
    cholmod_triplet *T ;
    cholmod_factor *L ;
    cholmod_dense *X ;
    size_t n, nbig ;
    int ok = TRUE, save ;
    Int junk ;
    FILE *f ;
    double beta [2] ;

    n = Size_max ;
    CHOLMOD (free_work) (cm) ;
    CHOLMOD (allocate_work) (n, 0, 0, cm) ;
    OK (cm->status == CHOLMOD_TOO_LARGE) ;

    n = CHOLMOD(add_size_t) (n, 1, &ok) ;
    NOT (ok) ;

    /* create a fake zero sparse matrix, with huge dimensions */
    A = CHOLMOD (spzeros) (1, 1, 0, CHOLMOD_REAL, cm) ;
    A->nrow = Size_max ;
    A->ncol = Size_max ;
    A->stype = 0 ;

    /* create a fake factor, with huge dimensions.  */
    L = CHOLMOD (allocate_factor)  (1, cm) ;
    OKP (L) ;
    L->n = Size_max ;
    CHOLMOD (factorize) (A, L, cm) ;
    OK (cm->status == CHOLMOD_TOO_LARGE) ;

    /* free the fake factor */
    L->n = 1 ;
    CHOLMOD (free_factor) (&L, cm) ;

    /* create a valid factor to test resymbol */
    C = CHOLMOD (speye) (1, 1, CHOLMOD_REAL, cm) ;
    C->stype = 1 ;
    L = CHOLMOD (analyze) (C, cm) ;
    OKP (L) ;
    CHOLMOD (factorize) (C, L, cm) ;
    ok = CHOLMOD (resymbol) (C, NULL, 0, 0, L, cm) ;
    OK (ok) ;
    C->nrow = Size_max ;
    C->ncol = Size_max ;
    L->n = Size_max ;

    ok = CHOLMOD (resymbol) (C, NULL, 0, 0, L, cm) ;
    NOT (ok) ;
    OK (cm->status == CHOLMOD_TOO_LARGE) ;

    printf ("rowfac:\n") ;
    beta [0] = 1 ;
    beta [1] = 0 ;
    C->xtype = CHOLMOD_COMPLEX ;
    L->xtype = CHOLMOD_COMPLEX ;
    ok = CHOLMOD (rowfac) (C, NULL, beta, 0, 0, L, cm) ;
    printf ("rowfac %d\n", cm->status) ;
    OK (cm->status == CHOLMOD_TOO_LARGE) ;
    C->xtype = CHOLMOD_REAL ;
    L->xtype = CHOLMOD_REAL ;
    printf ("rowfac done:\n") ;

    C->stype = -1 ;
    ok = CHOLMOD (resymbol_noperm) (C, NULL, 0, 0, L, cm) ;
    NOT (ok) ;
    OK (cm->status == CHOLMOD_TOO_LARGE) ;

    C->ncol = 1 ;
    CHOLMOD (rowadd) (0, C, L, cm) ;
    OK (cm->status == CHOLMOD_TOO_LARGE) ;

    CHOLMOD (rowdel) (0, C, L, cm) ;
    OK (cm->status == CHOLMOD_TOO_LARGE) ;

    C->ncol = 4 ;
    CHOLMOD (updown) (1, C, L, cm) ;
    OK (cm->status == CHOLMOD_TOO_LARGE) ;

    C->nrow = 1 ;
    C->ncol = 1 ;
    L->n = 1 ;
    CHOLMOD (free_sparse) (&C, cm) ;
    CHOLMOD (free_factor) (&L, cm) ;

    C = CHOLMOD (allocate_sparse) (Size_max, Size_max, Size_max, 0, 0, 0, 0, cm);
    NOP (C) ;
    OK (cm->status == CHOLMOD_TOO_LARGE) ;

    CHOLMOD (rowcolcounts) (A, NULL, 0,
	&junk, &junk, &junk, &junk, &junk, &junk, cm) ;
    OK (cm->status == CHOLMOD_TOO_LARGE) ;

    C = CHOLMOD (submatrix) (A, &junk, Size_max/2, &junk, Size_max/2, 0, 0, cm) ;
    NOP (C) ;
    OK (cm->status == CHOLMOD_TOO_LARGE) ;

    ok = CHOLMOD (transpose_unsym) (A, 0, &junk, &junk, Size_max, A, cm) ;
    NOT (ok) ;
    OK (cm->status == CHOLMOD_TOO_LARGE) ;

    A->stype = 1 ;
    ok = CHOLMOD (transpose_sym) (A, 0, &junk, A, cm) ;
    NOT (ok) ;
    OK (cm->status == CHOLMOD_TOO_LARGE) ;

    C = CHOLMOD (ptranspose) (A, 0, &junk, NULL, 0, cm) ;
    NOP (C) ;
    OK (cm->status == CHOLMOD_TOO_LARGE) ;
    A->stype = 0 ;

    CHOLMOD (amd) (A, NULL, 0, &junk, cm) ;
    OK (cm->status == CHOLMOD_TOO_LARGE) ;

    L = CHOLMOD (analyze) (A, cm) ;
    OK (cm->status == CHOLMOD_TOO_LARGE) ;
    NOP (L) ;

#ifndef NPARTITION
    CHOLMOD (camd) (A, NULL, 0, &junk, NULL, cm) ;
    OK (cm->status == CHOLMOD_TOO_LARGE) ;
#endif

    printf ("calling colamd\n") ;
    CHOLMOD (colamd) (A, NULL, 0, 0, &junk, cm) ;
    OK (cm->status == CHOLMOD_TOO_LARGE) ;

#ifndef NPARTITION
    printf ("calling ccolamd\n") ;
    CHOLMOD (ccolamd) (A, NULL, 0, NULL, &junk, cm) ;
    OK (cm->status == CHOLMOD_TOO_LARGE) ;
#endif

    CHOLMOD (etree) (A, &junk, cm) ;
    OK (cm->status == CHOLMOD_TOO_LARGE) ;

    L = CHOLMOD (allocate_factor) (Size_max, cm) ;
    OK (cm->status == CHOLMOD_TOO_LARGE) ;
    NOP (L) ;

#ifndef NPARTITION
    CHOLMOD (metis) (A, NULL, 0, 0, &junk, cm) ;
    OK (cm->status == CHOLMOD_TOO_LARGE) ;

    CHOLMOD (bisect) (A, NULL, 0, 0, &junk, cm) ;
    OK (cm->status == CHOLMOD_TOO_LARGE) ;

    CHOLMOD (nested_dissection) (A, NULL, 0, &junk, &junk, &junk, cm) ;
    OK (cm->status == CHOLMOD_TOO_LARGE) ;
#endif

    CHOLMOD (postorder) (&junk, Size_max, &junk, &junk, cm) ;
    OK (cm->status == CHOLMOD_TOO_LARGE) ;

    /* causes overflow in 32-bit version, but not 64-bit */
    f = fopen ("../Tcov/Matrix/mega.tri", "r") ;
    T = CHOLMOD (read_triplet) (f, cm) ;
    if (sizeof (Int) == sizeof (int))
    {
	NOP (T) ;
	OK (cm->status != CHOLMOD_OK) ;
    }
    CHOLMOD (free_triplet) (&T, cm) ;
    fclose (f) ;

    n = Size_max ;
    X = CHOLMOD (allocate_dense) (n, 1, n, CHOLMOD_REAL, cm) ;
    NOP (X) ;
    OK (cm->status == CHOLMOD_TOO_LARGE) ;

    /* supernodal symbolic test */
    C = CHOLMOD (speye) (1, 1, CHOLMOD_REAL, cm) ;
    C->stype = 1 ;
    save = cm->supernodal ;
    cm->supernodal = CHOLMOD_SIMPLICIAL ;
    L = CHOLMOD (analyze) (C, cm) ;
    OKP (L) ;
    junk = 0 ;
    C->nrow = Size_max ;
    C->ncol = Size_max ;
    L->n = Size_max ;
    CHOLMOD (super_symbolic) (C, C, &junk, L, cm) ;
    OK (cm->status == CHOLMOD_TOO_LARGE) ;
    cm->supernodal = save ;
    C->nrow = 1 ;
    C->ncol = 1 ;
    L->n = 1 ;
    CHOLMOD (free_sparse) (&C, cm) ;
    CHOLMOD (free_factor) (&L, cm) ;

    /* supernodal numeric test */
    C = CHOLMOD (speye) (1, 1, CHOLMOD_REAL, cm) ;
    C->stype = -1 ;
    save = cm->supernodal ;
    cm->supernodal = CHOLMOD_SUPERNODAL ;
    L = CHOLMOD (analyze) (C, cm) ;
    OKP (L) ;
    OK (cm->status == CHOLMOD_OK) ;
    C->nrow = Size_max ;
    C->ncol = Size_max ;
    L->n = Size_max ;
    CHOLMOD (super_numeric) (C, C, beta, L, cm) ;
    cm->supernodal = save ;
    C->nrow = 1 ;
    C->ncol = 1 ;
    L->n = 1 ;
    CHOLMOD (free_sparse) (&C, cm) ;
    CHOLMOD (free_factor) (&L, cm) ;

    /* free the fake matrix */
    A->nrow = 1 ;
    A->ncol = 1 ;
    CHOLMOD (free_sparse) (&A, cm) ;

    fprintf (stderr, "\n") ;
}
/*---------------------------------------------------------------------------*
 * Routine:  UART2_Start
 *---------------------------------------------------------------------------*
 * Description:
 *      Each time the timer fires off an interrupt, this routine catches it
 *      and passes it to the given interrupt service routine.
 * Inputs:
 *      uint32_t baud -- baud rate (e.g. 115200 baud), or bits per second
 * Outputs:
 *      void
 *---------------------------------------------------------------------------*/
void UART2_Start(uint32_t baud)
{
    /* Reset FIFO buffers */
    G_UART2_RXIn = G_UART2_RXOut = 0;
    G_UART2_TXIn = G_UART2_TXOut = 0;
    G_UART2_TX_Empty = true;  
  
    /* supply SAU0 clock */
    SAU1EN = 1U;
    NOP();
    NOP();
    NOP();
    NOP();
  
    /* disable UART2 receive and transmit */
    ST1 |= _SAU_CH1_STOP_TRG_ON | _SAU_CH0_STOP_TRG_ON;    
    
    /* Turn Off Interrupts */
    STMK2 = 1U;    /* disable INTST0 interrupt */
    STIF2 = 0U;    /* clear INTST0 interrupt flag */
    SRMK2 = 1U;    /* disable INTSR0 interrupt */
    SRIF2 = 0U;    /* clear INTSR0 interrupt flag */
    SREMK2 = 1U;    /* disable INTSRE0 interrupt */
    SREIF2 = 0U;    /* clear INTSRE0 interrupt flag */
    
    STPR12 = UART2_TX_INTERRUPT_PRIORITY;   /* Set INTST0 priority */
    STPR02 = UART2_TX_INTERRUPT_PRIORITY;
    SRPR12 = UART2_RX_INTERRUPT_PRIORITY;   /* Set INTSR0 priority */
    SRPR02 = UART2_RX_INTERRUPT_PRIORITY;
    SREPR12 = UART2_RE_INTERRUPT_PRIORITY;   /* Set INTSRE0 priority */
    SREPR02 = UART2_RE_INTERRUPT_PRIORITY;    
    
    /* Configure TX0 */
    SMR10 = _SAU_SMRMN_INITIALVALUE | _SAU_CLOCK_SELECT_CK00 | _SAU_TRIGGER_SOFTWARE |
            _SAU_MODE_UART | _SAU_TRANSFER_END;
    SCR10 = _SAU_TRANSMISSION | _SAU_INTSRE_MASK | _SAU_PARITY_NONE | _SAU_LSB | _SAU_STOP_1 |
            _SAU_LENGTH_8;
    
    NFEN0 |= _SAU_RXD0_FILTER_ON;
    
    /* Configure RX0 */
    SIR11 = _SAU_SIRMN_FECTMN | _SAU_SIRMN_PECTMN | _SAU_SIRMN_OVCTMN;    /* clear error flag */
    SMR11 = _SAU_SMRMN_INITIALVALUE | _SAU_CLOCK_SELECT_CK00 | _SAU_TRIGGER_RXD | _SAU_EDGE_FALL |
            _SAU_MODE_UART | _SAU_TRANSFER_END;
    SCR11 = _SAU_RECEPTION | _SAU_INTSRE_ENABLE | _SAU_PARITY_NONE | _SAU_LSB | _SAU_STOP_1 |
            _SAU_LENGTH_8;
    
    SO1 |= _SAU_CH0_DATA_OUTPUT_1;
    SOL1 |= _SAU_CHANNEL0_NORMAL;   /* output level normal */
    SOE1 |= _SAU_CH0_OUTPUT_ENABLE;   /* enable UART2 output */
    
    UART2_SetBaudRate(baud);
    
    PM1 |= 0x10U;   /* Set RxD2 pin */
    
    P1 |= 0x08U;    /* Set TxD2 pin */
    PM1 &= 0xF7U;
    
    STIF2 = 0U;    /* clear INTST0 interrupt flag */
	STMK2 = 0U;    /* enable INTST0 interrupt */
	SRIF2 = 0U;    /* clear INTSR0 interrupt flag */
	SRMK2 = 0U;    /* enable INTSR0 interrupt */
	SREIF2 = 0U;	/* clear INTSRE0 interrupt flag */
	SREMK2 = 0U;	/* enable INTSRE0 interrupt */
	SO1 |= _SAU_CH0_DATA_OUTPUT_1;    /* output level normal */
	SOE1 |= _SAU_CH0_OUTPUT_ENABLE;    /* enable UART2 output */
	
    /* enable UART2 receive and transmit */
    SS1 |= _SAU_CH1_START_TRG_ON | _SAU_CH0_START_TRG_ON;
}
Esempio n. 6
0
void halWaitX10 (UINT16 timeout)
{
    // Time base: 14,745,600 cycles per sec: 147 cycles; error 0.3%
    do {
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();

		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();

		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();

		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();

		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();

		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();

		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();

		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();

		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();

		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();

		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();

		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();

		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();

		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();

		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
	   } while (--timeout);

} // halWaitX10
Esempio n. 7
0
void halWait (UINT16 timeout)
{
    // Time base: 14,745,600 cycles per sec: 15 cycles; error 1.75% 
    do {
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
		 NOP();
	   } while (--timeout);

} // halWait
Esempio n. 8
0
void interrupt FastTick(void) {
    static unsigned char LowTrigger = 80;
    static unsigned char Motor_Encoder = 0;
    static signed long interal_PID_MeasuredPoint = 10;
    static unsigned int TimmingError = 0;
    static unsigned char BacklightPWM_PR = 8;
    unsigned char RXDat;

    //Reset for 40kHz
    TMR0H = 0xFE;
    TMR0L = 0x83;
    TMR0IF = 0; //Clear the Timer Interrupt Flag

    if ((TXSTA1bits.TRMT) && (TX_bCount)) {
        TXREG = TXBuffer[TX_Idx];
        TX_Idx++;
        TX_bCount--;
    }

    if ((RCSTA1bits.OERR) | (RCSTA1bits.FERR)) {
        RCSTA1bits.CREN = 0;
        NOP();
        RCSTA1bits.CREN = 1;
        RXDat = RCREG;
        RXDat = RCREG;
        RX_Idx = 0;
        RX_MsgComplete = 0;
        RX_InProgress = 0;
    }

    if (RC1IF) {
        RXDat = RCREG;
        if (RXDat == '@') {
            RX_Idx = 0;
            RX_MsgComplete = 0;
            RX_InProgress = 1;
        }
        if (RXDat == '#') {
            RX_MsgComplete = 1;
            RX_InProgress = 0;
        }
        if (RX_Idx > 254) RX_Idx = 0;
        if (RX_InProgress) {
            RXBuffer[RX_Idx] = RXDat;
            RX_Idx++;
        }
    }

    if (BacklightPWM_PR) BacklightPWM_PR--;
    else BacklightPWM_PR = 7;
    if (LCD_BacklightEnabled) {
        if (Config.BacklightPWM_Duty > BacklightPWM_PR) LCD_BL = 1;
        else LCD_BL = 0;
    } else LCD_BL = 0;

    LowTrigger--;
    bTick40Khz = !bTick40Khz;
    if (LowTrigger == 0) {
        TimmingError++;
        if (TimmingError == 401) {
            LowTrigger = 79;
            TimmingError = 0;
        } else LowTrigger = 80;
        TMR1IF = 1;
    }

    Motor_Encoder <<= 2;
    Motor_Encoder |= MOTOR_ENCODER;
    Motor_Encoder &= 0x0F;
    interal_PID_MeasuredPoint -= enc_states[Motor_Encoder];

    if (bClear_MotorPosition) {
        bClear_MotorPosition = 0;
        interal_PID_MeasuredPoint = 0;
    }

    if (!bLock_Motor_Position) Motor_Position = interal_PID_MeasuredPoint;
}
static void DelayNOP(u32 count)
{
	while(count--) NOP();
}