Bascom RC5 Empfänger Probleme

Hallo Cassio,
kann mein Programm gerne veröffentlichen, nur macht das derzeit keinen Sinn, da ich ja zum testen der Infrarot FB ein
neues angefangen habe. Wenn das soweit mal funktioniert, dann kümmer ich mich darum die beiden Teile zu vereinen.
Das komplette sieht derzeit also so aus:
Code:
$regfile = "m644def.dat"
$crystal = 16000000
$lib "mcsbyte.lbx"

Config Lcdpin = Pin , Db4 = Porta.2 , Db5 = Porta.3 , Db6 = Porta.4 , Db7 = Porta.5 , E = Porta.1 , Rs = Porta.0
Config Lcd = 16 * 2
Const Timsk = Timsk0                                        'configure lcd screen
Config Rc5 = Pinc.0
Config Pind.6 = Output

Config Porta = Output                                       'LCD Display

Dim Adress As Byte
Dim Command As Byte
Adress = 255
Enable Interrupts
Cursor Off                                                  ' kein Cursor auf LCD anzeigen
Cls                                                         ' LCD löschen

Lcd "Adress :"
Lowerline
Lcd "Command:"
Do
Pind.6 = Pinc.0
If Adress < 255 Then
  Getrc5(adress , Command)                                  ' RC5-Fernbedienung einlesen
    Command = Command And &B01111111                        ' Togglebit löschen
    Locate 1 , 10
    Lcd Adress
    Locate 2 , 10
    Lcd Command
    Wait 1
End If
Loop

In meinem ursprünglichen Programm ist der Timer 0 auch noch frei, somit habe ich da schon mal Glück gehabt :)
Die Ausführung mit meinen Prescale werten waren nur dazu da, um zu zeigen das ich auch den 16Mhz Quartz verwende und somit die Fuse Bits entsprechend gesetzt sind.
 
Hallo Tenor!

Ach, du hast jetzt für den RC5 Empfang ein ganz neues Programm auf einem leeren Mega644 begonnen.
OK, dann sollten die anderen Programmteile keine Probleme bereiten. :wink:


Allerdings hast du deine GETRC5() Abfrage an die falsche Stelle geschrieben.
Schau mal.....
Code:
Adress = 255

If Adress < 255 Then
  [COLOR="#FF0000"][B]Getrc5(adress , Command)[/B][/COLOR]                                  ' RC5-Fernbedienung einlesen
    Command = Command And &B01111111                        ' Togglebit löschen
    Locate 1 , 10
    Lcd Adress
    Locate 2 , 10
    Lcd Command
    Wait 1
End If
Loop


Der Empfang wird ja erst abgefragt, wenn die Adresse kleiner 255 ist.
Wie soll diese aber kleiner werden, wenn die Abfrage erst NACH der Bedingung kommt. :wink:

Setzt also die GETRC5() Abfrage mal VOR die IF-THEN Auswertung.
Das IF-THEN ist doch eigentlich nur für dein Display gedacht.


Grüße,
Cassio
 
Danke Cassio,
das war natürlich falsch.
Nach drücken von ca. 100 Tasten von 4 FBs, habe ich glatt 2 Knöpfe gefunden die Funktionieren :)
Da zeigt er mir eine Adresse und 2 verschiedene Kommandos an.

Somit liegt mein Problem jetzt wohl nur noch an der FB...

Hast du Erfahrung mit RC5 und Universalfernbedienungen? Die beiden Tasten die funktionierten waren von der Entertain FB.
Und 2 Knöpfe sind mir zu wenig :)
 
Hallo Tenor!

Damit hätten wir das mit dem RC5-Empfang dann wohl geklärt. :wink:


Warum baust du dir nicht selber eine FB?
Die kann alles senden was du möchtest. :D

Einfacher geht es natürlich, wenn du dir eine billige Universal-FB besorgst.
Es gibt manchmal sogar welche bei KIK für ein oder zwei Euro.

Die können mit Sicherheit auch den RC5-Code..... und falls nicht, hast du nur einen Euro in den Sang gesetzt. :D


Ach so....
Ein Entertain System habe ich natürlich nicht.
In meiner Freizeit helfe ich doch schon anderen bei ihren Problemen..... wann soll ich dann noch Fernsehen. :cool:


Grüße,
Cassio
 
Das ist natürlich auch richtig :)

