PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Spannungssteuerung



Strahleman
12.01.2006, 23:00
Habe hier schon gesucht, aber leider nichts passendes gefunden ;)

Bin blutiger Anfänger im Bascom-Gebiet und benötige etwas Hilfe. Ich bin dabei mir eine Steuerung mit einem Tiny 15L zu löten, mit der man per Tastendruck eine Spannung erhöhen, bzw. verringern kann. Bin im Code bis jetzt so weit, dass ich die Pins definiert habe ;)

Nun meine Frage(n): Wie setzte fest, dass die Ausgangsspannung beim einschalten der Schaltung auf 7V ist? Muss ich das per Subtrahieren machen? Also im Controller einspeichern, dass 12 das Höchste ist und 0 das Niedrigste? Und dementsprechend am Anfang sagen "start=12-5"? Oder macht man sowas anders?

Und sage ich dem Controller auch so, dass er bei Tastendruck die Spannung erhöhen/verringer soll? Also ca. so:

If
Tasterhoch = 0 Then
current + 1
Else
current


?

Oder gibt es da eine einfachere Variante? ;)

Ratber
13.01.2006, 00:58
Ich blicke zwar nicht ganz wie du da Arbeitest aber für die Tasten gibt es Debounce um ein Prellen zu verhindern.
Schau dir es mal an.


Mit "Config Debounce = 30" legst du fest wie lange der Taster geprüft wird.(in ms)
Die Sollte länger sein als die Prellzeit die der Hersteller vorgibt.


Mit "Debounce Pind.0 , 0 , Pr" springt das Program nach zum Label "PR" wenn der Port D.0 Low ist.

Schreibste noch ein Sub dahinter dann gilt es als Gosub.

In der Unterroutine steht dann eben current=Current+1 oder so und die If-Then Abfragen um ein verlassen des erlaubten Bereiches zu verhindern.


Bei dieser Methode ist aber sicherzustellen das die Tasten oft genug abgefragt weden. um Reaktionszeiten zu bekommen.
is bei deinem Programm aber nicht kritisch.





Für den Start legste einfach am anfang des Programms vor der Hauptschleife einfach mit "Current = irgendwas " den Startwert fest.

Is der Rechner Stromlos dann beginnt er ja beim nächsten Einschalten wieder am Anfang.

Ratber
13.01.2006, 01:55
Mal ne Zwischenfrage.

bleibt das bei den 12V/0.3A oder soll da später auch noch was größeres drann kommen ?

Wenn du bei Lüftern mit max ca. 0.5A Nennstrom bleibst dann reicht statt Mosfet auch nen einfachen BD135 oder ähnliches mit nem Fetzen Blech als Kühlkörper (Nen Aufsteckkühler kostet 20 Cent)

Strahleman
13.01.2006, 11:51
Ich blicke zwar nicht ganz wie du da Arbeitest aber für die Tasten gibt es Debounce um ein Prellen zu verhindern.

Für den Start legste einfach am anfang des Programms vor der Hauptschleife einfach mit "Current = irgendwas " den Startwert fest.

Is der Rechner Stromlos dann beginnt er ja beim nächsten Einschalten wieder am Anfang.

Habe mir im Wiki den Artikel über Bascom durchgelesen und einen Teil gefunden, wo auf Tasterdruck eine LED leuchtet. Dort wird auch kein Debounce benutzt. Liegt das daran, da es ja eine wesentlich einfachere "Aufgabe" ist (im Endeffekt einfach nur An/Aus)?

Genau das ist mein Problem: ich kann ja schlecht sagen current (heisst das überhaupt so?) = 7V. Wie kann man die Spannung in eine vom Chip verarbeitbare Zahl umwandeln?
Wie man dann weiter macht, weiss ich ja theoretisch (hoffe ich zumindest ;)):

If ...... then
spannungneu1 = spannungcurr + 1 (1 steht für die umgerechnete Spannung)
else
spannungcurr

If ...... then
spannungneu2 = spannungcurr - 1 (1 steht für die umgerechnete Spannung)
else
spannungcurr

if ..... then
spannungneu3 = 1 (kann man in dem fall einfach 1 schreiben, dass es als "high" gilt und so die komplette Spannung durchgelassen wird?)
else
spannungcurr

