- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 10 von 10

Thema: Ausgang mit 36khz modulieren. Wie?

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    26.03.2006
    Beiträge
    361

    Ausgang mit 36khz modulieren. Wie?

    Ich sende mit einem Mega8 IR Codes aus. Die Fernbedienungen habe ich (da sie keinen RC5 Code senden) mit einem Audioprogramm und einer TSOP aufgezeichnen und analysiert. Die 36khz modulation erzeuge ich mittels PWM an einem zweiten Ausgangsport des Mega8. Nun Suche ich eine Möglichkeit, dass ich das über nur einen Port hinbekomme. Geht das über PWM?

    Hier mein Code:

    Code:
    
    $regfile = "m8def.dat"
    $crystal = 8000000
    $hwstack = 100
    $swstack = 100
    $framesize = 100
    
    Config Pinb.0 = Output
    Config Portb.1 = Output
    Takt Alias Portb.1                                          '36khz takt moduliert über einen transistor
    Irled Alias Portb.0                                         '3 IR LED's über einen zweiten transistor gesteuert
    
    Dim Pwmwert As Word
    Dim L As Byte
    Dim H As Byte
    L = 0
    H = 1
    
    Config Timer1 = Timer , Prescale = 1 , Compare A = Toggle , Clear Timer = 1
    Pwmwert = 110
    Compare1a = Pwmwert
    
    Do
    Wait 2
    Gosub Sendecodeklimaanlage
    Loop
    
    Sendecodeklimaanlage:
    Irled = H
    Waitus 9000
    Irled = L
    Waitus 4500
    Irled = H
    Waitus 600
    Irled = L
    Waitus 600
    Irled = H
    Waitus 600
    Irled = L
    Waitus 600
    Irled = H
    Waitus 600
    Irled = L
    Waitus 600
    Irled = H
    Waitus 600
    Irled = L
    Waitus 600
    Irled = H
    Waitus 600
    Irled = L
    Waitus 600
    Irled = H
    Waitus 600
    Irled = L
    Waitus 1600
    Irled = H
    Waitus 600
    Irled = L
    Waitus 600
    Irled = H
    Waitus 600
    Irled = L
    Waitus 600
    Irled = H
    Waitus 600
    Irled = L
    Waitus 1600
    Irled = H
    Waitus 600
    Irled = L
    Waitus 1600
    Irled = H
    Waitus 600
    Irled = L
    Waitus 1600
    Irled = H
    Waitus 600
    Irled = L
    Waitus 1600
    Irled = H
    Waitus 600
    Irled = L
    Waitus 1600
    Irled = H
    Waitus 600
    Irled = L
    Waitus 600
    Irled = H
    Waitus 600
    Irled = L
    Waitus 1600
    Irled = H
    Waitus 600
    Irled = L
    Waitus 1600
    Irled = H
    Waitus 600
    Irled = L
    Waitus 600
    Irled = H
    Waitus 600
    Irled = L
    Waitus 1600
    Irled = H
    Waitus 600
    Irled = L
    Waitus 600
    Irled = H
    Waitus 600
    Irled = L
    Waitus 600
    Irled = H
    Waitus 600
    Irled = L
    Waitus 600
    Irled = H
    Waitus 600
    Irled = L
    Waitus 600
    Irled = H
    Waitus 600
    Irled = L
    Waitus 600
    Irled = H
    Waitus 600
    Irled = L
    Waitus 600
    Irled = H
    Waitus 600
    Irled = L
    Waitus 1600
    Irled = H
    Waitus 600
    Irled = L
    Waitus 600
    Irled = H
    Waitus 600
    Irled = L
    Waitus 1600
    Irled = H
    Waitus 600
    Irled = L
    Waitus 1600
    Irled = H
    Waitus 600
    Irled = L
    Waitus 1600
    Irled = H
    Waitus 600
    Irled = L
    Waitus 1600
    Irled = H
    Waitus 600
    Irled = L
    Waitus 1600
    Irled = H
    Waitus 600
    Irled = L
    Waitus 1600
    Irled = H
    Waitus 600
    Irled = 0
    Return
    
    End
    ----------------------------------------------------------------------------------------
    Je tiefer die Sonne der Kunst sinkt, umso grössere Schatten werfen Zwerge!!

  2. #2
    Erfahrener Benutzer Begeisterter Techniker Avatar von Torrentula
    Registriert seit
    10.10.2009
    Ort
    Procyon A
    Beiträge
    355
    Du kannst den pin an dem du die PWM erzeugst auf Eingang schalten um den Ausgangstreiber (push-pull transistoren im IC) auszuschalten, dann dürfte keine PWM mehr am Pin anliegen (bei PICs würde das so funktionieren, bei AVRs bin ich mir da nicht sicher).

    Alternativ könntest du die PWM ein- und ausschalten.
    MfG Torrentula

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    26.03.2006
    Beiträge
    361
    danke! die pwm nur einzuschalten wenn ich ein high sende war die lösung. somit klappt alles über einen einzelnen port
    ----------------------------------------------------------------------------------------
    Je tiefer die Sonne der Kunst sinkt, umso grössere Schatten werfen Zwerge!!

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Hallo, wenn Du die PWM über das COMA1 Bit ausschaltest, kann es sein, daß der Pin gerade high ist. Dann leuchtet die Sendediode ständig. Man könnte dann noch ein PORTB.1 = 0 hinterher schicken. Oder eben wie Torrentula schrieb, den Pin als Input konfigurieren. Wie hast Du es gemacht?

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    26.03.2006
    Beiträge
    361
    Ich hatte genau dieses Problem, dass der Port gelegentlich auf high blieb. Habe mir dann wie im Codebeispiel zu sehen geholfen. Ist sicher nich die feine englische Art aber es läuft perfekt. Es wäre für mich ziemlich wichtig das waitus in einer Variablen zu haben damit ich die Wartezeit zwischen den Bits bei unterschiedlichen Fernbedienungen im Programm ändern kann. Leider klappt das bisher nur mit einer Konstante. Habe gelesen, bei einem schnelleren Quarztakt ist es auch mit einer Variablen möglich. Teste ich noch, bin aber auch für jeden anderen Tipp dankbar.

    Hier der abgeänderte Code:

    Code:
    $regfile = "m8def.dat"
    $crystal = 8000000
    $hwstack = 200
    $swstack = 200
    $framesize = 200
    
    Config Portb.1 = Output
    Irled Alias Portb.1
    
    Dim Pwmwert As Word
    Dim L As Byte
    Dim H As Byte
    Dim Code1 As String * 120 , Stellenzaehler As Byte , Bitwert_str As String * 1 , A As Byte
    L = 0
    H = 1
    
    Config Timer1 = Timer , Prescale = 1 , Compare A = Disconnect , Clear Timer = 1
    Pwmwert = 110
    Compare1a = Pwmwert
    Const Bitlaenge = 600
    
    Do
    Wait 2
    Gosub Sendecodeklimaanlage
    Loop
    
    Sendecodeklimaanlage:
    Code1 = "1111111111111110000000101010101010010101001001001001001010010010100101010101010100101001001001001001001"
    Gosub Auswertung
    Return
    
    Auswertung:
    Stellenzaehler = Len(code1)
    For A = 1 To Stellenzaehler
    Bitwert_str = Mid(code1 , A , 1)
    Select Case Bitwert_str
    Case "1"
    Gosub Sendehigh
    Case "0"
    Gosub Sendelow
    End Select
    Next A
    Return
    
    Sendehigh:
    Config Timer1 = Timer , Prescale = 1 , Compare A = Toggle , Clear Timer = 1
    Start Timer1
    Waitus Bitlaenge
    Stop Timer1
    Config Timer1 = Timer , Prescale = 1 , Compare A = Disconnect , Clear Timer = 1
    Return
    Sendelow:
    Waitus Bitlaenge
    Return
    
    End
    ----------------------------------------------------------------------------------------
    Je tiefer die Sonne der Kunst sinkt, umso grössere Schatten werfen Zwerge!!

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Zitat Zitat von Accenter Beitrag anzeigen
    Es wäre für mich ziemlich wichtig das waitus in einer Variablen zu haben damit ich die Wartezeit zwischen den Bits bei unterschiedlichen Fernbedienungen im Programm ändern kann. Leider klappt das bisher nur mit einer Konstante.
    Mit zB.
    DIM Wartezeit as WORD
    Wartezeit = 600
    WAITUS Wartezeit
    sollte es funktionieren. Soll ab Bascom Version 1.12.. gehen. Bei mir kompilierte es mit Version 2.0.7.5. Hab es aber nicht real ausprobiert.

    Code:
    Sendehigh:
    Config Timer1 = Timer , Prescale = 1 , Compare A = Toggle , Clear Timer = 1
    Start Timer1
    Waitus Bitlaenge
    Stop Timer1
    Config Timer1 = Timer , Prescale = 1 , Compare A = Disconnect , Clear Timer = 1
    Return
    Ist die Sendediode nach dem Compare_A = Disconnect wirklich immer aus? Wenn nicht, nach der Config Timer1 mit dem Disconnect Zeile noch PORTB.1 = 0 bzw IRLED = L hinzufügen. START TIMER1 und STOP TIMER1 ist eigentlich nicht notwendig.

    PS. Fand die Idee mit Audioprogramm die Fernbedienung zu analysieren Klasse. Muß ich mir merken.

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

Ähnliche Themen

  1. PWM Ausgang ansteuern - wie?
    Von Barthimaeus im Forum C - Programmierung (GCC u.a.)
    Antworten: 8
    Letzter Beitrag: 07.11.2007, 14:35
  2. 36 kHz modulieren mit Bascom
    Von adrisch im Forum Asuro
    Antworten: 5
    Letzter Beitrag: 30.06.2007, 16:50
  3. serout wie mit 36khz modulieren
    Von alper im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 03.05.2007, 22:16
  4. HFS301 mit Ton modulieren???
    Von elcomportal im Forum Sensoren / Sensorik
    Antworten: 2
    Letzter Beitrag: 24.02.2007, 12:28
  5. Hochspannung mit Hochfrequenz modulieren
    Von cydodon im Forum Elektronik
    Antworten: 5
    Letzter Beitrag: 17.10.2005, 11:46

Berechtigungen

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

LiFePO4 Speicher Test