- 12V Akku mit 280 Ah bauen         
Seite 5 von 7 ErsteErste ... 34567 LetzteLetzte
Ergebnis 41 bis 50 von 67

Thema: RC-Empfänger Auswerten

  1. #41
    Erfahrener Benutzer Roboter-Spezialist Avatar von MiniMax
    Registriert seit
    26.07.2007
    Ort
    Bremen
    Beiträge
    241
    Anzeige

    Powerstation Test
    Code:
    $regfile = "m32def.dat"                                     ' specify the used micro
    $crystal = 16000000                                         ' used crystal frequency 16mHz
    $framesize = 80
    $hwstack = 80
    $swstack = 80
    $baud = 9600
    
    Config Porta.0 = Output
    Config Porta.1 = Output
    Config Porta.2 = Output
    Config Porta.3 = Output
    Config Porta.4 = Output
    Config Porta.5 = Output
    Config Porta.6 = Output
    
    Flashlinks Alias Porta.0
    Flashrechts Alias Porta.1
    Baconheck Alias Porta.2
    Flashheck Alias Porta.3
    Landescheinwerfer Alias Porta.4
    Posilightlirot Alias Porta.5
    Posilightregruen Alias Porta.6
    
    
    Timer1 = 3000
    Config Timer1 = Timer , Prescale = 8
    Enable Timer1
    Stop Timer1
    On Timer1 Flash
    
    Gosub Flashoff
    Gosub Landescheinwerferoff
    Gosub Posilightsoff
    
    Dim V As Byte
    Dim Flasher As Byte
    Dim Posi As Byte
    Declare Sub Flash
    
    
    Config Timer2 = Timer , Prescale = 256
    Stop Timer2
    Timer2=0
    
    Dim Zahl as Byte
    Dim Z11 As Byte
    
    
    Enable Interrupts
    Start Timer1
    
    
    
    Do
    
    
    
    
    Waitms 20
    
    Loop
    
    Empfaengerwerten:
    Gosub Empfaengereins
    Return
    
    
    Empfaengereins:
    Bitwait PIND.2, reset
    Bitwait PIND.2, set
    Start Timer2
    Bitwait PIND.2, reset
    Stop Timer2
    Zahl = Timer2
    Timer2 = 0
    Waitms 500
    Return
    
    Empfaengersort:
    Print Zahl
    
    If Zahl > 105 Then
    Gosub Flashon
    Gosub Landescheinwerferon
    Else
    
    If Zahl > 85 Then
    Gosub Flashon
    Gosub Landescheinwerferoff
    Else
    
    If Zahl < 75 Then
    Gosub Flashoff
    Gosub Landescheinwerferoff
    End If
    End If
    End If
    Return
    
    
    
    
    Flash:
    
    'Disable Interrupts
    Stop Timer1
    If V = 0 Then
    Set Flashlinks
    Set Flashrechts
    Set Flashheck
    End If
    
    If V = 1 Then
    Reset Flashlinks
    Reset Flashrechts
    Reset Flashheck
    End If
    
    If V = 2 Then
    Waitms 30
    End If
    
    If V = 3 Then
    Waitms 30
    End If
    
    If V = 4 Then
    Set Flashlinks
    Set Flashrechts
    Set Flashheck
    End If
    
    If V = 5 Then
    Reset Flashlinks
    Reset Flashrechts
    Reset Flashheck
    End If
    
    If V = 6 Then
    Waitms 30
    Set Baconheck
    End If
    
    If V = 7 Then
    Gosub Empfaengerwerten
    End If
    
    If V = 8 Then
    Gosub Empfaengersort
    End If
    
    If V = 9 Then
    End If
    
    If V = 10 Then
    Waitms 30
    End If
    
    If V = 11 Then
    Waitms 30
    End If
    
    If V = 12 Then
    End If
    
    If V = 13 Then
    End If
    
    If V = 14 Then
    Waitms 30
    Reset Baconheck
    End If
    
    If V = 15 Then
    Waitms 30
    V = 0
    'Enable Interrupts
    Start Timer1
    Timer1 = 3000
    Return
    End If
    
    'Enable Interrupts
    Incr V
    Start Timer1
    Timer1 = 3000
    Return
    
    
    
    
    
    Flashon:
    If Flasher = 0 Then
    Start Timer1
    Flasher = 1
    End If
    Return
    
    Flashoff:
    Stop Timer1
    Flasher = 0
    Reset Flashlinks
    Reset Flashrechts
    Reset Flashheck
    Reset Baconheck
    Return
    
    
    
    Landescheinwerferon:
    If Landescheinwerfer = 0 Then
    Set Landescheinwerfer
    End If
    Return
    
    Landescheinwerferoff:
    If Landescheinwerfer = 1 Then
    Reset Landescheinwerfer
    End If
    Return
    
    Posilightson:
    If Posi = 0 Then
    Set Posilightlirot
    Set Posilightregruen
    Posi = 1
    End If
    Return
    
    Posilightsoff:
    If Posi = 1 Then
    Reset Posilightlirot
    Reset Posilightregruen
    Posi = 0
    End If
    Return
    Gruß
    MiniMax

  2. #42
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    ich habe deinen Test Code nun mal einen Sub gelegt
    Eine Sub?? Das ist doch mindestens ein halbes Dutzend...

    Also:

    1. ISRs soll man so kurz wie nur irgend möglich halten. Warum? Weil während eines Interrupts zwar die nächsten IRQs angenommen, aber nicht ausgeführt werden können. Also idealerweise nur schnell ein Flag setzen, das in der -> Hauptschleife dann anzeigt, dass ein Interrupt passiert ist.

    2. In der Hauptschleife (von DO bis LOOP) dürfen ruhig auch ein paar Befehle stehen!

    3. Waitms... in einer ISR ist eines von den klassischen No-Go´s, weil es aus genannten Gründen für lange Zeit das Abarbeiten von anderen IRQs blockiert. Deine Timer1-ISR wird ja schon ca. 30mal pro Sekunde angesprungen, da kann es leicht sein, dass er sozusagen von einem Timer1-IRQ nahtlos in den anderen übergeht.

    4. Eine ISR sollte man nur im äußersten Notfall über ein Goto oder Gosub verlassen - und dann muss man unbedingt sicherstellen, dass das Programm korrekt in die ISR zurückkehrt, um sie sauber über das return zu verlassen. Ansonsten läuft Dir der Stack in wenigen Sekunden über.

    Möglicherweise wiederhole ich mich, aber ich würde an Deiner Stelle versuchen, all die Features nacheinander dazuzustricken, und nicht alles auf einmal. Und die Messung des Empfängerimpulses solltest Du unbedingt über einen Interrupt machen, da die Bitwait-Geschichte den Controller irrsinnig lange aufhält. Das war nur ein ganz grobes Testprogramm um zu sehen, ob der Controller den Empfänger überhaupt erkennt.

  3. #43
    Erfahrener Benutzer Roboter-Spezialist Avatar von MiniMax
    Registriert seit
    26.07.2007
    Ort
    Bremen
    Beiträge
    241
    Naja mein Problem ist ja wenn ich das in die Do loop schleife schreibe, unterbricht meine Timer1 ISR das Abfragen des Kanals
    Ich weiß einfach nicht mehr weiter! Wie ich dass so lösen kann, dass mein Timer die Port Abfrage net Unterrbricht
    Sollte ich vielleicht die "Leeren" Timer1 isr's canceln und in der Zeit die Port abfrage tun?
    Gruß
    MiniMax

  4. #44
    Erfahrener Benutzer Roboter-Spezialist Avatar von MiniMax
    Registriert seit
    26.07.2007
    Ort
    Bremen
    Beiträge
    241
    Hi, Ich habe jetzt deine "schnelle" Variante genommen - geht sehr gut:

    Code:
    $regfile = "m32def.dat"                                     ' specify the used micro
    $crystal = 16000000                                         ' used crystal frequency 16mHz
    $framesize = 80
    $hwstack = 80
    $swstack = 80
    $baud = 9600
    
    Config Porta.0 = Output
    Config Porta.1 = Output
    Config Porta.2 = Output
    Config Porta.3 = Output
    Config Porta.4 = Output
    Config Porta.5 = Output
    Config Porta.6 = Output
    
    Flashlinks Alias Porta.0
    Flashrechts Alias Porta.1
    Baconheck Alias Porta.2
    Flashheck Alias Porta.3
    Landescheinwerfer Alias Porta.4
    Posilightlirot Alias Porta.5
    Posilightregruen Alias Porta.6
    
    
    
    
    
    
    Config Timer2=Timer, Prescale=256
    Start Timer2
    
    Config INT0=Change
    On INT0 Flanke
    Enable INT0
    Enable Interrupts
    
    Dim Start1 As Byte
    Dim Stop1 As Byte
    Dim Impuls As Byte
    Dim Flag As Bit
    Dim V11 As Byte
    
    Do
    
    If Flag = 1 then
     Flag = 0
     Impuls = Stop1 - Start1
    
     If Impuls > 110 Then
     Set Flashlinks
     Set Flashrechts
     Set Baconheck
     Set Flashheck
     Set Landescheinwerfer
    
    Else
    
    If Impuls > 80 Then
     Set Flashlinks
     Set Flashrechts
     Set Baconheck
     Set Flashheck
     Reset Landescheinwerfer
    
     Else
    
     If Impuls < 75 Then
     Reset Flashlinks
     Reset Flashrechts
     Reset Baconheck
     Reset Flashheck
     Reset Landescheinwerfer
    
     End If
     End If
     End If
    
    
     If V11 = 50 Then
     Print "Impuls Kanal 1  " ; Impuls ; "   "                  'die Leerzeichen, weil Impuls 2- oder 3stellig sein kann)
     V11 = 0
     End If
     End if
    
    Loop
    
    Flanke:
    
    If PIND.2=1 then
     Start1 = Timer2
    Else
     Stop1 = Timer2
     Flag = 1
     V11 = V11 + 1
    End if
    
    Return
    Ich habe das Problem jetzt erkannt - Timer 1 und die Blitzlichter

    Ich galube da muss ich mir was anderes Überlegen - oder hast du einen Tipp?
    Gruß
    MiniMax

  5. #45
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    Okay - ich wollte Dir gerade auf Deinen vorletzten Beitrag hin empfehlen, die Impulserkennung über einen Interrupt zu machen. Das hast Du ja schon mal mit Erfolg gemacht!

    Kannst Du vielleicht noch ein Bisschen was zum Kapitel "Timer1 & die Blitzlichter" sagen? Was soll denn als Ergebnis am Ende rauskommen?? Mit ein paar mehr Infos kriege ich vielleicht auch einen Tip zusammen...

  6. #46
    Erfahrener Benutzer Roboter-Spezialist Avatar von MiniMax
    Registriert seit
    26.07.2007
    Ort
    Bremen
    Beiträge
    241
    Hi, also es funktionier so:

    Blitz
    kurze Pause
    Blitz
    Kurze Pause
    Bacon an
    Lange Pause
    Bacon aus
    Kurze Pause

    Die Timer Frequenz weist de ja schon. Eine Blitz funktioniert so:
    Timer1 läuft über -> ISR -> LED an -> Timer1 läuft über -> ISR -> LED aus

    Eine Kurze Pause ist so: Timer1 läuft über -> ISR -> Waitms 30 -> Timer1 läuft über -> ISR -> Waitms 30

    Eine Lange pause ist insgesamt etwa 7 Überläufe mit in jeder 4. Isr ein Waitms 30

    Code:
    Stop Timer1
    If V = 0 Then
    Set Flashlinks
    Set Flashrechts
    Set Flashheck
    End If
    
    If V = 1 Then
    Reset Flashlinks
    Reset Flashrechts
    Reset Flashheck
    End If
    
    If V = 2 Then
    Waitms 30
    End If
    
    If V = 3 Then
    Waitms 30
    End If
    
    If V = 4 Then
    Set Flashlinks
    Set Flashrechts
    Set Flashheck
    End If
    
    If V = 5 Then
    Reset Flashlinks
    Reset Flashrechts
    Reset Flashheck
    End If
    
    If V = 6 Then
    Waitms 30
    Set Baconheck
    End If
    
    If V = 7 Then
    Gosub Empfaengerwerten
    End If
    
    If V = 8 Then
    Gosub Empfaengersort
    End If
    
    If V = 9 Then
    End If
    
    If V = 10 Then
    Waitms 30
    End If
    
    If V = 11 Then
    Waitms 30
    End If
    
    If V = 12 Then
    End If
    
    If V = 13 Then
    End If
    
    If V = 14 Then
    Waitms 30
    Reset Baconheck
    End If
    
    If V = 15 Then
    Waitms 30
    V = 0
    'Enable Interrupts
    Start Timer1
    Timer1 = 3000
    Return
    End If
    
    'Enable Interrupts
    Incr V
    Start Timer1
    Timer1 = 3000
    Return
    Das is die ORGINAL Beleuchtung eines PPL-A Schein unterliegenden Flugzeuges nach der Anlage 1 zu §§ 17 und 19 Abs.
    7 der LuftVO.

    Ich hoffe ich habe genug Infos dir gegeben sonst einfah fragen
    Gruß
    MiniMax

  7. #47
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    Eine Lange pause ist insgesamt etwa 7 Überläufe mit in jeder 4. Isr ein Waitms 30
    Nochmal: Waitms 30 in einer ISR ist ungefähr so schlau wie bei 30 kn Ostwind nach Westen zu starten.

    Wenn das kleinste Zeitintervall 30ms ist, und der Rest ganzzahlige Vielfache davon sind, dann würde ich in der ISR einfach nur eine Variable um 1 hochzählen lassen. In der Hauptschleife bietet es sich dann an, mit "Select Case" die entsprechenden Ausgänge zu steuern.

    Wenn die Hauptschleife die Flash- und Beaconausgänge periodisch nach einem festen System auf High und Low legt, musst Du Dir noch etwas einfallen lassen, wie der RC-Empfänger mit einbezogen werden soll. So wie Du es bisher gemacht hast, dürfte dessen Einfluss nur von sehr begrenzter Dauer sein, weil alle 30ms die Ausgänge neu gesetzt werden. Man könnte das z.B. ganz einfach über die DDR-Register regeln!

  8. #48
    Erfahrener Benutzer Roboter-Spezialist Avatar von MiniMax
    Registriert seit
    26.07.2007
    Ort
    Bremen
    Beiträge
    241
    Hi, ähm DDR Register - was is das? War das nicht das um die Datenrichtung (ein/ausgang) zu bestimmen? Aber was soll das Bringen? Erklär dass doch mal etwas genauer
    Gruß
    MiniMax

  9. #49
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    Hi, ähm DDR Register - was is das?
    *Seufz... das meinte ich mit "ganz vorne anfangen..."

    Also: Wenn ich Dich richtig verstanden habe, sollen Zwei Dinge parallel laufen: Erstens soll ein regelmäßiger Rhythmus für die Flashlights und die Beacon generiert werden, gleichzitig sollen diese Gruppen und die Landescheinwerfer per RC-Signal ein- und ausgeschaltet werden. Richtig??

    Ersteres würde ich mit der Variablen V machen, die in der Timer1-ISR alle 30 ms hochgezählt wird. Select Case hatte ich ja schon angedeutet:

    Code:
    ...
    ...
    
    Do
    ...
    Select Case V
    
    Case 1: 
    Set Flashlinks
    Set Flashrechts
    Set Flashheck
    
    Case 2:
    Reset Flashlinks
    Reset Flashrechts
    Reset Flashheck
    
    Case 4:
    Set Flashlinks
    Set Flashrechts
    Set Flashheck
    
    Case 5:
    Reset Flashlinks
    Reset Flashrechts
    Reset Flashheck
    
    Case 6:
    Set Baconheck
    
    Case 14:
    Reset Baconheck
    
    Case 16:
    V=0
    
    End select
    ...
    Nur am Rande sei erwähnt, dass man den Effekt der Zeilen

    Set Flashlinks
    Set Flashrechts
    Set Flashheck

    auch kürzer bekommen kann:

    PORTA = PORTA OR &B00001011

    Damit setzt Du in einem Rutsch die Ausgänge A.0, A.1 und A.3, weil die Operation X ODER 1 als Resultat immer 1 hat, während X ODER 0 immer X ergibt.

    Wenn die Flashlights wieder aus sollen, könntest Du schreiben

    PORTA = PORTA AND &B11110100

    Damit löschst Du die Ausänge A.0, A.1 und A.3, denn X UND 0 ergibt immer 0, während X UND 1 immer X ergibt.

    (Boolesche Algebra...).

    Wie Du schon richtig vermutet hast, legt das DDR-Register fest, welcher der Anschlüsse als Ausgang konfiguriert ist. Wenn Du Deine Lampen nicht mit einem superhochverstärkenden Vorverstärker ansteuerst, kannst Du die Anschlüsse einfach als Eingang konfigurieren - dann bleiben die daran angeschlossenen Lampen aus, unabhängig davon, was im dazugehörigen PORT-Register steht.

    Beispiel:

    Flashlights und Beacon aktiv, Landescheinwerfer und Positionslichter aus:
    DDRA = &B00001111

    Positinslichter an, Rest aus:
    DDRA = &B01100000

    Nur Flashlights aktiv:
    DDRA = &B00001011

    dafür würde sich ein zweiter Select-Case-Befehl in der Hauptschleife anbieten, der die Variable Impuls abcheckt.

    BTW: Kenst Du eigentlich das Buch von Roland Walter?

    Hals- und Beinbruch!!

  10. #50
    Erfahrener Benutzer Roboter-Spezialist Avatar von MiniMax
    Registriert seit
    26.07.2007
    Ort
    Bremen
    Beiträge
    241
    Hi, Ja das Buch kenne ich

    Also: Wenn ich Dich richtig verstanden habe, sollen Zwei Dinge parallel laufen: Erstens soll ein regelmäßiger Rhythmus für die Flashlights und die Beacon generiert werden, gleichzitig sollen diese Gruppen und die Landescheinwerfer per RC-Signal ein- und ausgeschaltet werden. Richtig??
    Ja! Also es sind 2 SChalter vorhanden (1x 3Stufen und 1x 2Stufen) Über den 2Stufen schalter wird der Landescheinwerfer ein/aus geschaltet.
    Und auf dem 3Stufen Schalter soll es so laufen: Posilichter aus, Flash aus --> Posilichter an, Flash aus --> Posilichter an, Flash an.

    So nur die Sache mit dem Flash macht mir Kopfschmerzen
    Gruß
    MiniMax

Seite 5 von 7 ErsteErste ... 34567 LetzteLetzte

Berechtigungen

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

Solar Speicher und Akkus Tests