¿Por qué no se almacenan los valores de OCR1B?

0

Tengo el siguiente programa para controlar dos servomotores:

#include <avr/io.h>
#include <avr/delay.h>

void main()
{  
  int x,i,j,t=0,y=0,n=0;
  DDRA=0b11111111;
  DDRC=0b11111111;
  DDRB=0b00001111;

  //Configure TIMER1
  TCCR1A|=(1<<COM1A1)|(1<<COM1B1)|(1<<WGM11);         //NON Inverted PWM
  TCCR1B|=(1<<WGM13)|(1<<WGM12)|(1<<CS11)|(1<<CS10);  //PRESCALER=64 MODE 14(FAST PWM)

  ICR1=2499;  //fPWM=50Hz (Period = 20ms Standard).

  DDRD|=(1<<PD4)|(1<<PD5);    //PWM Pins as Out

  OCR1A=65;
  OCR1B=50;

  unsigned int k[1],z[1];

  while (1) {
    for (i=0;i<=4;i++) { //for keypad
      PORTB=0xf7>>i| 0xf0;
      x=PINB;

      if (x==0b11101110) {  //key 1 for moving motor 1
        OCR1A=OCR1A+1;
        _delay_ms(100);
      } else if (x==0b11011110) { //key 2 for moving motor 2
        OCR1B=OCR1B+1;
        _delay_ms(100);
      } else if(x==0b10111110) {    //key 3 for storing value of OCR1A
        k[t]=OCR1A;
        t++;
        _delay_ms(1000);
        _delay_ms(1000);              
      } else if (x==0b11101101) {    //key 4 for storing value of OCR1B
        z[n]=OCR1B;
        n++;
        _delay_ms(1000);
        _delay_ms(1000);
      } else if (x==0b11011101) {   //key 5 for moving motor from k[0] to k[1]
        OCR1A=k[0];
        Wait();
        for(OCR1A=k[0];OCR1A<=k[1];OCR1A++) _delay_ms(100);
        _delay_ms(1000); 
      } else if (x==0b10111101) {    //key 6 for moving motor from z[0] to z[1]
        OCR1B=z[0];
        Wait();
        for(OCR1B=z[0];OCR1B<=z[1];OCR1B++) _delay_ms(100);
        _delay_ms(1000);
      }
    }
  }
}

Tengo 4 * 3 Teclado conectado en el puerto B. Ambos motores funcionan correctamente a través de las teclas, pero al guardar solo los valores de OCR1A se almacenan correctamente y, de alguna manera, los valores de OCR1B no se almacenan correctamente. ¿Hay alguna diferencia entre el funcionamiento de OCR1A y OCR1B?

Después de mover los motores, estoy almacenando los valores de OCR1A y OCR1B que representan sus posiciones actuales. Estoy almacenando esos valores en una matriz (k [] yz []). Las teclas 5 y 6 se utilizan para acceder a los valores almacenados anteriormente para que pueda mover los motores entre las dos posiciones.

    
pregunta user3052614

2 respuestas

7

Has declarado que las matrices k[] y z[] tienen solo un elemento cada una. Por lo tanto, es probable que los valores que escriba en k[] estén sobrescribiendo los valores para z[] , y que los valores para z[] sean superados por otras variables.

    
respondido por el Dave Tweed
4

Además de la respuesta de Dave, es bueno mencionar que unsigned int k[1] solo declara (¿es esa la palabra correcta aquí?) k[0] y no k[1] .

Igualmente:

  • otro ejemplo: unsigned int k[10] declara k[0] .. k[9] ;
  • en general: unsigned int k[n] declara k[0] .. k[n-1] etc.
respondido por el jippie

Lea otras preguntas en las etiquetas