www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik IR Sender


Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);

}

Autor: pebisoft (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

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.