Bascom RC5 Empfänger Probleme

Danke!
Sieht auf jeden Fall interessant aus.
Ist wahrscheinlich so ähnlich wie mit 1wire.
Da habe ich mal mit dem DS1820 experimentiert.
Den wollte ich evtl. auch noch an den Kontroller anschließen, aber den Sensor Wasserdicht zu bekommen....

I2C scheint auf jeden Fall sinnvoll zu sein wenn man nicht genügend Ports am Atmega mehr frei hat.

Erstmal muss ich aber temporär das Empfangsproblem minimieren, dann kann ich an der stelle weiter machen ;)
 
Eine kurze Frage doch noch in dem Thread, muss ja erst ein paar Teile ordern bevor ich selber testen kann.

Kann ich auch den PCF8563P als RTC verwenden? Denke mal schon, hab da kaum Unterschiede gesehen.
Dieser hat dann ja auch den 32 khz OSC integriert, spart ja auch wieder platz.

Vom prinzip her benötige ich dann nur das DCF Modul um mir z.B. ein mal am Tag die genaue Zeit zu bekommen.
Diese schreibe ich dann mit den I²C Befehlen auch in den RTC, der sich dann intern um die Aktualisierung kümmert.
Die Zeit Frage ich dann immer manuell per Befehl vom Baustein ab, richtig?

Wie lässt man sich dann z.B. einen 1Hz Takt am AVR übergeben? Wird dafür dann ein externer Interrupt verwendet?
Oder läuft alles was mit dem Baustein passiert nur passiv auf Anfrage?
 
Hi,

Kann ich auch den PCF8563P als RTC verwenden? Denke mal schon, hab da kaum Unterschiede gesehen.
Dieser hat dann ja auch den 32 khz OSC integriert, spart ja auch wieder platz.
Interner Oszillator oder interner Quarz?
Einen internen Oszillator haben alle RTCs. Dann muß aber noch der Uhrenquarz dran. Einen internen Quarz (also alles drin) haben sehr wenige RTCs die dann auch ne Ecke teurer sind.

Beim PCF8563 müßte ich mir jetzt erst das Datenblatt ziehen da ich den nicht verwende. Ich hab den DS1307 im Einsatz.

Vom prinzip her benötige ich dann nur das DCF Modul um mir z.B. ein mal am Tag die genaue Zeit zu bekommen.
Diese schreibe ich dann mit den I²C Befehlen auch in den RTC, der sich dann intern um die Aktualisierung kümmert.
Die Zeit Frage ich dann immer manuell per Befehl vom Baustein ab, richtig?
Äh ... Also mit der Software im Atmel mußt du die einkommenden DCF-Datentelegramme (Impulsgruppen) decodieren und in die Zeitinformation umsetzen (gibts ne Lib für). Diese Information kannst du dann in die RTC schreiben.

Da die RTC ja mit einem eigenen Oszillator läuft, zählt die dann die Zeit automatisch selber weiter. Eine RTC ist eigentlich nix weiter wie ein Zähler der über eine interne Logik die Überläufe von Minute zu Stunde, Tag zu Monat, Monat zu Jahr, ... usw hat. Nicht mehr und nicht weniger.

Wenn du die Zeit aus der RTC holst, dann bekommst du die dort aktuell vorhandene Zeit. Wenn du sie also alle 5sec abholst, dann bekommst du die Zeit auch mit diesen Sekundensprüngen. +/- 1sec da ja die RTC grade kurz vor oder kurz nach einem Sekundensprung sein kann. Je nach Abfragezeitpunkt.

Wie lässt man sich dann z.B. einen 1Hz Takt am AVR übergeben? Wird dafür dann ein externer Interrupt verwendet?
Oder läuft alles was mit dem Baustein passiert nur passiv auf Anfrage?
Die RTC hat ja einen internen Oszillator mit einem internen oder externen Quarz. Dieser Oszillator läuft mit 32768Hz. Sie besitzt dann einen Vorteiler der diesen Takt in verschiedenen Stufen bis auf 1Hz bringt. Diesen Takt benötigt die RTC selber für ihren Uhrenzähler/Uhrzeit. 32768Hz und 1Hz bekommst du eigentlich von jeder RTC mit Taktausgang geliefert. Dann gibt es noch Zwischenstufen je nach RTC mit zB 4096Hz, 32Hz, 16Hz, 1024Hz, 2Hz, ... . Was am Ausgang anliegt stellst du über ein internes Steuerregister ein.

