PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : kleines Problem bei IR abfrage



Lenox
11.02.2007, 20:44
Abend zusammen!
Ich versuche gerade mein Lauflicht per IR zu steuern,
aber nicht über RC5 sondern einfach nur an/aus.

Leider bekomm ich die Invertierung nicht hin.
Das Lauflicht soll nur "laufen" wenn ich am Anfang sende, aber wenn ich sende, läuft es gerade nicht!

Manchmal geht es dann aber auch erst garnicht!



$regfile = "m16def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 9600

Waitms 50 'Einschwingzeit

Config Porta = Output 'M1
Config Portc = Output 'M2
Config Pind.3 = Input 'TSOP
Portd.3 = 1 'Pullup

Porta.4 = 1 'Enable1 active = low
Portc.4 = 1
Enable1 Alias Porta.4
Enable2 Alias Portc.4

Dim I As Byte
Dim Time As Integer
Time = 100

Print "Start"
Do

If Pind.3 = 1 Then

For I = 0 To 15
Porta = I
Enable1 = 0
Waitms Time
Enable1 = 1
Next I

For I = 0 To 11
Portc = I
Enable2 = 0
Waitms Time
Enable2 = 1
Next I

End If

Loop


Mit den Oskar mess ich nur an/aus, also kann ich den TSOP doch eig. wie einen normalen Schalter abfragen!

linux_80
11.02.2007, 21:00
Hallo,

das Signal vom TSOP ist high (1) wenn er nichts empfängt !
Wenn was kommt wird es auf low (0) gezogen.

Du musst die If-Abfrage also auf 0 abfragen damit die Logic vom TSOP her passt.

Lenox
11.02.2007, 21:13
ja genau, das hab ich auch herausgefunden.
Aber wenn ich die IF Abfrage in der Schleife auf 0 setzte, dann läuft er auch Pausenlos.

Ich verseh das auch nicht.
Wenn ich jetzt (IF ist auf 0) VCC mit der Signalleitung direkt überbrücke, geht das Lauflicht aber aus.

Alsu muss die IF Abfrage noch irgentwie falsch sein, und das Signal vom TSOP ein bisschen lückenhaft o.ä. (musste ja überbrücken).

veit
11.02.2007, 22:23
nur so nebenbei: der tsop reagiert so hin- und wieder auch auf umgebungslicht, monitore, lampen usw.

hatte mir mal nen ganz simplen fernbedienungstester gebastelt und da flackert meine led immer wieder mal ein wenig ...

linux_80
11.02.2007, 23:11
Besonders Neonröhren und auch Sparlampen erzeugen IR.
Wenn ich zB. den Empfänger vom Asuro, der am PC ist, unter die Neonröhre halte kommen andauernd irgendwelche Zufallszeichen an.

Evtl. sollte bei so einfacher Erkennung eine bestimmte Zeit gewartet werden bis das Signal ausgewertet wird.
Oder Du nimmst doch RC5, es muss ja kein bestimmter Code sein, geht ja nur um die Erkennung, zB. einfach getrc5(), dann wird gewartet bis ein RC5 kommt, wenn ein ungültiger Code ankommt, kann man das abfragen.

Lenox
12.02.2007, 09:31
Das Problem ist, dass der Sender kein senden RC5 kann, glaub ich jedenfalls.
Ist ein Sender von irgendeiner Alarmanlage.

Ist auch ein IC drauf, vllt modulliert er auch irgentwas, aber kein RC5 (schon getestet).

Wenn ich den TSOP an mein Oska anschließe sehe ich aber keine Störungen. Er funktioniert so wie linux_80 es oben erwähnt hat.

Die Signalleitung liegt an Pind.3 (Int)

Seit ihr sicher das der Code oben (mit geänderter IF Abfrage) so richtig ist?
Eig. ist es ja nur invertiert!

Lenox
12.02.2007, 14:13
Heute in Englisch viel mir ein das man doch garkein Pullup braucht!
Direkt getestet, und es funktioniert!

Aber ich habe sehr große Störungen mit Fremdlicht!
Also muss ich doch mit RC5 arbeiten.
Ich würde allerdings gerne den aktuellen Sender benutzen, und habe ihn deshalb mal auseinander gebaut.
http://dastefan.da.funpic.de/AVR/DSCN1872.JPG
http://dastefan.da.funpic.de/AVR/DSCN1875.JPG

Sorry ging grad nicht kleiner!
Es handelt sich dabei um einen SN74HC04N.

Oder sollte ich lieber selber ein Sender bauen?
Hab noch nen Tiny13 hier rumliegen.