Hab natürlich bei der letzten Bestellung die entsprechenden Teile nicht mitbestellt...
Bei der Gelegenheit muss ich dann mal eine FB mitbestellen, so lange die eine haben..
 
Hallo!

Bei Pollin gibt es sogar eine BETTY für 3,95
K620182.JPG


Markus hat hier auch mal etwas zur BETTY geschrieben und diese sogar modifiziert.


Ich denke daher mal, dass diese FB auch den RC5-Code kann.... ist aber jetzt nur eine Vermutung!
Obendrein sieht sie gut aus und wäre damit sogar "wohnzimmertauglich". :D


Grüße,
Cassio
 
Das stimmt!
Die hört sich erstmal gut an, werde ich auf jeden Fall bei der nächsten Bestellung berücksichtigen ;)
 
Nach Stunden habe ich endlich einen Code meiner universal FB gefunden, der auch funktioniert :)
Per RC5 lassen sich nun Relais an und aus schalten.
Jetzt habe ich den Code in meine eigentlichen Aquariumcontroller code integriert.

Prinzipiell funktioniert es erstmal, allerdings werden manche Signale manchmal nicht erkannt.
Soll heißen, vorher (mit dem Beispielcode) musste ich 2-3 mal drücken, jetzt 20-30 mal!

Wie kann ich das verbessern? An der Hardware hat sich nichts verändert.
Der Timer interrupt kommt ja nur jede sekunde, das kann ja nicht das problem sein.
Kann es ein Problem mit dem PWM sein?

Hier mal mein Code:
Code:
$regfile = "m644def.dat"
$crystal = 16000000
$lib "mcsbyte.lbx"
Const Timsk = Timsk0

Config Lcdpin = Pin , Db4 = Porta.2 , Db5 = Porta.3 , Db6 = Porta.4 , Db7 = Porta.5 , E = Porta.1 , Rs = Porta.0
Config Lcd = 16 * 2                                         'configure lcd screen

Evg Alias Portc.3                                           'Leuchtstoffröhre ein / aus
Moonlight Alias Portc.2                                     'Mondlicht
Backlight Alias Portc.1                                     'Hintergrundbeleuchtung
T_menu Alias Pina.6
T_hoch Alias Pina.7
T_runter Alias Pinc.5
T_home Alias Pinc.4
Led Alias Portd.6                                           ' LED Hintergrundbeleuchtung

Config Porta = Output                                       'LCD Display
Config Pind.7 = Output                                      'PWM
Config Evg = Output                                         'Relais EVG Ein / Aus
Config Moonlight = Output                                   'Relais Moonlight Ein / Aus
Config Backlight = Output                                   'Relais Backlight Ein / Aus
Config T_menu = Input
Config T_hoch = Input
Config T_runter = Input
Config T_home = Input
Config Rc5 = Pinc.0                                         ' IR --> RC5

Dim Isekunde As Byte , Prozw1 As Single , Prozw As Single
Dim Isminute As Byte , Dauer As Byte
Dim Istunde As Byte , Pwm_stopstd As Byte , Pwm_stopmin As Byte , Maxdim As Byte
Dim Proz1 As Single
Dim Proz2 As Single , Maxpwm1 As Single , Prozw3 As Byte
Dim Pwm_wert As Single
Dim Pwm_trigger As Byte , Pwm_startmin As Byte , Maxpwm As Byte , Prescale As Single
Dim Flanke1 As Byte , Flanke2 As Byte , Flanke3 As Byte , Flanke4 As Byte , Pwm_startstd As Byte
Dim Prescale2 As Byte
Dim Sstunde As String * 2 , Sminute As String * 2 , Pwm_startmins As String * 2 , Pwm_startstds As String * 2
Dim Daysek As Dword , Dimupsek As Dword , Dimupsek2 As Dword , Dimupsek3 As Dword , Dimdownsek As Dword , Dimdownsek2 As Dword , Dimdownsek3 As Dword
Dim Daysek2 As Dword , Daysek3 As Dword , Dimdownsekstd As Dword , Dimupsekstd As Dword
Dim Adress As Byte , Command As Byte

Enable Interrupts

