mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik [ATmega88] RC5 mit Interrupt auslösen (Bascom)


Autor: naeschd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

ich habe zur Zeit folgendes Problem:
Ich möchte meinen ATmega88 betriebenen RGBY-Controller fernbedienen. 
Benutze hierfür das Empfängermodul TSOP1736 und natürlich RC5.

Mein Programm (Bascom) ist auch schon sehr gewachsen und enthält 
natürlich unter Anderem auch while-schleifen und waitms, wobei dann 
folgendes Problem auftaucht, dass wenn ich zum falschen Zeitpunkt meine 
FB betätige ich evtl in einer Schleife stecke und die Betätigung der FB 
gar nicht erkannt wird... Um meine Fernbedienung immer sofort zu 
erfassen wäre es ja sinnvol sobald eine Taste gedrückt wurde einen 
Interrupt auszulösen. Wie löse ich den denn am Besten aus?

Bis jetzt habe ich versucht den Ausgang des TSOP1736 auf den INT0 zu 
legen und den auf steigende Flanke konfiguriert. Aber durch die schnelle 
folge von steigenden Flanken beim RC5-Signal funktioniert das natürlich 
nicht...

Wie würdet ihr das lösen, dass die Fernbedienung jederzeit zuverlässig 
ausgelesen werden kann?

Danke für eure Hilfe...

Autor: Hubert G. (hubertg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das mit den steigenden Flanken auf INT0 funktioniert schon, nur muss das 
Programm entsprechen ausgelegt sein. Lange while-Schleifen und waitms 
sind natürlich nicht das richtige.

Autor: Der Matze (naeschd)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hubert G. wrote:
> Das mit den steigenden Flanken auf INT0 funktioniert schon, ...


Wenn ich aber das RC5-Signal auf den INT0-Eingang lege und diesen bei 
steigender Flanke ausführen lasse, springt das Probgramm zwar in den 
Interrupt. Wenn ich jedoch dort den Befehl getrc5() aufrufe um das 
Signal auszulesen bleibt das Programm im Interrupt hängen. Wenn ich den 
getrc5() Befehl entferne springt er nach dem Interrupt auch wieder 
zurück...? kann es da kein Problem geben, dass beim RC5 sehr viele 
steigende Flanken in kurzer Zeit kommen?

Gruß

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Setze in der Interrupt-Routine nur ein Flag, dass dann im Hauptprogramm 
den RC5-Empfang aufruft.

Du kannst Dir den Interrupt aber sparen, wenn Du im Programm nicht in 
irgendwelchen Schleifen wartest, sondern einen Zähler hochzählst und 
abhängig vom Zählerstand bestimmte Aktionen ausführst.

Dann kommt das Programm oft genug an der RC5-Dekodierung vorbei.....

Otto

Autor: Flipp Flopp (flipp86)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so ich hol den thread nochmal hoch.
ich habe nämlich genau das selbe problem und bin auch noch zu keiner 
lösung gekommen.

auch die tipps die hier genannt wurden hab ich probiert. klappt aber 
nicht.

ich poste einfach mal meinen versuch. vlt hab ich ja eure tipps noch 
nicht richtig verstanden und umgesetzt.
programmiere nämlich noch nicht so lange mit bascom.
$regfile = "m8def.dat"
$lib "mcsbyte.lbx"
$crystal = 8000000                                          'interner Quarz 8 MHz


Declare Sub Check_input()                                   ' die Subfunktion

Config Rc5 = Pind.2

' Timer1 und Timer2 für PWM Betrieb initialisieren
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 1
Config Timer2 = Pwm , Compare Pwm = Clear Up , Prescale = 1


Config Pinb.3 = Output                                      'PWM Output rot Timer2
Config Pinb.2 = Output                                      'PWM Output grün Timer1
Config Pinb.1 = Output                                      'PWM Output blau Timer1

Led1 Alias Ocr2                                             'PIN 17 PB3
Led3 Alias Ocr1al                                           'PIN 16 PB2
Led2 Alias Ocr1bl                                           'PIN 15 PB1

Dim Address As Byte , Command As Byte


Led1 = 0                                                    'startwerte
Led2 = 0
Led3 = 0



Dim Ir_signal As Bit


'Config Timer1 = Falling
Enable Interrupts
Enable Int0
On Int0 Check_rc5






Do


   If Ir_signal = 1 Then

      Getrc5(address , Command)
      Ir_signal = 0

   End If


   Check_input


Loop




     Sub Check_input()

                 If Command = 5 Then

                     While Led1 < 255
                          If Ir_signal = 1 Then
                             Exit Sub
                          End If

                       Incr Led1

                       Waitms 20
                     Wend

                End If


     End Sub


End



Check_rc5:


      Ir_signal = 1

Return


was hab ich falsch gemacht?? könnt ihr mir helfen ??

danke für eure hilfe
mfg Flipp

Autor: Rolf Im forum (for_ro)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachdem die erste Flanke des RC5 Codes erkannt worden ist, startest du 
im Main-Loop die Erkennung. Für den ersten übertragenen Code fehlt daher 
die erste Flanke, dein GetRC5 funktioniert nicht.
Außerdem ist GetRC5 intern bestimmt unterbrechbar. D.h. bei der nächsten 
Flanke wird zuerst einmal der Interrupt zuschlagen und diese Flanke ist 
dann wieder nicht verfügbar. Du musst also zumindest diesen Interrupt 
vor der Erkennung abschalten. Nach der Erkennung musst du dann den dann 
schon wieder aufgetretenen Interrupt aus dem GIFR löschen, sonst löst 
der Interrupt sofort nach Wieder-Enable aus.
Ich glaube ehrlich gesagt nicht, dass du mit dem GetRC5 Befehl und ext. 
Interrupt in der Lage sein wirst, einen sicheren Empfang zu erreichen.
Außerdem wartet Bascom immer auf zwei komplette Übertragungen, die aber 
über 100ms auseinanderliegen. Die Gesamtzeit für die Ausführung des 
GetRC5 Befehls ist über 150ms, was meistens induskutabel für ein 
allgemeines Disable Interrupts ist.

Gruß

Rolf

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.