mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik RC5 - Umsetzung


Autor: Rüdiger Knörig (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich versuche gerade einen Tiny15 als fernbedienbaren Dimmer zu
programmieren. Die Idee war die folgende: ich lasse den Prozessor im
Schlafmodus, aus dem er durch den INT0-Interrupt geweckt wird. Dieser
wird durch die fallende Flanke des Ausgangssignals des TSOP 1736
ausgelöst. Nun messe ich die Zeit für eine halbe Bitdauer, indem ich in
einer 10-Takt-Schleife so lange ein Register hochzähle bis INT0 wieder
auf "1" geht (Ende Startbit 1). Die Zeit wird 1.5mal genommen und nun
warte ich auf die nächste fallende Flanke. Ab hier lese ich die
folgenden 12 Bit in einer Schleife aus: ich warte die Zeit für 3/4 Tbit
ab, frage den INT0-Eingang ab und kriege so mein nächstes Bit. Habe ich
6 Bits zusammen kopiere ich das Empfangsregister in das Adreßregister
und lösche das Empfangsregister zur Aufnahme der nächsten 6 Bits
(Kommando). Danach warte ich noch bis zum nächsten Flankenwechsel
(Mitte des Bitintervalls) bevor ich die Empfangsschleife wieder
durchlaufe.

Nun meine Frage: Hab ich da was übersehen? Irgendwie funktioniert es
doch nicht ganz so richtig....
Kann ich überhaupt bei den heutigen Fernbedienungen noch mit 2
Startbits rechnen? Oder ist das zweite Startbit gängigerweise ein
Adreßbit (was aber für eine TV-Fernbedienung immer "1" sein
müßte...).

RESET:  ldi  tmp,cal
  out  osccal,tmp  ; write calibration byte
  sbi  DDRB, led  ; set led pin as output
  sbi  DDRB, 0
  sbi  PORTB,int0pin  ; activate pull-up
  sbi  PORTB,led  ; LED is low-active
  ldi  tmp,0b01000000  ; GIMSK : activate INT0PIN
  out  GIMSK,tmp
  ldi  tmp,0b00100000  ; enable sleep mode, falling flank triggers 
INT0PIN
interrupt
  out  MCUCR,tmp
  sei      ; enable interrupts

main:  sleep
  rjmp  main  ; (2T)



receive:  cli    ; (1T) disable interrupts
    eor  Ts,Ts  ; (1T) clear Ts (2 + 8 clocks delay)
measure:  inc  Ts  ; (1T)
    cpi  Ts,192  ; (1T)
    breq  r_abort  ; (1T)
    nop
    nop
    nop
    nop
    sbis  PINB,int0pin ; (1T) skip jump if int0pin has changed to one
    rjmp  measure  ; (2T)  10 clocks / loop

    inc  Ts  ; compensate 10 clock delay from the beginning
    ;cpi  Ts,30  ; Ts too low?
    ;brlo  r_abort
    mov  tmp,Ts
    lsr  tmp  ; tmp=Tbit/4
    add  Ts,tmp  ; Ts=3/4*Tbit

    ldi  bitcount,0
    eor  rbuf,rbuf


wait_s2:  sbic  PINB,int0pin ; wait for falling edge in the middle of S2
    rjmp  wait_s2


rcvloop:  ldi  counter,0
wait_thrqtr:  inc  counter  ; (1T)
    nop
    nop
    nop
    nop
    nop
    nop
    cp  counter,Ts ; (1T)
    brne  wait_thrqtr ; (2T)
    in  tmp,PINB ; sample signal
    lsl  rbuf  ; next bit
    sbrc  tmp,int0pin ; if input was "0", don't write a one bit
    inc  rbuf
    inc  bitcount
    cpi  bitcount,6 ; address & toggle bit completed
    brne  data_check
    mov  address,rbuf
    eor  rbuf,rbuf
data_check:  cpi  bitcount,12
    brne  wait_middle
    mov  command,rbuf
    rcall  rc5handler
    sei
    reti
wait_middle:  sbrc  tmp,int0pin ; if bit was set, we wait for a zero
    rjmp  wait_zero ; jump to wait_zero if bit was "1"
wait_one:  sbis  PINB,int0pin
    rjmp  wait_one
    rjmp  rcvloop
wait_zero:  sbic  PINB,int0pin
    rjmp  wait_zero
    rjmp  rcvloop

r_abort:  sei
    reti

rc5handler:  mov  tmp,address
    andi  tmp,0b00011111 ; extract address
    cpi  tmp,TV0

    rjmp  standby

    brne  rc5h_end
    rjmp  standby
    cpi  command,01 ; standby command?
    breq  standby
rc5h_end:  ret

standby:  sbrs  address,5
    rjmp  switch_off
    cbi  PORTB,led
    ;cpi  command,0
    ;brne  switch_off
    ;cbi  PORTB,led
    ret
switch_off:  sbi  PORTB,led
    ret

Autor: Peter Schwarz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was meinst Du mit 'heutigen Fernbedienungen' ?

Sendet Deine Fernbedienung überhaupt RC5 ?

Autor: Rüdiger Knörig (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gute Frage - hab aber 3 Stück zum testen hier (Panasonic, Schneider,
Sharp) - eine von denen sollte ja mal RC5 senden!

Autor: Markus K. (markus-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe 5 Fernbedienungen, von denen keine einzige RC5 spricht.
Panasonic und Sharp sprechen kein RC5 und mein 15 Jahre alter Schneider
Fernseher auch nicht.

Markus

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.