Den Takt kannst du dann beliebig weiterverwenden. Entweder du packst ihn an einen normalen IO-Pin und fragst die Pegel/Flanken über Software ab (Polling). Das ist aber verschwenderisch für die Systemresourcen (zeitfressend).

Dann kannst du den Takt an einen x-beliebigen Interrupt-Eingang legen und auf die auftretenden Interrupts reagieren. Positive Flanke oder negative Flanke oder so. Pegel getriggert (positiver Pegel, negativer Pegel) würde ich in diesem Fall nicht machen wegen des lang anliegenden Pegels und Softwaretechnischen Problemen die da auftauchen können.

Dann kannst du zB auch den Takt an einen Takteingang eines Timers/Counters des Atmels legen und dann hardwaretechnisch die Sekunden hochzählen lassen. Das entlastet deine Software noch weiter.

Es gibt viele Möglichkeiten den Takt zu verwenden. Je nach Lust und Laune und was man damit anfangen will und wie man ein Problem lösen möchte.

Gruß
Dino
 
Hallo,
ich muss nochmal kurz nachfragen... (mit etwas Glück wartet der 1307 schon im Briefkasten :) )

Ist die I²C Adresse bei der RTC fix?
Generell habe ich gelesen, das der letzte Part der Adresse extern also per Jumper konfigurierbar ist.
Dazu habe ich aber bei der RTC nichts gefunden.
Auch im Datenblatt habe ich nichts entdeckt wie man die Adresse vergibt.

Habe immer nur das folgende gefunden:
Code:
' Adressen festlegen
Const Ds1307w = &HD0              ' Addresse des DS1307 zum schreiben
Const Ds1307r = &HD1               ' Addresse des DS1307 zum lesen

Ist die Adresse somit beim DS1307 fix und nicht änderbar?
Mehrere DS1307 kann man somit ja nicht betreiben. (Brauch ich derzeit eh nicht, aber wäre ja interessant :) )
 
Hi,

Hallo,
ich muss nochmal kurz nachfragen... (mit etwas Glück wartet der 1307 schon im Briefkasten :) )

Ist die I²C Adresse bei der RTC fix?
Das kommt auf den Baustein an.

EEPROMs haben meißt Anschlüsse für die Veränderung der Adresse. IO-Bausteine auch. Bei einer RTC ist das meißt nicht so weil ja eine RTC für ein Gerät normalerweise ausreicht. Aus dieser "Masterzeit" könnte man ja alles andere (Zeitzonen, Sommerzeit, ...) berechnen. Warum also mehrere RTCs?

Wenn man die Weckzeit der RTC verwenden will, aber mehrere Weckzeiten benötigt müßte man eben immer beim Ablauf der eingestellten Weckzeit die nächste folgende in die RTC laden.

Gruß
Dino
 
Ist die Adresse somit beim DS1307 fix und nicht änderbar?


Hallo!

Nein, die I2C-Adresse ist bei der DS1307 nicht einstellbar!
Sie hat "nur" eine feste Adresse, wie es auch im Datenblatt gezeigt wird:

DS1307_Slave-Adr.gif

Demnach also &HD0 zum Beschreiben bzw. &HD1 zum Auslesen der Daten.


Die Adress-Pins bei I2C-Bausteinen nennen sich sons meistens A0, A1, A2 und so weiter.


Gruß,
Cassio
 
Demnach also &HD0 zum Beschreiben bzw. &HD1 zum Auslesen der Daten.
ach ja .. da wollte ich im letzten Beitrag ja auch noch was zu schreiben ... :eek:

