Hallo stefan_Z

oder hab ich was verpasst?
Nein, ich denke nicht, dass du was verpasst hast. Manche Programmierer funktionieren eben nicht mit jeder Software. Ich kenne Harrys Programmer leider nicht, dass muss er sich letztlich selbst erarbeiten wie das mit seinem Programmer funktioniert.

PonyProg funktionierte mit meinem Programmer auch nicht, die Lösung fand ich dann schließlich irgendwo in einem Forum und seitdem funzt es bei mir.

Eine Vollversion von Bascom dürfte auch meiner Meinung nach nicht die Lösung bringen und ist für den tiny13 auch sicher nicht nötig.

Übrigens bin ich dem eigentlichen RC5-Problem vermutlich schon wieder etwas näher gekommen. Ich habe nun einen 50 Ohm Vorwiderstand und kann aus ca. 1m Entfernung senden. Allerdings akzeptiert mein RP6 nur bestimmte Addressen/Kommando-Kombinationen. Es sind 5, 9, 21 und 27. Mit einem geänderten Testprogramm das feste Codes sendet, erhalte ich auch regelmässigen Empfang, aber eben immer noch nicht das erwartete und auch nicht mit den vermuteten Timings. Ich vermute, der RP6 macht eine Plausibilitätsprüfung und filtert ungültige Codes raus. Das würde allerdings bedeuten, dass meine zusammengesetzten Bitfolgen für den RC5-Code nicht stimmen. Ich muss mir wohl die msb-lsb-Geschichte nochmal genauer anschauen. Das Programm sieht nun so aus
Code:
'RC5-Code senden mit ATtiny13                                         16.12.07 mic'

'Achtung! Das ist ein eher theoretischer Code den ich noch nicht getestet habe!'
'Es sollten im 0,2 Sekundentakt die Werte 0 bis 31 als Addresse und Kommando'
'mit Togglebit=0 gesendet werden. Ob das so funktioniert muss ich noch testen'

'Die IR-LED wird mit Widerstand(!) zwischen Pin5(PB0, OC0A) und GND angeschlossen  '
'Trägerfrequenz = 36kHz(Puls/Pause 1:1), Bitlänge = Trägerfrequenz/64'
'Code basierden auf den Angaben von: http://www.sbprojects.com/knowledge/ir/rc5.htm'

'Einstellungen --------------------------------------------------------------------'

'Wir verwenden einen tiny13'
$regfile = "ATtiny13.dat"
'der mit internen 9,6MHZ getaktet wird (Fuse Takt/8 nicht gesetzt!)'
$crystal = 9600000
'Weitere, von mir noch nicht geprüfte Compileranweisungen:'
$hwstack = 32
$swstack = 8

'Hier musste ich von 16 auf 8 ändern,ich habe keine Ahnung, was das bewirkt'
'Mit 16 erhalte ich eine Fehlermeldung:'
'Out of SRAM-Space bei Dim Rc5_bit_gesetzt As Word'
$framesize = 8

'Dims und Declears ----------------------------------------------------------------'

'Der zu sendende RC5-Code als 16bit-Wert'
Dim Rc5_code As Word

'Bitmaske für das zu sendende Bit aus RC-Code'
Dim Rc5_bitmaske As Word

'Teiler des Trägertaktes und Kennung des Halbbits'
'128-65 bedeutet erstes Manchester-Halbbit, 64-1 bedeutet zweites Manchester-Halbbit'
'0 bedeutet komplettes Bit gesendet!'
Dim Rc5_halbbit As Byte

'die zu sendende RC5-Adresse (5 Bits, 0-31)'
Dim Rc5_adresse As Byte

'das zu sendende RC5-Kommando (6 Bits, 0-63)'
Dim Rc5_kommando As Byte

'größer 0 bedeutet aktuelles zu sendende Bit ist gesetzt'
Dim Rc5_bit_gesetzt As Word

'Zähler für das Demo'
Dim Count As Byte

'Hilfsvariable'
Dim Temp As Byte

'Startblinken'
Config Portb.0 = Output
Portb.0 = 1
Wait 1
Portb.0 = 0
Wait 1

'Die Sendesubroutine deklarieren'
Declare Sub Rc5_send(byval Address As Byte , Byval Command As Byte , Byval Tog As Byte)

'Initialisierung ------------------------------------------------------------------'

'Timer0 auf CTC-Mode mit OC0A-Toggeln und OCR0A löschen nach Match bei perscale=1'
Config Timer0 = Timer , Compare A = Toggle , Prescale = 1 , Clear Timer = 1

'MatchCompareRegister setzen: 133 für 36kHz oder 126 für 38kHz'
Ocr0a = 255

'ISR für Timer0 bei Compare0A-Match definieren'
On Oc0a Rc5_isr Nosave

'MatchCompare Interrupt erlauben'
Enable Oc0a

'Interrupts generell erlauben'
Enable Interrupts

