- fchao-Sinus-Wechselrichter AliExpress         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 13 von 13

Thema: Register GIFR mit ATMEGA2560 ...RC5 Code geht nicht

  1. #11
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    19.08.2006
    Ort
    Kitzscher
    Alter
    44
    Beiträge
    237
    Anzeige

    Powerstation Test
    ok ich habe jetzt also mal deinen Code genommen und die Printbefehle auf meinen Port angepasst soweit sogut alles kompiliert ohne Fehler.

    Das Problem ist nun das er egal welche Taste ich auf dem IR FB drücke immer das selbe ausgegeben wird toggle:1 Adresse:10 Code:106.

    Irgendwas stimmt da nicht gibt es irgendwas was ich kontrollieren kann wo es hängt ?



    Hier ist der Code für den ATMEGA2560 von mir :
    Code:
    'Diese Anweisung setzt die Fusebits automatisch korrekt (Syntax $PROG LB, FB , FBH , FBX )
    $prog , 255 , &B11011001 ,                                  'Quarz an / Teiler aus / Jtag aus
    
    $regfile = "m2560def.dat"
    $hwstack = 82                                               '80
    $framesize = 68                                             ' 64
    $swstack = 68                                               '44
    
    $crystal = 16000000                                         'Quarzfrequenz
    
    
    Config Pine.5 = Input
    USB Alias Pine.5                                            'Ist 1 wenn USB angeschlossen
    
    Config Com4 = 38400 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
    Open "com4:" For Binary As #4
    
    
    
    
    
    
     $lib "mcsbyte.lbx"                                         'ACHTUNG:numeric<>string conversion routines only for bytes
    
      Config Portc.7 = 0
      Input_pin Alias Pinc.7                                    'Pin für TSOP1736
    
      Config Timer0 = Timer , Prescale = 8
      On Timer0 Timer_irq
      Const Timervorgabe = 78                                   'Timeraufruf alle 178µs (10 Samples = 1 Bit = 1,778ms)
      Enable Timer0                                             'Hier werden die Timer aktiviert
      Enable Interrupts
    
      'Timing für 10 Samples Per Bit = 1,778ms
      Const Samples_early = 8                                   'Flanke Frühestens Nach 8 Samples
      Const Samples_late = 12                                   'Flanke Spätestens Nach 12 Samples
      Const Samples_min = 3                                     'Flanke Vor 3 Samples - > Paket Verwerfen
    
      'Variablen der ISR
      Dim Sample As Byte                                        'eigentlich Bit, spart aber 46Byte ROM
      Dim Ir_lastsample As Byte                                 'zuletzt gelesenes Sample
      Dim Ir_bittimer As Byte                                   'zählt die Aufrufe von Timer_IRQ
      Dim Ir_data_tmp As Word                                   'Bitstream
      Dim Ir_bitcount As Byte                                   'Anzahl gelesener Bits
    
    
      'Rückgabewerte der ISR
      Dim Address_rc5 As Byte , Command_rc5 As Byte , Rc5_flag As Bit
    
      Do
     '    Print #4 , "test"
    
        If Rc5_flag = 1 Then
          Reset Rc5_flag
            Print #4 , "toggle:" ; Command_rc5.7;
            'clear the toggle bit
            Command_rc5 = Command_rc5 And &B01111111
            Print #4 , " Adresse:" ; Address_rc5 ; " Code:" ; Command_rc5
        End If
       ' Waitms 100
      Loop
    
    End
    
    
    Timer_irq:
      Timer0 = Timervorgabe
      Sample = Not Input_pin
    
      'bittimer erhöhen (bleibt bei 255 stehen)
      If Ir_bittimer < 255 Then Incr Ir_bittimer
    
      'flankenwechsel erkennen
      If Ir_lastsample <> Sample Then
    
         If Ir_bittimer <= Samples_min Then
           'flanke kommt zu früh: paket verwerfen
           Ir_bitcount = 0
         Else
           'nur Flankenwechsel in Bit-Mitte berücksichtigen
           If Ir_bittimer >= Samples_early Then
               If Ir_bittimer <= Samples_late Then
                 'Bit speichern
                  Shift Ir_data_tmp , Left , 1
                  Ir_data_tmp = Ir_data_tmp + Sample
                  Incr Ir_bitcount
               Else
                  'Flankenwechsel zu spät: Neuanfang mit gemessener Flanke
                  Ir_bitcount = 1
                  Ir_data_tmp = Sample
               End If
               'bittimer zurücksetzen wenn Timer > Samples_early
               Ir_bittimer = 0
           End If
         End If
    
        'Kontrolle des Startbits auf 1
         If Ir_bitcount = 1 Then Ir_bitcount = Ir_data_tmp.0
    
         'Alle 14 Bits gelesen?
         If Ir_bitcount >= 14 Then
           Command_rc5 = Ir_data_tmp                            'Bit 6 und 7 siehe unten
           Shift Ir_data_tmp , Right , 6
           Address_rc5 = Ir_data_tmp And &B00011111
           'For extended RC5 code, the extended bit is bit 6 of the command.
           Command_rc5.6 = Not Ir_data_tmp.6
           'The toggle bit is stored in bit 7 of the command
           Command_rc5.7 = Ir_data_tmp.5
           'Paket erfolgreich gelesen
           Set Rc5_flag
           'paket zurücksetzen
           Ir_bitcount = 0
         End If
    
      End If
      'sample im samplepuffer ablegen
      Ir_lastsample = Sample
    
    Return

    Gruß
    Steffen

  2. #12
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    27.03.2004
    Beiträge
    185
    Du schießt aber schnell und tauscht dabei ein Problem gegen ein anderes
    Du hast doch jetzt die zweite RC5-Code-Variante mit der Timer0-Overflow-ISR eingebaut.
    Hier gilt Timervorgabe = 78 nur für 8 MHz !!!!
    Lies mal https://www.roboternetz.de/phpBB2/viewtopic.php?t=20209

    Ich meinte, du sollst den Befehl
    Getrc5(address_rc5 , Command_rc5)
    mal ohne Interrupt Int1 zum laufen bringen und dann die ISR einbauen.

  3. #13
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    19.08.2006
    Ort
    Kitzscher
    Alter
    44
    Beiträge
    237
    Du schießt aber schnell und tauscht dabei ein Problem gegen ein anderes
    ja ich will es unbedingt hinbekommen aber meine Kenntnisse sind auf dem Timergebiet gleich null ich habe noch nie einen Timer verwendet !


    Ich meinte, du sollst den Befehl
    Getrc5(address_rc5 , Command_rc5)
    mal ohne Interrupt Int1 zum laufen bringen und dann die ISR einbauen.
    Sorry ich habe keinen blassen schimmer was ich machen soll. Ohne Interupt und ISR ?

    Alles durchgelesen und trotzdem nur die hälfte verstanden. Wenn ich das Excel Tool nehme dann kommt nur irgendwie mist raus ich kann nichteinmal sagen ob ich 8 oder 16 Bit Timer habe das ist schon das erste Problem. Bei dem pauschal angenommenen Wert von 212 funktioniert es auch nicht.

    Wenn es nicht auf anhieb geht habe ich bei diesem Code einfach ein Problem weil ich es nicht verstehe.


    Gruß
    Steffen

Seite 2 von 2 ErsteErste 12

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad