Forum: Compiler & IDEs rc5-code sneden mit avr16-8mhz


von pebisoft (Gast)


Lesenswert?

hallo, ich möchte einen signal für 889us erzeugen, das mit 36khz
pulsiert. dieses 36khz sollen nur zur verfügung stehen, wenn ich ein
bit über die ir-diode sende, 1bit besteht aus 2x 889us (ir-code).
mfg pebisoft

von Elektrikser (Gast)


Lesenswert?

Ja, schön...
Und was ist jetzt deine Frage oder dein Problem???

Gruß Elektrikser

von Werner B. (Gast)


Lesenswert?

Jetzt kann sein dass ich mich um den faktor 2 verhaue...

Timer compare register auf 111 (8MHz/36kHz/2) prescaler=1.

36 mal in jedem SIG_OUTPUT_COMPAREx interrupt den ausgang toggeln
(36mal an, 36 mal aus, natuerlich abwechselnd) und dann 36+36 mal aus
lassen, bzw. 72 mal auslaseen und dann toggeln, je nachdem ob du 1 oder
0 codieren willst.

Muesste auch mit PWM gehen, habu nur im moment keine idee wie man die
einzelnen bits codieren sollte.

Ohne gewehr, ich bin pazifist :)

Werner

von pebisoft (Gast)


Lesenswert?

hallo, haben es geschafft. kann jetzt mit dem avr16 8mhz mit diesem
programm alle 14 bits senden im rc5-code. keine einzige fehlermeldung.
klasse. die irdiode geht bei mir vom pinb0 (kann beliebig sein) über
einen 100ohm widerstand an +5volt.der code kann mit dem rc5-programm
aus diesem forum empfangen werden.
der code:

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <string.h>
#include <stdint.h>

#define IR_LED_PORT  PORTB
#define IR_LED_PIN   PB0
#define IR_LED_DDR   DDRB

#define IR_LED_ON    IR_LED_PORT |=  (1<<IR_LED_PIN)
#define IR_LED_OFF   IR_LED_PORT &= ~(1<<IR_LED_PIN)

//89ms pause
void ms_89(void)
{
  uint32_t zaehler;

  for (zaehler=0; zaehler<118666; zaehler++)
  asm volatile("nop");
}

void halbbit_high(void)
{
  uint8_t i,zaehler;

  //890us Impuls mit 36kHz senden
  //Bei 28us Periodendauer ergibt das 32 Impulse
  for(i=0; i<32; i++)
  {
    IR_LED_ON;
    for (zaehler=0; zaehler<18; zaehler++)
    asm volatile("nop");
    IR_LED_OFF;
    for (zaehler=0; zaehler<18; zaehler++)
    asm volatile("nop");
  }
}

void halbbit_low(void)
{
  uint16_t zaehler;

  //890us Pause
  for (zaehler=0; zaehler<1186; zaehler++)
  asm volatile("nop");
}

//Eine 0 oder 1 senden
void Send_Bit(uint8_t code)
{
  if (code==0)
  {
    halbbit_high();
    halbbit_low();
  }
    else
  {
    halbbit_low();
    halbbit_high();
  }
}


void send_code(uint8_t toggle, uint8_t address, uint8_t command)
{
  uint8_t mask,i;

  Send_Bit(1); //Erstes Startbit=1
  Send_Bit(1); //Zweites Startbit=1

  //Togglebit
  if(toggle==0)
  {
    Send_Bit(0);
  }
  else
  {
    Send_Bit(1);
  }

  //5 Bit Addresscode
  mask=0x10; //Beginn bei MSB

  for(i=0; i<5; i++)
    {
     if(address&mask) //Send 1
      {
       Send_Bit(1);
      }
     else //Send 0
      {
       Send_Bit(0);
      }

     mask>>=1;   //Nächstes Bit
    }


  //6 Bit Kommandocode
  mask=0x20; //Beginn bei MSB

  for(i=0; i<6; i++)
    {
     if(command&mask) //Send 1
      {
       Send_Bit(1);
      }
     else //Send 0
      {
       Send_Bit(0);
      }
     mask>>=1;  //Nächstes Bit
    }

  //Übertragung komplett
  PORTB=0; //IR-LED abschalten
  ms_89(); // warte 89ms
}


int main(void)
{
  IR_LED_DDR|=(1<<IR_LED_PIN);

  uint8_t command,i;
  command=32;

  for (i = 14; i < command; i++)
  {
    send_code(1,7,i); // toggle, addresse, commando
  }
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.