linux_80
12.02.2007, 18:10
Wenn Du schon ein Oskar da hast, mess doch mal an der LED vom Sender was da raus kommt,
ich denke nicht das der nur einfach leuchtet, wäre ja nicht so optimal für eine Alarmanlage ;-)
Evtl. kann man da was erkennen, das Du dann beim Empfänger so nachbaust, damit auch nur der eine Sender beim Empfänger gültig ist.

Du meinst einen Pullup in der Signalleitung vom TSOP, den braucht man nicht extra, den hat der TSOP schon eingebaut.

Lenox
12.02.2007, 18:55
So hier:
http://dastefan.da.funpic.de/AVR/DSCN1878.JPG

bei 30 µs/cm 0,3V/cm

Sieht sehr systemmatisch aus, aber was ist das für eine Signalart?
Bzw wie kann ich die mit dem AVR erkennen?

linux_80
12.02.2007, 20:18
Das ist einfach nur ein/aus, sollte schon ein Rechtecksignal werden.

Stell mal die Zeit etwas höher ein, damit das Signal etwas zusammengedrückt wird,
soweit, das man grad noch erkennen kann, das es Flanken sind, evtl. sieht man dann das zwischendurch mal ein paar Flanken abgehen.

Mit diesem Bild kann man höchstens die Frequenz ausrechnen, was etwa 36kHz sein dürften,
nur einen Code rauslesen kann man mit 5 Flanken noch nicht.

Lenox
12.02.2007, 20:37
Achso danke.
Es ist ein reines Rechecksignal.
Also nur an/aus, oder?

Wie kann ich jetzt weiter vorgehen?
Oder soll ich direkt nen AVR einsetzen?

linux_80
12.02.2007, 22:46
Wie kann ich jetzt weiter vorgehen?
Oder soll ich direkt nen AVR einsetzen?

Hab ich doch oben mit dazugeschrieben wie ich meine weiterforschen zu können !

Du kannst auch evtl. eine alte Fernbedienung ausschlachten, ist nur das IC, die Diode und ein Schalter nötig.

Lenox
13.02.2007, 17:51
Ja ich hab jetzt die Schaltung mit dem Atiny13 aufgebaut, und die IR Diode über ein Transistor angeschlossen, funktioniert auch wunderbar.
Jetzt geht es um den Code.

Erstmal die Fakten:
->Der Emfänger ist ein TSOP1136 an einem 16Mhz Atmega16.
->Der Sender ist ein IR Diode an einem 9,4Mhz Atiny13.
->Der Emfänger funktioniert mit einer Universalfernsteuerung.

Also fehlt nurnoch der Sender!
Gesendet wird über den Befehlt RC5Send, und über einen Timer.
Wie IR aufgebaut ist weiß ich, aber wie ich das jetzt mit dem Timer realisieren kann nicht.

Ich hab schonmal mit den Code angefangen:


$regfile = "ATtiny13.dat"
$hwstack = 32
$swstack = 8
$framesize = 16
$crystal = 960000

Config Rc5 = Pinb.4

Dim Togbit As Byte , Command As Byte , Address As Byte




Command = 12 ' power on off

Togbit = 0 ' make it 0 or 32 to set the toggle bit

Address = 0

Do
Rc5send Togbit , Address , Command
Waitms 500
Loop

End


Ich hab natürlich gegoogelt, aber kaum was gefunden, wenn nur sehr komplexe Sender.

linux_80
13.02.2007, 19:29
RC5 ist im Wiki erklärt, auch die Zeiten: https://www.roboternetz.de/wissen/index.php/RC5-Code

Funktioniert das obere Beispiel von Dir so, bzw. lässt es sich überhaupt compilieren ?
In der Hilfe steht, das für RC5send Timer1 (OC1A) verwendet wird, diesen hat der Tiny13 aber garnicht !

Oder was wolltest Du jetzt genau wissen :-k

Du musst/willst somit die Senderoutine selberbauen !?
Der Timer wird verwendet um die 36kHz zu erzeugen, die Software muss dafür sorgen, das die Bitlänge stimmt.
Mit dem 8Bit-Timer0 sollte das aber auch noch zu schaffen sein.

Lenox
13.02.2007, 20:12
Ich weiß wie RC5 funktioniert.
Ich weiß trotzdem nicht wie ich das mit nem "8Bit-Timer0" schaffen kann.

PS: Nein ich konnte es deshalb auch nicht complilieren.
Hab grad noch das hier gefunden, sicher, dass das mit dem Timer0 doch geht?
http://www.e-lab.de/phpBB2/viewtopic.php?t=557&sid=a5772f561cd1022458c85f23b8d9d94c