'**************************************
'Konfiguration Timer 2 für Hardware-PWM an OC2 (B.3)
Config Timer2 = Pwm , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 128       'Timer 2 = PWM für 1-10V Dimmer
Config Timer1 = Timer , Prescale = 256                      'Timer1 für den Sekundentakt
Enable Timer2
Timer2 = 0
Start Timer2
Const Timervorgabe = 3036
On Timer1 Timer_irq
Enable Timer1
'**************************************
Maxdim = 170                                                '255 = Hardwaremax - lampe bei 170 100 %
Isekunde = 0
Isminute = 18
Istunde = 13
Pwm_startstd = 8
Pwm_startmin = 0
Pwm_stopstd = 18
Pwm_stopmin = 0
Maxpwm = 50
Pwm_trigger = 0
Pwm_wert = 0
Flanke1 = 0
Flanke2 = 0
Flanke3 = 0
Dauer = 0
'**************************************
Main:
Initlcd                                                     'init display again
Cursor On
Cls
Do
Getrc5(adress , Command)                                    ' RC5-Fernbedienung einlesen
If Adress < 255 Then
   Command = Command And &B01111111
   Locate 2 , 8
   Lcd Command
End If
If Daysek >= 86401 Then Daysek = 0                          ' 86400 = 1 Tag in Sekunden
'**************************************
Dimupsek3 = Pwm_startstd * 3600
Dimupsek2 = Pwm_startmin * 60
Dimupsek = Dimupsek2 + Dimupsek3                            ' Sekunde bestimmen ab der der Dimmvorgang gestartet werden soll
'**************************************
Dimdownsek3 = Pwm_stopstd * 3600
Dimdownsek2 = Pwm_stopmin * 60
Dimdownsek = Dimdownsek2 + Dimdownsek3                      ' Sekunde bestimmen ab der der Dimmvorgang gestartet werden soll
'**************************************
Daysek3 = Istunde * 3600                                    ' Die Tagessekunde anhand der aktuellen Uhrzeit einstellen
Daysek2 = Isminute * 60
Daysek = Daysek2 + Daysek3
'**************************************
Dimdownsekstd = Dimdownsek + 3600
'Prozente und Teilerberechnung für die PWM
Maxpwm1 = Maxpwm                                            'byte nach Single konvertieren
Prozw1 = Maxpwm1 / 100
Prozw = Maxdim * Prozw1
Prozw3 = Prozw                                              'Prozenztwert in Digits
Prescale = 3600 / Prozw                                     ' Auflösung des Dimm Vorgangs bestimmen 3600 = 1 Stunde zum Dimmen
Prescale2 = Prescale
'**************************************
Dimupsekstd = Dimupsek + 3600                               'Dimmzeit + einer Stunde damit das Ende des Dimmvorgangs bestimmt werden kann

Ocr2a = Pwm_wert                                            'Ausgabe Spannung PWM  (0-255)

Pwm_wert = Pwm_trigger                                      'PWM Wert bestimmen
Proz1 = Pwm_wert / Maxdim                                   'Prozent Wert berechnen für Ausgabe LCD --> 170 max. Helligkeit am Display (255 ist der Maxwert am Ausgang)
Proz2 = Proz1 * 100                                         'Prozent Wert berechnen für Ausgabe LCD
Sstunde = Str(istunde)
Sstunde = Format(sstunde , "00")
Sminute = Str(isminute)
Sminute = Format(sminute , "00")
Pwm_startstds = Str(pwm_startstd , "00")                    'Formatierung auf 2 Stellen
Pwm_startstds = Format(pwm_startstds , "00")
Pwm_startmins = Str(pwm_startmin , "00")
Pwm_startmins = Format(pwm_startmins , "00")

If Daysek => Dimupsek And Dimupsek < Dimdownsek Then
   Evg = 1                                                  'EVG einschalten wenn das Dimmen beginnen soll
   'Backlight = 1                                            'Blaues Hintergrundlicht ausschalten
   Moonlight = 0                                            'Mondlicht noch einmal ausschalten
End If
If Daysek => Dimdownsekstd Then
   Evg = 0                                                  'EVG ausschalten
   'Backlight = 0                                            'Backlight ausschalten
End If
If Daysek >= Dimdownsek And Daysek < 82800 Then Moonlight = 1       'Mondlicht beim herabdimmen einschalten
If Daysek >= 82800 Then Moonlight = 0                       'Mondlicht um 23:00 Uhr ausschalten

If Command = 2 Then
   Backlight = 0
End If
If Command = 1 Then Backlight = 1

