- Akku Tests und Balkonkraftwerk Speicher         
Seite 4 von 5 ErsteErste ... 2345 LetzteLetzte
Ergebnis 31 bis 40 von 45

Thema: Multitasking

  1. #31
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Anzeige

    Powerstation Test
    Das ist kein C, irgendein Pseudo-Code eben. Ersetzte einfach IF-THEN-ELSE durch wenn-dann-sonst, da setzt du dann deine Tests und bedingten Sprünge rein.

    Das nach Assembler codieren oder C oder Basic oder Ada oder was auch immer ist doch kein Thema mehr, wenn man weiß, was zu tun ist.

    Du machst eben das, was zu tun ist nicht jedes mal sondern nur jedes 3. mal und anstatt bei 25µs bist du bei 3·25µs=75µs. Noch einfacher erklären geht nun echt nicht...
    Disclaimer: none. Sue me.

  2. #32
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    21.10.2005
    Ort
    Erde
    Alter
    58
    Beiträge
    1.195
    Dann nochmal als Fließtext. In Deiner Interrupt-Routine zählst Du eine Variable hoch. Abhängig von deren Wert kannst Du jetzt zu bestimmten Zeiten, die ein Vielfaches von 25 us sind, weitere Routinen ausführen.

  3. #33
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    38
    Beiträge
    795
    Aus dir machen wir schon noch nen Softwareking!

    Also nochmal:

    Wir betreiben jetzt 3 LEDs.
    LED1: 25ms ein...25ms aus.
    LED2: 50ms ein...50ms aus.
    LED3: 75ms ein...75ms aus.


    Also machen wir uns drei Variablen. Für jede LED eine:
    LED1: irq_25ms
    LED2: irq_50ms
    LED3: irq_75ms



    Der kleinste gemeinsame Teiler ist 25ms . Also stellen wir den TIMER0 zB so ein, dass er alle 25ms eine Interruptrutine ausführt.

    START der Interruptrutine {
    WENN irq_25ms GLEICH 25ms IST, DANN: Setze irq_25ms auf 0 Zurück ANSONSTEN zähle irq_25ms um 25ms hoch.
    WENN irq_50ms GLEICH 50ms IST, DANN: Setze irq_50ms auf 0 Zurück ANSONSTEN zähle irq_50ms um 25ms hoch.
    WENN irq_75ms GLEICH 75ms IST, DANN: Setze irq_70ms auf 0 Zurück ANSONSTEN zähle irq_75ms um 25ms hoch.
    }ENDE

    Das war jetzt die Funktion, die der Timer alle 25ms ausführt!
    In dieser Funktion, welche alle 25ms ausgeführt wird, wird jede Variable um 25ms hochgezählt. Wenn sie ihr maximum erreicht haben, setzt man wie wieder auf 0! Sie werden NUR von der Timer-Routine beeinflusst!!!




    Im Hauptprogramm untersucht man jetzt diese Variablen:

    WENN irq_25ms GLEICH 25ms IST, DANN verändere LED1
    WENN irq_50ms GLEICH 50ms IST, DANN verändere LED2
    WENN irq_75ms GLEICH 75ms IST, DANN verändere LED3
    Gruß,
    Franz

  4. #34
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    38
    Beiträge
    795
    Um auf das im Hauptprogramm noch genauer einzugehen:

    WENN irq_25ms GLEICH 25ms IST, DANN SCHAUE OB LED1 AN IST: WENN JA, MACH SIE AUS, WENN NEIN, MACH SIE AN!
    WENN irq_50ms GLEICH 50ms IST, DANN SCHAUE OB LED2 AN IST: WENN JA, MACH SIE AUS, WENN NEIN, MACH SIE AN!
    WENN irq_75ms GLEICH 75ms IST, DANN SCHAUE OB LED3 AN IST: WENN JA, MACH SIE AUS, WENN NEIN, MACH SIE AN!
    Gruß,
    Franz

  5. #35
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    26.04.2006
    Beiträge
    153
    wie soll ich 25ms vegleichen?? oder 50ms oder 75 ms???
    soll ich den Timer abfragen?

    MFG
    Michael

  6. #36
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    38
    Beiträge
    795
    Das war jetzt die Funktion, die der Timer alle 25ms ausführt!
    In dieser Funktion, welche alle 25ms ausgeführt wird, wird jede Variable um 25ms hochgezählt. Wenn sie ihr maximum erreicht haben, setzt man wie wieder auf 0! Sie werden NUR von der Timer-Routine beeinflusst!!!
    Die Variablen frägst du ab! Die Timer-Interrupt-routine aktualisiert sie!!!
    Das läuft alles völlig im hintergrund!

    Du musst nur noch beobachten, wann eine dieser Variablen den maximalen wert annimmt!

    Und wenn das der Fall ist, dann veränderst die LED!!!

    Um auf das im Hauptprogramm noch genauer einzugehen:

    WENN irq_25ms GLEICH 25ms IST, DANN SCHAUE OB LED1 AN IST: WENN JA, MACH SIE AUS, WENN NEIN, MACH SIE AN!
    WENN irq_50ms GLEICH 50ms IST, DANN SCHAUE OB LED2 AN IST: WENN JA, MACH SIE AUS, WENN NEIN, MACH SIE AN!
    WENN irq_75ms GLEICH 75ms IST, DANN SCHAUE OB LED3 AN IST: WENN JA, MACH SIE AUS, WENN NEIN, MACH SIE AN!
    Gruß,
    Franz

  7. #37
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    26.04.2006
    Beiträge
    153
    Ich weiß nicht wie ich dass in assembler richtig schreibe!
    Ich verstehe dich jetzt ganz gut.


    MFG
    Michael

  8. #38
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    38
    Beiträge
    795
    Hm.. mit assembler kenn i ich mich nicht aus...

    Evtl steigst du ja auf C um.... Ich denke das lohnt sich
    Gruß,
    Franz

  9. #39
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    26.04.2006
    Beiträge
    153
    Gibts hier irgendwo im internet eine seit wo c programmieren beschrieben ist für assembler? Wenn ja welche?

    MFG
    Michael

  10. #40
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    53
    Beiträge
    2.236
    O man, das ist jetzt echt lustig hier...

    Assembler...
    zuerst machen wir uns einen "Merker"

    Code:
    .equ LED2 = 0
    
    .def Merkerregister = R17
    
    ..
    ..
    ..
    clr Merkerregister
    jetzt ein Interrupt, der sagenwirmal alle 25 mS aufgeführt wird.

    Code:
    interrupt:
    ...
    ...
    ...
    sbrc Merkerregister,LED2
    rjmp led2sollleuchten
    sbr Merkerregister,(1<<LED2)
    rjmp zweiteled
    led2sollleuchten:
    cbr Merkerregister,(1<<LED2)
    sbic PORTB,PB2
    rjmp led2sollleuchten_
    sbi PORTB,PB2
    rjmp zweiteled
    led2sollleuchten_:
    cbi PORTB,PB2
    zweiteled:
    sbic PORTB,PB1
    rjmp zweiteled_
    sbi PORTB,PB1
    rjmp fertig
    zweiteled_:
    cbi PORTB,PB1
    fertig_:
    ...
    ...
    reti

    So in etwa PB2 wird nur jeden zweiten durchgang getoggelt, alle 50 mS und PB1 wird bei jedem Durchgang umgeschaltet...

    Bedenke daß es nur ein Pseudocode ist.

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

Seite 4 von 5 ErsteErste ... 2345 LetzteLetzte

Berechtigungen

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

LiFePO4 Speicher Test