- LiFePO4 Speicher Test         
Ergebnis 1 bis 10 von 65

Thema: Bascom Inline-Assembler

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    32
    Beiträge
    1.578
    Wie meinst du das mit dem Hochzählen? Hier
    Code:
    Isr_int0:                                                'falling edge detection
    If Channel > 0 And Channel < 6 Then                         'fill empf(1-5)
      Empf(channel) = Timer0
    End If
    Timer0 = 6                                                  'preload for 4.096 ms
    Incr Channel                                                'Increase Channel
    Return
    wird die Variable hochgezählt. Wenn du etwas anderes wissen möchtest, dann verstehe ich deine Frage leider nicht.

    Gruß
    Chris

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Zitat Zitat von Che Guevara Beitrag anzeigen
    Wie meinst du das mit dem Hochzählen?
    Ist ok, hab's jetzt gesehen. Selektive Wahrnehmung

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    32
    Beiträge
    1.578
    Ok
    Aber jetzt ist meine Frage noch offen?!
    Ich frage Channel nach >= 1 und < 6 ab. Wenns in dem Bereich ist, dann lese ich die Timer0 Variable WIE ein?
    Code:
       LSL   r24                                                ' * 2 (wordlength)
       CLR   r25                                                ' clear  (r24 kann ja nicht grösser als 8 werden)
       Loadadr Dummy , X                                        ' addr Empf(0)
       ADD   XL, r24                                            ' addr Empf + 2*channel
       ADC   XH, r25
       !IN    r24, TCNT0                                        ' timer0
       ST    X+ , r24                                           ' empf(channel) = timer0
       ST    X  , r25
    Funktioniert dann trotzdem, oder? Hier wird ja, soweit ich das verstanden habe, nur Channel nach links geschiftet, da Empf ein Word ist. Dann wird der entsprechende Empf-Feld-Bereich addresiert und Timer0 wird dort hineingeschrieben!?
    Muss ich außer den normal verwendeten Registern und SREG sonst noch was sichern? Warum muss ich überhaupt SREG sichern?

    Gruß
    Chris

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Zitat Zitat von Che Guevara Beitrag anzeigen
    dann lese ich die Timer0 Variable WIE ein?
    So:
    Code:
       !IN    r24, TCNT0                                        ' timer0
    Funktioniert dann trotzdem, oder? Hier wird ja, soweit ich das verstanden habe, nur Channel nach links geschiftet, da Empf ein Word ist. Dann wird der entsprechende Empf-Feld-Bereich addresiert und Timer0 wird dort hineingeschrieben!?
    Warum brauchst Du ein Wordarray, wenn Du nur einen 8Bit-Timer hast ? Werden da noch Rechnungen im Array durchgeführt ?
    Warum muss ich überhaupt SREG sichern?
    Weil das SREG Statusflags enthält, die z.B. von INC oder CPI verändert werden.

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    32
    Beiträge
    1.578
    Nein, ich meinte, wie ich die Variable dann ins Array schreibe? So, wie ich gerade eben nochmal gespostet habe?

    Ja, es werden noch Rechnungen durchgeführt und somit benötigt man ein Word. Ich habs e schon mal als Byte deklariert, aber das wollte dann nicht so recht. Deswegen ists ein Word.
    Ok, das verstehe ich.

    Gruß
    Chris

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Zitat Zitat von Che Guevara Beitrag anzeigen
    Nein, ich meinte, wie ich die Variable dann ins Array schreibe? So, wie ich gerade eben nochmal gespostet habe?
    Ja.
    Ja, es werden noch Rechnungen durchgeführt und somit benötigt man ein Word. Ich habs e schon mal als Byte deklariert, aber das wollte dann nicht so recht. Deswegen ists ein Word.
    Werden die Rechnungen innerhalb der Arrayvariable durchgeführt oder in einer extra Variablen ?

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    32
    Beiträge
    1.578
    Hier sind die Berechnungen im Code:
    Code:
    '--Noise filter--
    For I = 1 To 5
      Meanrx(i) = Meanrx(i) * 3
      Meanrx(i) = Meanrx(i) + Empf(i)                           '"lowpass filter" of the RC signal
      Shift Meanrx(i) , Right , 2                               ' (=divide by 4)
      Aempfh(i) = Meanrx(i) + 17                                'upper acceptable fluctuation
      Aempfl(i) = Meanrx(i) - 17                                'lower acceptable fluctuation
      If Empf(i) > Aempfh(i) Or Empf(i) < Aempfl(i) Then        'compare allowed fluctuation with current rc reading
         Empf(i) = Meanrx(i)                                    'if fluctuation was too high -> replace with averaged value
         Print "Error reading channel: " ; I                    'handy to check for RC problems
      End If
    Next
    
    'Empf(X) are filled in "getreceiver". They usually contain values ranging from 63 - 137.
    'Empf(throttlechannel) is the throttle stick. it will be rescaled differently.
    If Empf(throttlechannel) > 61 And Empf(throttlechannel) < 139 Then       'don't process values that can't be correct
      Sempf(throttlechannel) = Empf(throttlechannel) - 61
      Sempf(throttlechannel) = Sempf(throttlechannel) * 3       '==> values ranging from 3 (stick at bottom) to 228 (full throttle)
    End If
    'Now nick, roll, yaw and idle up switch
    
    If Empf(nickchannel) > 61 And Empf(nickchannel) < 139 Then  'don't process values that can't be correct
      Sempf(nickchannel) = Empf(nickchannel) - 100              'convert to values ranging from -37 to +37
    End If
    If Empf(rollchannel) > 61 And Empf(rollchannel) < 139 Then  'don't process values that can't be correct
      Sempf(rollchannel) = Empf(rollchannel) - 100              'convert to values ranging from -37 to +37
    End If
      If Empf(yawchannel) > 61 And Empf(yawchannel) < 139 Then  'don't process values that can't be correct
      Sempf(yawchannel) = Empf(yawchannel) - 100                'convert to values ranging from -37 to +37
    End If
    If Empf(5) > 61 And Empf(5) < 139 Then                      'don't process values that can't be correct
      Sempf(5) = Empf(5) - 100                                  'convert to values ranging from -37 to +37
    End If
    Eigentlich findet alles nicht im Array statt, trotzdem gehts nicht als Byte. Vielleicht liegt das daran, dass bei Fehlerhaftem Signal die Variable Meanrx in Empf geschrieben wird. Sicher bin ich mir da aber nicht. Vielleicht hast du eine Erklärung?

    Gruß
    Chris

Ähnliche Themen

  1. Inline Assembler
    Von Che Guevara im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 16
    Letzter Beitrag: 01.02.2010, 19:25
  2. AVR GCC inline Assembler
    Von chientech im Forum Assembler-Programmierung
    Antworten: 1
    Letzter Beitrag: 26.09.2009, 16:39
  3. Inline Assembler für Anfänger
    Von 1udo1 im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 25.10.2007, 19:53
  4. Inline Assembler - Register
    Von s.o. im Forum C - Programmierung (GCC u.a.)
    Antworten: 5
    Letzter Beitrag: 02.08.2007, 20:26
  5. Parameterübergabe bei Inline-Assembler
    Von ogni42 im Forum C - Programmierung (GCC u.a.)
    Antworten: 21
    Letzter Beitrag: 30.03.2006, 13:32

Berechtigungen

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

12V Akku bauen