Locate 1 , 1
Lcd Sstunde
Lcd ":"
Lcd Sminute
Locate 1 , 8
Lcd Fusing(proz2 , "##.#") + "%"                            'Prozent Wert Anzeigen
Locate 2 , 1
Lcd Pwm_startstds                                           'Startzeit zum Dimmen
Lcd ":"
Lcd Pwm_startmins
'Locate 2 , 8
'Lcd Pwm_wert

If T_menu = 0 And Flanke2 = 0 Then                          'Menü aufrufen
   Flanke2 = 1
   Goto Menustd
End If
If T_menu = 1 And Flanke2 = 1 Then Flanke2 = 0

Loop


Timer_irq:                                                  ' der Interrupt wird jede Sekunde ausgeführt
   Timer1 = Timervorgabe
   Daysek = Daysek + 1                                      ' Sekunden des gesamten Tages
   Isekunde = Isekunde + 1
   If Isekunde >= 60 Then
      Isekunde = 0
      Isminute = Isminute + 1
   End If
   If Isminute >= 60 Then
      Isminute = 0
      Istunde = Istunde + 1
   End If
   If Istunde >= 24 Then
      Istunde = 0
   End If
'**************************************
   If Daysek > Dimupsek And Daysek < Dimdownsek And Daysek < Dimupsekstd Then       'Trigger nur erhöhen wenn Startzeit erreicht ist
      If Dauer > Prescale2 And Pwm_trigger < Maxdim Then    'Trigger nur erhöhen wenn prescale erreicht ist (Teiler damit auf eine Stunde gedimmt wird)
         Pwm_trigger = Pwm_trigger + 1                      '170 ist max sonst 255
         Dauer = 0
      End If
   End If
'**************************************
   If Daysek > Dimdownsek Then                              'Trigger nur verringern wenn die Startzeit für das Herunterdimmen erreicht ist
      If Dauer > Prescale2 And Pwm_trigger > 0 Then         'Trigger nur verringern wenn prescale erreicht ist (Teiler damit auf eine Stunde gedimmt wird)
         Pwm_trigger = Pwm_trigger - 1
         Dauer = 0
      End If
   End If
'**************************************
   Dauer = Dauer + 1
Return

Menustd:
   Cls
   Lcd "Stunde : "
   Do
   Locate 1 , 10
      Lcd Istunde
      If T_hoch = 0 And Flanke1 = 0 Then                    'Stunde um eins erhöhen
           Istunde = Istunde + 1
           Flanke1 = 1
      End If
      If T_hoch = 1 And Flanke1 = 1 Then Flanke1 = 0
      If T_runter = 0 And Flanke3 = 0 Then                  'Stunde um eins verringern
           Istunde = Istunde - 1
           Flanke3 = 1
      End If
      If T_runter = 1 And Flanke3 = 1 Then Flanke3 = 0
      If T_menu = 0 And Flanke2 = 0 Then
         Flanke2 = 1
         Goto Menumin
      End If
      If T_menu = 1 And Flanke2 = 1 Then Flanke2 = 0
      If T_home = 1 And Flanke4 = 0 Then
         Flanke4 = 1
         Goto Main
      End If
      If T_home = 0 And Flanke4 = 1 Then Flanke4 = 0
   Loop
Return

Menumin:
   Cls
   Lcd "Minute : "
   Locate 1 , 10
   Lcd Isminute
   Do
      Locate 1 , 10
      Lcd Isminute
      If T_hoch = 0 And Flanke1 = 0 Then                    'Minute um eins erhöhen
         Isminute = Isminute + 1
         Flanke1 = 1
      End If
      If T_hoch = 1 And Flanke1 = 1 Then Flanke1 = 0        'Flanke entfernen
      If T_runter = 0 And Flanke3 = 0 Then                  'Minute um eins verringern
         Isminute = Isminute - 1
         Flanke3 = 1
      End If
      If T_runter = 1 And Flanke3 = 1 Then Flanke3 = 0
      If T_menu = 0 And Flanke2 = 0 Then
         Flanke2 = 1
         Goto Menustartstd
      End If
      If T_menu = 1 And Flanke2 = 1 Then Flanke2 = 0
      If T_home = 1 And Flanke4 = 0 Then
         Flanke4 = 1
         Goto Main
      End If
      If T_home = 0 And Flanke4 = 1 Then Flanke4 = 0
   Loop
