AW: DIY MultiTrigger - Intervall, HDR, Blitz, Lichtschranke, LZB, Strobo|LCD, Menüfüh
wird wohl das hier sein
wird wohl das hier sein
Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdint.h>
#include <util/delay.h>
#include "IR_drv.h"
/* Macros for IR LED */
#define LED_ON() IR_PORT |= (1<<IR_PIN)
#define LED_OFF() IR_PORT &= ~(1<<IR_PIN)
//#define PULSE_32k() LED_ON(); _delay_us(15.24); LED_OFF(); _delay_us(15.24)
// execution times of Port Clear/Set are longer because of 1MHz clock so we decrease them...
#define PULSE_32k() LED_ON(); _delay_us(14); LED_OFF(); _delay_us(10)
#define PULSE_38k() LED_ON(); _delay_us(13.15); LED_OFF(); _delay_us(13.15)
#define PULSE_38_4k() LED_ON(); _delay_us(12); LED_OFF(); _delay_us(8)
//#define PULSE_38_4k() LED_ON(); _delay_us(13.02); LED_OFF(); _delay_us(13.02)
//#define PULSE_40k() LED_ON(); _delay_us(12.5); LED_OFF(); _delay_us(12.5)
#define PULSE_40k() LED_ON(); _delay_us(12); LED_OFF(); _delay_us(4)
void IR_toggle(uint8_t camera_type){
uint16_t i;
uint8_t j,k;
uint16_t mask;
uint16_t address;
uint16_t cmd;
/* we disable interrupts for perfect timing */
cli();
switch(camera_type){
case 0: /* Canon RC-1 Protocol */
for(i = 0; i < 16; i++){
PULSE_32k();
}
_delay_ms(7.33);
for(i = 0; i < 16; i++){
PULSE_32k();
}
break;
case 1: /* Nikon ML-L3 Protocol */
for(j = 0; j < 2; j++){
for(i = 0; i < 77; i++){
PULSE_38_4k();
}
_delay_ms(27.83);
for(i = 0; i < 15; i++){
PULSE_38_4k();
}
_delay_ms(1.58);
for(i = 0; i < 16; i++){
PULSE_38_4k();
}
_delay_ms(3.58);
for(i = 0; i < 16; i++){
PULSE_38_4k();
}
if(!j)
_delay_ms(63);
}
break;
case 2: /* Pentax IR F */
for(i = 0; i < 494; i++){
PULSE_38_4k();
}
_delay_ms(3);
for(j = 0; j < 7; j++){
for(i = 0; i < 38; i++){
PULSE_38_4k();
}
_delay_ms(1);
}
break;
case 3: /* Sony */
address = 0x1E3A;
cmd = 0x2D;
for(k = 0; k<5; k++){
mask = 1;
/* Send Start-Burst */
for(i = 0; i < 96; i++){
PULSE_40k();
}
_delay_us(640);
j=0;
/* Send CMD; LSB first */
while(j++ <7){
if(cmd & mask){
for(i = 0; i < 48; i++){
PULSE_40k();
}
}
else{
for(i = 0; i < 24; i++){
PULSE_40k();
}
}
_delay_us(640);
mask <<= 1;
}
j=0;
mask = 1;
/* Send Adress; LSB first */
while(j++<13){
if(address & mask){
for(i = 0; i < 48; i++){
PULSE_40k();
}
}
else{
for(i = 0; i < 24; i++){
PULSE_40k();
}
}
_delay_us(640);
mask <<= 1;
}
_delay_ms(11);
}
break;
}
sei();
}