Lab-irkit2

Aus LaborWiki
Wechseln zu: Navigation, Suche

Diese Seite beschäftigt sich mit CanIR Version 2

Quellcode Dateien:

lab-irkit2.c
lab-irkit2.h

Was kann diese lib?

Was geht:

  • beliebige Taktquelle (Quarz > 10 Mhz empfohlen)
  • alle standart IR Trägerfrequenzen (30kHz, 33kHz ,36kHz ,38kHz ,40kHz ,50kHz)
  • beliebige selbstdefinierbare Trägerfrequenzen
  • bis zu 8 Kanäle gleichzeitig (selbe Trägerfrequenz, vielfaches der Bit-pulslänge)
  • vordefinierte Standartcodes NEC, Sharp, Philips, ....
  • einstellbare Pulsbreite (für LEDs, die mit Pulsstrom versorgt werden, std. 10% Pulsbreite)
  • nicht benutzte Känale sind freie Pins (werden nicht angesteuert)

Was geht nicht:

  • Timer0 & Timer1 benutzen (wenn ein Code gesendet wird)
  • Auf verschiedenen Kanälen gleichzeitig unterschiedliche Trägerfrequenzen
  • beliebig lange Codes (begrenzt durch Atmega SRAM)
  • unterschiedliche Ports verwenden, für die Kanäle

Funktionen

uint8_t ir_init((uint16_t freq, uint16_t pulselength)
Initialisiert die Timer und Ports, einstellbar sind Trägerfrequenz und bit-Pulslänge.
Parameter:

  • uint16_t freq
  • uint16_t pulselength

return:

  • 0 : Fehler
  • 1 : Kein Fehler

freq:
F_CPU/Trägerfrequenz
IR_FREQ30K = F_CPU/(30000)

Vordefiniert:

  • IR_FREQ30K
  • IR_FREQ33K
  • IR_FREQ36K
  • IR_FREQ38K
  • IR_FREQ40K
  • IR_FREQ56K

pulselength:
bit-Pulslänge in Mikrosekunden, abhängig vom verwendeten Code, siehe lab-irkit2.h!
Vordefiniert u.A.:

  • IR_PhilipsRC5_pulselength
  • IR_SIRC_pulselength
  • ...

void ir_disable(void)
Stoppt sofort den Sendevorgang auf allen Kanälen, schaltet alle Timer aus.

uint8_t ir_genHeader(uint8_t channel, uint32_t headerCode, uint8_t headerLen)
Generiert einen IR Header auf dem ausgewählten Kanal.
Parameter:

  • uint8_t channel
  • uint32_t headerCode
  • uint8_t headerLen

return:

  • 0 : Fehler
  • 1 : Kein Fehler

channel:
Gültige Werte: 0..7

headerCode:
Gültiger Wert: >0
Bitcode des Headers.
Vordefinierte HeaderCode u.A.:

  • IR_PhilipsRC6_header
  • IR_SIRC_header
  • ...

headerLength:
Länge des Headercodes in bit.
Gültige Werte: 1..32
Vordefinierte HeaderCodelength u.A.:

  • IR_PhilipsRC6_headerlength
  • IR_SIRC_headerlength
  • ...

uint16_t ir_genCode(uint8_t headerlength, uint8_t channel, uint8_t oneCode, uint8_t oneCode_length, uint8_t zeroCode,uint8_t zeroCode_length, uint32_t bitCode, uint8_t codeLen)
Diese Funktion erzeugt aus dem Codespezifischen Bitmustern das intern von Lab-irkit2 verwendete Format und legt die Daten im SRAM ab.
Sobald die Daten erzeugt wurden können diese immer wieder mit ir_sendCode(uint16_t codelength) gesendet werden.

Parameter:

  • uint8_t headerlength
  • uint8_t channel
  • uint8_t oneCode
  • uint8_t oneCode_length
  • uint8_t zeroCode
  • uint8_t zeroCode_length
  • uint32_t bitCode
  • uint8_t codeLen

return:

  • uint16_t codelength

headerlength, oneCode, oneCode_length, zeroCode, zeroCode_length sind Codespezifisch
benutze einfach die vordefinierten Werte aus lab-irkit2.h

bitcode:
Der zu sendende Code als Bitmuster. Max 32 Zeichen, muss größer 0 sein

codeLen:
Länge des zu sendenden Codes. Muss größer 0 sein und kleiner 33

channel:
Der Kanal auf dem gesendet werden soll. Gültige Werte: 0..7

void ir_sendCode(uint16_t codeLen)
Parameter:

  • uint16_t codeLen

codeLen:
Länge des zu sendenden Codes, dieser Wert wurde von ir_genCode erzeugt. Werden verschiedene Codes gesendet, den größten zurückgegebenen Wert nehmen !
Sendet auf allen Kanälen die vorher generierten IR Codes aus.
Diese Funktion startet nur die Timer, es kann in der Hauptroutine weitergerechnet werden!

Wichtige Definitionen

//define output PORT
#define IRPORT PORTD
#define IRDDR DDRD
#define IRUSEDPORTS 0x3 
//define how long a carrier pulse last 0..1
//select 0.5 for normal LED mode or
//less values if you overcurrent the IR LEDs 
#define IR_pulse_width 0.1f
//max SRAM usage
#define IR_MAX_SRAM 512

Beispielquelltext

Code example:

#include <stdio.h>
#include <stdlib.h>
#include "lab-irkit2.h"
int main(void)
{
//initialize ir subsystem
ir_init(IR_NEC_Carrier, IR_NEC_pulselength); //initialize the IR subsystem
uint16_t codelength=0;  //store the generated code length
ir_genHeader(0, IR_NEC_header, IR_NEC_headerlength);  //generate header
codelength=ir_genCode(IR_NEC_headerlength,0,IR_NEC_oneCode,IR_NEC_oneCodelength,IR_NEC_zeroCode,IR_NEC_zeroCodelength,0b00010000110010001110000100011110, 32);  //generate code
while (1)
{	
ir_sendCode(codelength);  //transmit code
wait(50); //wait a long time, we dont want to start the transmition every cycle
}
}