Return

Menustartstd:
   Cls
   Lcd "Start Stunde"
   Do
      Locate 2 , 1
      Lcd Pwm_startstd
      If T_hoch = 0 And Flanke1 = 0 Then                    'Start Wert für das Dimmen erhöhen
         Pwm_startstd = Pwm_startstd + 1
         Flanke1 = 1
      End If
      If T_hoch = 1 And Flanke1 = 1 Then Flanke1 = 0        'Flanke entfernen
      If T_runter = 0 And Flanke3 = 0 Then                  'Start Stunde um eins verringern
         Pwm_startstd = Pwm_startstd - 1
         Flanke3 = 1
      End If
      If T_runter = 1 And Flanke3 = 1 Then Flanke3 = 0
      If T_menu = 0 And Flanke2 = 0 Then
         Flanke2 = 1
         Goto Menustartmin
      End If
      If T_menu = 1 And Flanke2 = 1 Then Flanke2 = 0
      If T_home = 1 And Flanke4 = 0 Then
         Flanke4 = 1
         Goto Main
      End If
      If T_home = 0 And Flanke4 = 1 Then Flanke4 = 0
   Loop
Return

Menustartmin:
   Cls
   Lcd "Start Minute"
   Do
      Locate 2 , 1
      Lcd Pwm_startmin
      If T_hoch = 0 And Flanke1 = 0 Then                    'Start Wert für das Dimmen erhöhen
         Pwm_startmin = Pwm_startmin + 1
         Flanke1 = 1
      End If
      If T_hoch = 1 And Flanke1 = 1 Then Flanke1 = 0        'Flanke entfernen
      If T_runter = 0 And Flanke3 = 0 Then                  'Start Minute um eins verringern
         Pwm_startmin = Pwm_startmin - 1
         Flanke3 = 1
      End If
      If T_runter = 1 And Flanke3 = 1 Then Flanke3 = 0
      If T_menu = 0 And Flanke2 = 0 Then
         Flanke2 = 1
         Goto Max_pwm
      End If
      If T_menu = 1 And Flanke2 = 1 Then Flanke2 = 0
      If T_home = 1 And Flanke4 = 0 Then
         Flanke4 = 1
         Goto Main
      End If
      If T_home = 0 And Flanke4 = 1 Then Flanke4 = 0
   Loop
Return

Max_pwm:
   Cls
   Lcd "Max Beleuchtung in %"
   Do
      Locate 2 , 1
      Lcd Maxpwm
      If T_hoch = 0 And Flanke1 = 0 Then                    'Maximalwert auf dem gedimmt werden soll
         Maxpwm = Maxpwm + 1
         If Maxpwm > 100 Then Maxpwm = 100
         Flanke1 = 1
      End If
      If T_hoch = 1 And Flanke1 = 1 Then Flanke1 = 0        'Flanke entfernen
      If T_runter = 0 And Flanke3 = 0 Then
         Maxpwm = Maxpwm - 1
         Flanke3 = 1
      End If
      If T_runter = 1 And Flanke3 = 1 Then Flanke3 = 0
      If T_menu = 0 And Flanke2 = 0 Then
         Flanke2 = 1
         Goto Menustopstd
      End If
      If T_menu = 1 And Flanke2 = 1 Then Flanke2 = 0
      If T_home = 1 And Flanke4 = 0 Then
         Flanke4 = 1
         Goto Main
      End If
      If T_home = 0 And Flanke4 = 1 Then Flanke4 = 0
   Loop
Return

Menustopstd:
   Cls
   Lcd "Stop Stunde"
   Do
      Locate 2 , 1
      Lcd Pwm_stopstd
      If T_hoch = 0 And Flanke1 = 0 Then                    'Start Wert für das Dimmen erhöhen
         Pwm_stopstd = Pwm_stopstd + 1
         Flanke1 = 1
      End If
      If T_hoch = 1 And Flanke1 = 1 Then Flanke1 = 0        'Flanke entfernen
      If T_runter = 0 And Flanke3 = 0 Then                  'Start Stunde um eins verringern
         Pwm_stopstd = Pwm_stopstd - 1
         Flanke3 = 1
      End If
      If T_runter = 1 And Flanke3 = 1 Then Flanke3 = 0
      If T_menu = 0 And Flanke2 = 0 Then
         Flanke2 = 1
         Goto Menustopmin
      End If
      If T_menu = 1 And Flanke2 = 1 Then Flanke2 = 0
      If T_home = 1 And Flanke4 = 0 Then
         Flanke4 = 1
         Goto Main
      End If
      If T_home = 0 And Flanke4 = 1 Then Flanke4 = 0
   Loop