izaseba
13.02.2007, 20:31
QLenox,
Hier (http://www.sprut.de/electronic/ir/rc5.htm) nochmal der RC5 Signalaufbau,
wo ist jetzt das Problem, einen Timer so einzustellen, daß er Dir eine Bitfolge nach diesem Schema Sendet ?

Das ist mit dem kleinsten Tiny zu machen und zwar mit einem 8 Bit Timer, wenn Dir die Seite von Sprut anschaust,
wirst Du feststellen, daß alles auf 36 kHz aufbaut...
Gruß Sebastian

Lenox
13.02.2007, 20:42
@izaseba
Der Link steht schon oben, dass verstehe ich ja auch!!
Aber nicht wie ich in Bascom die bitreihenfolge in 36Khz gesendet bekomme!
Ich find einfach kein Beispielcode!

izaseba
13.02.2007, 20:49
Tja, dann würde ich dieses Bascom denken abschalten und etwas nachdenken...
Du brauchst 36 kHz Grundtakt, es sind etwa 27 µS ein Bit bei RC5 besteht aus zwei Signalen je 889µS das macht 32 * 2 36 kHz Takte,
ein Code hat 14 Bits...
jetzt mußt Du nur noch mit einem Timerinterrupt etwas rechnen und schon hast Du Deinen RC5 Signal...

Gruß Sebastian

Lenox
13.02.2007, 21:10
Oky, ich versuch mal meinen Denkansatz zu erläutern.
Sagen wir mal ich möchte folgendes Senden:

111 00000 000001

Wäre ja theoretisch

889µs -> low
889µs->high
889µs -> low
889µs->high
889µs -> low
889µs->high

889µs->high
889µs -> low

usw.. halt wie im Bild beschrieben.

Allerdings jetzt das natürlich nicht mit Waitms oder so, sondern über einen Timer.

Also müssen wir gucken das der Timer immer bei ca. 889µs überläuft, und in ein Subroutine läuft, die die "Bithälfte" dann sendet.

Richtig soweit?

Jetzt muss nurnoch der Timer richtig konfiguriert werden.
Config Timer0 = Timer , Prescale = 256
-> ergibt bei 9,6 Mhz 37,5 Khz

Weiter komme ich irgentwie nicht.
Irgentwie verdreh ich da was, sorry.

linux_80
13.02.2007, 21:10
Mit dem Bascom Befehl geht es nicht mehr, denn dieser nimmt nur den Timer1, bzw. einen 16Bit Timer, den ein Tiny13 nicht hat.

Also den Timer0 anwerfen und selber bauen,
um aus 9,6MHz 36kHz zu machen, muss der Takt durch 9.600.000Hz/36.000Hz = 266 geteilt werden,
266 ist etwas zu gross für 8 Bit, also muss ein Vorteiler dazwischen, der kleinste ist 8.
9.600.000/8 = 1.200.000Hz
daraus 36kHz sind 1.200.000Hz/36.000Hz = 33

Würde sagen den Timer mit Prescaler8 bis 33 zählen lassen, dann die IR-LED umschalten, entweder per CTC automatisch,
oder eine ISR bauen, dann wird das evtl. langsamer,
denn es muss auch noch das Bit herausgesucht und auf 0 oder 1 geprüft werden, weiss nicht ob man mit Bascom das so schnell hinbekommt, das die Bit-Zeiten noch passen :-k

PS:
hoffe das ich noch richtig gerechnet habe ;-)

Lenox
13.02.2007, 21:19
Juhu, lag ja noch nichtmal soo falsch :cheesy:
Da ich mich nochnicht soo lang mit AVRs beschäftige ist das alles nicht ganz einfach für mich.

Alsu muss ich jetzt erstma gucken wie ich das mit dem Vorteiler in Bascom mache, und dann gucken was CTC ist.
Das Togglebit muss ich ja auch jedesmal noch ändern.
Man man ist garnicht so einfach.

Ein Codebeispiel wäre echt sehr hilfreich, dürften ja eig. nur ein paar Zeilen sein.
Aber ich such trotzdem mal weiter!

linux_80
13.02.2007, 21:27
Der Blink-test:

$regfile = ""
$crystal = 9600000
Config Timer0 = Timer, Prescale = 8

Led3 Alias Portc.2

Config Led3 = Output

On Timer0 Timer_irq

Const Timervorgabe = 256-33 ' ;-)

Enable Timer0
Enable Interrupts

