Autor Tema: Rotacion de encendido de leds en MIKROC  (Leído 8822 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado frozen

  • PIC12
  • **
  • Mensajes: 53
Rotacion de encendido de leds en MIKROC
« 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;
                              }

                    }
            }

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Rotacion de encendido de leds en MIKROC
« Respuesta #1 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.

Desconectado frozen

  • PIC12
  • **
  • Mensajes: 53
Re: Rotacion de encendido de leds en MIKROC
« Respuesta #2 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.

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Rotacion de encendido de leds en MIKROC
« Respuesta #3 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);
}

}

Desconectado fenixariel

  • PIC10
  • *
  • Mensajes: 39
    • www.delphiandpic.jimdo.com
Re: Rotacion de encendido de leds en MIKROC
« Respuesta #4 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();              
                    
    }
    
}
 
        

Desconectado frozen

  • PIC12
  • **
  • Mensajes: 53
Re: Rotacion de encendido de leds en MIKROC
« Respuesta #5 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. :)

Desconectado fenixariel

  • PIC10
  • *
  • Mensajes: 39
    • www.delphiandpic.jimdo.com
Re: Rotacion de encendido de leds en MIKROC
« Respuesta #6 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.......

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Rotacion de encendido de leds en MIKROC
« Respuesta #7 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
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado fenixariel

  • PIC10
  • *
  • Mensajes: 39
    • www.delphiandpic.jimdo.com
Re: Rotacion de encendido de leds en MIKROC
« Respuesta #8 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........
« Última modificación: 20 de Noviembre de 2011, 03:02:35 por fenixariel »