Also in den Datenblättern ist manchmal auch nur eine 7Bit-Adresse angegeben. Das sind dann die oberen 7 Bits des Adress-Bytes. Also Bit 1-7. Bit 0 stellt dann je nach Wert (0 oder 1) ein ob du Daten in die internen Register des Bausteins schreiben willst oder daraus lesen willst.

Beim DS1307 sind dagenen alle 8Bit der Adresse angegeben. Also Bit 0-7. Dadurch stehen da dann zwei Adressen.

Das nur für den Fall das du da in einem Datenblatt mal drauf stößt.

Gruß
Dino
 
Besten Dank! (einmal mehr)
Leider muss ich wohl noch länger auf die Teile warten..
 
Hallo,
noch einmal zurück zu meinem ursprünglichen Problem.
Den RTC1307 habe ich auf meinem Testboard getestet und funktioniert soweit wie erwartet ;)
Jedoch fehlt mir da noch so der richtige Ansatz zwecks periodischer Abfrage der Zeit, ich muss mein Konzept mit dem Dimmvorgang erst noch einmal durch denken..

Bis dato, dachte ich mir, funktioniert das Programm so weit, bis auf die RC5.
Den Code habe ich jetzt etwas schlanker gestaltet und auch die Haupt Do Loop Schleife deutlich reduziert, so dass die RC5 Signale eigentlich deutlich besser erkannt werden sollten.
Allerdings ist genau das Gegenteil der Fall!
Ich muss zig mal drücken aus diversen Winkeln bis irgendwann mal was ankommt...
Wenn ich ein anderes Programm lade (nur RC5 nichts anderes) läuft es deutlich besser, zwar nichr Perfekt, aber gut.

Hat jemand da noch einen Tip?
Nebenbei..
Wo bringt man Kondensator und Widerstand am TSOP1136 am besten an? Direkt am Sensor, oder eher auf die Platine?
Ich habe 3 Leitungen genommen, vielleicht einen knappen Meter, und die Bauteile direkt am Sensor verlötet, ist das so ok?
Da es deutlich besser geht mit einem reinen RC5 Programm, gehe ich nicht von einem Hardware Problem aus, aber vielleicht kann man hier ja auch optimieren.

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_auto 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_auto = Input
Config Rc5 = Pinc.0                                         ' IR --> RC5

Dim Isekunde As Byte , Isminute As Byte , Dauer As Byte , Prozw3 As Byte
Dim Istunde As Byte , Pwm_stopstd As Byte , Pwm_stopmin As Byte , Maxdim As Byte
Dim Pwm_trigger As Byte , Pwm_startmin As Byte , Maxpwm As Byte , Prescale As Single
Dim Proz1 As Single , Prozw1 As Single , Prozw As Single , Pwm_wert As Single
Dim Proz2 As Single , Maxpwm1 As Single , Auto As Byte , menu as byte , Prescale2 As Byte , Pwm_startstd 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 , Adress2 As Byte , Command2 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 auf 100 %
Isekunde = 0
Isminute = 16
Istunde = 21
Pwm_startstd = 08
Pwm_startmin = 00
Pwm_stopstd = 19
Pwm_stopmin = 0
Maxpwm = 50
Pwm_trigger = 0
Pwm_wert = 0
Dauer = 0
menu = 0             ' Menü deaktiviert beim Start
Auto = 1                                                    'Automatik beim Start aktiv
'**************************************
Daysek3 = Istunde * 3600                                    ' Die Tagessekunde anhand der aktuellen Uhrzeit einstellen
Daysek2 = Isminute * 60
Daysek = Daysek2 + Daysek3
Dimdownsek3 = Pwm_stopstd * 3600
Dimdownsek2 = Pwm_stopmin * 60
Dimdownsek = Dimdownsek2 + Dimdownsek3                      ' Sekunde bestimmen ab der der Dimmvorgang gestartet werden soll
Dimdownsekstd = Dimdownsek + 3600
Dimupsek3 = Pwm_startstd * 3600
Dimupsek2 = Pwm_startmin * 60
Dimupsek = Dimupsek2 + Dimupsek3                            ' Sekunde bestimmen ab der der Dimmvorgang gestartet werden soll
Dimupsekstd = Dimupsek + 3600
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
'**************************************
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
' If Auto = 1 Then Lcd "Automatik"
' If Auto = 0 Then Lcd "Manual   "
'  Lcd Adress
 '  Locate 2 , 11
  ' Lcd Command
