- Labornetzteil AliExpress         
Seite 3 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 21 bis 30 von 32

Thema: IR-Schaltung geht nicht

  1. #21
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2004
    Alter
    40
    Beiträge
    255
    Anzeige

    Praxistest und DIY Projekte
    Ich habe noch nie in Bascom programmiert und habe mir gerade mal nur den Sendecode angeschaut.
    Das kann so nicht funktionieren.
    Erstens: Wie ich schon zweimal erwähnt habe. Die Sende LED darf nicht dauernd leuchten. Du musst sie mit 36 kHz modulieren - sonst liefert dein TSOP Empfänger IMMER nur 0 zurück.

    In den Sende routinen musst du nicht 500 ms warten (was sogar falsch ist) und du musst auch nicht dien PORTb.0 wieder auf Null zurück setzen.

    Zur Modulation.

    Code:
    $regfile = "m8def.dat" 
    $crystal = 12000000 
    
    Dim Daten As Byte 
    Dim A As Integer 
    
    Config Portb = Output 
    
    Mainloop: 
    Daten = 170 
    For A = 1 To 8 
    If Daten.0 = 1 Then 
    Gosub Send1 
    Else 
    Gosub Send0 
    End If 
    rotate Daten , Right , 1 
    Waitms 500 
    Next A 
    Goto Mainloop 
    
    Send1: 
    Send = 1 
    Goto Mainloop 
    
    Send0: 
    Send = 0 
    Goto Mainloop 
    
    
    Timer [der alle 1/ 72 000 s aufgerufen wird]:
    if send = 1 Then
      if toggle = 0 Then
        toggle = 1
        PORTb.0 = 1
      else
        toggle = 0
        PORTb.0 = 0 
      end if
    else
      Portb.0 = 0
    end if
    So etwa sollte die Senderoutine aussehen.

    Ich schau mir gleich noch die Empfangsroutine an.

    Grüße
    Flite

    EDIT: Ach ja: eine Startbedingung fehlt natürlich auch. Sonst empfängt dein Empfänger nachher immer nur müll ...

  2. #22
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2004
    Alter
    40
    Beiträge
    255
    Ähnliches gilt auch für deine Empfangsroutine:

    Code:
    $regfile = "m8def.dat" 
    $crystal = 12000000 
    
    Dim A As Integer 
    Dim Rxdaten As Byte 
    Dim Zustand As Integer 
    
    Config Portd = Input 
    Config Portb = Output 
    
    Zustand = Pind.2  // WAS IST DAS ?!?
    
    Mainloop: 
    
    StartLoop:
    If NOT Startbedingung = True Then
    Goto StartLoop
    ' Auf Startbedinung warten
    
    For A = 1 To 8 
    If PINb.0 = 0 Then 
      Rxdaten.0 = 0
    Else 
      Rxdaten.1 = 1
    End If 
    rotate Rxdaten , Left , 1 
    Waitms 500 
    Next A 
    
    PORTC = Rxdaten 'Ausgabe des gesendeten Bytes
    
    Goto Mainloop
    So könnte es schon eher funktinieren.

  3. #23
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    31.01.2004
    Beiträge
    585
    Das funktioniert auch nicht
    Was mache ich nur falsch...
    Hab die Codes, so wie sie sind, je in einen AVR eingeflashed.
    Aber es geht nicht ;-(

    MfG,
    SHadowPhoenix

    ...Was könnte ich nur falsch machen...

  4. #24
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2004
    Alter
    40
    Beiträge
    255
    Was hast du jetzt als Startbedinung genommen?

    Das sie so nicht gehen ist ja klar.
    Wann soll die Variable Startbedinung auch auf True gesetzt werden?
    Hast du den Timer richtig initialisiert?
    Was für einen AVR verwendest du denn?

    Grüße Flite

  5. #25
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    31.01.2004
    Beiträge
    585
    Startbedingung habe ich noch keine, sorry aber ich weiß nicht, wie ich das programmieren soll.
    Ich benutze einen AVR ATmega8.
    Der Timer sollte richtig initialisiert sein, habe den Code ja abgeschrieben.

    MfG,
    ShadowPhoenix

  6. #26
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2004
    Alter
    40
    Beiträge
    255
    Also zum senden Startbedingung:

    Vielleicht so:

    Code:
    send = 1
    waitms 10
    send = 0
    Zum empfangen der Startbedingung:

    Code:
    startLoop:
    if PORTB.0 = 1 Then
      waitms(52)
      if NOT PORTB.0 = 0 Then
        goto startLoop
      end if
    else
      goto startLoop
    end if
    Ich kann den Code hier nicht ausprobieren.
    Versuch ihn zu verstehen und dann reinzukopieren (natürlich an die richtige Stelle).

    Zur Initialisierung des Timers.
    Kannst du mir mal posten, wie du den Timer initialisert hast?

    Grüße
    Flite

  7. #27
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    31.01.2004
    Beiträge
    585
    Den Timer initialisieren hast du doch eh schon gepostet:

    Timer [der alle 1/ 72 000 s aufgerufen wird]:
    if send = 1 Then
    if toggle = 0 Then
    toggle = 1
    PORTb.0 = 1
    else
    toggle = 0
    PORTb.0 = 0
    end if
    else
    Portb.0 = 0
    end if

    So habe ich das auch hingeschrieben!

    MfG,
    ShadowPhoenix

  8. #28
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2004
    Alter
    40
    Beiträge
    255
    Timer [der alle 1/ 72 000 s aufgerufen wird]:

    SO HAST DU DAS DA REIN GESCHRIEBEN ?!?!?!

    Dat geht logischerweise nicht.
    Ich weiß nicht wie man den Timer in Bascom initialisiert. Aber dazu gibts doch im Netz bestimmt genug Infos (oder auch in der Bedienungsanleitung von Bascom).

    Du brauchst eine Funktion, die alle 1 / 72 000 s aufgerufen wird um dein Signal zu modulieren. Diese kann man mit dem Timer machen.

    Und das obere Beispiel hast du so rein kopiert und kompiliert. Kann mir irgendwie nicht vorstellen, dass der so einen Schwachsinn überhaupt kompiliert.

    Vielleicht solltest du dir erstmal ein wenig die Grundlagen aneignen?

    Versuch doch mal eine LED mittels des Timers zum blinken zu kriegen, so dass die jede Sekunde einmal und einmal aus geht ...

    Das soll dich nicht von dem Projekt hier abhalten (das ist nämlich echt einfach zu realisieren). Aber wenigstens die Grundfunktionen solltest du beherrschen, weil ich ohne je Bascom programmiert zu haben dir hier kein völlig funktinierendes Proghramm reinstellen kann.

    In Codevision C könnte ich dir so ein prgramm schreiben, aber das ist ja nicht Sinn der Sache. Dabei lernst du ja nichts.

    grüße
    Flite

  9. #29
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    31.01.2004
    Beiträge
    585
    Oh sorry, diese Zeile:
    Timer [der alle 1/ 72 000 s aufgerufen wird]:
    hatte ich natürlich nicht eingefügt. !

    Flite, es ist nicht so, dass ich die Grundlagen des AVR's nicht beherrsche.
    Eine Led per Taster zum blinken zum bringen ist wohl das einfachste.
    7Segment Anzeigen usw. habe ich auch schon angesteuert.
    Eh nicht schwer, nur das mit den Bytes usw. kapiere ich leider nicht!
    Da bin ich totaler Anfänger, aber da ich nun so etwas für den ADDLink zum fernsteuern meines Roboterfahrzeuges brauche, muss ich langsam
    anfangen, mich mit diesen Funktionen vertraut zu machen :-O

    MfG,
    ShadowPhoenix

    PS: Bitte tu mir einen gefallen:
    Schreibe mir bitte den kompletten Sendecode sowie den kompletten Empfängercode auf (exklusive der Timer funktion, da blättere ich noch einmal nach, ok?)
    Danke, weil dann flashe ich die AVR's mal damit und dann mal sehen !

  10. #30
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2004
    Alter
    40
    Beiträge
    255
    So ich habs jetzt mal zusammenkopiert, wie ich mir das vorstelle.
    Ich glaube jedoch nicht, dass das jetzt aufs erste Mal funktioniert - vielleicht sieht ja jemand anderes den Thread hier noch und kann schnell mal drüber schauen.

    Aber probieren kann mans ja:

    Der Sendecode:
    Code:
    $regfile = "m8def.dat" 
    $crystal = 12000000 
    
    Dim Daten As Byte 
    Dim A As Integer 
    Dim Send as Byte
    Dim toggle as Byte
    
    Config Portb = Output 
    
    Mainloop: 
    Waitms 1000
    Daten = 170 
    
    'Sende Startbedingung
    send = 1 
    waitms 10 
    send = 0 
    
    For A = 1 To 8 
     If Daten.0 = 1 Then 
      Send = 1 
     Else 
      Send = 0
     End If 
     rotate Daten , Right , 1  
     Waitms 500 
    Next A 
    
    
    Goto Mainloop 
    
    
    [[[[ DIESE FUNKTION MUSS ALLE 1 / 72000 s AUFGERUFEN WERDEN ]]]]]
    if send = 1 Then 
     if toggle = 0 Then 
      toggle = 1 
      PORTb.0 = 1 
     else 
      toggle = 0 
      PORTb.0 = 0 
     end if 
    else 
     Portb.0 = 0 
    end if
    Und der Empfangscode:

    Code:
    $regfile = "m8def.dat" 
    $crystal = 12000000 
    
    Dim A As Integer 
    Dim Rxdaten As Byte 
    Dim Zustand As Integer 
    
    Config Portd = Input 
    Config Portb = Output 
    
    
    Mainloop: 
    
    
    startLoop: 
    if PORTB.0 = 1 Then 
    waitms(52) 
    if NOT PORTB.0 = 0 Then 
    goto startLoop 
    end if 
    else 
    goto startLoop 
    end if 
    
    waitms 10
    
    For A = 1 To 8 
    If PINb.0 = 0 Then 
    Rxdaten.0 = 0 
    Else 
    Rxdaten.0 = 1 
    End If 
    rotate Rxdaten , Left , 1 
    Waitms 500 
    Next A 
    
    PORTD = Rxdaten 'Ausgabe des gesendeten Bytes 
    
    Goto Mainloop

    Der Sendecode sendet alle 5050 ms die Befehle.
    Dabei dauert ein Bit 500 ms und die Startbedinung 50 ms.
    Vor jedem senden wird 1000 ms gewartet.

    Das empfangene Byte wird an PORT D angelegt. D.h. den musst du noch auf Ausgang schalten (weiß ich nicht wie ...).

    Grüße
    Flite

Seite 3 von 4 ErsteErste 1234 LetzteLetzte

Berechtigungen

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

Labornetzteil AliExpress