Kleine RC5 Fernbedienung

elektronix00

Mitglied
02. Okt. 2008
30
0
6
62
Saarland
Sprachen
Hi @ all,

Die Tage hatte ich mal wieder etwas Zeit gefunden und ich habe an meiner RC5 Fernbedienung weitergebastelt. Den Code habe ich mit Bascom geschrieben, als µC nehme ich den ATTiny 2313 intern getaktet mit 4 MHz. Die Schaltung funktioniert soweit auf meinem Versuchsboard, d. h. beim Drücken eines Tasters wird der entsprechende RC5 Code gesendet, auswerten kann und überprüfen kann ich das mit einer anderen Schaltung, die ich mir vorher schon aufgebaut habe. Einen RC5 Tester mit LCD Anzeige, das die Geräteadresse sowie den Befehl anzeigt. Drücke ich eine Taste, so wird gesendet, die Kontroll-LED (an PB.0) geht für diese Zeit an. Parallel wird an PB.3 (OC1) die IR-LED geschaltet, zur Zeit noch als normale LED ausgeführt (IR sieht man so schlecht mit bloßem Auge) :) Diese LED bleibt dann aber an und geht nicht mehr aus. Die Fusebits scheinen richtig gesetzt zu sein, sonst würde ja die Kontroll-LED ebenfalls spinnen.

Gruß Michael

Hier mal das Bascom-Programm:

'***********************************************
'Schaltung :Fernbedienung *
'Compiler : BASCOM-AVR *
'Hardware : IR-LED an PB.3 (OC1) *
' Kontroll-LED an PB.0 *
'Last update : 08.11.2008 *
'***********************************************

$regfile = "attiny2313.dat"
$crystal = 4000000
$lib "mcsbyte.lbx"
$framesize = 32
$swstack = 10
$hwstack = 40

Ddrd = &B00000000 'alle PortD Pins auf Eingang definieren
Portd = &B11111111 'alle PortD Pins auf High setzen

Config Pinb.0 = Output 'Kontroll-LED
Config Pinb.3 = Output 'IR-LED

Dim Togbit1 As Byte 'Variablenname und Typ festlegen
Dim Togbit2 As Byte
Dim Command As Byte 'Kommando - Funktion
Dim Address As Byte 'Geräteadresse

Togbit1 = 0 '0 or 32 zum Setzen des Toggle-Bits
Togbit2 = 32 '0 or 32 zum Setzen des Toggle-Bits
Address = 5 'Adresse für Videorecorder

Do 'Beginn Schleife
If Pind.0 = 0 Then 'Wenn Taste 1 gedrückt --> Empfänger 1 AN / AUS
Set Portb.0 'Kontroll-Led an
Set Portb.3 'IR LED an
Waitms 500 'warte 500 Millisekunden
Rc5send Togbit1 , Address , 1 'sende RC5-Signal
Rc5send Togbit2 , Address , 1 'sende RC5-Signal
Reset Portb.0 'Kontroll-Led aus
Reset Portb.3 'IR LED aus
End If

If Pind.1 = 0 Then 'Wenn Taste 2 gedrückt --> Empfänger 2 AN / AUS
Set Portb.0 'Kontroll-Led an
Set Portb.3 'IR LED an
Waitms 500 'warte 500 Millisekunden
Rc5send Togbit1 , Address , 2 'sende RC5-Signal
Rc5send Togbit2 , Address , 2 'sende RC5-Signal
Reset Portb.0 'Kontroll-Led aus
Reset Portb.3 'IR LED aus
End If

If Pind.2 = 0 Then 'Wenn Taste 3 gedrückt --> Empfänger 3 AN / AUS
Set Portb.0 'Kontroll-Led an
Set Portb.3 'IR LED an
Waitms 500 'warte 500 Millisekunden
Rc5send Togbit1 , Address , 3 'sende RC5-Signal
Rc5send Togbit2 , Address , 3 'sende RC5-Signal
Reset Portb.0 'Kontroll-Led aus
Reset Portb.3 'IR LED aus
End If

If Pind.3 = 0 Then 'Wenn Taste 4 gedrückt --> Empfänger 4 AN / AUS
Set Portb.0 'Kontroll-Led an
Set Portb.3 'IR LED an
Waitms 500 'warte 500 Millisekunden
Rc5send Togbit1 , Address , 4 'sende RC5-Signal
Rc5send Togbit2 , Address , 4 'sende RC5-Signal
Reset Portb.0 'Kontroll-Led aus
Reset Portb.3 'IR LED aus
End If

