- fchao-Sinus-Wechselrichter AliExpress         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 18 von 18

Thema: LCD Ausgabe macht uC langsam?

  1. #11
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.232
    Anzeige

    Praxistest und DIY Projekte
    Achte darauf, dass die ISR nicht lange dauert. Alles was länger dauern kann, muss in die Mainloop.
    Das würd ich absolut unterschreiben.
    Will man aber trotzdem längerdauernde Funktionen regelmässig aufrufen, kann man in einem Interrupt ein Flag setzen ( Bit Variable ), das von der Hauptroutine abgefragt wird.
    Wurde die zugehörige Routine in der Hauptroutine abgearbeitet wird dieses Flag wieder gelöscht.

  2. #12
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.05.2007
    Beiträge
    329
    Hallo Brantiko,

    setze in deine Mainloop mal ein wait1.
    Dann ist die Hauptschleife richtig langsam. Das heißt aber nicht, daß der ATMega langsam ist.
    Lasse jetzt einen Timer alle paar Milisekunden einen Interrupt auslösen. Dort machst du deinen schnellen Code rein.
    Jetzt wird der Interrupcode sehr oft und schnell ausgeführt, der Code in der Mainloop nur wenn gerade nichts anderes zu tun ist. Du siehst, die langsame Mainloop bremst dein Programm nicht aus.

    Jetzt zu deinem Displayproblem. So ein Display ist laaaaangsam, alle Änderungen dauern ewig. Das würde theoretisch unser Programm ausbremsen. Da die LCD-Routinen aber in der Mainloop liegen, der schnelle Code aber im Interrupt, wird garnicht auf das Display gewartet, sondern der Interrupt abgehandelt und erst danach wieder nach dem Display geschaut.
    Wenn jedoch die Interrupts zu schnell aufeinander folgen, hat der Controller vor lauter Interrupts gar keine Zeit für die Mainloop. Ebenso ist wait1 natürlich auch zu lang. Aber das kriegst du hin.
    Ich hoffe ich konnte ein bisschen Klarheit reinbringen.

    Günter

  3. #13
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    95
    Beiträge
    627
    Ich fasse das mal zusammen:

    -Do...Loop mit Hauptprogramm
    -LCD-ISR z.b. über Timer&Bit setzen

    (Programm nicht getestet, sollte aber funktionieren)
    Code:
    $regfile = "m8def.dat" 
    $crystal = 8000000 
    
    Config Portb.0 = Output 
    
    Dim Anzeige as Bit
    
    Config Timer1 = Timer , Prescale = 256                    
    Const Timervorgabe = 36736  'ca 2x / sec
    Enable Timer1
    Enable Interrupts
    On Timer1 Timer_ISR  
    
    Config Lcd = 16 * 1 
    Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portd.5 , Rs = Portd.4 
    Config Lcdbus = 4 
    Cursor Off 
    Cls 
    
    Do 
    
        Toggle Portb.0 
      
        if Anzeige = 1 then
          Anzeige = 0
          goto LCD_ISR
        End if
    
    Loop 
    
    
    LCD_ISR:
    Locate 1 , 1 : Lcd "1,22929" 
    Return
    
    
    Timer_ISR:
    Timer1 = 36736
    Anzeige = 1
    Return
    Das LCD aktualisiert 2 mal pro Sekunde - das sollte eigendlich ausreichen...
    Wenn du das Signal an deinem Ausgang (Portb.0) mit einem Oszi ansiehst wirst du sehen, dass immer wenn das LCD aktualisiert wird der Ausgang etwas "hängt" das lässt sich nur ändern, wenn du den Ausgang selber über einen Timer laufen lässt(ich weiß ja nicht wie zeitkritisch dein Programm wird).

    Tobias
    ...

  4. #14
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Zitat Zitat von TobiasBlome
    Do

    Toggle Portb.0

    if Anzeige = 1 then
    Anzeige = 0
    goto LCD_ISR
    End if

    Loop


    LCD_ISR:
    Locate 1 , 1 : Lcd "1,22929"
    Return
    Goto und Return passen nicht zusammen, wenn dann also Gosub LCD_ISR.
    Allerdings ist das keine ISR und wenn von sonst nirgendwo dorthin gesprungen wird, dann kannst du den Locate... Befehl ruhig direkt in die Abfrage setzen.

    Gruß

    Rolf

  5. #15
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    95
    Beiträge
    627
    oh ja gosub wollte ich auch eigendlich schreiben....

    Zitat Zitat von for_ro
    Allerdings ist das keine ISR...
    Wann ist es denn eine ISR?

    Wie funktioniert das mit "Locate"? Habe es in der Hilfe nur in Verbindung mit LCD´s gefunden.

    Tobias
    ...

  6. #16
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    42
    Beiträge
    2.009
    Ich mach das bei Nur-Text-LCDs und genügend Speicher immer so, dass ich den aktuellen Displayinhalt in eine String-Variable speichere.
    Soll was geändert werden, wird der neue Inhalt in eine 2. Variable geschrieben. Am Ende der Main-Loop werden beide verglichen. Sofern unterschiedlich: Neu aufbauen, alten String = neuen String setzen.

    Es wird also nur dann was zum LCD geschickt, wenn sich auch was ändert.
    #ifndef MfG
    #define MfG

  7. #17
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Eine ISR ist eine Interrupt Service Routine, also ein Stück Code, das ausgeführt wird, wenn ein bestimmter Interrupt aufgetreten ist.
    Ich meinte nur, ich würde es nicht LCD_ISR nennen, eben weil es demnach keine ISR ist.
    Locate gibt es nur für LCDs. Du setzt damit die Stelle, wo die nächste Ausgabe positioniert wird.
    Ich würde die Loop also so schreiben

    Do
    Toggle Portb.0
    if Anzeige = 1 then
    Anzeige=0
    Locate 1,1 : LCD "1,22929"
    End if
    Loop

  8. #18
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.05.2007
    Beiträge
    329
    Hallo miteinander,

    fast richtig.

    Ob das Display jetzt ein bisschen früher oder später aktualisiert wird ist doch eigentlich egal. Darum würde ich dafür KEINEN Interrupt bemühen. Dieser ist für Programmcode gedacht, der SOFORT ausgeführt werden MUSS und nicht unterbrochen werden darf, also timingkritisch ist. Das alles ist das Display nicht. Das setzen von Anzeige=1 würde ich nur da in den Code einbauen, wo auch was im Display geändert werden soll.

Seite 2 von 2 ErsteErste 12

Berechtigungen

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

LiFePO4 Speicher Test