if ..... then
spannungneu4 = 0 (kann man in dem fall einfach 0 schreiben, dass es als "low" gilt und so die nichts durchgelassen wird?)
else
spannungcurr


€: Ja, das bleicht bei den 12V/~0,3A. Aber die Sachen von reichelt sind bereits da und es ist auch der Mosfet dabei ;)

Ratber
13.01.2006, 13:47
Yo,Mosfet ist natürlich auch ok bzw. besser.
War nur nen Gedankengang.


Zu Debouncet:

Das im Beispielcode im Wiki kein Debounce oder ein Equivalent genommen wird liegt daran das es dort nicht nötig ist.
Die Led geht dort an sobald der Pegel an dem Port mit dem Taster wechselt.


In dienemBeispiel willst du Tastendrücke zählen und wenn das programm schnell reagiert dann kann es sein das ein Tastenprellen doppelt gezählt wird.


Ein einfaches Programm zeigt wie fix das geht.(Nur das wesentliche und übersichtlich zum Verständnis)

Do
Locate 1,1
LCD X
If Pind.0 = 0 then Gosub Taste
Loop

:Taste
x = x +1
If pind.0 = 0 then Goto Taste
Return

Die vorletzte Zeile soll warten bis die Taste wieder losgelassen wird.
Prellt die Taste dann wird uu. 2-3x gezählt obwohl nur einmal gedrückt wurde.







Was den Rest angeht :

Ich habe jetzt wenig übersicht bei deinen Codeschnipseln um wirklich durchzusteihen was du machst.

Ein Tip da du auch lange Namen nutzt.

Zeilenlabels und Variablennamen können zwar fast beliebig lang sein aber nur die ersten 32 Zeichen werden ausgewertet.

zb.
"Spannungcurr1fuerneunenwertinunterprogram1"
und
"Spannungcurr1fuerneunenwertinunterprogram2"
werden vom Compiler beide als
"Spannungcurr1fuerneunenwertinunt "
gewertet.
Im Zweifelsfalle hilft es bei vielen langen Variablennamen eine eindeutige durchlafende Nummer an den anfang der Variablen zu legen.
zb.

01Eingang
02Ausgang
03Merker
04Blabla1
05blabla2
06Spannungcurr1fuerneunenwertinunterprogram1
07Spannungcurr1fuerneunenwertinunterprogram2
usw.

Wie gesagt,ist nur nen Vorschlag.
Jeder hat seinen eigenen stil oder entwickelt ihn sich noch.

Ansonsten:

Ich weiß das es verwirrend ist eine neue Sprachen zu lernen also keine Panik.
Das gibt sich mit der Zeit.

Strahleman
13.01.2006, 21:35
OK, dann einmal ganz ohne den Halb-Code ;)
Ich habe das Problem, dass ich nicht weiss, wie ich die Spannungsänderung, die durch die Tasterbetätigung gemacht wird dem Chip "beibringen" soll. Ich kann ja schlecht schreiben "-1V" bzw. "+1V". Genauso ist mir unklar, wie ich dem Chip sagen soll, dass er mit 7V "starten" soll.

Ich hoffe du weisst nun was mein Problem ist ;)

€: Achja, meine Reicheltsachen sind heute gekommen, ist das normal, dass der Attiny15L ein SMD Baustein ist? Habe den So8 bestellt, der sah im Datenblatt irgendwie aus wie ein Chip für solche Sockelbrücken (so zum reinstecken als normale Bauform und nicht SMD)

repi64
13.01.2006, 22:27
Ich bin nicht ganz im Thema aber die Bezeichnung SO8 steht für ein SMD Gehäuse. Ein "Normales" Gehäuse werden mit DIL oder DIP bezeichnet. Die Atmel AVRs haben in der DIL Ausführung ein P in der Bezeichnung (ATINY15L-1PI).
Beim ATTINY15L-1SC deutet das S auf ein SOP also SMD Ausführung.

Strahleman
13.01.2006, 22:41
Verdammt, dann habe ich genau den falschen bestellt ;) Egal, dann geht's halt morgen zum Elektrogeschäft bei uns in der Stadt...

Ratber
13.01.2006, 22:47
Yo,hast den falschen bestellt.