If Pind.4 = 0 Then 'Wenn Taste 5 gedrückt --> Empfänger 5 AN / AUS
Set Portb.0 'Kontroll-Led an
Set Portb.3 'IR LED an
Waitms 500 'warte 500 Millisekunden
Rc5send Togbit1 , Address , 5 'sende RC5-Signal
Rc5send Togbit2 , Address , 5 'sende RC5-Signal
Reset Portb.0 'Kontroll-Led aus
Reset Portb.3 'IR LED aus
End If

Loop 'zum Beginn der Schleife

End
 
Hi Elektronix !

Mal eine Frage vorab....
Hast du hier nur einen Auszug aus deinem Programm eingestellt, oder ist das wirklich dass gesamte Programm?

Was mich stutzig macht....... wo ist das "Enable Interrupts" ?
Außerdem......
If Pind.0 = 0 Then 'Wenn Taste 1 gedrückt --> Empfänger 1 AN / AUS
Set Portb.0 'Kontroll-Led an
Set Portb.3 'IR LED an
Waitms 500 'warte 500 Millisekunden
Rc5send Togbit1 , Address , 1 'sende RC5-Signal
Rc5send Togbit2 , Address , 1 'sende RC5-Signal
Reset Portb.0 'Kontroll-Led aus
Reset Portb.3 'IR LED aus
End If

Deine IR-Diode wird über den 16 Bit-Compare Pin angesteuert (OC1A). Dieser Port ist, wie du es schon richtig angegeben hast, beim Tiny2313 der PORTB.3 !
Allerdings musst du den Port NICHT mit SET oder RESET ansteuern.
Du benötigst lediglich den BASCOM-Befehl "RC5SEND" (bzw. RC5SENDEXT).
Die richige Einstellung des 16Bit-Timers und auch das Einpassen der Bits (Togbit, Adresse und Kommando) wird von BASCOM übernommen und mit dem OC1A entsprechend die IR-Diode (bzw. die Basis des vorgeschalteten PNP-Transistors) angetrieben.

Um also bei deinem Beispiel zu bleiben.....


If Pind.0 = 0 Then
Set Portb.0 'Kontroll-Led an

Waitms 500 'warte 500 Millisekunden ??? Warum das???
Rc5send Togbit1 , Address , 1 'sende RC5-Signal
Rc5send Togbit2 , Address , 1 'sende RC5-Signal ???Togbits direkt nacheinander ???
Reset Portb.0 'Kontroll-Led aus

End If


Wie eben schon angemerkt....
Warum machst du denn eine Pause von 500ms? Würde eine Pause von 30ms-100ms nicht ausreichen? Der Sende-Befehl benötigt ja auch noch etwas Zeit. ;)

Dann zu den Togbits...
Es macht doch keinen Sinn, wenn du erst Togbit1 und dann gleich Togbit2 hintereinander sendest.
Der Toggel-Bit dient dem empfangenden Gerät ja nur zur Erkennung, ob die selbe Taste dauerhaft gedrückt wird, oder die Taste zwischendurch einmal losgelassen wurde (z.B. für die Mute-Taste)!
Wenn du dein Programm so benutzen würdest, dann würden z.B. die Lautsprecher ab- und gleich wieder eingeschaltet!

Wenn du den RC5-Code nur erst mal ausprobieren möchtest dann genügt es, nur ein Togbit (die 0) zu verwenden.

Probiere es einfach mal aus. ;)


Diese LED bleibt dann aber an und geht nicht mehr aus.
Diesen Effekt wirst du auch feststellen, wenn du "nur" den OC1A verwendest.
Allerdings sollte nach dem Senden des ersten RC5-Codes die IR-LED verlöschen und nur noch flackern, wenn du einen weiteren Code sendest.



Noch ein Tip, zu deinem Programm....
Wenn du dir deine Programmierung mal anschaust wird dir auch auffallen, dass sich Eines immer wiederholt...... Das Senden des RC5-Codes! ;)

Lagere den Befehl zum Senden (mit den Variablen) doch einfach in eine Subroutine aus.
Zum Beispiel:


.....
Dim Togbit1 As Byte , Ir_adr As Byte , Ir_cmd As Byte
......
Togbit1 = 0
Ir_adr = 5
......

Do
If Pind.0 = 0 Then
Ir_cmd = 1
Gosub Ir_senden
Else
End if

If Pind.1 = 0 Then
Ir_cmd = 2
Gosub Ir_senden
Else
End if

......
Loop


Senden:
Portb.0 = 1
RC5SEND Togbit1 , Ir_adr , Ir_cmd
Portb.0 = 0
Waitms 100 ' Solltest du eine Pause benötigen.......
Return



So wird dein Programm doch wesentlicher kürzer und übersichtlicher. ;)

Im oberen Beispiel ist natürlich das Wechseln des Togbits ( 0 oder 32) noch nicht berücksichtigt..... Das kannst du dann später noch einbauen, wenn die ersten Tests erfolgreich waren.


