TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: frozen en 18 de Noviembre de 2011, 23:26:29

Título: Rotacion de encendido de leds en MIKROC
Publicado por: frozen en 18 de Noviembre de 2011, 23:26:29
SALUDOS, quiesiera saber si esta es la forma correcta de hacer una rotacion de leds a la izquierda con control de start y stop.

Código: [Seleccionar]
//al encender la fuente debe mostrarse 7 por el portb
//al pulsar un boton conectado a RA0=0 start INICIA DESPLAZAMIENTO por el portb
//al pulsar un boton conectado a RA1=0 stop  SE VUELVE A MOSTAR EL 7  por el portb

unsigned short desplazar;

 void main(){
aki:        trisb=0;
            adcon1=6;
            trisa=0x3f;
            portb=0x07;
            desplazar=1;
            while(1){
                     if(porta.F0==0)
                     while(2){
                              portb=desplazar;
                              desplazar=desplazar<<1;
                              delay_ms(500);
                              if(desplazar==0)
                              desplazar=1;
                              if(porta.F1==0)
                              goto aki;
                              }

                    }
            }
Título: Re: Rotacion de encendido de leds en MIKROC
Publicado por: MerLiNz en 19 de Noviembre de 2011, 00:16:55
mas o menos esta bien, pero te has complicado demasiado

PORTB=1;
while(1) {
if(porta.f0==0) {
PORTB<<=1;
delay_ms(500);
}

}

hay cosas que no entiendo como el goto aki, pero si lo que quieres es rotar cuando pulsas un boton este seria el codigo mas simple.
Título: Re: Rotacion de encendido de leds en MIKROC
Publicado por: frozen en 19 de Noviembre de 2011, 00:49:42
mas o menos esta bien, pero te has complicado demasiado

PORTB=1;
while(1) {
if(porta.f0==0) {
PORTB<<=1;
delay_ms(500);
}

}

hay cosas que no entiendo como el goto aki, pero si lo que quieres es rotar cuando pulsas un boton este seria el codigo mas simple.

Es que primero al encender la fuente tiene que salir el numero 7 por el PORTB.
Al pulsar START se inicia el desplazamiento.
Al pulsar STOP vuelve al mostrar el 7 por el portb.

Con respecto al GOTO es una instruccion que se usa en assembler. JAJA  es que estoy muy familiarizado con el asm y recien me estoy iniciando en el c. Pero el GOTO es valido en MIKROC.
Saludos.
Título: Re: Rotacion de encendido de leds en MIKROC
Publicado por: MerLiNz en 19 de Noviembre de 2011, 01:53:44
entonces seria:

void main() {
char fDesp;

......
fDesp=0;
PORTB=7;
while(1) {
  if(porta.f0) {
fDesp=1;
PORTB=1;
}
if(porta.f1) {
fDesp=0;
PORTB=7;
}
if(fDesp) PORTB<<=1;
delay_ms(500);
}

}
Título: Re: Rotacion de encendido de leds en MIKROC
Publicado por: fenixariel en 19 de Noviembre de 2011, 06:40:09
Por favor no puedes ni deberias usar goto en C, es valido en todos los lenguajes pero no se debe usar    :o

podrias hacer esto........


/al encender la fuente debe mostrarse 7 por el portb
//al pulsar un boton conectado a RA0=0 start INICIA DESPLAZAMIENTO por el portb
//al pulsar un boton conectado a RA1=0 stop  SE VUELVE A MOSTAR EL 7  por el portb

unsigned short desplazar;

void function1()
{
   //hacer algo aqui
}


void function2()
{
   //hacer algo mas aqui
}

void main()

