Archiv verlassen und diese Seite im Standarddesign anzeigen : Ausschaltverzögerung
Erstmal ein herzliches "Hallo" in die Runde.
Bin ja neu hier. :-b O:)
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
$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
Sauerbruch
18.10.2008, 15:30
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!
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? :-s
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?
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? ](*,) :-k
Grüße
'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
Vielleicht geht es so (nicht getestet ...):
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
Bauteiltöter
18.10.2008, 20:56
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
Vielleicht geht es so (nicht getestet ...):
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.
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. :-s Sollte mal gefixed werden...
Bauteiltöter
18.10.2008, 21:44
Ja, der Fehler ist fies... genause wie JTAG, ISP beim ATmega128...
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
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?
Also ich hab es wie folgt gelöst für eine 7-Segment Anzeige:
PWM Ausgang auf die Basis des Transistors (NPN, ohne Vorwidestand. Der Transistor Typ ist eher unkritisch, ich habe einen BC848 (SMD) genommen, ein normaler BC547 tut´s auch, oder auch ein BC517(Darlington)), den Kollektor an 5V und den Emitter an die LED (Anode).
Die Kathoden sind jeweils über einen R an den jeweiligen Ausgangspin (0V geschaltet).
Klappt prima.
Edit: Oder willst Du alle LEDs parallel leuchten lassen ? Also entweder alle oder nix ?
Gruß
Jens
Hi, ich nochmal. :)
Ja, es sollen alle 15 gleichzeitig leuchten.
Hab nun den PWM Ausgang an die Basis vom BC337-25 gehangen mit einem Basiswiderstand. Und Emitter an Masse bzw Kollektor an LED und dann 5V vom Netzteil. So nun läuft der Atmel bei mir mit 3,3V. Wie berechne ich nun den Basiswiderstand?
Hab zum Testen einfach mal 6LED's genommen, die parallel am Kollektor hängen. Die brauchen also dann 18mA*6=108mA.
Wie muss ich nun den Basiswiderstand wählen, um dahin zu kommen?
Grüße
Hi,
Du benötigst keinen Basiswiderstand bei direkter Ansteuerung der Basis vom µC aus. Du musst für jede LED einen eigenen Vorwiderstand haben.
Welche Durchflussspannung haben Deine LEDs ?
Gruß
Jens
Hi,
muss ich nicht? Und warum? Braucht man doch sonst immer.
Die LED's brauchen 3,2V und ich will sie so mit 18mA betreiben. Heißt ich brauche einen 100Ohm Widerstand pro LED.
Meinste so?
Grüße
Markus
Ja braucht man sonst immer, aber nur wenn keine Strombegrenzung vorhanden ist. der Strom aus dem µC ist ja schon begrenzt (ca.20mA).
100R passt.
Gruß
Jens
OK. Könnte man denn mit dem Basiswiderstand den Strom auf 108mA begrenzen, sodass die LED's keinen Widerstand bräuchten? (Ja, ich weiß, dass man LED's nicht ohne Vorwiderstand betreiben soll) ;)
Nein, da Du den Transistor ja im Schalterbetrieb nutzt (PWM).
Ja, dann danke ich dir vorerst für deine Hilfe. Man lernt ja nie aus. :)
dass die ausgänge der atmegas strombegrenzt sind ist mir neu. ich konnte das dem datenblatt bisher nicht entnehmen. mit einem basisvorwiderstand bist du auf der sicheren seite. selbst wenn eine begrenzung auf 20mA eingebaut wäre (habe da echte zweifel, da leute schon portpins "zerlegt" haben), ist ja nicht gesagt, dass du 20mA basisstrom überhaupt brauchen kannst.
du entnimmst zur berechnung dem datenblatt des transistors die verstärkung hfe, zB hfe=100. wenn du nun 108mA schalten willst, brauchst du einen basisstrom von 108mA/100 = 1,08mA. das rundet man grosszügig auf auf ca 2-5mA um sicheres schalten zu gewährleisten. nun kannst du mit R=U/I = 5V/5mA = 1kOhm den vorwiderstand bestimmen.
gruesse
Tja.... Jetzt habe ich gestern schon meine Platine gelötet, nach den Aussagen von Dirk. Ist das "schlimm" im Langzeitbetrieb? Sollte ich versuchen den Basiswiderstand noch da rein zu quetschen?
Grüße
Hier was Nützliches zum Thema Basiswiderstand:
http://www.mikrocontroller.net/articles/Basiswiderstand
@robocat: So habe ich es selbst auch gesagt bekommen und auch ausprobiert, funktioniert einwandfrei bisher. Ich muss mal raussuchen wo das stand das man keinen Basisvorwiderstand benötigt bei direkter Ansteuerung durch den µC im Schalterbetrieb. War auch hier im Forum.
Er nutzt den Transistor doch nur als Schalter, nicht im Analogbetrieb.
Geht das denn überhaupt mit PWM und Analogbetrieb ? Da hab ich keine Erfahrungswerte.
Gruß
Jens
@nF!n!ty:
Jetzt habe ich gestern schon meine Platine gelötet, nach den Aussagen von Dirk. Ist das "schlimm" im Langzeitbetrieb? Sollte ich versuchen den Basiswiderstand noch da rein zu quetschen?
8-[ 8-[ 8-[
Habe ich denn zu deinem Platinenlayout was gesagt?
... oder zu Basiswiderständen ...?
[-X
Gruß Dirk
@Dirk: Ich glaube er meint mich, hat sich nur mit dem Namen vertan :(
Gruß
Jens
@nF!n!ty:
Jetzt habe ich gestern schon meine Platine gelötet, nach den Aussagen von Dirk. Ist das "schlimm" im Langzeitbetrieb? Sollte ich versuchen den Basiswiderstand noch da rein zu quetschen?
8-[ 8-[ 8-[
Habe ich denn zu deinem Platinenlayout was gesagt?
... oder zu Basiswiderständen ...?
[-X
Gruß Dirk
Sorry. Hab mich wirklich im Namen vertan. Wie kam ich denn auf Dirk? #-o
Naja, auf jedenfall hab ich meine Platine eh nochmal neu gemacht, da sie mir nicht gefallen hat. Also alles nicht schlimm. Habe jetzt einfach mal einen Basiswiderstand dahin gesetzt, den ich aber auch entfernen könnte.
Mal sehen, was die Schaltung im Betrieb mit allen 15LED's sagt.
Ich danke allen hier für Ihre Hilfe. =D> Egal in welcher Form.
Und melde mich nochmal, wenn die Sache in Betrieb genommen wurde. (Kann aber ein paar Wochen dauern. Gerade nicht soviel Zeit)
Grüße O:)
Hallo Nf!n!ty,
Ich möchte deine Ausschaltverzögerung gerne nachbauen.
Gibt es zum Programm von Dir auch ein Schema ?
Gruss brecom
Hi erstmal nochmal an alle.
Schaltung ist jetzt montiert und läuft wie gewollt. ;)
@brecom: Schema?! Was meinst du damit? Einen Schaltplan der Schaltung? Oder eine Kommentierung des Codes?
Grüße
Hallo nF!n!ty,
Ein Schaltplan der Schaltung würde mir schon helfen.
Gruss brecom
Schöne Weihnachten
brecom
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.