'Hier ist die Programmhauptschleife
Do
'Hier könnte Ihr Hauptprogramm stehen
Loop

Timer_irq:
Timer0 = Timervorgabe
Toggle Led3
Return
Habe das jetzt nur schnell zusammenkopiert (ungetestet), oben nur noch die richtige .DAT-Datei einbauen, und den richtigen AusgangsPort angeben, dann sollte das mit dem 36kHz Blinken funktionieren.

Edit:
Timerwert Stimmte ja garnicht, ist aber jetzt ausgebessert ;-)

Lenox
13.02.2007, 21:48
Das haste bestimmt getestet gibts zu ;)
Funktioniert, die LED geht ganz schnell an und aus, danke!

Jetzt muss ich in der Sub immer die Bits ausgeben (mit ner If abfrage und einer Laufvariablen, damit ich nicht immer das gleiche ausgebe).

Ich geh jetzt erstmal schalfen, bin total müde, ich setzt mich morgen mal dran!
Hab noch son eine Frage zum Timer. Return setzt den µC ja immer wieder an die letzt bearbeitete Stelle im Hauptprogramm zurück, aber kann ich diese Stelle auch irgentwie vorgeben?
Das ich ihn z.b. vor eine IF abfrage stelle (wegen meinen verschiedenen Programmen beim Lauflicht).
Ich wollte den IR Emfang per Interrupt lösen (wenn er RC5 identifiziert), aber er soll dann halt direkt das akt. Programm beenden, und nicht noch erst bis es einmal durch ist.

Naja ich hoffe ihr versteht was ich auszudrücken versuche.

Dankeschön ;)

linux_80
13.02.2007, 22:14
Hab das nicht probiert, ehrlich [-X :-)

kannst Du das mal probieren, dann geht das geblinke automatisch, da ich keinen T13 da hab, und es sich für den Mega8 so nicht kompilieren lässt, kann ich das auch nicht testen :-)

Die LED muss dann aber an PortB0 sein, da das er OC0A Ausgang ist !


$regfile = "Attiny13.dat" ' the used chip
$crystal = 9600000

Config Portb.0 = Output

Config Timer0 = Pwm , Prescaler = 8 , Compare A = Toggle , Clear Timer = 1

Ocr0a = 33

Do

Loop

End

Wenn das klappt, muss man nur noch mit Start/Stop Timer0 den Timer ein-/ausschalten, je nachdem ob man High oder Low ausgeben will.

Evtl. noch mit Deinem Oszi messen ob es auch 36kHz sind, also der Abstand der Flanken ca. 28µs hat, so wie letztens in deinem Bild oben.

PS:
kannst Du deine grossen Bilder oben entfernen, und evtl. nur den Link dahin angeben, das verzieht sonst das schöne RN-Layout !

izaseba
13.02.2007, 22:33
Hallo, schön, das es klappt, vielleicht ein Tip von mir,anstatt den Timer ein und auszuschalten, würde ich die Katode der Diode an einem Freiem Pin hängen und in der Interruptroutine ein und ausschalten(natürlich nicht bei jeden Überlauf, sonderen nach jedem 32) je nachdem ob die LED High oder LOW sein muß, ich hoffe Ihr versteht was ich meine...

Gruß Sebastian

linux_80
13.02.2007, 23:27
Beim ASURO ist es auch so gemacht mit der IR LED, zwischen TxD und OC2.

Wenn er die Leistung der LED ausnutzen will, muss er aber noch etwas an elektronic dazu bauen.



Kann er aber machen wie ein Dachdecker, oder wie das hier heisst :-)

Lenox
14.02.2007, 15:59
So ich hab den Code mal probiert, das Oskar zeigt aber nur einen senkrechten Strich na mit "leichten" Lücken.
Warum er nicht vertical ist versteh ich auch nicht.

Oder soll die Led jetzt mit der anderen Seite noch an Tsd?.
Zurzeit hab ich die Anode per Widerstand an Vcc, und die Kathode per Transistor gegen GND.

Muss ich den Timer nicht noch starten?

linux_80
14.02.2007, 18:13
Die Schaltung sollte zum ausprobieren der Frequenz schon passen, erst später evtl. den 2. Pin auch an den AVR.
Hast Du das mit dem Start Timer auch gemacht ?

Lenox
14.02.2007, 20:31
ne nur so wie du es oben gepostet hast!

Lenox
14.02.2007, 21:49
Sorry ich hab es grad 2 Stunden versucht, aber ich bekomm den Aufbau einfach nicht hin.
Sagen wir mal der Timer überäuft, die Subroutine setzt den Port auf 1, dann läuft er wieder über, und ich setzte den Port wieder 0 oder?

