Forum: Mikrocontroller und Digitale Elektronik IR Sender


von Peter (Gast)


Lesenswert?

Hi ich wollte fragen ob der Code so funktionieren könnte. Hab leider
kein Oszi da.
Wenn der Timer läuft wird im 76 KHz Takt ein Pin getoggelt als
Trägerfrequenz. Die Senderoutinen schalten dann den Timer ein oder aus
um ein Bit zu senden.


#include "main.h"

uint8_t on=0x00;
uint16_t testbefehl = 0xAAAA;

void InitPorts(void){
}

//76KHz Timer
void InitTimer0(void){
  TCCR0=0x00;
  TCNT0=0x2e;
  //TCCR0=0x01;
}

INTERRUPT (SIG_OVERFLOW0){
  TCNT0=0x2e;
  PORTC^=PORTC&(1<<5);
}

void InitDevice(void){
  cli();
  InitPorts();
  InitTimer0();
  MCUCR = 0x00;
  GICR  = 0x00;
  TIMSK = 0x01;
  sei();

}

void IRSend(uint16_t* befehl){

  for(int i=0;i<14;i++){
    Manchester((uint8_t)((*befehl>>i)&0x01));
  }
  for(int i=0;i<50;i++){
    Delay_us(1778);
  }
  TCCR0=0x00;
  PORTC&=~(1<<5);

}

void Manchester(uint8_t onebit){
  switch(onebit){
    case 0x00:
      TCCR0=0x01;
      Delay_us(889);
      TCCR0=0x00;
      Delay_us(889);
    break;
    case 0x01:
      TCCR0=0x00;
      Delay_us(889);
      TCCR0=0x01;
      Delay_us(889);
    break;
  }
}

void main(void){


IRSend(&testbefehl);

}

von pebisoft (Gast)


Lesenswert?

habe mal als versuch diesen rc5-sendecode geschrieben. ist hier und da
noch verbesserungswürdig, aber er funktioniert auf einem avr 8mhz. ohne
timer. es wird im test die zahl 1-14 gesendet, das toggle und das
commando.


#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_PIN_1   PB1
#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
  ms_89(); // warte 89ms
}


int main(void)
{

  IR_LED_DDR|=(1<<IR_LED_PIN_1);
  IR_LED_DDR|=(1<<IR_LED_PIN);
  IR_LED_PORT|=(1<<IR_LED_PIN_1);

  uint8_t command,i;
  command=32;

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

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.