PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RC5 Code senden mit AVR und Bascom AVR



Import-Script
15.06.2002, 17:27
teils von der Homepage von Bascom und teils von mir ... <BR> <BR>IR Diode von Pind.5 mit einem Wid zu &#43;5V <BR> <BR>wenn das nicht geht gibt&#39;s die &#42;.bas file unter <A HREF="mailto:spatz222@altavista.de">spatz222@altavista.de</A> <BR> <BR> <BR>$regfile = &#34;8515def.dat&#34; <BR> <BR>$crystal = 8000000 <BR> <BR>Dim Rc5_address As Byte <BR>Dim Rc5_command As Byte <BR>Dim Rc5_bit_nr As Byte <BR>Dim Toggle_bit As Boolean <BR>Dim Count As Byte <BR> <BR> <BR>&#39; 36kHz carrier reload value <BR>&#39;Const T_oc1 = 55 &#39;value for 4MHz crystal <BR>Const T_oc1 = 110 &#39;value for 8MHz crystal <BR>&#39;Const T_oc1 = 138 &#39;value for 10MHz crystal <BR> <BR>Const Ton = 64 &#39;IR 36kHz carrier on <BR>Const Toff = 192 &#39;IR 36kHz carrier off <BR> <BR> <BR>Config Timer1 = Timer , Prescale = 1 , Compare A = Toggle , Clear Timer = 1 <BR>Timer1 = 0 <BR>Compare1a = T_oc1 OC1 = IR carrier output 36 kHz <BR> <BR>Declare Sub Logic_0 <BR>Declare Sub Logic_1 <BR> <BR>Tccr1a = Toff <BR> <BR> <BR>&#39;---&#91; set RC-5 System Address &#93;------------------------------------------------- <BR> <BR>Rc5_address = 0 <BR>Rc5_command = 4 <BR>Toggle_bit = 0 <BR> <BR> <BR>&#39;---&#91; main program loop &#93;------------------------------------------------------- <BR> <BR> <BR>Do <BR>Ddrd.5 = 0 <BR>wait 2 <BR> <BR>&#39;---&#91; transmit Address and Command as 14 bit RC-5 code &#93;------------------------ <BR> <BR> Ddrd.5 = 1 <BR> <BR> <BR>&#39;&#42;&#42;&#42;&#42; 2 Startbit&#39;s &#42;&#42;&#42;&#42; <BR> Logic_1 <BR> Logic_1 <BR> <BR>&#39;&#42;&#42;&#42;&#42; Togglebit &#42;&#42;&#42;&#42; <BR> If Toggle_bit = 0 Then Logic_0 Else Logic_1 <BR> <BR> <BR>&#39;&#42;&#42;&#42;&#42; RC5 Adresse &#42;&#42;&#42;&#42; <BR> For Rc5_bit_nr = 4 To 0 Step -1 <BR> If Rc5_address.rc5_bit_nr = 0 Then Logic_0 Else Logic_1 <BR> Next <BR> <BR> <BR>&#39;&#42;&#42;&#42;&#42; RC5 Code &#42;&#42;&#42;&#42; <BR> For Rc5_bit_nr = 5 To 0 Step -1 <BR> If Rc5_command.rc5_bit_nr = 0 Then Logic_0 Else Logic_1 <BR> Next <BR> <BR> Tccr1a = Toff <BR> <BR> <BR>Loop <BR> <BR> <BR>End <BR> <BR> <BR>&#39;------------------------------------------------------------------------------- <BR> <BR> <BR>Sub Logic_0 <BR> <BR> Tccr1a = Ton <BR> <BR> Waitus 883 <BR> <BR> Tccr1a = Toff <BR> <BR> Waitus 884 <BR> <BR>End Sub <BR> <BR> <BR>Sub Logic_1 <BR> <BR> Tccr1a = Toff <BR> <BR> Waitus 883 <BR> <BR> Tccr1a = Ton <BR> <BR> Waitus 884 <BR> <BR>End Sub