Is aber auch nicht wild.

Wenne den auf Dil haben willst dann löt ihm dünnen Kupferdraht an die Beinchen und schnall ihn auf ne IS Fassung (Verlöten)




OK, dann einmal ganz ohne den Halb-Code Zwinkern
Ich habe das Problem, dass ich nicht weiss, wie ich die Spannungsänderung, die durch die Tasterbetätigung gemacht wird dem Chip "beibringen" soll. Ich kann ja schlecht schreiben "-1V" bzw. "+1V". Genauso ist mir unklar, wie ich dem Chip sagen soll, dass er mit 7V "starten" soll.

Ich hoffe du weisst nun was mein Problem ist Zwinkern


Yp,ich weiß schon was du meinst.

Das kannste nur durch probieren rausbekommen.
Lass erstmal die RC-Kombi zwischen Controller und Transistor weg und betreib den Lüfter im reinen PWM-Modus.
Pfeifft eventuell einwenig aber soll jetzt nicht jucken.

Den Prescaler für die PWM hoch wählen so das du eine niedrige PWM-Frequenz bekommst (Kann man gut höhren).
Das vertragen die allermeisten Lüfter.

Dann läst du die PWM langsam hochlaufen bzw. testest verschiedene Werte und merkst dir ab wann der Lüfter sicher läuft.
Gib 5% zu dann passt es.


Bei reiner PWM kannst du 0-255 mit 0-100% mit 0-12V gleichsetzen.

Strahleman
13.01.2006, 23:01
Der letzte Satz war, auf den ich gewartet habe ;) Nun weiss ich, wo ich mich orientieren muss! ;)

Ratber
13.01.2006, 23:08
Ja aber nur unter Vorbehalt denn das sind nur Richtwerte.
In der Praxis gibt es abweichungen

Strahleman
14.01.2006, 13:03
Habe mich heute etwas mit meinem Vater an den Programmcode gesetzt. Leider spuckt Bascom beim compilieren noch Fehler aus, die aber immer die gleichen sind.

Error 230 You can not write to a PIN register
Error 105 StoreBit error (immer in der selben Zeile wie Error 230)
Error 31 Invalid datatype

Und ganz zum Schluss:
Error 124 (Line 0) LOOP expected

Ebenfalls sagt mir Bascom, dass Debounce bei $tiny nicht unterstützt wird.

Der Code zu den Fehlern:

$regfile = "at15def.dat"
$tiny


$initmicro

Pinb.6 = 255 * 0.6

'Initialisierung
_init_micro:
Config Pinb.1 = Output 'PortB.1 als Ausgang
Ausgang Alias Pinb.6

Config Pinb.2 = Input 'Pin (PB4) als Eingang
Tasterhoch Alias Pinb.2
Config Pinb.3 = Input 'Pin (PB5) als Eingang
Tasterrunter Alias Pinb.3
Config Pinb.4 = Input 'Pin (PB6) als Eingang
Tastervoll Alias Pinb.4
Portb.1 = 1 'Pullup Widerstand ein
Return

'Ausführungsprogramm
Pr:

Do
If Tasterhoch = 0 Then 'Spannungserhöhung
If Ausgang > 245 Then
Ausgang = 255
Else
Ausgang = Ausgang + 10
End If
Else
nop

End If


If Tasterrunter = 0 Then 'Spannungsverminderung
If Ausgang < 10 Then
Ausgang = 0
Else
Ausgang = Ausgang - 10
End If
Else
nop

End If


If Tastervoll = 0 Then
If Ausgang = 255 Then 'Volle 12V
Ausgang = 0
Else
Ausgang = 255
End If
Else
nop

End If
End

Ratber
14.01.2006, 15:34
Ja,das kann auch nicht funktionieren.

Am Anfang kommen die Definitionen,
Also welche Ports oder Pinne als ein odr ausgang.
Die Variablen werden deklariert (Auch Alias)
eventuell. benötigtwe Libarys geladen.

usw.

Erst danach kommt das Programm
und am Ende hinterm Programm steht "END"
Danach Eeprom und Datazeilen falls nötig.

Das solltest du erstmal umstellen.

Dann ist die Dokumentation nicht mehr stimmig.

