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?
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
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?
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
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.
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
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.
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.
Beispiel für RC5 funktioniert: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
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
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.
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
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.
Lesezeichen