- 3D-Druck Einstieg und Tipps         
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
    Hallo,

    mit der ISR-Int0 Routine und dem Detectrxpause Interrupt wird das Summensignal des Modellbau-Empfängers ausgelesen:
    Code:
    Detectrxpause:
    Channel = 0
    Return
    Der Timer0 (Detectrxpause-Interrupt) ist auf 4.096ms eingestellt. Das Summensignal beinhaltet ja alle Kanäle der FC (in meinem Fall 8, wovon nur 5 eingelesen werden). Nachdem alle 8 Kanäle übertragen wurden, erfolgt eine kurze Pause, durch welche der Timer0 überläuft. Somit wird Channel auf 0 gesetzt, damit die Signale erneut eingelesen werden können.
    Mit diesen 5 Werten wird dann der Copter gesteuert; sie werden im übrigen Programm auf Integer-Zahlen (Bereich: -37 ... +37) umgerechnet. Aber hier gehts nur ums einlesen der Signale.
    Ich hoffe, das beantwortet deine Frage?!

    Gruß
    Chris

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Zitat Zitat von Che Guevara Beitrag anzeigen
    Code:
    Channel = 0
    Das ist die einzige Stelle an der auf Channel zugegriffen wird ? Allein daraus ergibt sich aber schon der Unterschied, dass bei einem Index von Channel 1..5 der Int0 wenigstens einmal vorher triggern muss muss, damit Channel auf 1 geht, wobei's bei PicNick's Code sofort losgeht. Und das macht den Unterschied aus.

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    32
    Beiträge
    1.578
    Ja, das ist die einzige Stelle. Channel wird nur zum Einlesen benötigt.
    Also muss ich doch auf >=1 und <6 abfragen, damits stimmt?!

    Gruß
    Chris

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Zitat Zitat von Che Guevara Beitrag anzeigen
    Also muss ich doch auf >=1 und <6 abfragen, damits stimmt?!
    Ich kenne nicht den gesamten Code und damit den kompletten Mechanismus, aber ich kann sagen dass wenn der Basic-Code >= 1 <6 abfragt und der funktioniert, die ASM Routine genau das Gleiche machen sollte.
    Du hast mir auch die Frage noch nicht beantwortet, woher das Hochzählen von Channel kommt, da in Deinem zuerst geposteten Basic-Code nicht enthalten.
    Zeig doch mal die Basic-Routine genau so, wie sie tatsächlich funktioniert.

  5. #5
    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

  6. #6
    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

  7. #7
    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

Ä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
  •  

Labornetzteil AliExpress