Viel Spaß und schöne Grüße,
Cassio !
 
Hallo Cassio,

zuerst mal danke für deine ausführliche Hilfe. Das Grundgerüst vom Code habe ich mir aus dem Internet zusammengesucht und einen Teil auch aus der BASCOM Hilfe. Bin halt noch Anfänger, übe aber fleissig und lese viel. :) In der BASCOM Hilfe wird aber angegeben, dass enable interrupts nicht benötigt wird, ich habs aber jetzt mal eingesetzt. Ich habe auch mal testweise das 2. Togglebit deaktiviert. Ursprünglich hatte ich auf meinem Testboard PB.3 die IR-LED mit einer normalen LED in Reihe geschaltet (+ Vorwiderstand) und die Anode der IR-LED an PB.3, die Kathode an GND. Nun habe ich das Ganze genau umgekehrt. Da sieht das Flackern auch ganz anders aus.
Mit den Togglebits blicke ich nicht so ganz durch. Später soll ja mit einer Taste eine Gerätefunktion an oder aus geschaltet werden. Dazu muss ich aber noch das Empfangsmodul aufbauen. Ich will damit kleine Relais schalten.

Ich habe meinen Code nun etwas geändert, leider leuchtet aber die Kontroll - LED nicht mehr obwohl sie ja parallel zur IR LED über PB.0 geschaltet werden soll.
Ich werde aber heute morgen noch zum testen deinen Code verwenden, finde ich auch übersichtlicher. Hier mal mein geänderter Code:

'***********************************************
'Schaltung :Fernbedienung *
'Compiler : BASCOM-AVR *
'Hardware : IR-LED an PB.3 (OC1) *
' Kontroll-LED an PB.0 *
'Last update : 09.11.2008 *
'***********************************************

$regfile = "attiny2313.dat"
$crystal = 4000000
$lib "mcsbyte.lbx"
$framesize = 32
$swstack = 10
$hwstack = 40

Ddrd = &B00000000 'alle PortD Pins auf Eingang definieren
Portd = &B11111111 'alle PortD Pins auf High setzen

Config Pinb.0 = Output 'Kontroll-LED
Config Pinb.3 = Output 'IR-LED (OC1)

Dim Togbit1 As Byte 'Variablenname und Typ festlegen
Dim Togbit2 As Byte
Dim Command As Byte 'Kommando - Funktion
Dim Address As Byte 'Geräteadresse

Enable Interrupts

Togbit1 = 0 '0 or 32 zum Setzen des Toggle-Bits
Togbit2 = 32 '0 or 32 zum Setzen des Toggle-Bits
Address = 5 'Adresse für Videorecorder

Do 'Beginn Schleife
If Pind.0 = 0 Then 'Wenn Taste 1 gedrückt --> Empfänger 1 AN / AUS
Ddrb.0 = 1 'Kontroll-LED an
Ddrb.3 = 1 'IR LED an
Waitms 100 'warte 500 Millisekunden
Rc5send Togbit1 , Address , 1 'sende RC5-Signal
'Rc5send Togbit2 , Address , 1 'sende RC5-Signal
Ddrb.0 = 0 'Kontroll-LED aus
Ddrb.3 = 0 'IR LED aus
End If

If Pind.1 = 0 Then 'Wenn Taste 2 gedrückt --> Empfänger 2 AN / AUS
Ddrb.0 = 1 'Kontroll-LED an
Ddrb.3 = 1 'IR LED an
Waitms 100 'warte 500 Millisekunden
Rc5send Togbit1 , Address , 2 'sende RC5-Signal
'Rc5send Togbit2 , Address , 2 'sende RC5-Signal
Ddrb.0 = 0 'Kontroll-LED aus
Ddrb.3 = 0 'IR LED aus
End If

If Pind.2 = 0 Then 'Wenn Taste 3 gedrückt --> Empfänger 3 AN / AUS
Ddrb.0 = 1 'Kontroll-LED an
Ddrb.3 = 1 'IR LED an
Waitms 100 'warte 500 Millisekunden
Rc5send Togbit1 , Address , 3 'sende RC5-Signal
'Rc5send Togbit2 , Address , 3 'sende RC5-Signal
Ddrb.0 = 0 'Kontroll-LED aus
Ddrb.3 = 0 'IR LED aus
End If

If Pind.3 = 0 Then 'Wenn Taste 4 gedrückt --> Empfänger 4 AN / AUS
Ddrb.0 = 1 'Kontroll-LED an
Ddrb.3 = 1 'IR LED an
Waitms 100 'warte 500 Millisekunden
Rc5send Togbit1 , Address , 4 'sende RC5-Signal
'Rc5send Togbit2 , Address , 4 'sende RC5-Signal
Ddrb.0 = 0 'Kontroll-LED aus
Ddrb.3 = 0 'IR LED aus
End If

