pic_rc5/src/main.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);
}*/
}
}