Import-Script
16.06.2002, 20:15
Die RC5-Beschreibung auf der Seite von Sprut l&auml;&szlig;t nichts zu w&uuml;nschen &uuml;brig. Damit l&auml;&szlig;t sich sehr einfach die 8051 Software implementieren. Den PIC-Kode habe ich mir noch nicht angesehen. <BR> <BR> <BR>Die Zeitbedingungen lassen sich bequem ermitteln: <BR> <BR>Der Grundtakt betr&auml;gt T = 1 / 144kHz. <BR>Ein Puls hat ein Tastverh&auml;ltnis von 25% &#40;1T: LED ein &#43; 3T: LED aus&#41;. Daraus wird dann ein Pulspaket von 32 Pulsen = 128T gebaut. <BR>Ein 1-Bit wird gesendet, indem erst ein Pulspaket und dann eine gleichlange Pause von 128T folgt. Beim 0-Bit ists genau umgekehrt. <BR>Im Kode habe ich das so realisiert, indem vor und nach der Pulssenderoutine eine Warteschleife steht und je nach Wert des Bits wird die vordere oder <BR>die hintere &uuml;bersprungen &#40;mit JNB bzw. JB&#41;. <BR> <BR> <BR>Bei meinem Beispiel wird ein kompletter 14-Bit Kode in 2 Registern &uuml;bergeben und die Bits einzeln gesendet. Es wird immer Bit14 gesendet und danach der Wert nach links geschoben. Das Ganze 14 mal und fertig. <BR> <BR> <BR>Ich denke mal, da&szlig; der 8051 auch hier wieder Weltmeister im Speicherverbrauch ist. D.h. er braucht nur 50 Byte Kode, was weder der AVR noch der PIC toppen kann. Man kann noch mindestens 8 Byte sparen, aber der besseren Lesbarkeit wegen hab ichs so gelassen. <BR> <BR>Ich verwende den &uuml;blichen Standard-Quarz &#40;11.0592MHz&#41;, d.h. zu langsam ist der 8051 also auch nicht daf&uuml;r. <BR> <BR> <BR>Am Anfang steht ein universelles Macro, um die ben&ouml;tigten Wartezeiten zu generieren. Ich wei&szlig; nicht, ob der Batronix dieses Macro unterst&uuml;tzt, aber mit dem Keil oder dem bekannten &#40;und kostenlosen&#41; Metalink gehts auf alle F&auml;lle. <BR> <BR> <BR>Peter <BR> <BR> <BR>; RC5 Transmitter <BR> <BR>; use Metalink or Keil to assemble <BR> <BR>$mod51 <BR> <BR>mdelay macro cycle ;0 ... 65535 <BR> if&#40; cycle 3 &#41; <BR> nop <BR> endif <BR> if&#40; cycle &#62; 2 &#41; <BR> nop <BR> endif <BR> if&#40; cycle &#62; 1 &#41; <BR> nop <BR> endif <BR> if&#40; cycle &#62; 0 &#41; <BR> nop <BR> endif <BR> elseif&#40; cycle &#60; 515 &#41; <BR> mov r7, #low&#40;&#40;cycle-1&#41;/2&#41; <BR> djnz r7, $ <BR> if&#40;&#40;cycle and 1&#41; = 0&#41; <BR> nop <BR> endif <BR> else <BR> mov r7, #high&#40;cycle/2&#43;253&#41; <BR> mov r6, #low&#40;cycle/2-2&#41; <BR> djnz r6, $ <BR> djnz r7, $ - 2 <BR> if&#40;cycle and 1&#41; <BR> nop <BR> endif <BR> endif <BR> endm <BR> <BR> <BR>XTAL equ 11059 ;kHz <BR> <BR>RC5CLOCK equ 144 ;kHz <BR> <BR>RC5_T1 equ &#40;&#40;XTAL &#43; RC5CLOCK / 2&#41; / RC5CLOCK &#43; 6&#41; / 12 <BR>RC5_T3 equ &#40;&#40;XTAL &#43; RC5CLOCK / 2&#41; / RC5CLOCK &#42; 3 &#43; 6&#41; / 12 <BR>RC5_T128 equ &#40;&#40;XTAL &#43; RC5CLOCK / 2&#41; / RC5CLOCK &#42; 128 &#43; 6&#41; / 12 <BR> <BR> <BR>xRC5LED equ P1.0 ;low active <BR> <BR> <BR>TUNER equ 17 &#42; 64 <BR>VOLUME_PLUS equ 16 <BR>STARTBITS equ 11000000000000b <BR> <BR>main: <BR> mov a, #low&#40; STARTBITS &#43; TUNER &#43; VOLUME_PLUS &#41; <BR> mov b, #high&#40; STARTBITS &#43; TUNER &#43; VOLUME_PLUS &#41; <BR> <BR> call rc5send ;send code <BR> <BR> mov r3, #128 ;wait 114&aelig;s <BR>wait: mdelay RC5_T128 <BR> djnz r3, wait <BR> jmp main <BR> <BR> <BR>;input: B, A = RC5 code &#40;14 bit&#41; <BR> <BR>rc5send: <BR> mov r3, #14 <BR>_rc5s1: <BR> jb b.5, _rc5s2 ;bit 14 <BR> mdelay RC5_T128 - 11 ;pause before pulse if bit = 0 <BR>_rc5s2: <BR> mov r4, #32 ;pulse 32 times <BR>_rc5s3: <BR> clr xRC5LED ;LED on <BR> mdelay RC5_T1 - 1 <BR> setb xRC5LED ;LED off <BR> mdelay RC5_T3 - 3 <BR> djnz r4, _rc5s3 ;next pulse <BR> jnb b.5, _rc5s4 <BR> mdelay RC5_T128 - 11 ;pause after pulse if bit = 1 <BR>_rc5s4: <BR> rlc a ;shift low byte <BR> xch a, b <BR> rlc a ;shift high byte <BR> xch a, b <BR> djnz r3, _rc5s1 ;next bit <BR> ret <BR>end

Import-Script
18.06.2002, 08:37
Eine kleine Korrektur: <BR> <BR>Die Sprut-Beschreibung ist falsch, das 0-Bit und das 1-Bit sind genau andersrum definiert. D.h. in meinem Kode mu&szlig; JNB durch JB ersetzt werden und umgekehrt. <BR> <BR>Das Delay-Makro ist leider v&ouml;llig verst&uuml;mmelt worden, da das Forum allergisch ist gegen &#34;gr&ouml;&szlig;er&#34; und &#34;kleiner&#34; Zeichen. <BR> <BR>Daher werde ich alles nochmal auf meine Webseite stellen. <BR>Dazu noch die passende Empfangsroutine. <BR> <BR> <BR>Peter