If Pind.4 = 0 Then 'Wenn Taste 5 gedrückt --> Empfänger 5 AN / AUS
Ddrb.0 = 1 'Kontroll-LED an
Ddrb.3 = 1 'IR LED an
Waitms 100 'warte 500 Millisekunden
Rc5send Togbit1 , Address , 5 'sende RC5-Signal
'Rc5send Togbit2 , Address , 5 'sende RC5-Signal
Ddrb.0 = 0 'Kontroll-LED aus
Ddrb.3 = 0 'IR LED aus
End If

Loop 'zum Beginn der Schleife

End
 
Guten Morgen !

Sorry, habe gerade nicht viel Zeit!

Was ich aber noch schnell anmerken möchte....

If Pind.0 = 0 Then 'Wenn Taste 1 gedrückt --> Empfänger 1 AN / AUS
Ddrb.0 = 1 'Kontroll-LED an
Ddrb.3 = 1 'IR LED an

Waitms 100 'warte 500 Millisekunden
Rc5send Togbit1 , Address , 1 'sende RC5-Signal
'Rc5send Togbit2 , Address , 1 'sende RC5-Signal
Ddrb.0 = 0 'Kontroll-LED aus
Ddrb.3 = 0 'IR LED aus

End If


DAS ist der falsche Weg! ;)

Mit dem DDRn legst du nur die Richtung fest, ob dein Pin (oder Port) ein Eingang, oder ein Ausgang sein soll!!!

Richtig Schalten wirst du damit nicht!


Probiere den Ansatz meines Programmes einfach mal aus und nimm es als Basis für deine Überlegungen.


Wenn du später einen eigenen Empfänger dazu baust, dann kannst du auch auf das Wechseln des Toggelbits verzichten.


Viel Spaß weiterhin,
Cassio !
 
Hallo Cassio,

habe heute auch nicht viel Zeit, muss zur Mittagsschicht. Aber den Code habe ich noch geändert, so weit ich es verstanden habe. Der Versuchsaufbau funktioniert auch. Ich habe die Ansteuerung der IR - LED aus der BASCOM-Hilfe genommen, mit PNP-Transistor. Und auch hier gab es ein Problem. Laut Eagle gibt es den BC516 nämlich als normaler und als Darlington. In der Hilfe war der normale Transistor eingezeichnet. Dadurch hatte ich nur eine geringe Reichweite, ich habe mit einem RC5-Tester, den ich schon vorher aufgebaut hatte testen können. Den Transistor kann ich aber erst nächste Woche austauschen man hat ja nicht jedes Bauteil vorrätig.

Wenn die Schaltung komplett ist, werde ich wohl die nächste Frage haben. Schließlich soll die Fernbedienung nur Strom verbrauchen wenn sie gerade eingesetzt wird, sonst wäre nach ein paar Tagen die Batterie leer. Ich dann wohl mit SLEEP oder POWERDOWN arbeiten. Ich habe mich zwar reingelesen, steige da aber wirklich nicht durch. Aber eins nach dem anderen.
Hier der aktuelle Code und als Anhang mein Schaltplan:

'***********************************************
'Schaltung :Fernbedienung *
'Compiler : BASCOM-AVR *
'Hardware : IR-LED an PB.3 (OC1) *
' Kontroll-LED an PB.0 *
'Last update : 09.11.2008 *
'***********************************************

$regfile = "attiny2313.dat"
$crystal = 4000000
$lib "mcsbyte.lbx"
$framesize = 32
$swstack = 10
$hwstack = 40

Ddrd = &B00000000 'alle PortD Pins auf Eingang definieren
Portd = &B11111111 'alle PortD Pins auf High setzen

Config Pinb.0 = Output 'Kontroll-LED
Config Pinb.3 = Output 'IR-LED (OC1)
Pinb.3 = 1

Enable Interrupts

Dim Togbit1 As Byte , Ir_adr As Byte , Ir_cmd As Byte 'Variablenname und Typ festlegen

Togbit1 = 0
Ir_adr = 5

Do
If Pind.0 = 0 Then
Ir_cmd = 1
Gosub Ir_senden
Else
End If

If Pind.1 = 0 Then
Ir_cmd = 2
Gosub Ir_senden
Else
End If

If Pind.2 = 0 Then
Ir_cmd = 3
Gosub Ir_senden
Else
End If

If Pind.3 = 0 Then
Ir_cmd = 4
Gosub Ir_senden
Else
End If

If Pind.4 = 0 Then
Ir_cmd = 5
Gosub Ir_senden
Else
End If

Loop

