Kleine RC5 Fernbedienung

Danke für die Tipps. Das wichtigste war erstmal die Aussage daß die internen 1 MHz ausreichen und bei 3V sicher funktionieren.
Da ich mit Idle gearbeitet habe (was ja nicht so effektiv stromspart), werde ich erstmal auf PCINT und Powerdown umstellen. Falls ich nicht klarkomme ,freue ich mich auf lehrreiche Hilfe. Ich probiere lieber lange , als daß ich mir was fertiges vorsetzen lasse. Komischerweise lerne ich so besser...
Also nicht wundern , wenn es etwas dauert.
 
Nochmals Danke, hat auf Anhieb geklappt.
Das Thema ist in Bascom einfach zu realisieren. Nun wird meine Batterie auch lange durchhalten. Auch nur um die 5 µA wenn nichts gedrückt. (Was mein Multimeter so hergibt) Vorher um die 800 µA !
Ich hatte bedenken, weil ich die Tastendrucklänge erfasse (wenn auch einfach).
Du kannst ja nochmals den Code überfliegen , wenn es Dir nichts ausmacht.
Code:
'**********************************************************
'Compiler            : BASCOM-AVR
'Hardware            : IR-LED an PA.6 (OC1 !!)
'                      Taster an PA.7
'
'Chip type           : ATTiny24
'**********************************************************

$regfile = "attiny24.dat "
$crystal = 1000000                                          '8MHz RC Oszillator
$hwstack = 10                                               'geteilt durch 8
$swstack = 10
$framesize = 20

On Pcint0 Aufwachen
Enable Pcint0
Enable Interrupts
Set Mcucr.sm1

Ddra.7 = 0                                                  'Pin PA7 ist Eingang
Porta.7 = 1                                                 'Pull up Widerstand ein
Ddra.6 = 1
Porta.6 = 0                                                 'PinA.6 = Ausgang

Dim Togbit1 As Byte                                       'Variablenname und Typ festlegen
Dim Togbit2 As Byte
Dim Command As Byte
Dim Command1 As Byte
Dim Address As Byte
Dim A As Byte

Command = 5
Command1 = 2                                                'Kommando
Togbit1 = 0                                                 '0 or 32 zum Setzen des Toggle-Bits
Togbit2 = 32                                                '0 or 32 zum Setzen des Toggle-Bits
Address = 0                                                 'Adresse für TV

Do                                                          'Beginn Schleife

        A = 0
         While Pina.7 = 0
         Waitms 10
         Incr A
         Wend

         If A > 50 Then

        Waitms 100                                          'warte 100 Millisekunden
    Rc5send Togbit1 , Address , Command                     'sende RC5-Signal
    Rc5send Togbit2 , Address , Command
    Gosub Schlafen
         End If

         If A > 1 And A < 50 Then

        Waitms 100                                          'warte 100 Millisekunden
    Rc5send Togbit1 , Address , Command1                    'sende RC5-Signal
    Rc5send Togbit2 , Address , Command1
    Gosub Schlafen
         End If




Loop                                                        'zum Beginn der Schleife

End

Aufwachen:
         Reset Mcucr.se                                     'powerdown disabled
      Pcmsk0 = &B00000000                                   'PCI Maske zurückgesetzt
   Return

Schlafen:
            Pcmsk0 = &B10000000                             'PCI Maske für PCINT0 an PortA7
         Set Mcucr.se                                       'powerdown enabled
      !Sleep
   Return

Ich habe die IR LED direkt an einem Port dran (laut Datenblatt 40mA pro Port) da ich nur 2m überbrücken muß. Nun wird ja moduliert. Zur Zeit habe ich 75 Ohm als Vorwiderstand zwischen. Wäre für Gleichstrom 40 mA bei 3V. kann ich bei Bedarf weiter runter , oder ist es ratsam Ein Transistor wie bei Deinem Schaltbild zu verwenden ?
 
