Forum: Projekte & Code rc5-code senden mit winavr-c


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
  }
}

mfg pebisoft

von Werner B. (Gast)


Lesenswert?

@pebisoft

Dann ist aber die Batterie deiner selbstgebauten Fernbedienung schnell
leer ;)

Wenn A)

"...die irdiode geht bei mir vom pinb0 (kann beliebig sein) über
einen 100ohm widerstand an +5volt..."

und B)

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

dann ist die LED nach einem "IR_LED_OFF;" immer unter Strom.

Das würde ich nicht aushalten - IMMER unter strom ;)

von pebisoft (Gast)


Lesenswert?

du sollst keine kritik üben, sondern einen konkreten vorschlag machen,
damit es nicht so ist. monatenlang ward ihr zu dusselig einen sender zu
programmieren und jetzt kommen die parasieten.
mfg pebisoft

von Mike (Gast)


Lesenswert?

Na? Wie schreibt man Parasit?

Wenn du deine LED auf einer Seite an 5V hängst und im Ruhezustand den
AVR-Pin auf 0V legst, dann "leuchtet" sie ständig. Wenn du nicht von
selbst drauf kommst, wie man das ändert, dann tut es mir leid.

von Werner B. (Gast)


Lesenswert?

@pebisoft

ÄÄÄÄÄ "...konkreten vorschlag machen..."?

Wenn Du <bold>*DAS*</bold> nicht zustandebringst ...

Zudem was das nicht als Kritik gedacht, sondern als Hinweis auf eine
Sache die offensichtlich übersehen worden ist!

von peter dannegger (Gast)


Lesenswert?

@pebisoft

"du sollst keine kritik üben,"


Uih, ganz böses Foul !

Dafür gibts nur eine einzige Lösung: stell Deinen Sch... nicht in ein
Forum.

Ein Forum ist ja gerade dazu da, um Kritik zu üben.

Und gerade dieses Forum gefällt mir gut, weil es hier Sitte ist, einen
mit der Nase auf den Fehler zu stoßen, ohne ihm die Lösung vorzukauen.

Wenn Du nur als Gott angebetet werden willst, dann bist Du hier
falsch.



"monatenlang ward ihr zu dusselig einen sender zu programmieren"

Uih, 2. ganz böses Foul !

Wer hat Dir denn hier versprochen, für Dich einen Sender zu
programmieren ???

Niemand !!!

Ich wüßte also nicht, was daran "dusselig" sein soll, eine Aufgabe
nicht zu lösen, die man garnicht hat.


Peter


P.S.:
Es kann auch nichts schaden, zu überlegen, wozu wohl der Dateianhang
gedacht ist.

von Peter Schwarz (Gast)


Lesenswert?

Hallo,

trifft sich ja, daß hier ein Quellcode in C da ist. Brauch ich grad für
meine Propeller Uhr um die DCF Zeit über IR zu übertragen :)

Was ist denn die Lösung für das IR-Problem hier ?

Die IR-LED auf der einen Seite an Masse hängen und mit dem AVR die
Leitung auf High (sende) oder Low (aus) legen ?

Nur damit ich nicht ganz dumm sterbe und es hier wieder zum
Ursprungsthema zurückgeht.

Peter

von Aurel J. (Gast)


Lesenswert?

Naja die IR Diode würde ich jetzt nicht anders herum ansteuern, weil
Microcontroller im allgemeinen als Open Collector ausgeführt werden.
Soll heißen wenn Strom fließt sollter der Pin auf "null" sein.

 Die einfachste Lösung ist wohl in die Funktion "void send_code" als
letzte Zeile noch "IR_LED_OFF;" ein zu fügen. Eventuell das gleich
noch einmal Am Anfang bei einer Initialisierung.

Gruß

Aurel

von Hagen (Gast)


Lesenswert?

Leute !!

damit ihr nich dumm sterbt,

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

IR_LED_ON setzt Ausgang auf High Pegel,er hat aber die LED nach Vcc
geschaltet, erdo IR_LED_ON schaltet die LED aus und IR_LED_OFF schaltet
die LED an, weil ja dann der Ausgang auf Low geht und somit Strom
fließt.

Na, was wäre jetzt die cleverste Lösung ?

Bevor auch das noch gefragt wird, einfach die #defines vertrauschen und
hoffen das der Rest des Codes wirklich bipolare Manchastercodierung
unterstützt.

Also:

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

Gruß hagen

von Aurel J. (Gast)


Lesenswert?

Hallo Hagen,

danke für deine Sorge um mein Ableben aber an der Stelle habe ich schon
vorgesorgt :-)

Mit der ON/OFF Geschichte hast du völlig recht aber leider ist die
Batterie immer noch leer.

1.
Nach einem Reset sind die Ausgänge low d.h. die Diode brennt bis zum
ersten Sendeeinsatz. --> Abhilfe: Bei der Initialisierung ein
IR_LED_OFF; nach deiner Änderung.

2.
Fast am Ende steht "PORTB=0; //IR-LED abschalten". Das muss natürlich
auch gegen IR_LED_OFF; ersetzt werden oder PORTB=1; heißen.

Gruß

Aurel

von Jens (Gast)


Lesenswert?

@pebisoft

Dein Code ist ja ganz nett, nur was mache ich bei einer anderen
Quarzfrequenz. Dann geht das suchen (und rechnen) los, welche Schleifen
geändert werden müssen, um die Zeiten zu bekommen. Du solltest das
nochmal überarbeiten, am besten so, daß nur am Anfang ein paar #defines
geändert werden müssen.

Ansonsten komm mal runter von deinem hohen Ross, Peter hat eigentlich
schon alles dazu gesagt.

MfG
Jens

von Werner B. (Gast)


Angehängte Dateien:

Lesenswert?

Ungetestet und ohne Garantie

// Timing Werte aus ASM-Listing ermittelt. Referenzfrequenz ist 8 MHz
(8.0e6 Hz)
// F_CPU im Makefile definiert.
#define DELAY_89ms      (uint32_t)(88997.875*(F_CPU/8.0e6)+0.499)
#define DELAY_HALFBIT   (uint16_t)(1184.019*(F_CPU/8.0e6)+0.499)
#define DELAY_36kHz     (uint8_t)(21.4*(F_CPU/8.0e6)+0.499)

oder als Anhang der komplett überarbeitete und kommentierte (noch
ungetestete) Code.
P.S:
Ich bin immernoch am überlegen wie ich's mit PWM mache :)

von Aurel J. (Gast)


Lesenswert?

Werner B. dein *.zip geht irgendwie nicht.

von Werner B. (Gast)


Angehängte Dateien:

Lesenswert?

Kann nicht mal einer eine Maschine erfinden die diesem Bill G.
automatisch eine knallt sobald wieder so ein Sch... passiert?

rc5_send.szipfile in .zip umbenennen :)

von Chris H. (toffer)


Lesenswert?

kann mir einer erklären was es mit dem togglebit bei rc5_send_code auf 
sich hat? Und wie sende ich jetzt einen speziellen Code, bzw. gebe ich 
das an? ist das dezimal oder hex?

Ich will zB Taste 7 von Code 030 Sanyo senden, geht das dann so: ?


rc5_send_code(??siehe oben, 30, 7);

Hoffe es kann mir noch wer helfen.

mfg chris

von Werner B. (werner-b)


Lesenswert?

Bist du dir sicher, dass Sanyo RC5 verwendet?

Zum testen am besten IRMP aufbauen ;-)
Das kann auch senden (IRSND) und ist besser dokumentiert.

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.