-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

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

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

    Register GIFR mit ATMEGA2560 ...RC5 Code geht nicht

    Anzeige

    Hallo

    ich habe gerade versucht den code aus der Bascom Hilfe für den RC5 Empfang auf einem ATMEGA2560 zum laufen zu bekommen.

    Leider meckert er mir diese Zeile an :

    Code:
       Gifr = Gifr Or &H80                                      'clear Flag Int1
    Die Fehlermeldung lautet : Error invalid datatyp ?!

    Heißt das Register anders beim ATMEGA2560 ?

    Nach meinen recherchen im Internet habe ich dieses hier gefunden was zumindest die Funktion des Registers erklärt.

    Und schließlich ist auch noch das Register GIFR (General Interrupt Flag Register) beteiligt. In diesem Register werden die Bits INTF0 (Bit 6) bzw. INTF1 (Bit 5) gesetzt, sobald die Bedingung zur Auslösung des betreffenden Interrupts erfüllt ist. Mit dem Anspringen der Interrupt-Routine wird das entsprechende Bit vom AVR automatisch wieder gelöscht. Hier sollte man sich ins Gedächtnis rufen, daß alle Interrupts so lange gesperrt sind, wie eine andere Interrupt-Routine ausgeführt wird. Das Interrupt-Flag speichert die Interrupt-Anforderung zwischen, damit sie nicht verlorengeht. Die Interrupt-Flags lassen sich aber auch softwareseitig löschen, indem man GIFR.INTF0 = 1 bzw. GIFR.INTF1 = 1 schreibt (tatsächlich eine 1 und nicht, wie es logischer wäre eine 0). Das Löschen des Interrupt-Flags unterbindet die Auslösung des anstehenden Interrupts. Die Auswertung dieser Flags kann sinnvoll sein, wenn man sich in einer umfangreicheren Interrupt-Routine befindet und vielleicht effizienter reagieren will.

    Im Datenblatt zum ATMEGA2560 findet sich sowas :

    Vector Nr. Program Address Source Interrupt Definition
    ..............|.............|..................... ..|...............................
    ........3....... $0004.... INT1... External Interrupt Request 1


    kann man das irgendwie umbauen oder hat jemand funktionierenden Code für den ATMEGA2560 ?


    Danke und Gruß
    Steffen

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    28.03.2004
    Beiträge
    185
    gib mal bitte den Link zum vollständigen RC5-Code an (habe es nicht im RN-Wissen gefunden)


    außerdem gib mal die Zeile aus dem *.dat an, wo steht:
    GIFR=$...

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    Wie aus dem Datenblatt pp. 80 ersichtlich ist, heißt das Flag-Register für externt Interrupts (INTx, PCINTx) EIFR.

    Wie auch immer das Register auch heissen mag...
    Code:
       Gifr = Gifr Or &H80                                      'clear Flag Int1
    ist ein Bug! Es hat den gleichen Effekt wie
    Code:
       Gifr = &Hff
    Was der Autor der Software wahrscheinlich im Sinn hatte ist
    Code:
       Gifr = &H80                                      'clear Flag Int1
    Disclaimer: none. Sue me.

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    19.08.2006
    Ort
    Kitzscher
    Alter
    38
    Beiträge
    237
    So ich hoffe ich habe alle RC5 Programmteile erwischt.

    Das ist der Code :
    Code:
     'RC5 benötigt Timer0 Interrupt !
     Config Rc5 = Pind.3
     On Int1 Int1_int                                           'Nosave würde 52 Takte = 6,5uS sparen
     Enable Int1
     Config Int1 = Falling
     Enable Interrupts
    
     'Rückgabewerte der ISR
     Dim Address_rc5 As Byte , Command_rc5 As Byte , Rc5_flag As Bit
    'RC5 ENDE
    
    
    do
    'RC5 Anfang Power off Taste
         If Rc5_flag = 1 Then
          Reset Rc5_flag
            Print "toggle:" ; Command_rc5.7;
            'clear the toggle bit
            Command_rc5 = Command_rc5 And &B01111111
            Print " Adresse:" ; Address_rc5 ; " Code:" ; Command_rc5
    
            If Command_rc5 = 12 Then
    
    ' Alles an das I2C RN-KEYLCD Senden
          I2cinit
          Stemp = Chr(12)
          Rnlcd_clr
          Rnlcd_cursor 4 , 1
          Rnlcd "Fernbedienung"
          Rnlcd_cursor 4 , 2
          Rnlcd "aktiviert"
    
            Print "Power off now !!"
            Sound Portd.7 , 400 , 350                           'BEEP
            End If
    
    
    'RC5 Anfang Ton Stumm Taste
    
    
          If Command_rc5 = 13 Then                              ' Taste Stumm ist Code 13
    
    ' Alles an das I2C RN-KEYLCD Senden
          I2cinit
          Stemp = Chr(12)
          Rnlcd_clr
          Rnlcd_cursor 4 , 1
          Rnlcd "Stumm Taste wurde"
          Rnlcd_cursor 4 , 2
          Rnlcd "aktiviert !!!"
          Print "Stumm Taste aktiviert!!"
          Sound Portd.7 , 400 , 350                             'BEEP
    
          End If
    
    
    
    
        End If
        'Waitms 100
         'RC5 ENDE  Power off Taste
    
    loop
    
    'RC5 Anfang
    'Lesen der RC5 Codes
    
    
    
    Int1_int:                                                   'Interrupt Handler For Int1
       Disable Int1
       Enable Interrupts                                        'für Timer0 Overflow GetRC5
       Getrc5(address_rc5 , Command_rc5)
       Set Rc5_flag                                             'Flag für RC5 Daten
       Gifr = Gifr Or &H80                                      'clear Flag Int1
       Enable Int1
    Return
      'RC5 ENDE
    @SprinterSB ja vermutlich hast du recht das Problem ist aber das der ATMEGA2560 einen anderen Register hat und ich mit den Datenblättern nicht so gut umgehen kann das ich rausfinde wie man die Register sinnvoll in Bascom übersetzt.

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    Name ist Schall und Rauch.

    Die Benutzung der AVR-Flag-Register ist bei allen Derivaten gleich: Ein Flag wird durch Schreiben einer 1 gelöscht, Schreiben einer 0 belässt das Flag beim alten Wert.

    Da bei der ursprünglichen Version alle Bits der FlagReg, die gesetzt sind, auch wieder geschrieben werden (das OR &h80 hat keine Wirkung, man überlege sich warum) werden *alle* IRQ-Flags gelöscht; also auch solche, die nicht im RC5 verwendet werden. Das ist eine Fehlerquelle, aka "bug".
    Disclaimer: none. Sue me.

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    19.08.2006
    Ort
    Kitzscher
    Alter
    38
    Beiträge
    237
    mhh klingt logisch nur hilft mir das bei dem Problem nicht weiter was ich habe.

    Da ich den RC5 Code schon seit Ewigkeiten auf einem ATMEGA32 im Einsatz und dort sehr gut funktioniert habe ich bis jetzt auch nie einen Programmfehler vermutet.


    Du verstehst anscheind ne Menge mehr als ich von den Registern und wie man sie benutzt. Kannst du mir eine Quelle nennen wo man sich da in Deutsch einlesen kann und wo man es versteht. Da kann ich nur versuchen das Problem alleine zu lösen wenn ich mich mit der ganzen Sache intensiv beschäftige. Der ATMEGA2560 hat sowieso schon einige Überraschungen bereitgehalten die Bascom überforderten das macht das ganze nicht leichter.

    Gruß
    Steffen

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    Das Register beim ATmega2560 heisst wie gesagt EIFR (External Interrupt Flag Register).

    Was man allerdings Bascom zuflstern muss, damit es diesen Namen kennt/schluckt, da kann ich dir nicht weiterhelfen. Aber es gibt hier garantiert genug BASCOM-Kenner, zu denen ich in keiner Weise dazu zähle.

    Deutsche Quelle? Da muss ich passen. Ich lese die Datasheets, die für AVR -- im Gegensatz zu denen manch anderen Controllerhersteller -- ausgezeichnet sind.

    Deutsche Übersetzungen wären wohl auch gespickt mit englischen Fachtermini, die man nicht versteht. Und Übersetzen dieser Ausdrücke ins Deutsche würde Sachen liefern wie den "schwanzlosen Motor" aus einem Nachbarthread hier oder dem "Controller mit direkt programmierbarem Blitz".

    Vielleicht schaust du mal bei den Buchbesprechungen (Forum/Wiki), was es da an Tipps zu dem Thema gibt.

    Zu den Programmfehlern: wenn keine anderen externen Interrupts verwendet werden, gibt es auch keine Fehler; und wenn, wird es fast immer klappen. Es kann dann jedoch zu sporadischen Fehlern kommen, daß also hier und da eine IRQ flöten geht.
    Disclaimer: none. Sue me.

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    28.03.2004
    Beiträge
    185
    da bin ich wieder

    @Steffen44
    bitte immer Quellen angeben, das macht den Dialog einfacher
    Der Code stammt von mir, der Link dazu ist:
    http://www.roboternetz.de/phpBB2/viewtopic.php?t=20209

    @SprinterSB
    Du hast Recht, Gifr = Gifr Or &H80 hat die Nebenwirkung, dass es alle INT-Register löscht.
    Ein Bug, aber in diesem Fall unschädlich, da dass INT1-Register des Mega16/32 auch gelöscht wird. Ist mir nie aufgefallen
    Code:
    Gifr = &H80
    wäre richtig. Danke für den Hinweis.

    @Steffen44
    wie SprinterSB sagte, beim Atmega2560 liegt das INTF1 im EIFR-Register auf Bit1.
    Also schreib:
    Code:
    EIFR=&H02
    Ein Kontrollblick ins manchmal fehlerhafte DAT-File zeigt:
    m2560def.dat
    Code:
    [IO]
    EIFR	= $1C
    ...das müsste klappen

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    19.08.2006
    Ort
    Kitzscher
    Alter
    38
    Beiträge
    237
    Hallo -tomas-

    erstmal sorry für das doppelposting ich wollte eigentlich nur das evtl. Frank mein Posting findet das ich gleich den RC5 Profi an der Hand habe hätte ich nie gedacht.

    Ja die Quelle habe ich nicht mehr genau gewußt deswegen dachte ich ich hätte den Code im Wiki gefunden was aber noch nicht der Fall ist. Da solltest du wirklich mal den Vorschlag machen diesen mit ins Wiki aufzunehmen da der Code einfach klasse ist.


    Ich habe den Code nun mal ausgetauscht und wie sollte es auch anders sein es ist es beim ATMEGA2560 natürlich nicht so einfach


    Nun zeigt er mir 6 Fehler an die mir überhaupt nichts sagen :

    .EQU not found , probbably using functions that are not supported by the selected Chip [TCCR0]

    .EQU not found , probbably using functions that are not supported by the selected Chip [TIMSK]

    Beide dieser Fehler stehen insgesamt 3 mal mit dem selben Wortlaut da.
    Zu der Fehlerzeile springt er leider auch nicht.

    Es wäre toll wenn du mal drüber schauen könntest ob du den Code für den ATMEGA2560 zum laufen bekommst.

    Ansonnsten muß ich mir wohl oder übel überlegen einen zweiten µC mit dem ATMEGA2560 zu verbinden und irgendwie das RC5 Signal per RS232 zu übertragen oder sowas in der Art.

    Besten Dank für deine Hilfe

    Gruß
    Steffen

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    28.03.2004
    Beiträge
    185
    Du hast nur einen Codeausschnitt gepostet...

    Bau den Code mal um, dass RC5 ohne Interrupt läuft. Dann ergänze die ISR.
    Bei den selteneren Atmels stecken in den m**def.dat oft Fehler.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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