-
        

Ergebnis 1 bis 8 von 8

Thema: Sobald Timer-Code eingebunden, wait ungenau

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.02.2005
    Ort
    Hannover
    Beiträge
    174

    Sobald Timer-Code eingebunden, wait ungenau

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Hi,
    ich will eine IR-Led auf ein 38Khz trägersignal bringen und benutze dazu den Timer0. Sobald ich den Code dafür einsetze, wird das "Wait 1" zu ca "Wait 3".
    Ist der Timer-Code aber draußen, geht alles normal.
    Code:
    $regfile "m8def.dat"
    $crystal = 3686400
    $baud = 2400
    Config Lcdpin = Pin , Db4 = Portd.7 , Db5 = Portb.0 , Db6 = Portb.5 , Db7 = Portb.4 , E = Portd.6 , Rs = Portd.5
    Config Lcd = 16 * 2
    Initlcd
    Display On
    Cursor Off
    Cls
    Locate 1 , 1
    Lcd "Willkommen"
    Locate 2 , 1
    Lcd "AVR->IR->RCX"
    Config Portd.4 = Output
    Ir Alias Portd.4
    Dim X As Word
    Config Timer0 = Timer, Prescale = 1
    'Hier wird das Unterprogramm festgelegt, das
    'in dem von ihnen eingestellten Intervall aufgerufen wird
    On Timer0 Timer_irq
    'Diese Vorgabe wurde berechnet um die genaue Intervallfrequenz zu erreichen
    Const Timervorgabe = 159
    'Hier werden die Timer aktiviert
    Enable Timer0
    Enable Interrupts
    Do
    Locate 1 , 1
    Lcd X
    X = X + 1
    Wait 1
    Loop
    
    Timer_irq:
    Timer0 = Timervorgabe
    Toggle Ir
    Return
    Sobald ich "enable interrupts" auskommentiere geht alles wieder aber mein timerinterrupt ja nicht.
    Was kann ich dagegen tun?
    MFG PcVirus

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    24.12.2006
    Alter
    51
    Beiträge
    117
    hallo, habe zwar mit timern noch nicht viel am hut ,aber sortiere mal
    dein programm und setzte die einstellungen alle an den anfang.
    habe es mal gemacht und steht im anhang,kann sein das der
    controller damit durcheinander kommt und damit die lange wartezeit
    entsteht,er muss am anfang alles setzt wie du möchtest und dann ist gut.
    konnt es aber so nicht testen.
    Angehängte Dateien Angehängte Dateien

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.02.2005
    Ort
    Hannover
    Beiträge
    174
    geht so auch nicht

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791
    ... benutze dazu den Timer0. Sobald ich den Code dafür einsetze, wird das "Wait 1" zu ca "Wait 3".
    Das ist doch klar!
    Wenn dein Interrupt Wait regelmäßig unterbricht, dauert Wait länger.

    Gruß Dirk

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.02.2005
    Ort
    Hannover
    Beiträge
    174
    hm..ok..ist zwar blöd dass dann nicht weiter gezählt wird und dann wenn wait vorbei ist das auch ausgeführt wird.

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.08.2004
    Ort
    Potsdam
    Beiträge
    190
    hmmm... nuja
    vielleicht wärs schon mal von Vorteil wenn Du Deinen Code nen bissel übersichtlicher schreibst - also erst die def, dann die Arrays und danach die Konfigurationen sowie Initialisierungen und erst DANN den Code.
    Im Moment ist es alles ziemlich durcheinander gewurschtelt und daher recht schwer lesbar.

    Warum nutzt Du nicht die Hardware PWM des µC? Damit hast Du keinerlei Timingprobleme und der nun unnötige Interrupt unterbricht die recht langsame Datenübertragung zum LCD-Display nicht mehr.
    Der Befehl Wait ist laut der Hilfedatei eh recht ungenau - wenn Du einen bestimmten Zeittakt einhalten willst würde ich an Deiner Stelle den zweiten Timer nutzen und in dessen Interruptroutine die Aktualisierung des Displays schreiben.
    Waitus = 100000 sollte aber auch gehen und nicht allzu große Verzögerungen mit sich bringen.

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.02.2005
    Ort
    Hannover
    Beiträge
    174
    Normalerweise mach ich das auch übersichtlicher, nur ich hatte bis jetzt noch nichts mit Timern gemacht und den Code wo rauskopiert.
    Wie kann ich denn mit dem PWM ein 38Khz Signal machen?

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.08.2004
    Ort
    Potsdam
    Beiträge
    190
    Such mal im Datenblatt des µC unter den Timern nach dem CTC-Mode (Clear Timer on Compare Match) oder dem Fast-PWM-Mode.

    Mit vier bis fünf Zeilen Code sollte alles erledigt sein (Timer konfigurieren, PWM-Mode einstellen und die Werte in die OCR reinschreiben.
    In den Timer/Counter Controllregistern stehen alle nötigen Werte wie Prescale, Modus (PWM oder non-PWM), welche Art der PWM (normal, CTC, Fast PWM, Phase correct PWM) und welches der Output-Compare-Register genutzt werden soll.
    Klingt kompliziert, ist aber ganz einfach weil man nur einzelne Bits setzen muss.
    Das wären die nötigsten Eingaben die Du machen müsstest:

    TCCR0A = &B........ 'hier steht meist drin welcher Mode genutzt werden soll
    TCCR0B = &B........ 'und hier welches OCR-Ausgang und welcher Prescaler gebraucht wird
    OCR0A = 127 'Schwellwerte fürs Tastverhältnis oder die Frequenz (im CTC-Mode)
    OCR0B = 127

Berechtigungen

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