mikrocontroller.net

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


Autor: pebisoft (Gast)
Datum:

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

Autor: Elektrikser (Gast)
Datum:

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

Gruß Elektrikser

Autor: Werner B. (Gast)
Datum:

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

Autor: pebisoft (Gast)
Datum:

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

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.