'Subroutine
Ir_senden:
Portb.0 = 1
Portb.3 = 1
Rc5send Togbit1 , Ir_adr , Ir_cmd
Portb.0 = 0
Portb.3 = 0
Waitms 100 'kurze Pause
Return

End
 

Anhänge

  • fernbedienung.jpg
    fernbedienung.jpg
    89,9 KB · Aufrufe: 156
Hallo Elektronix !

Noch mal schnell zwischendurch....

Warum schaltest du den Ausgang PORTB.3 immer noch? :confused:

Der PORTB.3 arbeitet als Signalausgang und darf nicht High und Low geschaltet werden!

Nimm also dein "Pinb.3 = 1" unter "Config Pinb.3 = Output 'IR-LED (OC1)" raus...
....und lösche auch gleich in der Senden-Routine die Anweisungen "Portb.3 = 1" und "Portb.3 = 0" !


Mit den "Enable Interrupts" hast du allerdings Recht... In der BASCOM-Hilfe taucht es nicht auf!


Dann würde dein Code also nun so aussehen:
Code:
[COLOR="Blue"]
'***********************************************
'Schaltung :Fernbedienung *
'Compiler : BASCOM-AVR *
'Hardware : IR-LED an PB.3 (OC1) *
' Kontroll-LED an PB.0 *
'Last update : 09.11.2008 *
'***********************************************

$regfile = "attiny2313.dat"
$crystal = 4000000
$lib "mcsbyte.lbx"
$framesize = 32
$swstack = 10
$hwstack = 40

Ddrd = &B00000000 'alle PortD Pins auf Eingang definieren
Portd = &B11111111 'alle PortD Pins auf High setzen

Config Pinb.0 = Output 'Kontroll-LED
Config Pinb.3 = Output 'IR-LED (OC1)

Dim Togbit1 As Byte , Ir_adr As Byte , Ir_cmd As Byte 'Variablenname und Typ festlegen

Togbit1 = 0
Ir_adr = 5

Do
If Pind.0 = 0 Then
Ir_cmd = 1
Gosub Ir_senden
Else
End If

If Pind.1 = 0 Then
Ir_cmd = 2
Gosub Ir_senden
Else
End If

If Pind.2 = 0 Then
Ir_cmd = 3
Gosub Ir_senden
Else
End If

If Pind.3 = 0 Then
Ir_cmd = 4
Gosub Ir_senden
Else
End If

If Pind.4 = 0 Then
Ir_cmd = 5
Gosub Ir_senden
Else
End If

Loop

'Subroutine
Ir_senden:
Portb.0 = 1
Rc5send Togbit1 , Ir_adr , Ir_cmd
Portb.0 = 0
Waitms 100 'kurze Pause
Return

End
[/COLOR]

Ändere deinen Code entsprechend und probiere ihn aus.
Funktioniert er so wie du es möchtest, dann kannst du weiter machen. ;)


Den Transistor kann ich aber erst nächste Woche austauschen man hat ja nicht jedes Bauteil vorrätig.
Ich habe auch nicht immer alle vorgeschlagenen Bauteile hier liegen.....
Als PNP-Transitor benutze ich z.B. den BC327 und es klappt ebenfalls. :cool:


Ich dann wohl mit SLEEP oder POWERDOWN arbeiten.
Die Idee ist bei batteriegestützten Geräten natürlich nicht grundlegend falsch....
Allerdings ist das Aufwecken des µC aus dem Powerdown-, oder Idle-Modus an bestimmte Bedingungen geknüpft!

Wenn ich mir deine Schaltung aber so ansehe dann bin ich der Meinung, dass dein 7805 im Ruhezustand mehr Strom verbraucht, als dein µC. ;)
Vielleicht solltest du erst mal dort ansetzen.... um den Ruhestromverbrauch zu reduzieren.

Wie du aber schon geschrieben hast.... Dies Problem kommt etwas später. ;)


Dann wünsch ich mal eine ruhige Mittagsschicht!

Cassio !
 
Hallo Cassio,

heute habe ich noch meine Materiallieferung von Reichelt bekommen und konnte mit der Fernbedienung weitermachen. Und alles läuft nun sauber. Schaltplan und Layout habe ich mit Eagle auch schon fertig, will ich nur noch an die spätere Gehäusegröße anpassen. Ja, mit dem Stromsparen, das ist so eine Sache. Die FB wird eigentlich nur in den Sommermonaten benutzt, wenn ich mit dem Wohnmobil irgendwo hinfahre, ich werde einen kleinen Schiebeschalter am Gehäuse anbringen. Wenn du aber Lust und Laune hast, können wir die Sache gerne weiterspinnen. Schließlich will ich die Schaltung mit Code später hier posten, der ein oder andere Anfänger wird sich sicherlich freuen.
Aber damit ich was lerne, ich stelle mir das mit dem Stromsparmodus so vor: In den Fusebits muß ich wohl den Watchdog enablen? Dann muss ich im Code irgendwo den Watchdog anschalten? Ich muss aber den Watchdog irgendwie auch wieder abschalten können, wenn ich die FB z. B. nutzen möchte.