Hallo Moto!

Na siehst du, viele Wege führen ans Ziel! ;)

Ich habe deinen Code zwar nicht ausprobiert und nur mal überflogen, aber wenn du schreibst dass er funktioniert, dann ist doch alles bestens! :)


In meinem Programm arbeite ich genau "entgegengesetzt"....

Meine Hauptschleife besteht lediglich aus:
Do

Powerdown

Loop



Durch den PCINT, der im Rumpf aktiviert wird, rufe ich die Subroutine auf, um den passenden RC5-Code zu senden.
Code:
' PCINT = Pin Change Interrupt aktivieren

' Pin Change Mask 0 (PCINT0-7) benutzen
Enable Pcint0

' Bei einem Interrupt, springe zur ISR Aktiv
On Pcint0 Aktiv

' Überwache PCINT 3, 4, 5 und 7
Pcmsk0 = &B1011_1000


Du siehst also... es gibt immer mehrere Wege sein Ziel zu erreichen!
Und gelernt hast du auf diese Weise auch noch etwas! :)


Gratuliere also ! :flowers:

Cassio
 
Hallo,

ich baue auch grade an einer kleinen Fernbedienung mit Drehencoder. Später soll man durch Drehen des Encoders die Farbe von RGB Leds ändern können. Jetzt aber habe ich grad ein Problem: Wie kann ich den Sleepmode benutzen? Ich würde den AVR gern in den Schlaf schicken wenn gerade nicht am Encoder gedreht wird. Das wird aber ein problem mit der Encoder Funktion in Bascom geben:hmpf:.

Nebenbei: Ich habe gesehen dass ihr diese PCint Funktion nutzt. Ist die irgendwo dokumentiert oder steh ich grad mächtig aufm Schlauch:eek:?

Mfg,
Flo
 
Hallo Flo,

Nebenbei: Ich habe gesehen dass ihr diese PCint Funktion nutzt. Ist die irgendwo dokumentiert oder steh ich grad mächtig aufm Schlauch:eek:?
ich schubs dich mal vom Schlauch runter ...

PCint ist PinChangeInterrupt. Die steht in den Datenblättern der Typen die das können.
Du hast da eine mehrstufige Konfiguration für den Interrupt. Will heißen ...
- Es exisitert ja die globale Interruptfreigabe.
- Dann sind da mehrere PinChange Interrupts (PCINT0,PCINT1,PCINT2,...)
- und es existieren noch Tabellen in denen man angibt welche IO-Pins des jeweiligen PCINTx aktiv sein sollen

Der PinChangeInterrupt reagiert auf Pegeländerungen an den Pins. Du kannst also nicht nur auf fallende oder nur auf steigende Flanke triggern lassen. Es wird also immer bei jeder Flanke ein Interrupt ausgelöst.

Gruß
Dino
 
Hallo,

danke dir. Das muss ich mir gleich auf meine Merkzettel schreiben, denn das wird bestimmt noch irgendwann sehr nützlich.
Das Programm für die Fernbedienung ist jetzt bis auf den Sleep Mode fertig. Ich werde im Laufe des Tages noch Schaltplan und Code hochladen, damit man das Problem besser versteht in dem ich grad stecke:D . Nur durch Drehen des Drehencoders muss der Atmega aus dem Schlaf geweckt werden und soll danach auch sofort wieder zurückfallen. Das schlafen legen geht ohne Probleme, aber das aufwecken bekomme ich nicht hin, da der Encoder keinen Interrupt auslöst (auch wenn ich ihn auf int0 lege) :p
schem..png

Edit: Schaltplan ist jetzt da, aber ein bsischen klein. Einfach draufdrücken, dann wird er grösser :p

Mfg,
Flo
 
Hier noch der Code. In der Beschreibung oben steht die Funktion und die Probleme:)


