Archiv verlassen und diese Seite im Standarddesign anzeigen : Register GIFR mit ATMEGA2560 ...RC5 Code geht nicht
Steffen44
19.02.2007, 09:43
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 :
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
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=$...
SprinterSB
23.02.2007, 09:04
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...
Gifr = Gifr Or &H80 'clear Flag Int1
ist ein Bug! Es hat den gleichen Effekt wie
Gifr = &Hff
Was der Autor der Software wahrscheinlich im Sinn hatte ist
Gifr = &H80 'clear Flag Int1
Steffen44
23.02.2007, 16:51
So ich hoffe ich habe alle RC5 Programmteile erwischt.
Das ist der 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.
SprinterSB
23.02.2007, 17:47
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".
Steffen44
23.02.2007, 21:27
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
SprinterSB
23.02.2007, 22:09
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.
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 :-)
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:
EIFR=&H02
Ein Kontrollblick ins manchmal fehlerhafte DAT-File zeigt:
m2560def.dat
[IO]
EIFR = $1C
...das müsste klappen
Steffen44
25.02.2007, 13:47
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.
Steffen44
26.02.2007, 07:18
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 :
'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
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.
Steffen44
26.02.2007, 15:23
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 ?
Lies mal https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=20209
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
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.