End If
'**************************************
Ocr2a = Pwm_wert                                            'Ausgabe Spannung PWM  (0-255)
'**************************************
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 Command = 1 Or Command2 = 1 Then Auto = 0
If Command = 2 Or Command2 = 2 Then Auto = 1

Getrc5(adress2 , Command2)                                  ' RC5-Fernbedienung einlesen
If Adress2 < 255 Then
   Command2 = Command2 And &B01111111
End If

If Menu = 0 Then
 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
 If Auto = 1 Then Lcd "Automatik"
 If Auto = 0 Then Lcd "Manual   "
End If

Debounce T_menu , 0 , menustd , Sub
Debounce T_hoch , 0 , addieren , Sub
Debounce T_runter , 0 , Subtrahieren , Sub
Loop

Timer_irq:                                                  ' der Interrupt wird jede Sekunde ausgeführt
   Timer1 = Timervorgabe
   Maxpwm1 = Maxpwm
   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
   Daysek = Daysek + 1                                      ' Sekunden des gesamten Tages
   If Daysek > 86400 Then Daysek = 0                          ' 86400 = 1 Tag in Sekunden
   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
         '*****************************
         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
         '*****************************
         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
         '*****************************
         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
         '*****************************
         Dauer = 0
      End If
   End If
   '**************************************
   If Daysek > Dimupsek And Dimupsek < Dimdownsek And Auto = 1 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 And Auto = 1 Then
      Evg = 0                                               'EVG ausschalten
      Backlight = 0                                         'Backlight ausschalten
   End If
   If Daysek >= Dimdownsek And Daysek < 82800 And Auto = 1 Then
      Moonlight = 1                                         'Mondlicht beim herabdimmen einschalten
   End If
   If Daysek >= 82800 And Auto = 1 Then
      Moonlight = 0                                         'Mondlicht um 23:00 Uhr ausschalten
   End If
   '**************************************
   Dauer = Dauer + 1
Return

menustd:
Menu = Menu + 1
if menu > 7 then menu = 0
cls
select case menu
case 1 :
 LCD "Stunde: "
 lcd sstunde
case 2 :
 lcd "Minute: "
 Lcd Sminute
case 3 :
 lcd "Start Stunde: "
 lcd pwm_startstd
case 4 :
 lcd "Start Minute: "
 lcd pwm_startmin
case 5 :
 lcd "Stop Stunde: "
 lcd pwm_stopstd
case 6 :
 lcd "Stop Minute: "
 lcd pwm_stopmin
case 7 :
 Lcd "Max Beleuchtung"
 Locate 2 , 1
 Lcd "in %: "
 lcd maxpwm
end select
return