Dann versuchst du ganz oben einen Pin mit einem Bytewert zu beglücken und das vor den Dedinitionen wobei genau dieser Pin noch garnicht definiert wird


Änder das mal und bring Ordnung rein.(Gleich angewöhnen)


alternativ kann ich mir das mal in ruhe ansehen aber das dauert ne weile.

Strahleman
14.01.2006, 17:01
Hm habe nun einmal alles sortiert und den Loop-Fehler behoben. Leider kommen die restlichen Fehler immernoch...
Wie gesagt bin totaler Neuling auf dem Gebiet, was mich aber wundert, ist, dass kopierte Codes funktionieren, ich aber eigentlich keine Unterschiede sehe :(

Dann noch eine Frage: erkennt der Tiny automatisch, dass es sich bei den 255 um Byte handelt? Oder muss ich das mit "Dim Ausgang As Iram Byte" definieren?

Ratber
14.01.2006, 21:18
Definieren must du alles was du nutzen willst.

Vorallendingen fehlt dir hier die Zeile um den Timer im PWM-Modus zu betreiben.

zb.

Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Prescale = 64

Beim 15L macht Bascom das aber nicht (Is vieleicht bei der 81er Version schon gefixt. Probieren)


Wenn das nicht geht dann Manuell mit

Tccr1 = &B01010011
Tcnt1 = &B10000111
Ddrb.1 = 1


Mit

Ocr1a = 127
Ocr1b = 127
Ocr1a = X

Kannste dann Arbeiten.

Strahleman
15.01.2006, 15:52
Definieren must du alles was du nutzen willst.

OK, dann mach ich das nun einmal hier Schritt für Schritt. Anscheinend unterscheided sich der Code für Bascom schon etwas vom Visual Basic gecode.

Das steht vor meinem Programm:

$regfile = "at15def.dat"
$tiny
$initmicro
$crystal = 1000000
$noramclear

Config Pinb.1 = Output 'PortB.1 als Ausgang
Config Pinb.2 = Input 'Pin (PB2) als Eingang
Config Pinb.3 = Input 'Pin (PB3) als Eingang
Config Pinb.4 = Input 'Pin (PB4) als Eingang
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Prescale = 64

Ausgang Alias Pinb.6
Tasterhoch Alias Pinb.2
Tasterrunter Alias Pinb.3
Tastervoll Alias Pinb.4


Wenn ich die Bascom-Hilfe richtig verstanden habe, kann man ganz am Anfang mit $initmicro in das Sub _init_micro springen. So kann ich doch einmal den Startwert festlegen oder?

Ratber
15.01.2006, 16:45
Also $Initmicro ist nur Sinjnvoll wenn du einge Portpinne so schnell wie Möglich auf einen definierten Wert setzen willst weils die Schaltung erfordert und man nicht die Möglichkeit hat den Einschaltfehler abzufangen (Selten)
Das ist auch nur bei langen Programmen mit umfangreicher Initialisierung nötig.

Für deine Anwendung ist das irrelevant.
Die Pinne am Controller sind beim Einschalten auf Eingang also passiert hier nichts ausser das der Lüfter vieleicht einige Millisekunden anders läuft als gewollt (Also garnicht weil Träge)

Strahleman
15.01.2006, 16:54
Ok, dann kann ich das auch weglassen. Habe ich denn soweit alle nötigen Definitionen usw. oder fehlt da noch etwas? Habe bei Beispielcodes nichts weiter finden können, was noch wichtig sein könnte.

Ratber
15.01.2006, 17:03
Ich hab jetzt nicht den Überblick aber ich denke mal das du noch Variablen nutzen willst

Also zb. "Dim A as Byte" usw. fehlt da noch.


Ach so ,nochwas nebenbei.

Die PWM kannste gut mit einer LED+Vorwiderstand am PWM ausgang testen.
Man sieht dann gut was läuft.

Strahleman
15.01.2006, 21:49
Super Ratber vielen Dank! Habe den Code nun fertig und er funktioniert auch (zumindest in Bascom). Wenn endlich die richtigen Microcontroller da sind, wird gleich mal getestet!

Ratber
15.01.2006, 21:59
Yo,wennes im Simulator läuft dann haste schon die halbe Miete.

Der Rest sind normalerweise kleine Anpassungen.