Gruß Michael

P.S. In den Tagen gehts dann mit dem Empfangsmodul weiter :D
 
Hallo @Elec....

Aber damit ich was lerne, ich stelle mir das mit dem Stromsparmodus so vor: In den Fusebits muß ich wohl den Watchdog enablen? Dann muss ich im Code irgendwo den Watchdog anschalten? Ich muss aber den Watchdog irgendwie auch wieder abschalten können, wenn ich die FB z. B. nutzen möchte.


:D

Der Stromsparmodus wird meistens über die Sleep-Funktion aufgerufen.
Watchdog dient hauptsächlich dazu, festzustellen, ob das Programm irgendwo "hängengeblieben" ist, also dazu werden in regelmäßigen Abständen
WDR-Marken ins Programm gesetzt, die wiederum den Watchdog-Timer resetten, sonst würde er einen kompletten Reset durchführen.
Dauert nun die Programmausführung zwischen den WDR-Marken zu lange, wird resettet.
Dann liefe das Programm wieder bis zu Stelle, wo es eventuell wieder hängt, oder initialisiert den "Störenfried" wieder, falls das hilft.
Watchdog kann über Fuses, IMHO besser durch das "Hauptprogramm"
initialisiert werden, siehe auch:

http://www.avr-praxis.de/forum/showthread.php?t=200

Hier mal ein kleines Beispiel für den Sleep-Modus in ASM
einkopiert:

Code:
sleep:		;Programmende "Power-down"-Modus rufen

push	temp 
ldi	temp,	0x20		
out	mcucr,	temp
sleep
pop	temp		
ret

Bis dannn

Gruß von Oskar.
 
Stromsparmodus

Hallo Oscar,

leider kann ich mit Assembler noch nichts anfangen, arbeite mich erst mal in BASCOM rein. Dann hatte ich das mit dem Watchdog eh falsch verstanden, ich meinte dann wohl eher den SLEEP Modus, den es auch in BASCOM gibt. Leider gibt die BASCOM Hilfe nicht viel her, vernünftige Beispiele wo die Funktion erklärt wird habe ich auch noch nicht gefunden. Na ja, ein kleiner Schiebeschalter wirds am Anfang auch tun, kann ja später wenn ich mehr Erfahrung habe mich um die SLEEP-Funktion kümmern. Zudem müsste ich dann auch wohl die Hardware ändern, der Spannungsregler zieht ja auch immer etwas Strom.

Gruß Michael
 
SleepMode

Hallo Ele....

ja ja, aus diesem Grund heißt der Wtachdog ja Watchdog weil er ein Wachhung für die korrekte Funktion eines Programms ist. In der Praxis unterschweidet man noch zwischen SW-Watchdog und HW-Watchdog.

Aber nur soviel dazu. Das wolltest Du ja garnicht wissen. Dich hat ja viel mehr der Sleep-Mode interessiert.

Also:

Meiner Meinung nach ist es zur Aktivierung des Sleep-Modes essenziell wichtig, den INT0 zu konfigurieren.

Also erstmal:

Code:
CONFIG INT0 = LOW LEVEL
und
ENABLE INTERRUPTS

Anschließend kannst Du über den BASCOm Befehl POWERDOWN den ATMEGA schlafen legen.
Ich bin der Meinung, dass die BASCOM Hilfe hier schon sehr klar darauf eingeht:

In the power down mode, the external oscillator is stopped. The user can use the WATCHDOG to power up the processor when the watchdog timeout expires. Other possibilities to wake up the processor is to give an external reset or to generate an external level triggered interrupt.
Most new chips have many options for Power down/Idle. It is advised to consult the data sheet to see if a better mode is available.

Ein 0V Signal am INT0 Pin weckt den Mega dann wieder auf. Bitte beachte die Notwendigkeit eines PullUps. Entweder intern oder extern mit 10k gegen Vcc.

Ich glaube das ist das ganze Hexenwerk! Ich habs zwar selbsr noch nie probiert, erscheint mir aber als recht simple. Eigentlich reicht die Freigabe des externen Interrupts INT0 und der POWERDOWN. Noch n Taster ran gegen Masse und fertig!

Hoffe Dir weitergeholfen zu haben.

Grüße,
Markus
 
Hallo Markus,

