IR Sender

Gast #260232
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);

}
Gast #260233
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);
}

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 20 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.