Und mit dem Hauptprogramm frag ich noch per Endlosschleife ab, ob die Sendetaste gedrück wurde, der als Bedingung mit der Subroutine zum senden verknüft wird.

Und zusätzlich brauch ich ja auch noch ein Sleep Modus damit die Batterie nicht direkt leer ist.

izaseba
14.02.2007, 22:10
Hallo Lenox,

Ganz so einfach ist es mit RC5 nicht, wenn Du den Timer mit 36 kHz laufen hast und z.B. eine Logische 1 senden willst, mußt Du 32 Überläufe die Led senden lassen, dann 32 Überläufe nicht senden lassen, bei einer 0 ist es andersherum, das ganze mal 14 Bit .
Ich könnte Dir ein Codeschnipsel zukommenlassen ist aber in Assembler.

Sleepmodus am besten Powerdown und den Taster an Extint anschliessen.

Gruß Sebastian

Lenox
14.02.2007, 22:22
Achso, oky hab ich jetzt verstanden, aber ich glaub das bekomm ich noch nicht hin.
Dafür hab ich einfach noch zuwenig Programmiererfahrung.

Ich denke mal die Subroutien müsste in etwa so aussehen (für 1 Bit)

If Schalter = 1
If I < 33
Portb.0 = 1
End if
If I >32 AND I < 65
Portb.0 = 0
End If
I = I +1
End If

izaseba
14.02.2007, 22:38
So könnte man es machen, denke ich, jetzt nur noch alles mit 14 bits und gut ist...
Gruß Sebastian

Lenox
14.02.2007, 23:01
Oky dann lasst uns doch mal den Code zusammenbasteln!



$regfile = "Attiny13.dat" ' the used chip
$crystal = 9600000

Config Portb.0 = Output 'LED
Config Portb.4 = Input 'Schalter gegen GND
Portb.4 = 1 'Pullup

Schalter Alias Portb.4

Config Timer0 = Timer , Prescale = 8
On Timer0 Timer_irq
Const Timervorgabe = 256 - 33

Enable Timer0
Enable Interrupts

Dim I As Byte

Do

Loop

Timer_irq:

If Schalter = 1
If I < 33 Then
Portb.0 = 1
End If

If I > 32 And I < 65 Then
Portb.0 = 0
End If

If I = 64 Then
I = 0
Else
I = I + 1
End If

End If

Return


Ist noch ein Fehler bei der Varibale I drin "Out of space?!"
Was fehlt hier sonst noch? ;)

izaseba
14.02.2007, 23:12
Gute Frage was noch fehlt, meiner Meinung nach sieht es gut aus, ich weiß nicht wo die Variable out of space ist 8-[ sorry, wenn Du nicht weiter kommst kannst Du mein Asmprogramm haben, aber schau mal, das kriegst Du schon hin ...

Gruß Sebastian

Lenox
16.02.2007, 11:03
Vielleicht wäre es doch ganz praktisch wenn du mir den Asm Code posten könntest, ich muss auch noch den ganzen RGB Kram fertig bekommen.
Dafür brauch ich PonyProg oder? (Asm)

Lenox
17.02.2007, 12:57
Alle am feiern?

Lenox
17.02.2007, 14:26
Soo ich habs jetzt raus (ersten 3 Bits).
Aber ich habe schon 43% belegt, leider fällt mir keine Methode mit Schleife ein!



$regfile = "ATtiny13.dat"
$crystal = 9600000
$hwstack = 32
$swstack = 8
$framesize = 16

Config Portb.0 = Output 'LED
Config Portb.4 = Input 'Schalter gegen GND
Portb.4 = 1 'Pullup

Schalter Alias Portb.4

Config Timer0 = Timer , Prescale = 8
On Timer0 Timer_irq
Const Timervorgabe = 256 - 33

Enable Timer0
Enable Interrupts

Dim I As Byte
I = 0

Do

Loop

Timer_irq:

If I < 33 Then '1
Portb.0 = 1
End If
If I > 32 And I < 65 Then
Portb.0 = 0
End If

If I > 64 And I < 97 Then '2
Portb.0 = 1
End If
If I > 96 And I < 129 Then
Portb.0 = 1
End If

If I > 128 And I < 161 Then '3
Portb.0 = 1
End If
If I > 160 And I < 193 Then
Portb.0 = 1
End If

Return


PS: irgentwo ist da noch ein Fehler drin, die IR Led blink viel zu langsam.