Return

Menustopmin:
   Cls
   Lcd "Stop Minute"
   Do
      Locate 2 , 1
      Lcd Pwm_stopmin
      If T_hoch = 0 And Flanke1 = 0 Then                    'Start Wert für das Dimmen erhöhen
         Pwm_stopmin = Pwm_stopmin + 1
         Flanke1 = 1
      End If
      If T_hoch = 1 And Flanke1 = 1 Then Flanke1 = 0        'Flanke entfernen
      If T_runter = 0 And Flanke3 = 0 Then                  'Start Minute um eins verringern
         Pwm_stopmin = Pwm_stopmin - 1
         Flanke3 = 1
      End If
      If T_runter = 1 And Flanke3 = 1 Then Flanke3 = 0
      If T_menu = 0 And Flanke2 = 0 Then
         Flanke2 = 1
         Goto Main
      End If
      If T_menu = 1 And Flanke2 = 1 Then Flanke2 = 0
      If T_home = 1 And Flanke4 = 0 Then
         Flanke4 = 1
         Goto Main
      End If
      If T_home = 0 And Flanke4 = 1 Then Flanke4 = 0
   Loop
Return
 
Hallo Tenor!

Nun ja, das ist generell schwer zu sagen woran es nun liegt, dass du zig mal deine FB drück musst um eine Reaktion im Programm zu bekommen.

Der häufigste Punkt ist natürlich, dass dein "humanoides" Timing nicht mit dem technischen Timing des AVR`s zusammenspielt. :wink:

Deine GETRC5() Abfrage kommt gleich zu Beginn der DO-LOOP Schleife.
Jetzt ist das Problem, dass GENAU in dem Moment der IR-Code starten muss, sonst läuft dein Programm weiter....... oder es werden dann nicht alle Bits so gelesen, wie sie eigentlich sind (Adress/Command)...... sondern mittendrin.
Somit ist dann ggf. auch nicht "Adress < 255" bzw. das Command ergibt keinen sinnvollen Wert für das Programm.
So in etwa stelle ich mir das zumindest bei dir gerade vor.

Wenn deine FB also eine höhere Priorität bekommen soll, dann musst du das ganze Programm entsprechend anpassen.

Als "Quick`n dirty" Lösung könntest du an verschiedenen Punkten (ggf. auch in einigen ISR`s) mehrere GETRC5() einbinden und die Ergebnisse erst mal in zwei separaten Variablen speichern.
Sobald dein Programm dann an der "richtigen" Stelle, zur Verarbeitung des RC5-Codes angekommen ist, werden die Variablen auch verarbeitet.


Grüße,
Cassio
 
Hi Cassio,
hm, das ist ein guter Hinweis, das werde ich auf jeden Fall testen!
Vielleicht auch eine Abfrage in der Timer Routine.

Ich dachte aber das das Signal wiederholt wird wenn man die Taste hält, oder funktioniert das anders?
 
Hallo!

Ja, natürlich wird der FB-Code immer wiederholt, solange du die Taste an der FB drückst.
Dafür gibt es ja auch das Togglebit.

Das Bit ändert NUR den Zustand, wenn die selbe Taste ein erneutes mal gedrückt wurde!
Hält man die eine Taste permanent gedrückt, behält das Togglebit seinen Zustand (1 oder 0).

Das ist also nicht das Problem.
Wer garantiert dir aber, dass beim nächsten Schleifendurchlauf deines Programmes auch der IR-Code vom Startbit an richtig abgefragt wird. :hmmmm:

Wie lang ist denn dein Schleifendurchlauf (DO-LOOP) eigentlich?


Grüße,
Cassio
 
Hi Cassio,
Ich habe das jetzt noch eine weitere Abfrage des RC5 Codes gegen Ende des Loops.
Das Problem ist schon besser geworden, aber 4-5 mal muss ich schon noch drücken.
Das mag egal sein wenn man nur ein Licht ein und aus schaltet, aber ich muss erst vom automatik in den Manuellen Modus..
Dann weiß ich ja nie welche Taste ich wiederholen muss.