Code:
'++++++++++++++++++++++++++++++++++++IR-fernbedienung für RGBW-Projekt++++++++++++++++++++++++++++++++++++++
'von Eberl Florian (2011)
'Aufgabe: Übertragen von Signalen an einem Empfänger der die komplette Farbpalette durcharbeitet.
'Wird am Drehencoder gedreht, dann sendet die fernbedienung einen Code (mehr/weniger), welcher bewirkt,
'dass das Farbrad "Weiterläuft". Bei Betätigen des Tasters im Encoder springt Die Farbe wieder auf Weiss.

'Probleme: Wakeup nicht möglich bei Benutzung des Sleep Befehls, Drehimpulsgeber von reichelt scheint Encoder
'Befehl zu verwirren----> Bei 1 Drehung 30% "Mehr" und 70% "weniger"....nie sortenreines "mehr" oder "weniger"
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++




$regfile = "attiny2313.dat"
$crystal = 8000000


'#######################Deklarationen####################

'I/Os
Config Pind.4 = Input                                       'A-Pin Encoder
Config Pind.5 = Input                                       'B-Pin Encoder
Portd.4 = 1                                                 'Pullups Encoder
Portd.5 = 1

Config Pind.2 = Input                                       'Wakeup Taster Encoder
Portd.2 = 1                                                 'Taster Pullup
Config Portb.1 = Output                                     'Leds an der platine--> derzeit funktionstest
Config Portb.3 = Output                                     'IR-Leds


'Variablen
Dim Togbit As Byte , Command As Byte , Address As Byte ,
Dim Togglebit As Bit                                        'Keine ahnung ob Bascom selbst toggelt :(
Togglebit = 0
Address = 0
Dim E As Byte                                               'Encoder Byte....nicht genutzt


'Timer usw.
Config Int0 = Low Level
On Int0 Weiss
Enable Interrupts
Enable Int0



'#######################Arbeitsschleife#####################

Do

Togbit = Togglebit                                          'Togbit 1-0-1-0....
E = Encoder(pind.4 , Pind.5 , Weniger , Mehr , 1)           'Encoder Lesen , warten auf eingabe
Rc5send Togbit , Address , Command                          ' rc5 code senden

Loop


'#######################ISRs################################


Mehr:
Command = 12
Toggle Togglebit
Toggle portb.1
Return

Weniger:
Command = 8
Toggle Togglebit
Toggle portb.1
Return


Weiss:
Command = 5
Toggle Togglebit
Toggle portb.1
Return



End

Bitte helft mir. Das Projekt soll bald fertig sein. Achja: Gibts eigentlich beim Code keine Bascom farbgebung mehr? Wäre schade:(

Edit: Sorry für den Doppelpost, faslchen Button erwischt:angel:
 
Hallo Flo,

Nur durch Drehen des Drehencoders muss der Atmega aus dem Schlaf geweckt werden und soll danach auch sofort wieder zurückfallen. Das schlafen legen geht ohne Probleme, aber das aufwecken bekomme ich nicht hin, da der Encoder keinen Interrupt auslöst (auch wenn ich ihn auf int0 lege) :p
Wenn du den ATmega durch drehen aufwecken willst, warum legst du dann den Drucktaster des Drehgebers auf INT0 ??
Damit kannst du ihn nur durch draufdrücken aufwecken. Du mußt eines der Phasensignale (A oder B) auf den INT0 legen.

Aber nach dem Aufwecken dann den INT0 abschalten damit du den armen Prozessor nicht so sehr streßt. Aber vor dem Einschlafen nicht vergessen den INT0 wieder einzuschalten.

Edit: Schaltplan ist jetzt da, aber ein bsischen klein. Einfach draufdrücken, dann wird er grösser :p
Der Schaltplan ist genau in der richtigen Größe. Schön in PNG-Format damit es ne scharfe Sache wird und auch einfach nach dem Eagle-Export hier reingepackt. Das paßt schon.

Gruß
Dino
 

Ü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)