PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bascom RC5 Fernbedinung ATtiny2313 und powerdown Mode Proplem



Der bastler
17.09.2017, 20:50
Hallo Forum Gemeinde und Bastler

Ich wollte gern eine RC5-FGernbedinung Bauen 4Tasten und dann in den schlaf modus gehen, aber irgendwie haut mein code nicht hin
Bitte um Rat und Tipps

$regfile = "attiny2313.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32

Ddrd = &B00000010

Config Portd.6 = Output
Led_gelb Alias Portd.6 'LED GELB - Ob Programm Arbeitet ( Nur zum TESTEN)

'Config Portd.2 = Input
'Portd.2 = 0
Config Portd.3 = Input
Portd.3 = 1
Config Portd.4 = Input
Portd.4 = 1
Config Portd.5 = Input
Portd.5 = 1
Config Portd.5 = Input
Portd.6 = 1

Config Int0 = Low Level
Enable Interrupts
On Int0 Isr_int0
Disable Int0

Dim Geraet As Byte , Kommando As Byte
Dim Togglebit As Byte
Togglebit = 0

Do
If Pind.3 = 0 Then
Led_gelb = 1
Geraet = 0 'Blinker / Lauflicht / Radio
Kommando = 1 'Was wird geschaltet
Rc5send Togglebit , Geraet , Kommando
Waitms 50
Gosub Code
End If
If Pind.4 = 0 Then
Led_gelb = 1
Geraet = 0 'Blinker / Lauflicht / Radio
Kommando = 2 'Was wird geschaltet
Rc5send Togglebit , Geraet , Kommando
Waitms 50
Gosub Code
End If
If Pind.5 = 0 Then
Geraet = 0 'Blinker / Lauflicht / Radio
Kommando = 4 'Was wird geschaltet
Rc5send Togglebit , Geraet , Kommando
Waitms 50
Gosub Code
End If
Loop
End

Code:
Togglebit = 0
Geraet = 0
Rc5send Togglebit , Geraet , Kommando
Waitms 80
Enable Int0
'powerdown
Return
End

Isr_int0:
Disable Int0
Return
Schaltung wird nachgereicht
Vielen Dank und einen schönen Abend Noch
Gruß T Sch.

- - - Aktualisiert - - -

Hier die bilder und schaltung
32875
32876

Danke T Sch.

Searcher
19.09.2017, 17:31
Hallo,
Als erstes fällt mir auf, daß Du Deinem Schaltplan nach einen NPN Transistor als Treiber für die IR-Sendediode an PB3 (OC1A) verwendest (Wie hoch ist der Wert des Basisvorwiderstandes?). Schau mal in der BASCOM Hilfe zu RC5SEND. Dort wird ein PNP Transistor verwendet. In Deinem Setup wird deshalb das IR-Signal invertiert gegenüber dem richtigen RC5 Signal ausgegeben.


aber irgendwie haut mein code nicht hin
... hört sich an wie "geht nicht" und ist keine besonders gute Fehlerbeschreibug ;)

Gruß
Searcher

Der bastler
20.09.2017, 20:49
Hallo forum und gemeinde

Mit den Transistor wahr ein fehler soory, das programm geht in Powerdown und kann danach keine taste drücken?
Verleicht die taster falsch angeschlossen oder in programm?
Danke
Gruß T Sch.

Searcher
21.09.2017, 05:14
Hallo,
funktioniert den die Fernbedienung grundsätzlich?
Verstehe ich das richtig, daß nach Nutzung der Fernbedienung, also Einschalten eines Gerätes per FB, die FB in Powerdown geht und sich dann aber nicht mehr aufwecken läßt?
Das Aufwecken soll dann durch Drücken einer der Tasten zum Einschalten eines Gerätes geschehen?

Gruß
Searcher

Searcher
21.09.2017, 14:40
Hallo Bastler,
ich habe mir das Programm nochmal angeschaut. Es sollte alles funktionieren wenn die richtige Treiberschaltung für die IR-LED nach der Bascom Hilfe verwendet wird.