addieren:
select case menu
 case 1 :
  Istunde = Istunde + 1
  if istunde > 23 then istunde = 0
  Daysek3 = Istunde * 3600                                    ' Die Tagessekunde anhand der aktuellen Uhrzeit einstellen
  Daysek2 = Isminute * 60
  Daysek = Daysek2 + Daysek3
  Locate 1 , 10
  Lcd Istunde
 case 2 :
  Isminute = Isminute + 1
  if isminute > 59 then isminute = 0
  Daysek3 = Istunde * 3600                                    ' Die Tagessekunde anhand der aktuellen Uhrzeit einstellen
  Daysek2 = Isminute * 60
  Daysek = Daysek2 + Daysek3
  Locate 1 , 10
  Lcd Istunde
 case 3 :
  pwm_startstd = pwm_startstd + 1
  if pwm_startstd > 23 then pwm_startstd = 0
  Locate 1 , 10
  Lcd Pwm_startstd
 case 4 :
  pwm_startmin = pwm_startmin + 1
  if pwm_startmin > 59 then pwm_startstd = 0
  Locate 1 , 10
  Lcd Pwm_startmin
 case 5 :
  pwm_stopstd = pwm_stopstd + 1
  if pwm_stopstd > 23 then pwm_stopstd = 0
  Locate 1 , 10
  Lcd Pwm_stopstd
  Dimdownsek3 = Pwm_stopstd * 3600
  Dimdownsek2 = Pwm_stopmin * 60
  Dimdownsek = Dimdownsek2 + Dimdownsek3                      ' Sekunde bestimmen ab der der Dimmvorgang gestartet werden soll
  Dimdownsekstd = Dimdownsek + 3600
  Dimupsek3 = Pwm_startstd * 3600
  Dimupsek2 = Pwm_startmin * 60
  Dimupsek = Dimupsek2 + Dimupsek3                            ' Sekunde bestimmen ab der der Dimmvorgang gestartet werden soll
  Dimupsekstd = Dimupsek + 3600                               'Dimmzeit + einer Stunde damit das Ende des Dimmvorgangs bestimmt werden kann
 case 6 :
  pwm_stopmin = pwm_stopmin + 1
  if pwm_stopmin > 59 then pwm_stopmin = 0
  Locate 1 , 10
  Lcd Pwm_stopmin
  Dimdownsek3 = Pwm_stopstd * 3600
  Dimdownsek2 = Pwm_stopmin * 60
  Dimdownsek = Dimdownsek2 + Dimdownsek3                      ' Sekunde bestimmen ab der der Dimmvorgang gestartet werden soll
  Dimdownsekstd = Dimdownsek + 3600
  Dimupsek3 = Pwm_startstd * 3600
  Dimupsek2 = Pwm_startmin * 60
  Dimupsek = Dimupsek2 + Dimupsek3                            ' Sekunde bestimmen ab der der Dimmvorgang gestartet werden soll
  Dimupsekstd = Dimupsek + 3600                               'Dimmzeit + einer Stunde damit das Ende des Dimmvorgangs bestimmt werden kann
 case 7 :
  maxpwm = maxpwm + 1
  if maxpwm > 100 then maxpwm = 0
  locate 1, 10
  lcd maxpwm
  '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
end select
return

subtrahieren:
select case menu
 case 1 :
  Istunde = Istunde - 1
  if istunde < 0 then istunde = 0
  Daysek3 = Istunde * 3600                                    ' Die Tagessekunde anhand der aktuellen Uhrzeit einstellen
  Daysek2 = Isminute * 60
  Daysek = Daysek2 + Daysek3
  Locate 1 , 10
  Lcd Istunde
 case 2 :
  Isminute = Isminute - 1
  if isminute < 0 then isminute = 0
  Daysek3 = Istunde * 3600                                    ' Die Tagessekunde anhand der aktuellen Uhrzeit einstellen
  Daysek2 = Isminute * 60
  Daysek = Daysek2 + Daysek3
  Locate 1 , 10
  Lcd Istunde
 case 3 :
  pwm_startstd = pwm_startstd - 1
  if pwm_startstd < 0 then pwm_startstd = 0
  Locate 1 , 10
  Lcd Pwm_startstd
 case 4 :
  pwm_startmin = pwm_startmin - 1
  if pwm_startmin < 0 then pwm_startmin = 0
  Locate 1 , 10
  Lcd Pwm_startmin
 case 5 :
  pwm_stopstd = pwm_stopstd - 1
  If Pwm_stopstd < 0 Then Pwm_stopstd = 0
  Locate 1 , 10
  Lcd Pwm_stopstd
  Dimdownsek3 = Pwm_stopstd * 3600
  Dimdownsek2 = Pwm_stopmin * 60
  Dimdownsek = Dimdownsek2 + Dimdownsek3                      ' Sekunde bestimmen ab der der Dimmvorgang gestartet werden soll
  Dimdownsekstd = Dimdownsek + 3600
  Dimupsek3 = Pwm_startstd * 3600
  Dimupsek2 = Pwm_startmin * 60
  Dimupsek = Dimupsek2 + Dimupsek3                            ' Sekunde bestimmen ab der der Dimmvorgang gestartet werden soll
  Dimupsekstd = Dimupsek + 3600                               'Dimmzeit + einer Stunde damit das Ende des Dimmvorgangs bestimmt werden kann
 case 6 :
  pwm_stopmin = pwm_stopmin - 1
  if pwm_stopmin < 0 then pwm_stopmin = 0
  Locate 1 , 10
  Lcd Pwm_stopmin
  Dimdownsek3 = Pwm_stopstd * 3600
  Dimdownsek2 = Pwm_stopmin * 60
  Dimdownsek = Dimdownsek2 + Dimdownsek3                      ' Sekunde bestimmen ab der der Dimmvorgang gestartet werden soll
  Dimdownsekstd = Dimdownsek + 3600
  Dimupsek3 = Pwm_startstd * 3600
  Dimupsek2 = Pwm_startmin * 60
  Dimupsek = Dimupsek2 + Dimupsek3                            ' Sekunde bestimmen ab der der Dimmvorgang gestartet werden soll
  Dimupsekstd = Dimupsek + 3600                               'Dimmzeit + einer Stunde damit das Ende des Dimmvorgangs bestimmt werden kann
 case 7 :
  maxpwm = maxpwm - 1
  if maxpwm < 0 then maxpwm = 0
  locate 1, 10
  lcd maxpwm
  'Prozente und Teilerberechnung für die PWM
  '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
