www.mikrocontroller.net

Forum: Compiler & IDEs RC5 Char mit uint vergleichen


Autor: Richard B. (rbrose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich benutze die RC5 Funktion von Peter Dannegger.
#include "main.h"

#define RC5TIME   1.778e-3    // 1.778msec
#define PULSE_MIN  (uchar)(XTAL / 512 * RC5TIME * 0.4 + 0.5)
#define PULSE_1_2  (uchar)(XTAL / 512 * RC5TIME * 0.8 + 0.5)
#define PULSE_MAX  (uchar)(XTAL / 512 * RC5TIME * 1.2 + 0.5)


uchar  rc5_bit;        // bit value
uchar  rc5_time;        // count bit time
uint  rc5_tmp;        // shift bits in
volatile uint  rc5_data;        // store result


ISR (TIMER0_OVF_vect)
{
  uint tmp = rc5_tmp;        // for faster access

  TCNT0 = -2;          // 2 * 256 = 512 cycle

  if( ++rc5_time > PULSE_MAX ){      // count pulse time
    if( !(tmp & 0x4000) && tmp & 0x2000 )  // only if 14 bits received
      rc5_data = tmp;
    tmp = 0;  
  }

  if( (rc5_bit ^ xRC5_IN) & 1<<xRC5 ){    // change detect
    rc5_bit = ~rc5_bit;        // 0x00 -> 0xFF -> 0x00  

    if( rc5_time < PULSE_MIN )
  {      // to short
      tmp = 0;    
  }

    if( !tmp || rc5_time > PULSE_1_2 ){    // start or long pulse time
      if( !(tmp & 0x4000) )      // not to many bits
        tmp <<= 1;        // shift
      if( !(rc5_bit & 1<<xRC5) )    // inverted bit
        tmp |= 1;        // insert new bit
      rc5_time = 0;        // count next pulse time
    }
  }

  rc5_tmp = tmp;
}

Jetzt will ich in meiner Main Schleife eine Abfrage bauen ob - und
welche Taste bedrückt wurde.
  while(1) 
  {
    for (unsigned char i=0; i<20; i++)
            _delay_ms(10);

    if( get_key_press(1) )
    {  
      couterZ++;
    }      
    if( get_key_press(2) )
    {  
      couterZ--;
    }      
    
    if(couterZ == 11)
      couterZ = 0;

    currentSeg1 = pgm_read_byte(&c_led[couterZ]);
    currentSeg2 = pgm_read_byte(&c_led[couterZ]);
    currentSeg3 = pgm_read_byte(&c_led[couterZ]);        
  }

Hier ein Beispiel mit get_key_press(1) und get_key_press(2)
Also wird hier abgefragt ob die Taste 1 oder 2 auf der Fernbedienung
gedrückt wurden.

Und hier kommt der Knackpunkt:
uint8_t get_key_press( uint8_t key_mask )
{
  uint8_t i;
  char key[30];

  cli();
        i = rc5_data;      // read two bytes from interrupt !
  rc5_data = 0;
        sei();

  itoa((i & 0x3F) | (~i >> 7 & 0x40), key, 10); // Key Code

    return key_mask;
} 
Wie muss ich hier den vergleich machen? Damit ich den Key Code mit dem
Int Wert vergleichen kann?

Ist das überhaupt so sinnvoll? Weil bei jeder Abfrage für jede Taste
rc5_data neu geholt wird? Oder mache ich das anders?

Autor: Richard B. (rbrose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann mir den wirklich keiner helfen? Oder ist etwas unklar?

Autor: ernst (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

guck dir doch mal die Zeile an:
itoa((i & 0x3F) | (~i >> 7 & 0x40), key, 10); // Key Code

So sollte der Key Code in einer int Variable landen (nicht probiert, es 
reicht bestimmt auch eine 8 Bit Variable):
unsigned int keyCode = (i & 0x3F) | (~i >> 7 & 0x40)

ernst

Autor: Richard B. (rbrose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank es funktioniert!

Aber habe jetzt das nächste Problem:

Hier wird Taste 16 erkannt ... aber Taste 17 nicht :-(
  while(1) 
  {
      
    if( get_key_press(16) )
    {  
      couterZ++;
    }
    
    if( get_key_press(17) )
    {  
      couterZ--;
    }    

  
    for (unsigned char i=0; i<20; i++)
      _delay_ms(10);
    
    if(couterZ == 11)
      couterZ = 0;

  //  PORTD = pgm_read_byte(&c_led[couterZ]);

    currentSeg1 = pgm_read_byte(&c_led[couterZ]);
    currentSeg2 = pgm_read_byte(&c_led[couterZ]);
    currentSeg3 = pgm_read_byte(&c_led[couterZ]);
        
  }

Wenn ich aber die Abfrage umtausche wird Taste 17 erkannt und Taste 16 
nicht. Wieso ist das so?
  while(1) 
  {      
    if( get_key_press(17) )
    {  
      couterZ--;
    }

    if( get_key_press(16) )
    {  
      couterZ++;
    }
        
  
    for (unsigned char i=0; i<20; i++)
      _delay_ms(10);
    
    if(couterZ == 11)
      couterZ = 0;

  //  PORTD = pgm_read_byte(&c_led[couterZ]);

    currentSeg1 = pgm_read_byte(&c_led[couterZ]);
    currentSeg2 = pgm_read_byte(&c_led[couterZ]);
    currentSeg3 = pgm_read_byte(&c_led[couterZ]);
        
  }

Autor: Bastler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vieleicht den return value von get_key_press() in einer variable 
speichern und erst danach testen?

Cheers

Autor: Richard B. (rbrose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ahh Logisch, wenn ich die "get_key_press" Methode Aufrufe wird rc5_data 
auf 0 gesetzt und die nächste Überprüfung stimmt schon nicht mehr.

Habe das so geändert:
while(1) 
{
  uint8_t key_tmp;

  cli();
      i = rc5_data;      // read two bytes from interrupt !
  rc5_data = 0;
      sei();    

      key_tmp  = (i & 0x3F) | (~i >> 7 & 0x40);

      
  if( get_key_press(i, 16) )
  {  
    couterZ++;
  }
    
  if( get_key_press(i, 17) )
  {  
    couterZ--;
  }    

  
  for (unsigned char i=0; i<20; i++)
    _delay_ms(10);
    
  if(couterZ == 11)
    couterZ = 0;


  currentSeg1 = pgm_read_byte(&c_led[couterZ]);
  currentSeg2 = pgm_read_byte(&c_led[couterZ]);
  currentSeg3 = pgm_read_byte(&c_led[couterZ]);        
}


uint8_t get_key_press( uint8_t key, uint8_t key_mask )
{
  if(key == key_mask)
  {
    return 1;
  }
  else
  {
    return 0;
  }    
} 


Und schon funktioniert es.

Danke!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.