Garantieren kann mir leider keiner das beim Abfragen immer alles richtig rein kommt, aber dafür muss es doch eine Lösung geben :(

Wie bekomme ich das raus wie lange der loop ist?
 
Hi Cassio,
Ich habe das jetzt noch eine weitere Abfrage des RC5 Codes gegen Ende des Loops.
Das Problem ist schon besser geworden, aber 4-5 mal muss ich schon noch drücken.

Hallo!

Na also, dann lag ich mit meiner Vermutung doch richtig. :wink:


Garantieren kann mir leider keiner das beim Abfragen immer alles richtig rein kommt, aber dafür muss es doch eine Lösung geben :(

Natürlich kann man die Abfrage besser im Programm berücksichtigen, aber dafür musst du dein Programm entsprechend modifizieren.
Wie ich schon erwähnte, musst du dann die Prio auf den IR-Empfang legen..... oder ihn entsprechend hoch ansiedeln.


Wie bekomme ich das raus wie lange der loop ist?

Das kannst du im Simulator "messen".
Ist aber auch egal....


Grüße,
Cassio
 
Hallo!

Natürlich kann man die Abfrage besser im Programm berücksichtigen, aber dafür musst du dein Programm entsprechend modifizieren.
Wie ich schon erwähnte, musst du dann die Prio auf den IR-Empfang legen..... oder ihn entsprechend hoch ansiedeln.

Dann werde ich heute Abend mal schauen was der Simulator dazu sagt.

Wie modifiziere ich denn am besten das Programm, so dass die Prio auf dem IR Empfang ist?
Ausser noch mehr Abfragen fällt mir da nicht viel ein.
Externer Interrupt wäre wohl die sauberste Lösung, der zerschießt mir dann aber meinen Sekundentakt.
 
Wie modifiziere ich denn am besten das Programm, so dass die Prio auf dem IR Empfang ist?


Hallo Tenor!

Tja, das ist eine gute Frage. :wink:

Dafür gibt es nun mal kein Generalkonzept.
Es hängt einfach vom Programmaufbau ab!

Da dein Programm nun schon steht wird es bestimmt schwierig bzw. aufwendig werden, es nun einer neuen Priorität zu "unterwerfen".
Natürlich kannst du eine Subroutine für das Abfragen des RC5-Codes erstellen und diese Sub zig mal in deinem Programmteilen aufrufen, aber die schönste Lösung ist das natürlich auch nicht. :wink:

Wie du das nun realisieren möchtest und kannst, bleibt aber dir überlassen.
Du wirst ja z.B. auch deine Gründe haben, warum du unbedingt die Softclock selber programmieren und nicht auf fertige (hard- oder softwareseitige) Lösungen zurück greifen wolltest.


Nur mal eine Frage am Rande, wegen deiner selbstprogrammierten Uhr......
Was macht deine Aquariumsteuerung eigentlich wenn mal Stromausfall gewesen ist, oder du mal den Stecker ziehen musstest?
Wie stellt sich die Uhr denn nach einem Stromausfall in der Nacht..... oder wenn du in Urlaub bist? :hmmmm:
Wäre eine hardwareseitige Lösung, ggf. mit Gangreserve, (DCF77 und/oder RTC) für ein Lebensbiotop da nicht angebrachter?


Grüße,
Cassio
 
Hallo Cassio,
Ok, dann muss ich mal überlegen wie man das am besten verbessern kann :confused:

nunja, das mit der Uhr ist so ne Sache, ich glaube ich hatte dafür mal einen Thread eröffnet, (mein erster hier ;) )
Ich hatte einfach keine Ahnung wie man das besser regelt, daher habe ich das so geregelt.

Einen DCF Empfänger habe ich hier auch schon liegen, der wird bald noch dazu kommen, dann ist das mit der Uhrzeiteinstellung auch geklärt.
Bisher habe ich halt Startwerte für die Uhr gegeben, wenn mal Stromausfall ist macht der halt irgendwie weiter.
Hauptsache die Fische haben dann am Tag mal licht. Stromausfall kommt ja zum Glück auch nicht so oft vor ;)

Aber ich bin jederzeit offen für Verbesserungen!
Wie würdest du das mit der Uhr regeln?
Der DCF gibt mir ja nur eine akuelle Zeit, damit muss ich ja noch Variablen füttern.
Du meintest Uhr in Hardware lösen, meintest du den DCF oder gibt es einen anderen Baustein der das kann?