das hast du wirklich gut erklärt. Mit dem Signal an INT0 hatte ich auch schon etwas gelesen, konnte leider nicht wirklich was damit anfangen. Aber wenn ja noch ein Taster dazu benötigt wird, dann leuchtet das ein. Aber wie du sehen kannst ist ja im Schaltplan noch dieser Spannungsregler. Der zieht ja dann auch immer noch etwas Strom. Ich werde dann wohl doch mittels einem Schiebeschalter die Fernbedienung komplett abschalten, sie wird ja im Wohnmobil nicht allzu oft gebraucht. Aber zumindest weiss ich jetzt, wie der Watchdog eingesetzt wird und man POWERDOWN einsetzt.

Gruß Michael
 
Hallo Michael,

was hältst Du von der Idee, vor dem Spannungsregler z.B. einen Power-MOS-FET zu implementieren der mittel PowerOnOff Halteleitung vom Mega aus am leben gehalten werden kann und wenn der Mega schlafen will dann drhst Du dem MOS-Fet den Saft ab. Mittels Einschaltlogig, z.B. Taster könntest Du so die Spannung wieder aktivieren und der Mega könnte losrennen.

Grüße,
Ma
 
Hallo Markus,

die Idee wäre nicht schlecht, dann wäre die Schaltung genau so, wie ich sie mir vorgestellt habe. Nun habe ich aber heute das Layout speziell für mein Gehäuse gestaltet und schon das letzte Finish vorgenommen, am Montag lasse ich mir den Layoutfilm in der Reproanstalt herstellen. (Platinenherstellung ist ja mein Spezialgebiet) :)
Da die Fernbedienung nun funktioniert, wollte ich gerade den Schaltplan mit Kurzerklärung sowie BASCOM Code hier im Forum posten. Der ein oder andere wirds vielleicht gebrauchen und vielleicht noch verbessern wollen.
Den Anhang kannst du dir gerne anschauen, deine Verbesserungen für ein Update nehme ich wie immer gerne an. Schließlich ist diese Fernbedienung ja auch hier im Forum mit einigen Hilfen :cheers: entstanden.

Gruß aus Saarbrooklyn :D

Michael
 

Anhänge

  • FB.zip
    42,8 KB · Aufrufe: 139
Ich glaube das ist das ganze Hexenwerk!

Hallo zusammen!

Ich habe auch mal wieder etwas Zeit und möchte deshalb noch einmal zum INT0 etwas beisteuern. ;)

Sicher ist der SLEEP oder POWERDOWN Modus recht simpel einzurichten und auch das Aufwecken ist nicht wirklich schwer.

Allerdings stelle ich mir immer wieder folgende Fragen...

Die Fernbedienung soll ja so lange schlafen, bis man eine beliebige Sendetaste drückt.
Wenn aber nun nicht der INT0, der Watchdog, oder ein Reset verwendet wird, schläft der µC ja den Schlaf der Gerechten und kümmert sich nicht um den Wechsel anderer Pins.

Würde das denn bedeuten, dass alle Taster 2-polig sein müssen? So dass einmal der INT0 betätigt wird und gleichzeitig der entsprechende Pin angesprochen wird? :confused:
Das muss sich doch einfacher und kostengünstiger lösen lassen.

Ich habe hier auch noch einige Geräte "in Arbeit", die mit Batterie betrieben werden sollen.... und suche deshalb nach einer "Patentlösung" für den geringsten Ruhestromverbrauch. ;)

Wenn ich mir fertige Fernbedienungen so ansehe... die kommen teilweise über ein Jahr mit "einer" CR2032 aus (je nach Häufigkeit der Bedienung)

Das ist der Grund, warum ich den POWERDOWN-Modus so interessant finde!
Wie dem Datenblatt des Tiny2313 zu entnehmen ist, benötigt er 500µA im normalen Betrieb, aber nur 2µA im POWERDOWN-Modus. Das ist wirklich nicht zu verachten!
Da muss man ja schon fast überlegen, ob die Selbstentladung der CR2032 nicht höher ist, als der Verbrauch des µC. ;)


Es wäre also vielleicht doch interessant, wenn wir hier gemeinsam das Thema "Batteriebetrieb" noch einmal überdenken.

Schöne Grüße,
Cassio
 
Hallo Elektronix!

Es ist zwar schon ein weilchen her und ich weiß auch nicht, ob du dein Projekt noch weiter entwickelst, aber ich habe inzwischen meine Fernbedienung vollendet! ;)
Den Programmcode habe ich auch schon einige Wochen hier liegen.....
Dafür ist er aber getestet und funktioniert bei meiner kleinen Fernbedienung problemlos! :)


Achtung:
Zwischenzeitlich habe ich den Atmel gewechselt, weil meine RC5-Fernbedienung nicht so viele Tasten benötigt! ;)

Ich verwende also nun nicht mehr den Tiny2313v sondern den Tiny24v !