end select
return
 
Zum TSOP1136: ich würde es so nah wie möglich am Sensor platzieren. Sprich Sensor + Widerstand + Elko und dann diese Leitung, danach MCU.

Wie wertest Du den Sensor aus? Interrupt gesteuert oder wie? Einen RC5 auswerten dürfte doch für den Atmega ein Scherz am Rande sein.

Grüße
Heinrich
 
Ok, dann habe ich das mit dem schon mal richtig gemacht ;)

Per interrupt mache ich das nicht, das wäre vielleicht eine Option wenn ich die RTC am laufen habe.

Der reine Code sieht so aus: (der volle Code ist im vorherigen Post)

Getrc5(adress , Command) ' RC5-Fernbedienung einlesen
If Adress < 255 Then
Command = Command And &B01111111
End If

Vorher war halt das Problem das die Main Loop so lang war, die habe ich nun deutlich reduziert und Neuberechnungen der Werte ins Menü verlagert.
Diese werden dann nur noch durchgeführt wenn auch Werte geändert werden.
Aber anstelle einer Verbesserung, hat es sich jetzt deutlich! verschlechtert.
 
ok, ich habe eine der beiden RC5 abfragen entfernt, es läuft jetzt deutlich besser.
Aber zufriedenstellend ist das leider noch nicht, 4-5 mal drücken, dann erkennt er es.
Manchmal auch schon beim ersten mal.
Denke nicht das ich von der Interrupt Lösung los komme, nur wie macht man das??

Bisher verstehe ich die ext. interrupts des AVR so, das sie das Programm unterbrechen wenn ich z.B. 5V
an einen I/O Port lege. Das Klappt ja bestimmt bestens mit Schaltern, aber wie soll das mit Einen IR Signal
funktionieren?
Bin da echt gerade am verzweifeln.
Hat da noch jemand eine Idee?
 
Besten Dank Straddel!
das hat mir geholfe :)
Jeder Tastendruck wird sauber erkannt :)
 
@Straddel: Was bewirkt die Wait = 2000 Anweisung? Ich kenne mich mit Bascom leider gar nicht aus.

Grüße
Heinrich
 
Das ist der Hilfe Text aus Bascom:
The default value is 100. Each unit is ca. 64 us. This gives a time out of 6.4 ms. Since a start bit is 3.5 ms, you can reduce the value to 56. When you make it lower, it will not work.

When you want the old behavior you need to specify a value of 2000 which is ca. 131 ms.
 

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