308 lines
5.0 KiB
C
308 lines
5.0 KiB
C
|
|
|
|
// Die Bi-Phasenmodulation arbeitet folgendermaßen
|
|
// Eine 1 wird durch eine Flanke 0 -> 1 definiert
|
|
// Eine 0 wird durch eine Flanke 1 -> 0 definiert
|
|
// Der Empfänger invertiert die Bits !!!
|
|
|
|
// Die RC5-Pulsbreite beträgt 1,778ms
|
|
// PORTB.0 wird alle 890us abgetastet und in 2 Bits rotiert.
|
|
|
|
// Die einzig gültige n Werte sind dann
|
|
// 0x02 für ein 1 Bit und 0x01 für ein 0 Bit
|
|
// 0x00 sowie 0x03 sind nicht erlaubt und ein Kennzeichen
|
|
// für keinen Empfang
|
|
|
|
|
|
//Auflösung des Timers 8 us
|
|
//RELOAD = 890us/8us = 111
|
|
|
|
//Wegen des Programm-Overheads ist der Timer mit 111 zu lang
|
|
//und die Abtastung rutscht nach rechts über die Flanken
|
|
//Timerwert verkürzen
|
|
//So sollte es eigentlich sein
|
|
//#define RELOAD 255-111 //Alle 890us läuft der Timer über
|
|
|
|
#define DELAY 73
|
|
#define RELOAD 255-DELAY //So gehts
|
|
#define _XTAL_FREQ 40000000
|
|
|
|
|
|
//verzögert um 890us, sampelt dann PORTB.0
|
|
//und schiebt das Bit in shift
|
|
|
|
#include <htc.h>
|
|
//#include <xc.h>
|
|
// #include <pic16F62xa.h>
|
|
#include <pic16F628a.h>
|
|
//#include "phaserec.h"
|
|
|
|
//#define IrOut PORTA,0
|
|
|
|
|
|
__CONFIG( LVP_OFF & BOREN_OFF & CPD_OFF & MCLRE_OFF & PWRTE_ON & WDTE_OFF & FOSC_XT );
|
|
|
|
|
|
unsigned char PhaseDemod();
|
|
|
|
|
|
//Globale Variablen
|
|
unsigned char toggle = 0; //Das Togglebit
|
|
unsigned char counterus = 0;
|
|
unsigned char counterms = 0;
|
|
unsigned int cycl_1;
|
|
unsigned int cycl_2, CountA, CountB, CountC;
|
|
unsigned int somethingpressed = 0;
|
|
|
|
void samplebit();
|
|
|
|
void AN()
|
|
{
|
|
unsigned char i = 0;
|
|
do
|
|
{
|
|
RA0 = 1;
|
|
RA0 = 1;
|
|
RA0 = 1;
|
|
RA0 = 1;
|
|
|
|
RA0 = 0;
|
|
RA0 = 0;
|
|
RA0 = 0;
|
|
RA0 = 0;
|
|
RA0 = 0;
|
|
RA0 = 0;
|
|
RA0 = 0;
|
|
RA0 = 0;
|
|
RA0 = 0;
|
|
RA0 = 0;
|
|
RA0 = 0;
|
|
i++;
|
|
}
|
|
while(i<32);
|
|
|
|
RA0 = 0;
|
|
/*
|
|
#asm
|
|
;****************************************************************************
|
|
; Licht pulsen (889 us)
|
|
; ideal: 32 IR Pulse von je 6,944 us mit Pausen von 20,8332 us
|
|
; real: 32 Pulse a 7 us mit je 21 us Pause, letzte Pause entfällt (32x7+31*21=875 us)
|
|
bcf 0x03, 5
|
|
bsf 0x05, 6
|
|
LichtAn
|
|
; 1. Puls
|
|
bsf 0x05,0
|
|
movlw 0x1E ; 31 weitere Zyklen
|
|
movwf _cycl_1
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
bcf 0x05,0
|
|
|
|
;31 Zyklen aus Pause und Puls
|
|
LichtAn1
|
|
;Pause
|
|
movlw 0x05 ;1T
|
|
movwf _cycl_2 ;1T
|
|
nop ;1T
|
|
nop ;1T
|
|
LichtAn2 ; 4x3T + 1x2T =14T
|
|
decfsz _cycl_2,f ;1T
|
|
goto LichtAn2 ;2T
|
|
;Puls ;7T
|
|
bsf 0x05,0
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
bcf 0x05,0
|
|
decfsz _cycl_1,f ;1T
|
|
goto LichtAn1 ;2T
|
|
|
|
return
|
|
; remaining code goes here
|
|
|
|
#endasm*/
|
|
}
|
|
|
|
void AUS()
|
|
{
|
|
unsigned char i = 0;
|
|
do
|
|
{
|
|
RA0=0;
|
|
}
|
|
while(i++<59);
|
|
/*unsigned char _cycl_2;
|
|
#asm
|
|
bcf 0x05,0
|
|
LichtAus
|
|
|
|
movlw 0xAF
|
|
movwf _cycl_2
|
|
LichtAus2
|
|
nop ;1T
|
|
nop ;1T
|
|
decfsz _cycl_2,f ;1T
|
|
goto LichtAus2 ;2T
|
|
#endasm*/
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void interrupt ISR (void)
|
|
{
|
|
|
|
}
|
|
|
|
void delay_89ms()
|
|
{
|
|
#asm
|
|
pause89ms
|
|
clrf _CountA
|
|
clrf _CountB
|
|
clrf _CountC
|
|
movlw 0x74
|
|
movwf _CountB
|
|
movlw 0x02
|
|
movwf _CountA
|
|
movlw 0x01
|
|
movwf _CountC
|
|
|
|
Loop ;Wiederholung der Zeitverzögerung
|
|
decfsz _CountA
|
|
goto Loop
|
|
decfsz _CountB
|
|
goto Loop
|
|
decfsz _CountC
|
|
goto Loop
|
|
#endasm
|
|
return;
|
|
}
|
|
|
|
void SendEins()
|
|
{
|
|
AUS();
|
|
AN();
|
|
}
|
|
void SendNull()
|
|
{
|
|
AN();
|
|
AUS();
|
|
}
|
|
|
|
|
|
void evaluate_tastatur(char *comcode)
|
|
{
|
|
unsigned char i;
|
|
unsigned char a;
|
|
unsigned char e;
|
|
e = 0;
|
|
|
|
for(i=3; i != 255; i--)
|
|
{
|
|
PORTB = 0xFF;
|
|
PORTB &= ~(1<<i);
|
|
for(a=4; a <= 7; a++)
|
|
{
|
|
e++;
|
|
if( ((PORTB>>a) & 1) == 0)
|
|
{
|
|
*comcode = e;
|
|
somethingpressed = 1;
|
|
return;
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
void SendRc5(char* command, char *group)
|
|
{
|
|
unsigned char i;
|
|
SendEins();
|
|
SendEins();
|
|
|
|
toggle = toggle ^ 1 & 1;
|
|
if(toggle == 1)
|
|
SendEins();
|
|
else
|
|
SendNull();
|
|
|
|
for(i = 4; i != 255; i--)
|
|
{
|
|
if(((*group>>i))&1)
|
|
SendEins();
|
|
else
|
|
SendNull();
|
|
}
|
|
for(i = 5; i != 255; i--)
|
|
{
|
|
if(((*command)>>i)&1)
|
|
SendEins();
|
|
else
|
|
SendNull();
|
|
}
|
|
delay_89ms();
|
|
|
|
}
|
|
|
|
|
|
void main(void)
|
|
{ //Takt des PIC 4MHz, ein Zyklus = 1us
|
|
unsigned char comcode = 0;
|
|
char subcode = 0;
|
|
|
|
OPTION_REG = 0b00000010; //Pullups on
|
|
CMCON = 0x07; //Komperatoren Abschalten
|
|
TRISA = 0x00; //PORTA ist Ausgang
|
|
TRISB = 0xF0; //PORTB 0...3 sind Ausgänge
|
|
//PR2 = 0xFF; //Periodendauer für die PWM modulation
|
|
GIE = 1; //Interrupts nicht möglich
|
|
CM0 = 1;
|
|
CM1 = 1;
|
|
CM2 = 1;
|
|
PORTA = 0; //Aus und Eingänge auf null
|
|
PORTB = 0xFF;
|
|
subcode = 29; //21;
|
|
|
|
|
|
INTCON = 0;
|
|
RBIE = 1;
|
|
char help = 0;
|
|
|
|
while(1)
|
|
{
|
|
while(!RBIF)
|
|
SLEEP();
|
|
PORTB = 0xFF;
|
|
evaluate_tastatur(&comcode);
|
|
if(somethingpressed == 1)
|
|
{
|
|
SendRc5(&comcode, &subcode);
|
|
somethingpressed = 0;
|
|
help = 1;
|
|
}
|
|
/*else if(help == 1)
|
|
{
|
|
help = 0;
|
|
comcode = 0; //endcommand
|
|
SendRc5(&comcode, &subcode);
|
|
}*/
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|