{
    trisb = 0;
    adcon1 = 6;
    trisa = 0x3f;
    portb = 0x07;
    desplazar = 1;
    
    while(1)
    {
                
          if(porta.B0 == 0)
             function1();
                    
          if(porta.B1 == 0)
             function2();              
                    
    }
    
}
 
        
Título: Re: Rotacion de encendido de leds en MIKROC
Publicado por: frozen en 19 de Noviembre de 2011, 08:16:36
Gracias por su ayuda. Espero alcanzar pronto un buen nivel C ya que en assembler ya llegue a mi limite. :)
Título: Re: Rotacion de encendido de leds en MIKROC
Publicado por: fenixariel en 19 de Noviembre de 2011, 17:29:01
Mejor tener un buen nivel primero en asm, pues si se empesara directamente con un lenguaje de alto nivel, creo(es mi opinion),  no se tendria  idea que estas haciendo cuando configuras por ejemplo la uart;  en PICC:


#use rs232(baud=9600, xmit=PIN_A2,rcv=PIN_A3)


pero si se tiene muy buena base en asm, se sabe exactamente como y que registros se necesitan para configurar correctamente el modulo RS232.



Saludos.......
Título: Re: Rotacion de encendido de leds en MIKROC
Publicado por: AngelGris en 19 de Noviembre de 2011, 17:56:02
  Bueno, pero eso ocurre porque se utiliza CCS  :D  :D  :D En HiTech se puede modificar los registros a mano... pero como es más cómodo crearse funciones eso fue lo que hice.

  Un ejemplo de lo que digo es que para habilitar las interrupciones hay que escribir

Código: C
  1. GIE = 1;

  Teniendo el datasheet a mano es muy notorio que lo que se está haciendo es asignar un 1 al bit GIE del registro INTCON
Título: Re: Rotacion de encendido de leds en MIKROC
Publicado por: fenixariel en 20 de Noviembre de 2011, 02:57:34
No he tenido la suerte de usar HiTech(pero ganas no me faltan).

A diferencia de PICC (el cual gusto mucho y uso mas frecuentemente), es de esa misma forma como en general se maneja  MikroC Pro, y claro una buena base en asm y datasheet bajo el brazo.



Código: C
  1. ADCON1 = 0b00001111;
  2.   T0CON = 0b10000111;                        // TMR0 prescaler 1:256, 16bits
  3.  
  4.   TRISA = 0b00000111;
  5.   PORTA = 0b00000111;
  6.  
  7.   TRISB.B0 = 1;
  8.   PORTB.B0 = 1;
  9.  
  10.   TRISC = 0;
  11.   PORTC = 0;
  12.  
  13.   TRISB.B1 = 0;
  14.   PORTB.B1 = 1;
  15.  
  16.   Lcd_Init();
  17.  
  18.   Lcd_Cmd(_LCD_CLEAR);
  19.   Lcd_Cmd(_LCD_CURSOR_OFF);
  20.   for (i = 0; i < 4; i++)
  21.   {
  22.        Lcd_Chr(1, i + 7, String1[i]);
  23.        Delay_mS(150);
  24.   }
  25.   Delay_mS(1000);
  26.   Lcd_Cmd(_LCD_CLEAR);
  27.   Delay_mS(500);
  28.   Lcd_Out(1, 16, String2);
  29.  
  30.   for(i = 0; i < 39; i++)
  31.   {
  32.       Lcd_Cmd(_LCD_SHIFT_LEFT);
  33.       Delay_mS(250);
  34.   }
  35.   Delay_ms(500);
  36.   Lcd_Cmd(_LCD_CLEAR);
  37.  
  38.   INTCON.GIE = 1;
  39.   INTCON.T0IE = 1;
  40.  
  41.   INTCON2.INTEDG0 = 0;                                                     // flanco bajo para INT0
  42.  
  43.   INTCON.PEIE = 1;                                                              // permiso de int perifericos
  44.   INTCON.INT0IE = 1;                                                           // enable INT0
  45.   INTCON.INT0IF = 0;                                                            // clear flag INT0
  46.  
  47.   HID_Enable(&readbuff,&writebuff);
  48.   Init();
  49.  
  50.   TMR0H = 0b01001000;
  51.   TMR0L = 0b11100101;                                                         // 18661 == 1seg



Saludos........