Die neue Variante hat nun folgende Eigenschaften:

- Betrieb mit nur einer CR2032 Knopfzelle
- Permanenter "Schlafmodus" der Fernbedienung, bis eine Taste gedrückt wird
- Extrem geringer Stromverbrauch im Ruhezustand ca. 4µA
- 3mm LED zur optischen Kontrolle/Rückmeldung für gedrückte Tasten
- Berücksichtigung des Togbits beim Senden, für erneutes Drücken oder Halten einer Taste
- Vier verschiedene RC5-Adressen auch nachträglich einstellbar


Wenn es dich noch interessiert, dann melde dich doch einfach noch mal....

Ich stelle hier schon mal den Schaltplan und ein Bild mit ein. ;)

Grüße,
Cassio
 

Anhänge

  • FB-24v-CR2032.gif
    FB-24v-CR2032.gif
    12,4 KB · Aufrufe: 144
  • IMG_0351.JPG
    IMG_0351.JPG
    126,4 KB · Aufrufe: 92
Hallo Cassio,
Ich bin auch gerade dabei eine Fernbedienung für meine Wintergartensteuerung zu bauen.
dein Projekt gefällt mir gut !!
Kann man den Bascom Code dazu bekommen ?

Danke & Gruß
Mischu
 
Kann man den Bascom Code dazu bekommen ?

Hallo Mischu!

Versteh es bitte nicht falsch, aber ich halte nichts davon dir einen fertigen Code zu präsentieren.

Ich bin aber gern bereit mit dir zusammen einen für dich passenden Programmcode zu entwickeln.

Fang doch einfach mal an die ersten Codeteile zu programmieren.
Wenn du dann Hilfe brauchst stellst du deinen vorläufigen Programmcode hier ein und wir beantworten deine Fragen.... sofern wir die Probleme nachvollziehen können, oder offensichtlich sind.

Ich bin der Meinung, so lernst du viel mehr über BASCOM und dessen Befehle, als einfach eine fertige Lösung zu kopieren und dran rum zu basteln. ;)

Gruß,
Cassio
 
Schau mal im ELO Magazin unter franzis.de nach dem RC5 Übersetzer.
Ist zwar in Assembler aber einfach.;)
 
Hallo Cassio,
Ich bin durch Zufall auf diesen Beitrag gestoßen und Anfänger auf dem Gebiet.
Ich habe auch eine funktionierende Minifernbedienung gebaut. Ähnlich Deiner ,aber mit nur 2 Funktionen, und ich bekomme den "Schlafmodus" nicht hin. Ohne den läuft alles einwandfrei.
Aber ich habe erstmal grundsätzliche Fragen. Deine FB arbeitet mit einer 3V Zelle. In der Schaltung hast Du keinen externen Quarz also arbeitest Du mit dem RC Oszillator ? (Im Datenblatt vom Tiny24V las ich "8MHz = 5V".?)
Ich habe es mit dem "Idle" Befehl versucht und auf meinem Testboard mit Mega8 geht alles wunderbar, sobald ich das Programm auf dem Tiny24V mit 3V anwende , wacht der anscheinend nicht mehr auf. Man hat mir geraten , die Sache mit einem externen Quarz zu betreiben , da es sein kann , daß der RC-Oszillator bei 3V nicht sicher anschwingt ,aber ich sehe daß Du das hinbekommen hast ohne Quarz ?
Über Powerdown hab ich in der Bascom Hilfe nicht viel gefunden. Aber soweit ich gelesen habe ,ist das die Methode mit dem Pinchangeinterrupt ?
Ich würde mich freuen, wenn Du mir auf die Sprünge helfen würdest .
Danke
Moto
 
Hallo Moto!

Na, dann erst einmal herzlichen Glückwunsch, dass deine Fernbedienung eigentlich schon läuft.

Wie du es schon richtig erkannt hast, arbeite ich ohne den externen Quarz und nutze nur die interne 1MHz Frequenz.
Für die Funktion ist ein externer Quarz auch nicht dringend erforderlich....

Da ich den Tiny24v verwende, habe ich auch mit den 3V (und weniger) keine Probleme.


Kurz zur Funktion....
Der Schlafmodus ist eigentlich immer aktiv!
Durch den PCINT wecke ich die Fernbedienung auf und lasse den RC5-Code solange senden, wie die Taste gehalten wird.
Gleich danach "fällt" sie wieder in den Schlafmodus zurück.
Ist eigentlich ganz simpel. ;)

Du musst einfach mal mit dem PCINT etwas "spielen", dann kommst du recht schnell dahinter.


Stell doch schon mal deinen vorläufigen Code und den zugehörigen Schaltplan hier ein. Dann können wir den gern gemeinsam durchgehen.

Schöne Grüße,
Cassio
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)