Hallo Mic.

Bin über meine eigene Euphorie gestolpert.
Hatte die Wiederholzeit (100ms) auf 50ms reduziert.
Da hat sich mein Empfänger wohl etwas täuschen lassen.
80ms sind aber wieder ok.
Hier mein letzter aktueller Code:

Code:
'RC5-Code senden mit ATtiny13 100% Funktion mit endloser Wiederholung  18.12.07 mic'

'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'

'Die Stellen, an denen man den zu sendenden Code und die Wiederholgeschwindigkeit'
'ändern kann, sind mit +++++++++++++++++++++++++++++++++++++++++++++++++ markiert'
'
'Code von mir ( Pizzakurier ) https://www.roboternetz.de/phpBB2/vi...36253&start=66 geändert.
'Nun können mit 3 Tastern (max.4) verschiedene IR Codes gesendet werden.
'Wenn er fertig gesendet hat, geht der µC schlafen und brauch nur noch weniger als ein µA...
'Batterie ( 2x 1,5V Micro ) hält damit ewig :-))
'Danke an das tolle Forum und vor allem "radbruch" und "x1cr" für die Idee und Code.
'
'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
$framesize = 16
Config Pinb.0 = Input                                       'ocr0a (IR-LED)
Config Pinb.1 = Input                                       'Taste grün
Config Pinb.2 = Input                                       'Taste rot
Config Pinb.3 = Input                                       'n/c
Config Pinb.4 = Input                                       'Taste blau
Portb = &B00011110                                          'Pullup-Widerstände für Pb.1-4 aktivieren

Mcucr = &B00110000                                          'Sleepmodus : 00110000 = Powerdown !
Pcmsk = &B00011110                                          'Maske, welche Pins einen pcint auslösen dürfen (Pinb.1-4)
Gimsk = &B00100000                                          'GIMSK Bit5 = PinChangeInterrupt eingeschaltet

'Dims --------------------------------------------------------------------------'
'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'
'0-63 bedeutet erstes Manchester-Halbbit, 64-127 bedeutet zweites Manchester-Halbbit'
Dim Rc5_halbbit As Byte
'größer 0 bedeutet aktuelles zu sendende Bit ist gesetzt'
Dim Rc5_bit_gesetzt As Word
'Sendeflag'
Dim Senden_aktiv As Byte

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

'Startwerte setzen, es findet noch keine Übertragung statt'
Senden_aktiv = 0

'Timer0 auf CTC-Mode mit OC0APin-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 = 133

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

'MatchCompare Interrupt erlauben'
Enable Oc0a

'Interrupts generell erlauben'
Enable Interrupts

'Hauptprogramm -----------------------------------------------------------------'
   '++++++++++++++++++++++++++++++++++++++++++++++++++++++++'
   '14 bits RC5-Code zusammensetzen in der 16 Bit Variablen Rc5_code'
   'und Bitmaske auf bit13 (erstes von 14 RC5-Bits) setzen
   'Bitnummer: 1111110000000000'
   '           5432109876543210'
   'Funktion:  --sstaaaaacccccc'
   'Maske:     0010000000000000'

   '++++++++++++++++++++++++++++++++++++++++++++++++++++++++'
   'Hier kann man den gewünschten Code eintragen'

   'Rc5_code = &B0011010010000001
    Rc5_code = &B0011000000000000

   'Testcode: 2 Start, kein Toggle, Adresse 0, Kommando 0'
   '++++++++++++++++++++++++++++++++++++++++++++++++++++++++'

Label:

If Pinb.1 = 1 And Pinb.2 = 1 And Pinb.3 = 1 And Pinb.4 = 1 Then       'wenn keine Taste gedrückt...
Enable Pcint0                                               'PcInt einschalten
'gute Nacht :-))
!sleep
Disable Pcint0                                              'PcInt ausschalten
End If

 If Pinb.1 = 0 Then                                         'Taste grün
 Rc5_code = &B0011010010000001
 End If
 If Pinb.2 = 0 Then                                         'Taste rot
 Rc5_code = &B0011010010000000
 End If
 If Pinb.4 = 0 Then                                         'Taste blau
 Rc5_code = &B0011010010000010
 End If


  'Bitmaske auf erstes von 14 zu sendende Bits setzen'                            '
   Rc5_bitmaske = &B0010000000000000

   'Start ist erstes Halbbit'
   Rc5_halbbit = 0

   'Ab hier übernimmt die ISR die Kontrolle. Wir warten, bis alle Bits gesendet sind'
   Senden_aktiv = 1

   Do
       nop
   Loop Until Senden_aktiv = 0

   '+++++++++++++++++++++++++++++++++++++++++'
   'Kurz warten vor der nächsten Übertragung'

Config Portb.0 = Output
Portb.0 = 1
Waitms 40
Config Portb.0 = Input
Portb.0 = 0
Waitms 80

    'Das ist dann die Wiederholgeschwindikeit'
   '+++++++++++++++++++++++++++++++++++++++++'

   'endlos wiederholen'
   Goto Label

'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 Senden_aktiv = 1 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 = 0 Then

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

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

      'Bitzeit ist Trägertakt/128 , also wir zählen den Bittimer hoch'
      Incr Rc5_halbbit

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

         'Wir setzen die Bitmaske auf das nächste zu sendende Bit'
         Shift Rc5_bitmaske , Right , 1

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

         'Ist das letzte Bit gesendet?'
         If Rc5_bitmaske = 0 Then

            'Dann sind wir fertig. Dies erkennt dann das Hauptprogramm'
            Senden_aktiv = 0

         'Ende Sendeflag'
         End If

      'weitersenden bis alle Bits ausgegeben sind'
      End If

   'und wiederholen bis rc5_bitmaske = 0'
   End If

   'Code aus der Basom-Hilfe on interrupt isr nosave'
   $asm
      POP R24 ;get content of SREG
      Out Sreg , R24 ; Save Into Sreg
      POP R24 ; get r24 back
   $end Asm

Return

End                                                         'end program
Das Prellen dürfte nicht stören, denn wenn der code erst mal gesetzt ist, ändert sich dieser nicht mehr beim prellen.
Erst mit anderer Taste wird der code neu "gesetzt".


Gruß Bernhard