'Es wird noch wird nicht gesendet'
Rc5_bitmaske = 0

'Hauptprogramm --------------------------------------------------------------'

Do
   Call Rc5_send(0 , 31 , 0)
   Waitms 200
   Call Rc5_send(1 , 15 , 0)
   Waitms 200
   Call Rc5_send(2 , 7 , 0)
   Waitms 200
   Call Rc5_send(4 , 3 , 0)
   Waitms 200
   Call Rc5_send(8 , 1 , 0)
   Waitms 200
   Call Rc5_send(16 , 0 , 0)
   Waitms 200
Loop

'Sub und ISR ---------------------------------------------------------------------'

'die eigentliche Sendefunktion'
Sub Rc5_send(address As Byte , Command As Byte , Tog As Bit)
   '14 bits RC5-Code zusammensetzen in der 16 Bit Variablen Rc5_code'
   'Bitnummer: 1111110000000000'
   '           5432109876543210'
   'Funktion:  --sstaaaaacccccc'

   '2 Startbits setzen'
   Rc5_code = &B11

   'Bitmuster nach links weiterschieben und Platz für die nächsten Bits schaffen'
   Shift Rc5_code , Left , 1

   'das Toggle-Bit setzen wenn gewünscht'
   If Tog <> 0 Then
      Set Rc5_code.0
   End If

   'address hat 5 gültige Bits'
   Shift Rc5_code , Left , 5

   'überflüssige Addressbits ausblenden'
   Address = Address And &B11111

   'und Address-Bits in Rc5_code setzen'
   Rc5_code = Rc5_code Or Address

   'command hat 6 gültige Bits'
   Shift Rc5_code , Left , 6

   'überflüssige Commandbits ausblenden'
   Command = Command And &B111111

   'und Kommando-Bits in Rc5_code setzen'
   Rc5_code = Rc5_code Or Command

   'Bitmaske auf bit13 (erstes von 14 RC5-Bits) setzen
   'Bitnummer: 1111110000000000'
   '           5432109876543210'
   'Funktion:  --sstaaaaacccccc'
   'Maske:     0010000000000000'
   Rc5_bitmaske = &B0010000000000000

   'Start der Übertragung mit dem ersten Halbbit'
   Rc5_halbbit = 64

   'Ab hier übernimmt die ISR die Kontrolle. Wir warten, bis alle Bits gesendet sind'
   Do
      nop
   Loop Until Rc5_bitmaske = 0

   'LED ausschalten'
   Config Portb.0 = Input

   'Fertig'
End Sub


'Ab hier folgt die ISR'
Rc5_isr:
   'Code aus der Basom-Hilfe on interrupt isr nosave'
   $asm
      PUSH R24 ; since we are going to use R24 we better save it
      IN r24, SREG ; get content of SREG into R24
      PUSH R24 ; we can save a register
   $end Asm

   'Wenn wir senden wollen'
   If Rc5_bitmaske > 0 Then

      'ermitteln wir den Status des aktuellen Bits'
      Rc5_bit_gesetzt = Rc5_code And Rc5_bitmaske

      'und wenn wir beim Start des ersten Halbbits sind,'
      If Rc5_halbbit = 64 Then

         'geben wir das erste Halbbit invertiert aus (Manchestercodierung?)
         If Rc5_bit_gesetzt > 0 Then
            Config Portb.0 = Input
         Else
            Config Portb.0 = Output
         End If
      'ende erstes Halbbit'
      End If

      'Beim zweiten Halbbit müssen wir nun den gewünschten Bitstatus ausgeben'
      If Rc5_halbbit = 32 Then
         If Rc5_bit_gesetzt > 0 Then
            Config Portb.0 = Output
         Else
            Config Portb.0 = Input
         End If
      'ende zweites Halbbit'
      End If


      'Bitzeit ist Trägerfrequenz/64, also wir zählen den Bittimer runter'
      Rc5_halbbit = Rc5_halbbit - 1

      'Bei RC5_halbbit = 0 ist das aktuelle Bit gesendet, wir senden nun das nächste Bit'
      If Rc5_halbbit = 0 Then

         'und laden den Bittimer mit dem Startwert für erstes Halbbit.'
         Rc5_halbbit = 64

         'Dann setzen wir die Bitmaske auf das nächste zu sendende Bit'
         Rc5_bitmaske = Rc5_bitmaske / 2

         'Rc5_bitmaske = 0 beim nächsten Aufruf der ISR bedeutet,'
         'alle Bits sind gesendet, also sind wir fertig'
      'nächstes Bit'
      End If

   'und wiederholen 14 mal'
   'Ende wenn rc5_bitmaske >0'
   End If

   $asm 'Code aus der Basom-Hilfe on interrupt isr nosave'
      POP R24 ;get content of SREG
      Out Sreg , R24 ; Save Into Sreg
      POP R24 ; get r24 back
   $end Asm
Return
und belegt so 99% des tiny13-Speichers.

Gruß

mic