-         

Seite 1 von 10 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 95

Thema: RC5 Senden mit Attiny13

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    22.11.2007
    Beiträge
    57

    RC5 Senden mit Attiny13

    Anzeige

    Hallo Erstmal,

    Bin gerade am Programmieren eines 1 Kanal RC5 Senders mit Attiny13.

    Es sind meine ersten gehversuche mit der AVR programmierung.

    Nun habe ich folgendes Problem, ich hab einfach ein RC5 Signal (wenn es eines ist) mit waitms 0,889 zwischen den halbbits gemacht.

    Weiß weder ob es richtig ist oder ob es einfacher geht, will unbedingt den attiny13 wegen dem Platz verwenden.

    Hab mit einem PC Oszilloskop die signale gemessen (Software über Line-In der Soundkarte) und ich bekomme eigentlich ganz gute Signale.

    Nur leider macht der Empfänger (IgorplugXP - Seriell) was er will.

    Nun meine Frage kann es daran liegen dass ein 38kHz Empfänger TSoP die 36kHz des Senders filtert oder hab ich einfach einen Blödsinn programmiert?

    Bitte um Antwort, auch wenn mein Problem vielleicht nur Peanuts für euch sind!

    Werde Heute mal eine Fernbedienung auseinandernehmen und die Signale mit meinem Sender vergleichen.


    Mfg
    Harry

  2. #2
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.782
    Blog-Einträge
    8
    Hallo Harry

    Ein nettes Projekt, dass spornt direkt zum Nachmachen an. Das igorplugxp-Teil sagt mir nicht viel. Soweit ich das durchschaue ist das ein kleiner IR-Empfänger am seriellen Port des PCs der die IR-Signale an die rs232-Pegel anpasst. Die gewandelten Signale werden dann mit einem Progrämmchen (z.B. grider) im PC als serieller Input interpretiert und ausgewertet? (http://www.cesko.host.sk/girderplugin.htm)

    Die 38kHz des Empfängers sollten eigentlich kein Problem sein, du kannst doch den Sender entsprechend toggeln. Und da sind wir auch schon beim eigentlichen Problem: Wie sieht denn dein Code aus? Welchen Takt verwendet der tiny? Wie ist die Sendediode geschaltet? Auf welcher Wellenlänge sendet die IR-Diode? Funktioniert es mit einer normalen RC5-Fernbedienung? Reagieren andere RC5-Empfänger auf deine selbstgemachten Signale?

    Gruß

    mic

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    22.11.2007
    Beiträge
    57
    Serwus,

    richtig, funktioniert mit Girder einwandfrei mit "normaler" RC5 Fernbedienung, sprich Fernseher udgl.


    Mein Programmcode ist sehr primitiv!

    Schalte nur das Port ein und aus mit 1,778ms/Bit.

    Auf welcher wellenlänge die IR-Diode sendet weiß ich nicht, is von einer alten Fernbedienung.

    Der Takt ist auf $crystal 9600000

    Genauen Programmcode Poste ich wenn ich zuhause bin.

    Was meinst du mit togglen???

    Mfg

    Harry

  4. #4
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.782
    Blog-Einträge
    8
    Hallo Harry

    Primitiv ist nicht unbedingt schlecht, beim kleinen tiny13 sogar eher gut. Eine IR-LED aus einer alten Fernbedienung sollte eigentlich grundsätzlich mal funktionieren.

    Mit toggeln meine ich das Ein- und Ausschalten der Trägerfrequenz die deine RC5-Signale transportiert. Wenn du einen 38kHz-TSoP verwendest, mußt du die eingeschaltete LED zusätzlich mit 38kHz takten. Der TSoP ignoriert alle anderen IR-Signale die nicht seiner Trägerfrequenz entsprechen. Das dient der Störsicherheit und ist wohl der Grund, warum deine Schaltung nicht funktioniert.

    Das Aufmodulieren der Trägerfrequenz macht man am einfachsten indem man die LED mit ihrem Vorwiderstand zwischen zwei Ports des Mikrokontrollers anschließt. Beim Senden taktest du dann z.B. mit dem Timer im CTC-Mode den OC0x-Pin(Pin 5 oder 4 =Kathode der LED) mit den 38kHz (Achtung! Taktfrequenz für den Timer sind dann 76kHz!) und gleichzeitig schaltest du den anderen Pin (Anode) im Rythmus deiner Datenbits ein und aus. Die Bitzeiten erzeugst du mit dem zweiten Timer und einer ISR die die Bitfolge rausschiebt. Das scheint mir eine optimale Anwendung für den tiny13 zu sein: "Two Independent Output Compare Units" steht im Datenblatt.

    Ob das so funktioniert habe ich auch noch nicht getestet, auch die Werte für OCRx kann ich dir nicht sagen. Ich bin noch Counter/Timer-Newbie. Beim 76kHz-Takt würde ich es mal so versuchen:

    9600kHz/76kHz=126,31.. d.h. Prescaller=1 und OCRx=126 (das sind dann knapp 0,3% Fehler, das sollte der TSoP tolerieren)

    Vielleicht könnte das noch ein Timerprofi bestätigen. Alles in Allem hört sich das sehr lecker an und scheint mir eine klasse Anwendung für meine eigenen tiny13 zu sein...

    Gruß

    mic

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    22.11.2007
    Beiträge
    57
    Hi,

    Okay, ein bisschen was hab ich verstanden, doch beim Timer hörts auf.... muß ich mich wohl noch schlauer lesen.... hab gedacht das geht ganz einfach.... wie folgt...

    $regfile = "attiny13.dat"
    $crystal = 9600000
    Config Portb = Output

    Do
    Portb.4 = 1
    Portb.3 = 1 'bit1'
    Waitms 0.889
    Portb.4 = 0
    Portb.3 = 0
    Waitms 0.889

    Portb.4 = 1
    Portb.3 = 1 'bit2'
    Waitms 0.889
    Portb.4 = 0
    Portb.3 = 0
    Waitms 0.889

    Portb.4 = 1
    Portb.3 = 1 'bit3'
    Waitms 0.889
    Portb.4 = 0
    Portb.3 = 0
    Waitms 0.889

    Portb.4 = 1
    Portb.3 = 1 'bit4'
    Waitms 0.889
    Portb.4 = 0
    Portb.3 = 0
    Waitms 0.889

    Portb.4 = 0
    Portb.3 = 0 'bit5'
    Waitms 0.889
    Portb.4 = 1
    Portb.3 = 1
    Waitms 0.889

    Portb.4 = 0
    Portb.3 = 0 'Bit6'
    Waitms 0.889
    Portb.4 = 1
    Portb.3 = 1
    Waitms 0.889

    Portb.4 = 1
    Portb.3 = 1 'Bit7'
    Waitms 0.889
    Portb.4 = 0
    Portb.3 = 0
    Waitms 0.889

    Portb.4 = 0
    Portb.3 = 0 'Bit8'
    Waitms 0.889
    Portb.4 = 1
    Portb.3 = 1
    Waitms 0.889

    Portb.4 = 1
    Portb.3 = 1 'bit9'
    Waitms 0.889
    Portb.4 = 0
    Portb.3 = 0
    Waitms 0.889

    Portb.4 = 1
    Portb.3 = 1 'bit10'
    Waitms 0.889
    Portb.4 = 0
    Portb.3 = 0
    Waitms 0.889

    Portb.4 = 1
    Portb.3 = 1 'bit11'
    Waitms 0.889
    Portb.4 = 0
    Portb.3 = 0
    Waitms 0.889

    Portb.4 = 1
    Portb.3 = 1 'bit12'
    Waitms 0.889
    Portb.4 = 0
    Portb.3 = 0
    Waitms 0.889

    Portb.4 = 0
    Portb.3 = 0 'bit13'
    Waitms 0.889
    Portb.4 = 1
    Portb.3 = 1
    Waitms 0.889

    Portb.4 = 1
    Portb.3 = 1 'bit14'
    Waitms 0.889
    Portb.4 = 0
    Portb.3 = 0
    Waitms 0.889

    Loop


    End


    Wie gesagt, sehr primitiv...... is auch mein erstes programm.... Portb.4 ist nur eine LED zum kontrollieren, ob er sendet.


    Wenn ich die IRled zwischen zwei ausgänge schalte schliesst die dann nicht kurz???


    mfg Harry

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    05.11.2006
    Ort
    bei den sieben Zwergen
    Beiträge
    14

    togglebit

    Hallo

    das togglen des sogenannten togglebit's betrift bei mehrmaligem senden des gleichen kommandos das dritte bit der sequenz , da dieses dann jedesmal den zustand gewechselt haben sollte.Es ist erforderlich da es sonst passieren kann das das empfangsgerät das wiederholte senden nicht richtig interpretiert - Bsp. lautstaerke am Fernseher .

    zum testen mal hier schauen -
    http://www.bellibot.com/projects/avr...C5SIRC.ASM.txt
    das demo sendet nur ein/aus an einen sony Fernseher wenn eine taste des AVR200 gedrückt wird (ja -bin stolzer besitzer eines solchen teiles )
    und das alles ohne timer und ohne interupt.
    RC5 und Sony SIRCS ist eigentlich fast dasselbe nur muss bei sony alles 3mal hintereinander gesendet werden.
    hf
    Bella
    ;************************************************* *********************
    ; one bit rc5 code are 1778 ySec. long, from Low to High , 889ySec. each
    ; zero bit are 1778 ySec. long, from High to Low
    ; two Startbits , one toggle bit , 5 Bit System , 6 bit Command
    ; at one = 38khz burst
    ; zero = pause (nothing
    ; time over 14 bit = 24,889 msec.
    ; time over all 113,778 msec.
    ; after command send wait 113,778 - 24,889 msec.= 88,889 msec.
    ;************************************************* **********************

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    22.11.2007
    Beiträge
    57

    Re: togglebit

    Danke für deine Anteilnahme, aber weder Assembler noch AVR200 bringt mir etwas!

    Komme gerade so mit Basic zurecht und bräuchte das ganze auf an attiny13. Also wird das ganze mit dem togglebit noch umständlicher.....


    Und ich dachte das wäre nicht so schwer....

  8. #8
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.782
    Blog-Einträge
    8
    Hallo

    Ich glaube, wir "reden" aneinander vorbei:
    Mit toggeln meine ich das Ein- und Ausschalten der Trägerfrequenz die deine RC5-Signale transportiert.
    Toggeln meint hier nicht das togglebit2 im RC5-Code.

    Toggeln bedeutet doch nur "Zustand wechseln", Zitat aus dem Datenblatt, CTC-Mode, Seite 64:
    Code:
    For generating a waveform output in CTC mode, the OC0A output can be set to toggle
    its logical level on each Compare Match by setting the Compare Output mode bits to
    toggle mode (COM0A1:0 = 1). The OC0A value will not be visible on the port pin unless
    the data direction for the pin is set to output. The waveform generated will have a maximum
    frequency of fOC0 = fclk_I/O/2 when OCR0A is set to zero (0x00). The waveform
    frequency is defined by the following equation:
    So kann die LED ausreichend schnell geschaltet werden, der Kontroller könnte es natürlich auch ohne Timer schaffen, aber dann kann er nicht mehr viel anderes erledigen. In deinem timerlosen Beispiel wird das über eine Schleife erledigt:

    Code:
    .equ	b	=15	;38kHz @  togle = 26,3ySec / 2 @ 4 MHz crystal
    	
    			; 	BitTime = 35	; 889 YSec		
    
    One_send:
    		ldi	BitTime,36	; half Bit one
    One_1:		ldi 	temp,b		; 38 KHz Burst
    		sbi	PORTD,TxD
    One_2:		dec	temp
    		brne	One_2
    		
    		ldi	temp,b
    		cbi	PORTD,TxD
    One_3:		dec	temp
    		brne	One_3
    		dec 	BitTime
    		brne	One_1
    		
    		ret
    Viele Wege führen zum Ziel. Allerdings führt dein Code (@Harry) leider nicht dahin, weil du eben nur die Bits ausgibst, aber keine Trägerfrequenz. Hier werden die 38kHz mit einem NE555 erzeugt und die Trägerfrequenz erklärt:
    http://www.the-starbearer.de/Roboter...ake/IRBake.htm

    Wenn ich die IRled zwischen zwei ausgänge schalte schliesst die dann nicht kurz?
    Die LED doch hat einen Widerstand in Reihe und schliest deshalb keine Ports kurz. Die Pins können 50mA ("Pin Driver Strength",Datenblatt s. 134)

    $crystal = 9600000
    Hast du die Fusebits auch auf 9,6MHz gesetzt? Sonst ist der tiny vermutlich zu lahm.

    Gruß

    mic

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    705
    Ab einer gewissen "Ausstattung" können die AVR-Chips einen Bascom-Befehl namens "RC5SEND" ausführen. Dieser Befehl ist sehr komfortabel, da er nicht nur die Address- und Kommandobits überträgt, sondern die 38 kHz Trägerfrequenz automatisch miterzeugt. Ich hab´s gerade mal für den Tiny13 und Tiny45 probiert - da klappt´s aber leider aufgrund fehlender Ressourcen nicht.
    Ab dem Tiny2313 funktioniert der Befehl - vielleicht macht Dich die Bascom-Hilfe zu RC5SEND ja neugierig?

    Gutes Gelingen!

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    22.11.2007
    Beiträge
    57
    Hi, Mic

    Also der link hat mich jetzt viel schlauer gemacht! Nun versteh ich auch die trägerfrequenz!

    das heißt mit meiner schleife kann ich nichts anfangen, denn ich kann die trägerfrequenz nicht einschleifen da ich das über timer machen muss.

    555 will ich mir ersparen soll ja möglichst klein sein.

    mit wieviel mA kann man den eigentlich so einen Ausgang des Tinys belasten? sind 40mA zuviel?

    Zum programm, wenn ich mit einem timer die 38kHz Trägerfrequenz mache kann ich dann nicht die bits ausgeben wie sie in meiner schleife sind oder?

    Ach, das programmieren ist so lange her..... hab das letzte mal in der schule vor rund zehn jahren programmiert und da auch nur das was der lehrer sagte, hab zwar die fachschule Elektrotechnik gemacht, aber mehr als ein Parallelport Interface und Pascal Programmierung auch nicht. Damals hab ich auch nur schleifen programmiert....

    Schleifen sind hald sooo hübsch..... vor allem Endlos....

    Die Hilfe von Bascom AVR ist ja auch nicht das gelbe vom Ei!

    Mfg

    Harry

Seite 1 von 10 123 ... LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •