PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ir-code erzeugen



super_castle
27.12.2005, 09:31
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

uwegw
27.12.2005, 10:34
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?

super_castle
27.12.2005, 11:03
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

PicNick
27.12.2005, 11:24
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.

super_castle
27.12.2005, 12:14
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

PicNick
27.12.2005, 17:32
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)

super_castle
29.12.2005, 08:00
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.



$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:


$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

PicNick
29.12.2005, 09:47
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.

super_castle
29.12.2005, 12:29
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

super_castle
29.12.2005, 12:36
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.

PicNick
29.12.2005, 13:25
Das sieht so aus, als wär es genau umgekehrt:
du macht erst toggle, dann reset


$Timer1=Timer, CompareA=Toggle
WaitUs 83
Nop 3
$Timer1=Timer, CompareA=Reset
WaitUs 83

in dem Bild wäre aber eigentlich


$Timer1=Timer, CompareA=Reset
WaitUs 83 ' 83 --> 0 333-> 1
Nop 3
$Timer1=Timer, CompareA=Toggle
WaitUs 83

??? vergiss mein gebrabbel von wegen Thread, is alles ok.