Allerdings muß an den INT0 (PD2) noch ein Pullup Widerstand angebracht werden oder der interne Pullup mit PORTD.2 = 1 eingeschaltet werden. Sonst floatet der Eingang PD2, hat also keinen definierten Pegel wenn keine Taste gedrückt ist.

Die Funktion von Led_gelb ist mir nicht klar. Sie wird über PIND.3 oder PIND.4 eingeschaltet aber im weiteren Programm nicht mehr ausgeschaltet. Der Powerdown schaltet sie auch nicht ab, da in dem Zustand nur der Oszillator gestoppt wird aber die Portzustände nicht geändert werden. Sie bleibt also immer eingeschaltet auch während des Powerdowns, wenn sie irgendwann einmal eingeschaltet wurde!

Gruß
Searcher

Der bastler
21.09.2017, 19:52
So auf ein neues
Hier die schaltung:
32897
Und der endwurf
32898
Den code ist hier:

$regfile = "attiny2313.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32

'Ddrd = &B00000010

Config Portd.6 = Output
Led_gelb Alias Portd.6 'LED GELB - Ob Programm Arbeitet ( Nur zum TESTEN)

Config Portd.2 = Input
Portd.2 = 1
Config Portd.3 = Input
Portd.3 = 1
Config Portd.4 = Input
Portd.4 = 1
Config Portd.5 = Input
Portd.5 = 1
Config Portd.5 = Input
Portd.6 = 1

Config Int0 = Low Level
Enable Interrupts
On Int0 Isr_int0
Disable Int0

Dim Geraet As Byte , Kommando As Byte
Dim Togglebit As Byte
Togglebit = 0

Do
If Pind.3 = 0 Then
Led_gelb = 1
Geraet = 0 'Blinker / Lauflicht / Radio
Kommando = 1 'Was wird geschaltet
Rc5send Togglebit , Geraet , Kommando
Waitms 50
Gosub Code
End If
If Pind.4 = 0 Then
Led_gelb = 1
Geraet = 0 'Blinker / Lauflicht / Radio
Kommando = 2 'Was wird geschaltet
Rc5send Togglebit , Geraet , Kommando
Waitms 50
Gosub Code
End If
If Pind.5 = 0 Then
Geraet = 0 'Blinker / Lauflicht / Radio
Kommando = 4 'Was wird geschaltet
Rc5send Togglebit , Geraet , Kommando
Waitms 50
Gosub Code
End If
Loop
End

Code:
Togglebit = 0
Geraet = 0
Rc5send Togglebit , Geraet , Kommando
Waitms 80
Enable Int0
Led_gelb = 0
'Powerdown
Return
End

Isr_int0:
Disable Int0
Return

wenn ich unten den powerdown aktivere geht es nur einmal, warum? Bitte um Rat Danke
Gruß T Sch.

Searcher
21.09.2017, 22:12
wenn ich unten den powerdown aktivere geht es nur einmal, warum? Bitte um Rat Danke

WAS geht nur einmal? Welche Taste drückst Du? Was erwartest Du?

Wie ich das sehe, wird RC5SEND zweimal vor dem Powerdown aufgerufen. Das erste Mal nach dem Tastendruck und das zweite Mal im Unterprogramm "Code".

Denn geht es in den Powerdown. Beim nächsten Tastendruck wird der ATTINY wieder über den Lowlevel Interrupt aktiviert und das Spiel beginnt von vorne.

Wenn Du nicht schreibst, was exakt Du tust und dann daraufhin erwartest - was Dein Programm genau tun soll, kann ich Dir nicht weiterhelfen.

Wozu ist gelb_LED da?

Gruß
Searcher

- - - Aktualisiert - - -


.., kann ich Dir nicht weiterhelfen.

