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=$...
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 :
Die Fehlermeldung lautet : Error invalid datatyp ?!Code:Gifr = Gifr Or &H80 'clear Flag Int1
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
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=$...
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...
ist ein Bug! Es hat den gleichen Effekt wieCode:Gifr = Gifr Or &H80 'clear Flag Int1
Was der Autor der Software wahrscheinlich im Sinn hatte istCode:Gifr = &Hff
Code:Gifr = &H80 'clear Flag Int1
Disclaimer: none. Sue me.
So ich hoffe ich habe alle RC5 Programmteile erwischt.
Das ist der Code :
@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.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
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.
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
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.
da bin ich wieder
@Steffen44
bitte immer Quellen angeben, das macht den Dialog einfacher
Der Code stammt von mir, der Link dazu ist:
https://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
wäre richtig. Danke für den Hinweis.Code:Gifr = &H80
@Steffen44
wie SprinterSB sagte, beim Atmega2560 liegt das INTF1 im EIFR-Register auf Bit1.
Also schreib:
Ein Kontrollblick ins manchmal fehlerhafte DAT-File zeigt:Code:EIFR=&H02
m2560def.dat
...das müsste klappenCode:[IO] EIFR = $1C
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
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.
Lesezeichen