Im prinzip bin ich noch Neueinsteiger im Mikrocontroller bereich. Das ist mein erstes Projekt das mal eine Verwendung gefunden hat ;)
Aber ich will es auch noch permanent erweitern!
Also immer her mit guten Tips ;)
 
Hallo,

Wie würdest du das mit der Uhr regeln?
Der DCF gibt mir ja nur eine akuelle Zeit, damit muss ich ja noch Variablen füttern.
Du meintest Uhr in Hardware lösen, meintest du den DCF oder gibt es einen anderen Baustein der das kann?
...
Aber ich will es auch noch permanent erweitern!
also ich würde zuerst mal an einem I2C-Bus nen DS1307 oder ne ähnliche Echtzeituhr dranhängen. Die hat 2 Vorteile.
1. Sie hat immer die richtige Uhrzeit sofort zur Verfügung
2. Sie hat einen Taktausgang der dir schöne Pulse mit 32,768kHz bis runter zu 1Hz liefern kann.
3. Auch bei schlechtem Empfang oder Stromausfall hast du sofort die richtige Uhrzeit beim Systemstart

An dem I2C-Bus kannst du noch nen EEPROM dranhängen was ne Ecke mehr Speicheroperationen aushält als das interne EEPROM des Atmels. Notfalls kann man das externe EEPROM mal schnell tauschen wenn es hin ist (wird wohl nicht passieren). In dem EEPROM kann man ne Menge Schaltzeiten und Systemparameter abspeichern und wieder rausholen. Die gibts hoch bis 1MBit (also 128kByte) als 24FC1025.

Den DCF-Empfänger würde ich verwenden um ohne manuelles Stellen eine genaue Uhrzeit zu bekommen. Den muß man aber nicht oft verwenden.

Die Softclock kannst du mit den Bascom internen Routinen und nem 32kHz Uhrenquarz machen. Wenn du aber selber Routinen machen willst, dann kannst du auch vom DS1307 den 1Hz-Takt benutzen. Dann hast du sehr wenige Interrupt-Ereignisse und dein restlicher Programmablauf wird kaum gestört. Außerdem hast du einen weiteren Timer übrig ;)

Gruß
Dino
 
also ich würde zuerst mal an einem I2C-Bus nen DS1307 oder ne ähnliche Echtzeituhr dranhängen.


Hallo!

So wie Dino es schon vorgeschlagen hat, würde ich es auch machen....... eine I2C Echtzeituhr (RTC = RealTimeClock).

Du könntest anstatt der DS1307 auch eine DS1337 nehmen und hättest dann auch gleich noch die Alarm- bzw. Schaltzeiten mit erschlagen.
So müsstest du dich noch nicht mal um die softwareseitige Abarbeitung der Schaltzeiten kümmern.

Gleiches kannst du auch mit der PCF8583 erreichen!
Wenn du die Schaltzeiten bei dieser RTC jedoch nicht verwendest, kannst du es als externen EEPROM-Platz nutzen. :)


Da du aber selber noch Anfänger bist, kann ich deine Bedenken jetzt schon etwas erahnen. :wink:
Schließlich müsstest du dich jetzt erst mal mit dem I2C-(TWI)-Bus_System befassen.
Ich kann dir dazu aber nur den guten Rat geben.....
Nutze nur die BASCOM-Hilfe und die Beispieldateien!

Alle anderen Infos in Büchern, Internetseiten und Co befassen sich meist mit dem Timing und dem Funktionsprinzip von I2C (TWI).
Genau das wird dich aber zu Beginn verunsichern und durcheinander bringen.
Lass dich also nicht verrückt machen und probiere es ggf. erst mal mit den Beispieldateien in BASCOM.


Grüße,
Cassio
 
Da sag ich erstmal Besten Dank!
Erstmal etwas schlau lesen und dann die nächste Bestellung aufgeben ;)

Für genauere Fragen, mach ich dann mal besser einen neuen Thread auf ;)
 
Hallo Tenor!

Als Übung zum Thema I2C (TWI) kannst du auch mal HIER reinschauen.

Dort geht es zwar nicht um eine RTC, aber das Prinzip solltest du damit auch verstehen können. :wink:


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)