Vielleicht doch noch:
Wenn vor dem powerdown der INT0 enabled wird, kann dieser INT0 auch auftreten. Wenn er also nach ENABLE INT0 und vor dem powerdown auftritt, wird INT0 in der ISR disabled. Danach kommt das powersave, aus dem der µC dann nicht mehr durch den disabelten INT0 geweckt werden kann.

Abhilfe: Die ISR leer lassen, also das DISABLE INT0 rauslöschen und zB nach jeder Tastenabfrage nach dem IF PIND ... einfügen. also etwa so:



.
.
If Pind.3 = 0 Then
Disable INT0
Led_gelb = 1
.
.
.
.
Isr_int0:
Return
.
.



Wozu ist gelb_LED da?

Hab es in den Kommentaren gesehen.

Gruß
Searcher

PS: Interesante Lösung. Mich stört aber noch, das die Tasten nicht entprellt sind. Es fehlt ein Abblockkondensator (http://rn-wissen.de/wiki/index.php?title=Abblockkondensator) über dem ATTiny2313 und eventuell noch ein Pufferelko ... und die waitms :-(

Deine Anhänge aus dem letzten post kann ich nicht öffnen. Im Schaltplan aus dem ersten post fehlen zB die Werte für die Widerstände.

Der bastler
23.09.2017, 12:55
Hallo Searcher und Forum
Also die RC5 Fernbedinung soll ja mal in ein handgeäuse verbaut werden, nur so mal neben bei

Zur Funktion der Fernbedinung:
-----------------------------------------------------------------------------
Wenn ich TASTE1 Drücke soll das programm code senden in POWERDOWN gehen.
beim erneuten drücken der TASTE1 code senden und un POWERDOWN gehen
-----------------------------------------------------------------------------
Wenn ich TASTE2 Drücke soll das programm code senden in POWERDOWN gehen.
beim erneuten drücken der TASTE2 code senden und un POWERDOWN gehen
-----------------------------------------------------------------------------
Wenn ich TASTE3 Drücke soll das programm code senden in POWERDOWN gehen.
beim erneuten drücken der TASTE3 code senden und un POWERDOWN gehen
-----------------------------------------------------------------------------

so hätte ich das gerne, aber leider geht das nicht
hier der code den ich geändert habe:

$regfile = "attiny2313.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32

'Ddrd = &B00000010

Config Portd.6 = Output
Led_gelb Alias Portd.6 'LED GELB - Ob Programm Arbeitet ( Nur zum TESTEN)

Config Portd.2 = Input
Portd.2 = 1
Config Portd.3 = Input
Portd.3 = 1
Config Portd.4 = Input
Portd.4 = 1
Config Portd.5 = Input
Portd.5 = 1
Config Portd.5 = Input
Portd.6 = 1

Config Int0 = Low Level
Enable Interrupts
On Int0 Isr_int0
Disable Int0

Dim Geraet As Byte , Kommando As Byte
Dim Togglebit As Byte
Togglebit = 0

'NEU
Led_gelb = 0
'NEU

Do
If Pind.3 = 0 Then
Led_gelb = 1
Geraet = 0 'Blinker / Lauflicht / Radio
Kommando = 1 'Was wird geschaltet
Rc5send Togglebit , Geraet , Kommando
'NEU
Disable Int0
'NEU
Waitms 50
Gosub Code
End If
If Pind.4 = 0 Then
Led_gelb = 1
Geraet = 0 'Blinker / Lauflicht / Radio
Kommando = 2 'Was wird geschaltet
Rc5send Togglebit , Geraet , Kommando
'NEU
Disable Int0
'NEU
Waitms 50
Gosub Code
End If
If Pind.5 = 0 Then
Geraet = 0 'Blinker / Lauflicht / Radio
Kommando = 4 'Was wird geschaltet
Rc5send Togglebit , Geraet , Kommando
'NEU
Disable Int0
'NEU
Waitms 50
Gosub Code
End If
Loop
End

Code:
'Togglebit = 0 'AUS
'Geraet = 0 'AUS
'Rc5send Togglebit , Geraet , Kommando 'AUS
Waitms 80
Enable Int0
Led_gelb = 0
Powerdown
Return
End

Isr_int0:
'Disable Int0 'AUS
Return

wenn ich den code zum chip sende alles ok soweit und dann auf die TASTE1 Drücke wird nicht mal der code gesendet und (led_gelb) geht an und bleibt an nichts geht mehr, auser neu programieren....
noch was zur schaltung, der abblokkodensator ist im IC-Halterrung verbaut und der kondensator ja der fehlt wahr ja auf schnell gemacht.....

Soweit erst mal danke und Lieben Gruß
T. Sch.

Searcher
23.09.2017, 13:43
Hallo Bastler,
ich habe im Code ein paar Stellen farbig markiert:



$regfile = "attiny2313.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32

'Ddrd = &B00000010 'Würde PORTD.1 auf Output schalten. Ich würde die komplette Zeile rauslöschen

Config Portd.6 = Output
Led_gelb Alias Portd.6 'LED GELB - Ob Programm Arbeitet ( Nur zum TESTEN)

Portd.1 = 1 'Pullup auf portd.1, Portds sind ist defaultmäßig nach reset sowieso auf Input.
Config Portd.2 = Input
Portd.2 = 1
Config Portd.3 = Input
Portd.3 = 1
Config Portd.4 = Input
Portd.4 = 1
Config Portd.5 = Input
Portd.5 = 1
Config Portd.5 = Input 'ist doppelt und kann entfallen
Portd.6 = 1 'Einschalten von LED_gelb





...dann auf die TASTE1 Drücke wird nicht mal der code gesendet und (led_gelb) geht an und bleibt an nichts geht mehr, auser neu programieren....


Wo ist TASTE1 angeschlossen? Bei PORTD.1 fehlt Aktivierung von Pullup (oben in grün hinzugefügt)
Portd.5 ist sowieso Input und wird darüber hinaus auch zwei Mal als Input konfiguriert.

Fuses richtig gesetzt? Insbesondere CKDIV8 für 8MHz Systemtakt.

Das DISABLE INT0 würde ich direkt nach dem IF PIN Befehl einfügen. Das Verhalten kenne ich auch nicht genau und kann ich im Augenblick auch nicht testen.

Sonst fällt mir im Augenblick nichts Neues ein :(

Gruß
Searcher

Der bastler
23.09.2017, 16:49
PonyPro2000 Fuse einstellung
32900

Nachreichen...

Searcher
23.09.2017, 17:58
PonyPro2000 Fuse einstellung

Die Fuses sind richtig.
Benutzt Du nicht die BASCOM IDE zum Fuses setzen/lesen?


Hast Du mal ausprobiert, den Interrupt sofort nach Abfrage der Tasten zu disablen, so wie unten angedeutet?

Durch den Tastendruck wird über den INT0 der µC aus dem powerdown herausgeholt.
Wird der Interrupt nicht sofort disabled, könnte durch den Tastendruck, den man ja nicht innerhalb von µs oder wenigen Millisekunden lösen kann, ein weiterer bzw viele weitere INT0 erkannt werden. Die ISR würde andauernd angesprungen werden, führt zwar keine Kommados aus aber nimmt Rechenzeit weg. Weitere Konsequenzen traue ich mir nicht auszumahlen ... ;)
Möglicherweise müßte man das Konzept des Programms überarbeiten oder auch mal testen ob man ohne ISR auskommt.


If Pind.3 = 0 Then
Disable Int0
Led_gelb = 1
Geraet = 0 'Blinker / Lauflicht / Radio
Kommando = 1 'Was wird geschaltet
Rc5send Togglebit , Geraet , Kommando
'NEU
' Disable Int0
'NEU
Waitms 50
Gosub Code
End If

Gruß
Searcher