-         

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 29

Thema: Ausschaltverzögerung

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    15.10.2008
    Beiträge
    23

    Ausschaltverzögerung

    Anzeige

    Erstmal ein herzliches "Hallo" in die Runde.
    Bin ja neu hier.

    Also seit gestern habe ich nun auch mit der Microcontroller Programmierung angefangen. Als Sprache habe ich mir Basic ausgesucht, da ich dort schon einwenig Ahnung habe. Am liebsten wäre mir Pascal gewesen, da wir das auch in der Schule benutzen für anderes, aber BASIC hatten wir auch schon mal.

    Als Board benutze ich das myAVR Board 2 USB. So nun zu meinem Anliegen.
    Ich möchte so als Anfang eine LED nach Tastendruck für eine bestimmte Zeit zum leuchten bringen. Diese bestimmte Zeit möchte ich mittels eines Poti von 1s-60s einstellen können.

    Es funktioniert fast. Mein Problem ist das das minimum komischerweise nicht 1Sekunde ist, sondern laut Stopuhr etwa 5Sekunden. Woran liegt das? Und kann man den Code vlt. noch optimieren?

    Ich bitte um Milde. Bin noch Anfänger. [-o<

    Grüße
    Markus

    Code:
     $regfile = "m8def.dat"                                   
     $crystal = 3686400                                        
    
     Config Portb.1 = Output                                   
     Led Alias Portb.1
     Config Pind.2 = Input                                      
     Taster Alias Pind.2
     Portd.2 = 1
    
     Config Timer1 = Timer , Prescale = 64                     
     On Timer1 Main                                           
    
     Config Adc = Single , Prescaler = Auto
     Start Adc
    
     Const Timervorgabe = 7936
     Dim W As Integer
     Dim Zeit As Integer
     Dim Zeitvorgabe As Integer
     Zeit = 1
     Enable Timer1
     Enable Interrupts
    
     Do
     If Taster = 0 Then
     If Getadc(0) < 17 Then
     W = 17
     Else
     W = Getadc(0)
     End If
     Zeitvorgabe = W / 17
     Led = 1
     Enable Timer1
     End If
     Loop
    
     Main:
     If Zeit < Zeitvorgabe Then
     Zeit = Zeit + 1
     Timer1 = Timervorgabe
     Else
     Led = 0
     Zeit = 0
     Timer1 = Timervorgabe
     Disable Timer1
     End If
     Return

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    705
    Für ein erstes Programm sieht das doch schon mal ziemlich gut aus! Und mit dem Timervorgabe-Wert sollte genau 1 Sekunde rauskommen.

    Könnte es sein, dass der Controller nicht vom externen Quarz getaktet wird, sondern vom eingebauten 1MHz-Oszillator? Das ist nämlich nicht nur der Auslieferungszustand, sondern würde auch zumindestens die Größenordnung des Fehlers erklären.

    Schau doch mal in die Fuse-Bits - da wird die Taktquelle festgelegt!

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    15.10.2008
    Beiträge
    23
    Hi,

    danke für deine Antwort.

    Also das Fusebit KLA987(ist der der für den Quarz, oder) steht laut Bascom auf "000000: Ext. Clock; Start-up time: 6CK + 0ms; [CKSEL=0000 SUT=000]".
    Aber laut myAVR Workpad steht das auf dem 1MHZ Int. . Wem kann ich nun glauben?

    Ich werde da aus der Auswahlliste nicht so ganz schlau. Vlt. kannst du mir da helfen. Ist das so richtig?

    Grüße
    Markus

    Edit:
    Also Bascom scheint die Fusebits kompl. falsch auszulesen. Hab jedenfalls jetzt mit myAVR Workpad das Fusebit auf "Ext. Crystal/Resonator Medium Freq.; Start-up time: 16K CK + 64 ms; [CKSEL=1101 SUT=11]" gesetzt und jetzt schein es wirklich zu funktionieren.

    Ein großes Dankeschön an dich.

    Lässt sich jetzt Codetechnisch noch was verbessern? Aufgeräumter?
    Zum Beispiel ist es möglich, dass bei erneutem Drücken des Tasters der Timer resetet wird, falls die LED gerade an ist, sodass er quasi wieder von vorne anfängt zu zählen?

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    15.10.2008
    Beiträge
    23
    Sorry fürs Doppelposting, aber sonst wird es unübersichtlich.

    Das mit dem Rest ist mittlerweile auch gelöst. Nun wollte ich die LED mit dem Taster2 auch dimmen per PWM. Soweit habe ich es geschafft. Nun dimmt die LED bei Tastendruck einmal von hell nach dunkel und wieder von dunkel nach hell. Er soll aber solange weiter hin und her dimmen, bis ich die Taste erneut drücke. Wie geht das?

    Grüße

    Code:
     'Standard Einstellungen
     $regfile = "m8def.dat"
     $crystal = 3686400
     $baud = 9600
    
     'Out- und Inputs einrichten
     Config Portb.3 = Output
     Led Alias Portb.3
     Config Pind.2 = Input
     Taster Alias Pind.2
     Portd.2 = 1
     Config Pind.3 = Input
     Taster2 Alias Pind.3
     Portd.3 = 1
    
     'Timer für PWM und Laufzeit einrichten
     Config Timer1 = Timer , Prescale = 64
     On Timer1 Main
     Config Timer2 = Pwm , Compare = Clear , Prescale = 1
     Ocr2 = 0
    
     'ADC einrichten
     Config Adc = Single , Prescaler = Auto
     Start Adc
    
     'INTs und Timer aktivieren
     Enable Timer1
     Enable Interrupts
    
     'Konstanten und Variablen deklarieren
     Const Timervorgabe = 7936
     Dim W As Integer
     Dim Zeit As Integer
     Dim Zeitvorgabe As Integer
     Dim Helligkeit As Integer
     Helligkeit = 150
     Zeit = 1
    
     'Hauptprogramm
     Do
    
     If Taster = 0 Then
       If Getadc(0) < 17 Then
         W = 17
       Else
         W = Getadc(0)
       End If
       Zeitvorgabe = W / 17
       If Ocr2 <> 0 Then
         Timer1 = Timervorgabe
         Print "Neustart"
       Else
         Ocr2 = Helligkeit
         Enable Timer1
       End If
     End If
    
     If Taster2 = 0 Then
       For Helligkeit = 150 To 0 Step -1
         Ocr2 = Helligkeit
         Waitms 10
       Next
    
       For Helligkeit = 0 To 150
         Ocr2 = Helligkeit
         Waitms 10
       Next
     End If
    
     Loop
    
     Main:
     If Zeit < Zeitvorgabe Then
       Zeit = Zeit + 1
       Print "Timer läuft"
       Timer1 = Timervorgabe
     Else
       Ocr2 = 0
       Zeit = 0
       Timer1 = Timervorgabe
       Disable Timer1
     End If
     Return

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791
    Vielleicht geht es so (nicht getestet ...):
    Code:
    If Taster2 = 0 Then
       Waitms 100
       Do
          For Helligkeit = 150 To 0 Step -1
             Ocr2 = Helligkeit
             Waitms 10
          Next
    
          For Helligkeit = 0 To 150
             Ocr2 = Helligkeit
             Waitms 10
          Next
       Loop Until Taster2 = 0
    End If
    Evtl. das Waitms 100 noch erhöhen, wenn man beim 1. Mal Taster 2 nur sehr kurz drücken kann, damit das dauerhaft dimmt ...

    Gruß Dirk

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.06.2008
    Beiträge
    113
    Hallo nF!n!ty,

    das problem kenne ich, Bascom unterstützt änderungen der Fusebits nur bei bestimmten Programmern, z.B. bei LPT-Programmern

    MfG Bauteiltöter

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    15.10.2008
    Beiträge
    23
    Zitat Zitat von Dirk
    Vielleicht geht es so (nicht getestet ...):
    Code:
    If Taster2 = 0 Then
       Waitms 100
       Do
          For Helligkeit = 150 To 0 Step -1
             Ocr2 = Helligkeit
             Waitms 10
          Next
    
          For Helligkeit = 0 To 150
             Ocr2 = Helligkeit
             Waitms 10
          Next
       Loop Until Taster2 = 0
    End If
    Evtl. das Waitms 100 noch erhöhen, wenn man beim 1. Mal Taster 2 nur sehr kurz drücken kann, damit das dauerhaft dimmt ...

    Gruß Dirk
    Hi Dirk,

    danke für deine Antwort. Also das faden macht er auf jedenfall in einem Loop. Aber stoppen kann ich es mit dem Taster leider nicht.
    Aber trotzdem schonmal danke.

    Zitat Zitat von Bauteiltöter
    Hallo nF!n!ty,

    das problem kenne ich, Bascom unterstützt änderungen der Fusebits nur bei bestimmten Programmern, z.B. bei LPT-Programmern

    MfG Bauteiltöter
    Hm. Darauf muss man erstmal kommen. Sollte mal gefixed werden...

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.06.2008
    Beiträge
    113
    Ja, der Fehler ist fies... genause wie JTAG, ISP beim ATmega128...

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    01.07.2008
    Ort
    NRW
    Alter
    45
    Beiträge
    169
    Zitat Zitat von nF!n!ty
    Aber stoppen kann ich es mit dem Taster leider nicht.
    Das liegt daran das erst hin und danach zurück "gefaded" wird, erst DANN kommt die Taster Abfrage. Vielleicht solltest Du es mit einem Interrupt versuchen.

    Gruß
    Jens

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    15.10.2008
    Beiträge
    23
    Zitat Zitat von Blue72
    Zitat Zitat von nF!n!ty
    Aber stoppen kann ich es mit dem Taster leider nicht.
    Das liegt daran das erst hin und danach zurück "gefaded" wird, erst DANN kommt die Taster Abfrage. Vielleicht solltest Du es mit einem Interrupt versuchen.

    Gruß
    Jens
    Richtig, das ist mir dann 10mins nach Dirk's Beitrag auch eingefallen und habs anders gelöst. Nun geht es wie es soll.

    Hab aber noch ne andere Frage. Und zwar möchte ich nun an den PWM Ausgang ca. 15 LED's parallel dran hängen. Das geht ja nicht, da der Ausgang ja nur ca 20mA aushält. Jetzt verstärke ich das ja mittels eines Transistors, doch ich weiß noch nicht so ganz mit welchem und wie. Kann mir da einer helfen?

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

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