-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: ir-code erzeugen

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    11.11.2005
    Beiträge
    321

    ir-code erzeugen

    Anzeige

    Hallo, wer kann mir das mal interpretieren:

    Public Const StartBit as single = 0.006664 'Time it takes for the start bit to start a command

    Public Const LowBit as single = 0.000833 'Time it takes for the low bit = 0
    Public Const HighBit as single = 0.003332 'Time it takes for the highbit = 1

    Public Const ClockBit as single = 0.000833 'Clock bit time ' second # in the 1binary bit code = 0

    Damit soll ein 8Bit-Code an der Ir-Diode erzeugt werden.

    Castle

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    31
    Beiträge
    4.255
    da wird erstmal noch kein code erzeugt. es wird nur definiert, wie lange die einzelnen Impulse bzw die Pausen dazwischen dauern sollen... wo ist der rest vom Programm?

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    11.11.2005
    Beiträge
    321
    Hier ist das weitere zur Erzeugung der Ir-Signale. Ich möchte diese mit einem AVR erzeugen, ohne Interrupt mit Bascom.

    The IR Carrier is 39.2kHz. Data is modulated using a space coded signal with 8 data bits (data clock is 1200Hz,
    but actual data rate varies depending on the data).

    -- 1/1200s is 0.000833333s or 833us or 8 x 100us
    -- 4/1200s is 0.003333333s or 3333us or 33 x 100us
    -- 8/1200s is 0.006666666s or 6666us or 66 x 100us

    -- Timing based on 1/1200 second clock (~.833ms)
    -- Signal is normally high (idle, no IR).
    -- Start: signal goes low for 8/1200 sec.
    -- Data bits: for each of 8 data bits, space encoded signal depending on bit value
    -- Sends the most significant data bit first
    -- If the data bit is 0: signal goes high for 1/1200 sec, and low for 1/1200 sec.
    -- If the data bit is 1: signal goes high for 4/1200 sec, and low for 1/1200 sec.
    -- BTW: The first bit (msb) is always 1 (valid codes are from $80 to $FF)
    -- When completed, signal goes high again.


    Beispielkommandos für den Robby:

    81 (129) - Right Arm Up
    84 (132) - Right Arm Down
    85 (133) - Right Arm In
    82 (130) - Right Arm Out
    83 (131) - Tilt Body Right

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Wenn du das programmieren willst, mußt du dir das alles auf Maschinencycles umrechnen. Am besten auf 1/1200 Einheiten, der Rest halt Vielfache davon. D.h. das kannst du für einen Timer verwenden oder eben durch Wait-Schleifen mit abgezählten cycles.
    Hängt also offensichtlich vom Quartz ab.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    11.11.2005
    Beiträge
    321
    Ich habe einen AVR16 mit 8mhz.
    Ich finde den Ansatz nicht nicht für die Waitschleifen um die obengenannten Vorgaben zu realisieren.

    "Public Const ClockBit as single = 0.000833 'Clock bit time ' second # in the 1binary bit code = 0"

    Heisst das, das beim Bit=0 die Zeit "low for 1/1200 sec" als 39,2khz Schwingung übertragen wird.

    Kannst du mir mal helfen mit den "Waitschleifen mit abgezählten cyles".

    Castle

  6. #6
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Schau, bei 8 MHZ dauert
    ein Maschinencycle 0,000125 mS
    der Takt f. 78,4 kHz 0,012755 mS (gibt 39,2 kHz Rechteck)
    die 1/1200 sind 0,833333 mS

    Für die IR Frequenz. von 39,2 kHz brauchst du also 102,04 Masch.cyclen
    Und wenn du 65,33 mal die IR-Frequenz erzeugt hast, bist du bei 1/1200

    An den Dezimalstellen sieht du, daß sich das nicht genau ausgeht. Ein paar Prozent fehler sind da leider dabei.

    In reinem Bascom könnte das schwierig werden, inline assembler wär gut. (Das gilt aber auch für C oder sonstwas)
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    11.11.2005
    Beiträge
    321
    Es läuft nicht, was ist falsch am Code für den Robosapien. Habe ihn gemäss oberer Timingbeschreibung erstellt. Ir-Diode funktioniert, wird durch Cmoscam angezeigt. Ein Programm ähnlichem Aufbaues für den RC5-Code funktioniert (siehe unten).
    Ps: Waitus=1 sind im Programmablauf 10us, weil durch den internen Schleifenurchlauf ca 6 us verbraucht werden, wird er auf 10us festgesetzt.

    Code:
    $Device= m16			
    $Stack = 32                
    $Clock = 8					
    $Timer1=Timer, Prescale=1, CompareA=Toggle, Clear
    
    Dim command As Byte
    Dim i As Byte
    
    Declare Sub RCout() 
    
    Const Delay83=83	
    Const Delay333=333	
    Const Delay666=666	
    
    DDRD.5=1	
    	
    Compare1A=102
    Start Timer1
    $Timer1=Timer, CompareA=Reset
    
    command=132	
    	
    Do
    	Wait 1
    	RCout()        
    Loop
    
    Sub RCout()
    
    $Timer1=Timer, CompareA=Toggle
    WaitUs 666
    Nop 6
    $Timer1=Timer, CompareA=Reset
    
    For i=0 To 7
    	If command.7 =0 Then
    		$Timer1=Timer, CompareA=Toggle	
    		WaitUs 83
    		Nop 3
    		$Timer1=Timer, CompareA=Reset
    		WaitUs 83
    	Else
    	    $Timer1=Timer, CompareA=Toggle
    		WaitUs 333
    		Nop 3
    		$Timer1=Timer, CompareA=Reset
    		WaitUs 83	
    	End If
    	Shift(Left,1,command)
    Next
    $Timer1=Timer, CompareA=Reset
    End Sub
    Beispiel für RC5 funktioniert:
    Code:
    $Device= m16			
    $Stack = 32                
    $Clock = 8					
    $Timer1=Timer, Prescale=1, CompareA=Toggle, Clear
    
    Dim ToggleBit As Bit
    Dim Adr As Byte, Command As Byte
    
    Declare Sub RC5out(adr As Byte, command As Byte) 
    Declare Sub BitLow()
    Declare Sub BitHigh()
    
    Const Delay=89	
    
    Set DDRD.5 		
    Compare1A=101	
    Start Timer1
    
    Adr=0			
    Command=5	
    	
    Do
    	RC5out(Adr,Command)        
    	WaitMs 90
    Loop
    
    Sub RC5out(adr As Byte, command As Byte)
    
    Local i As Byte
    
    BitHigh()
    BitHigh()    
    If ToggleBit Then
    	BitHigh()
    Else
    	BitLow()
    End If
    For i=0 To 4
    	If adr.4 Then
    		BitHigh()
    	Else
    		BitLow()
    	End If
    	Shift(Left,1,adr)
    Next
    For i=0 To 5
    	If command.5 Then
    		BitHigh()
    	Else
    		BitLow()
    	End If
    	Shift(Left,1,command)
    Next
    $Timer1=Timer, CompareA=Reset
    End Sub
    
    Sub BitLow()					
    $Timer1=Timer, CompareA=Toggle		
    WaitUs Delay
    $Timer1=Timer, CompareA=Reset
    WaitUs Delay
    End Sub
    
    Sub BitHigh()					
    WaitUs Delay
    $Timer1=Timer, CompareA=Toggle
    WaitUs Delay
    $Timer1=Timer, CompareA=Reset
    End Sub

  8. #8
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Du, bevor ich dir jetzt irgendeinen Schwachsinn erzähle, schau ich mir das zu Haus mit dem oszi erstmal an, was da wann und wo getoggelt wird.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    11.11.2005
    Beiträge
    321
    Also der untere RC5-Code geht ja. Ich kann alle Zahlen damit bringen. Muss mit den Toggeln hinhauen (Oszi habe ich nicht).
    Dann erzähl ruhig mal deinen "Schwachsinn" was du da evtl nicht richtig findest.

    Castle

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    11.11.2005
    Beiträge
    321
    Noch mal ein Bild der Signalform und die Daten:

    The IR Carrier is 39.2kHz. Data is modulated using a space coded signal with 8 data bits (data clock is 1200Hz,
    but actual data rate varies depending on the data).

    -- Timing based on 1/1200 second clock (~.833ms)
    -- Signal is normally high (idle, no IR).
    -- Start: signal goes low for 8/1200 sec.
    -- Data bits: for each of 8 data bits, space encoded signal depending on bit value
    -- Sends the most significant data bit first
    -- If the data bit is 0: signal goes high for 1/1200 sec, and low for 1/1200 sec.
    -- If the data bit is 1: signal goes high for 4/1200 sec, and low for 1/1200 sec.
    -- BTW: The first bit (msb) is always 1 (valid codes are from $80 to $FF)
    -- When completed, signal goes high again.
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken stop.jpg  

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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