Hallo,
zu mein vorhaben ich möchte einen AT mega8 so programmieren das 5
Ausgänge belibich und unregelmäßig schalten. damit möchte ich dann
Lampen ansteuern die dann über die Nacht eine Anwesenheit simulieren
sollen. eine feste Abfolge ist ja nicht das Problem aber das jede Lampe
mal angeht wie sie will und auch wieder aus und jede für sich unabhanig
von den anderen habe ich nicht hin bekommen. selbst die suche ergab
nicht wirklich etwas. geht das überhaupt oder gibts da Möglichkeiten.
ich verwende bascom.
danke im vorraus
Für eine echt zufällige Steuerung könnte man z.B. eine Zenerdiode als
Rauschquelle verwenden und für den µC passend verstärken.
Zur ausreichend unregelmäßigen Schaltung der Beleichtung dürfte ein
Pseudo-Zufallszahlengenerator ausreichen, der eine PRBS erzeugt.
http://www.scheidig.de/Deutsch/Projekte/Rauschgenerator/PrbsGenerator.htm
Zufall kannst du mit der BASCOM-Funktion RND in dein Programm einbauen
http://avrhelp.mcselec.com/rnd.htm
Bei 5 Lampen EIN/AUS bieten sich 5 Bits als Schaltzustände an, d.h. die
Ganzzahlwerte 0 bis 31. Über RND kannst du dir dann laufend neue
Schaltzustände für die Lampen nehmen. Bei geschicktem Hardwaredesign
kannst du die Schaltzustände 1:1 auf einen Ausgangsport geben.
Um das Ganze realistischer d.h. zufälliger zu machen, kannst du mit
einem weiteren regelmäßigen RND Aufruf auch noch die Zeit zwischen dem
Setzen der Schaltzustände verändern.
Um das Ganze noch realistischer d.h. zufälliger zu machen, kannst mit
einem weiteren regelmäßgen RND Aufruf entscheiden, welche Lampen
geschaltet werden dürfen.
Eine nette Idee habe ich mal in einem ähnlichen Projekt gesehen: Dort
wurde das bläuliche Licht eines TV und das regelmäßig/unregelmäßige
Helligkeitsschwanken bei Szenenwechseln simuliert. Von au0en sah das
dann so aus, als ob die Hausbewohner TV schauen. Aufpassen, wenn jemand
klingelt: Das könnte der GEZ-Scherge sein!
hallo,
danke für die schnellen antworten.
hab mir jetzt die Vorschläge mal angesehen.
am besten gefällt mir der mit rnd.
könnt ihr mir nen kleinen tip geben wie ich es dann schreiben muss wie
du es vorgeschlagen hast.
bin auf auf den Gebiet relative frisch.
danke bis den
Dir fehlt scheinbar das ganze Wissen, wie man in BASCOM mit PORTS um
geht.
http://avrhelp.mcselec.com/config_port.htm
Statt eine Variable mit PRINT auszugeben, kann man die auch einem
Ausgangsport zuweisen. Wenn die Hardware am PORT sinnvoll ist und die
Variable sauber DIMensioniert ist, kommt auch was sinnvolles raus.
hallo,
was heißt genau Hardware sinnvoll.
nebenbei bemerkt ich möchte kein TV simulieren sonder eher die
Beleuchtung in räumen.
an die Ausgänge soll eigendlich nur nen Transistor und nen Relais oder
optokoppler und Relais oder direkt die LED straler an den Transistor.
ansonsten hab ich schon nen bissel was gemacht wie Eingänge Ausgänge LCD
adc mit LCD.
bin halt noch beim lernen.
was würdet ihr mir empfelen um die LED`s an zu schalten. haben zwischen
3 und 15 Watt bei 12volt
mfg
Mit sinnvoll meine ich, dass
* die Bits in der Varaiblen sinnvoll den Bits am Ausgangsport und der
angeschlossenen Hardware zugeordnet sind. Also z.B. alle an einem Port
und nicht über mehrere Ports verteilt.
* die angeschlossene Hardware in einen Zustand fällt, wenn es Probleme
mit deinem Programm oder der Steuerung geben sollte. Wenn der µC
ausfällt sollten die Lampen aus sein. Das kann z.B. heissen, dass der
Ausgangsport mit active-high Logik arbeitet und externe Pull-Down
Widerstände vorhanden sind. Oder dass keine bistabilen Relais benutzt
werden, sondern der µC den EIN Zustand aktiv aufrecht erhalten muss.
Christoph schrieb:> I = Portd.0 'print the value> nur es kommt nichts raus.
was mich jetzt aber auch nicht wunder, ich kann zwar kein BASCOM aber
ich denke hier wird auch nichts ausgegeben sonder nur eine Variabel
doppelte beschrieben.
Sinnvoller sollte es so sein.
Portd.0 = I
Was bringt nichts?
(Gewöhn dir an: Solange du auf Einsteigerniveau arbeitest, zeige deinen
Code. Immer! Bei jeder Änderung! Vollständig!)
Lass halt das RND als erstes mal weg. Sieh einfach nur zu, dass du einen
Ausgang gezielt auf 0 bzw. 1 schalten kannst. Arbeite zb erst mal mit
wait um dazwischen eine Pause einzulegen, damit du auch an einer LED
siehst, dass sich was tut.
Ich würde das ganze anders angehen.
Basis des ganzen ist eine Hauptschleife, die für 1 Durchlauf 1 Sekunde
braucht
1
do
2
3
....
4
5
wait 1
6
loop
für jede Lampe gibt es eine Variable, die angibt, wieviele Sekunden die
Lampe noch in ihrem Zustand (brennt oder brennt nicht) bleiben soll. Mit
jedem Durchlauf durch die Hauptschleife wird diese Variable um 1
herunter gezählt und wenn sie 0 ist, wird die Lampe umgeschaltet und
eine neue Zeitdauer bestimmt, wie lange sie in diesem Zustand bleiben
soll.
1
..
2
Lampe1Dauer = 5 + RND( 4 )
3
Lampe2Dauer = 5 + RND( 4 )
4
...
5
do
6
7
if Lampe1Dauer = 0 then
8
Port..... Lampe umschalten
9
Lampe1Dauer = 5 + RND( 4 )
10
end if
11
12
if Lampe2Dauer = 0 then
13
Port..... Lampe umschalten
14
Lampe2Dauer = 5 + RND( 4 )
15
end if
16
17
wait 1
18
19
Lampe1Dauer = Lampe1Dauer - 1
20
Lampe2Dauer = Lampe2Dauer - 1
21
loop
Das verallgemeinert jetzt schön auf beliebig viele Lampen. Wenn man
will, kann man auch für die Ein-Dauer eine andere Zeit bestimmen als für
die Aus-Dauer.
Und schau dir die BASCOM Online Hilfe an!
RND(x) liefert eine Zufallszahl in der Größenordung von 0 bis x-1. x
selber wird nicht geliefert. RND(1) wird also niemals 1 liefern, sondern
immer nur 0.
Wenn wir als Nicht-BASCOM Programmierer es schaffen, uns die
Funktionsweise in der Online Hilfe nachzuschlagen und zu studieren, dann
ist es wirklich nicht zuviel verlangt, dass du als BASCOM Programmierer
das ebenfalls tust.
Christoph schrieb:> das geht auch wunderschön
Schon.
Aber jetzt geht es mit 'Programmieren' los!
Das was du da hast, ist der Versuch die Fläche eines Rechtecks mit
Seitenlängen 3 und 5 zu berechnen, indem du rechnest
3
3
3
3
3
----
15
Also, in dem du 3 5-mal addierst, anstelle das du 3*5 rechnest.
Solange du dich daran festkrallst, dass du Multiplizieren nicht lernen
musst, weil du ja ohnehin durch entsprechend oft Addieren das Ergebnis
auch rauskriegst, wirst du bei 'komplexeren' Berechnungen unweigerlich
Schiffbruch erleiden.
Und in der Programmierung ist es ebenso. Das was du da hast ist zwar ein
Lauflicht. Aber es ist ein 'Additions'-Lauflicht. Bei mehr als, über den
Daumen, 30 LED und komplizierteren Mustern, wirst du nicht mehr weiter
kommen und auf 'Multiplikations'-Lauflicht umsatteln müssen.
Sieh dir mal den Vorschlag an, den ich dir gemacht habe für deine
Problemstellung.
hallo,
das ist zwar alles gut und schön aber ich kann mir under multiplikations
lauflich nicht viel vorstellen und erst recht nicht wie man das in
bascom umsetzen soll.
mfg
Christoph schrieb:> das ist zwar alles gut und schön aber ich kann mir under multiplikations> lauflich nicht viel vorstellen und erst recht nicht wie man das in> bascom umsetzen soll.
Karl Heinz meint damit das du dein Lauflicht auch anders, kompakter
schreiben kannst.
z.B. Kannst du dir fuer die auszugebenden Muster eine Tabelle erstellen
und die in einer Schleife ausgeben. Das meint er mit Multiplikation.
in C z.B.
for(i=0;i < Anzahl;i++)
{
PORTA = Muster[i];
wait(xxx);
}
Muster ist dein Musterarray, und Anzahl die Anzahl deiner Muster im
Array.
Christoph schrieb:> das ist zwar alles gut und schön aber ich kann mir under multiplikations> lauflich nicht viel vorstellen und erst recht nicht wie man das in> bascom umsetzen soll.
Worum gehts jetzt?
Um ein Lauflicht oder eine Abwesenheits-Lichtsteuerung?
Edit: Die Sacher mit Addition und Multiplikation war ja nur ein
Beispiel, das aufzeigen soll, dass man sich nicht mit der erstbesten
Lösung zufrieden geben soll. Nur weil etwas funktioniert, heißt das noch
lange nicht, dass es gut ist.
In deinem Fall, wie Helmut völlig richtig vorgebracht hat, geht es
darum, dass du dich mit Schleifen und Arrays vertraut machen musst. Wenn
man 30 mal im Prinzip denselben Ablauf hat, dann ist es unsinnig einfach
30 mal untereinander denselben Code nur mit anderen Zahlenwerten
hinzuschreiben. Genau an dieser Stelle kommen Schleifen in den diversen
Variationen ins Spiel.
Christoph schrieb:> nur da bin ich jetzt noch nicht wirklich weiter.
Und welchen Teil von der 'Skizze' von weiter oben verstehst du nicht?
Ich hab ihn bewusst so einfach wie nur möglich gehalten.
Christoph schrieb:> hallo,>> wenn ich das mache dann kommt immer error 31
Das war ja auch eine Skizze!
Die Details musst schon du einsetzen!
> $regfile = "m8def.dat"> $crystal = 1000000> $hwstack=40> $swstack=16> $framesize=32>>> Lampe1dauer = 5 + Rnd(4 )> Lampe2dauer = 5 + Rnd(4 )
Auch in BASCOM muss man meines Wissens Variablen erst mal definieren,
damit klar ist, welche Datentypen im Spiel sind
>> do>> if Lampe1Dauer = 0 then> Portd.0 Lampe Umschalten
Das ist eine umgangssprachliche Beschreibung vor den Vorgang "schalte
eine Lampe um". So viel BASCOM solltest du schon können, damit du weißt,
wie das in korrekter Syntax aussehen muss.
Hinweis 1: Im Englischen nennt man so etwas: einen Pin 'toggeln'
Hinweis 2: Schau doch mal in die BASCOM Hilfe, was die zum Thema
"TOGGLE" zu sagen hat.
Wo wird vereinbart, dass die Port-Ausgänge auch wirklich Ausgänge sind,
etc. etc.
Die Skizze soll das vorgschlagene Vorgehen, das Prinzip des Codes
verdeutlichen. Die Umsetzung in ein vollständiges Programm ist dein
Bier. Sonst könnte ich dich ja gleich fragen an welchen Pins die Lampen
hängen und dir das Programm fertig schreiben.
hallo,
woher soll mann denn das alles wissen
die erklärungen die mann alle im internet findet versteht mann nur wenn
man schon ahnung hat.
ach ja in der hilfe gibts keine treffer bei toggle
mfg
Christoph schrieb:> hallo,>> woher soll mann denn das alles wissen
Das nennt man 'lernen'.
> die erklärungen die mann alle im internet findet versteht mann nur wenn> man schon ahnung hat.
Ach komm.
Es gibt auch online ein paar BASCOM Tutorien, die einem die Basisdinge
zeigen. Und es gibt jede Menge kleinere Programme, die man durchaus
studieren kann und sich bei Dingen die einem neu sind, erst mal die
Hilfe reinzieht.
Ein bischen ein Niveau muss man schon voraussetzen, wenn jemand ein
Projekt wie deines machen will.
> ach ja in der hilfe gibts keine treffer bei toggle
Natürlich gibts da einen Treffer.
Auch das Benutzen der Hilfe will gelernt sein.
Mach die Hilfe auf
(online zb hier
http://avrhelp.mcselec.com/
du hast sie aber auch auf deinem Rechner)
mach den Unterpunkt "BASCOM Language Reference auf" und dann scroll
runter bis TOGGLE
hallo,
die hilfe ist nur dann eine hilfe wenn man auch versteht was die da von
einen wollen. wenn die das mal für otto normalverbraucher schreiben
würden dann ginge es.
egal was ich mit den toggle mache es kommen immer die gleichen errors
MFG
Christoph schrieb:> hallo,>> die hilfe ist nur dann eine hilfe wenn man auch versteht was die da von> einen wollen. wenn die das mal für otto normalverbraucher schreiben> würden dann ginge es.
Hoffe nicht auf Mitleid. Wir alle sind durch diese Schule gegangen. Und
im Gegensatz zu unseren Poltikern sind die meisten hier der Meinung,
dass Niveauabsenken nicht der richtige Weg ist. Wer etwas lernen will,
der muss es lernen.
(Und konträr zu deiner Meinung: Die BASCOM Hilfetexte sind extrem simpel
geschrieben. Da hast du noch nie richtige Manuals gesehen :-)
> egal was ich mit den toggle mache es kommen immer die gleichen errors
Dann musst du dir den Fehlertext ansehen, darüber nachdenken worüber der
Fehlertext spricht, in deinem Code die entsprechende Zeile aufsuchen und
versuchen den Fehlertext mit dem was du geschrieben hast in
Übereinstimmung zu bringen.
jetzt gehen die leds zusammen an und nacheinander aus.
das komische ist nur als ich das vor 20 min versucht hab ging es nicht.
warum das jetzt passiert weis ich dennoch nicht
Christoph schrieb:> warum das jetzt passiert weis ich dennoch nicht
Was daran ist unklar?
Im Grunde ist es nichts anderes als das bestimmen einer 'zufälligen
Anzahl von Sekunden', wann die nächste Aktion bei einer Lampe
passieren soll
1
Lampe1dauer = 5 + Rnd(4 )
und diese Zeit wird innerhalb der Schleife
1
do
2
3
....
4
5
Loop
die das Programm ständig durchläuft, und die für einen Durchlauf durch
die Schleife 1 Sekunde
1
wait 1
benötigt bei jedem Durchlauf um 1 verringert
1
Lampe1Dauer = Lampe1Dauer - 1
Im Prinzip ist Lampe1Dauer also einfach nur eine 'Uhr', die von einem
bestimmten Wert ausgehend runterzählt (und zwar um 1 pro Sekunde), und
wenn diese 'Uhr' dann irgendwann bei 0 angelangt ist
1
if Lampe1Dauer = 0 then
dann passiert etwas. Nämlich was?
Die Lampe wird umgeschaltet
1
Toggle Portd.0
und es wird eine neue Zeitdauer bestimmt
1
Lampe1Dauer = 5 + RND( 4 )
von der die 'Uhr' wieder herunterzählen soll um dann bei 0 die nächste
Aktion auszuführen.
Der 'Trick' besteht also darin, nicht für 1 Lampe die komplette
Zeitdauer abzuwarten, sondern in 1 Sekunden Abständen alle Lampen zu
untersuchen, ob ihre jeweilige Leucht/Pausen-Zeit abgelaufen ist und
dann jeweils etwas zu unternehmen.
Hallo.
für was steht aber nun die 4 wenn ich die Brüdern zahlen ändere dann
gehen sie unterschiedlich an und dann wieder das gleiche wie vorher
zusammen an nacheinander aus
mfg
chtistoph schrieb:> Hallo.>> für was steht aber nun die 4
Die 4 sind das Argument an RND.
Und RND liefert eine Zufallszahl zwischen 0 und dem Wert dem du ihm
übergibst. Also liefert RND eine zufällige 0, 1, 2 oder 3
Wenn du dann noch 5 dazuzählst, kriegst du daher zufällige Zahlen 5, 6,
7, 8
D.h. in diesem Zusammenhang, dass die Leuchtzeiten (oder Pausenzeiten)
zufällig 5, 6, 7 oder 8 Sekunden lang sind.
Willst du Zeiten beispielsweise zwischen 32 und 49 Sekunden, dann musst
du das daher wie abändern?
49 - 32 ergibt 17
Du brauchst daher Zufallszahlen zwichen 0 und 17 -> RND(17)
und dann noch 32 dazu, liefert daher Zufallszahlen zwischen 32 und 49
Lampe1Dauer = 32 + RND( 17 )
Hallo,
egal wie ich diese zahlen verändere zum schluss gehen beide zusammen an
und nacheinander wieder aus.
das ist doch dann auch nicht so wie es soll.
MFG
Christoph schrieb:> das ist doch dann auch nicht so wie es soll.
Ähm.
Wenn in einer Wohnung Lichter zufällig an ausgehen sollen, dann ist es
nicht sehr wahrscheinlich, dass sie gemeinsam ausgehen.
Genau das sollen sie ja NICHT tun!
Lass das doch mal weiterlaufen.
Nachdem sie hintereinander ausgehen, geht irgendwann eine wieder an,
dann geht vielleicht die andere wieder an, die eine aus, an, etc.
Beide Lampen schalten sich unabhängig voneinander ein/aus.
Du möchtest das jetzt wahrscheinlich noch weiter entwickeln. So dass du
zb für jede Lampe die Leuchtzeit und die Dunkelzeit getrennt einstellen
kannst. Zb wird die Toilette in der Nacht eher das Muster haben: lange
Dunkelzeiten unterbrochen von kurzen Hellzeiten.
Dafür wird in der Küche eher das umgekehrte Schema vorliegen: längere
Hellzeiten gefolgt von kürzeren Dunkelpausen.
Denkbar wäre auch, das Schema im Laufe der Nacht zu verändern und so die
Küche nach 23 Uhr auf "Der Hausbesitzer plündert den Kühlschrank"
umzustellen.
Der Fantasie sind keine Grenzen gesetzt.
Aber erst mal musst du die einfachen Sachen hinkriegen und verstehen:
Lampen die voneinander unabhängig sich nach zufälligem Muster
ein/aussschalten.
Christoph schrieb:> die hilfe ist nur dann eine hilfe wenn man auch versteht was die da von> einen wollen. wenn die das mal für otto normalverbraucher schreiben> würden dann ginge es.
Ach komm, du kennst die Anfänge dir Mikrocontrollerei am Ende der 70
Jahre nicht. Da gab es kein Internet und keine Foren wo man fragen
konnte. Kaum einer kannte sich damit aus. Es gab ein paar einfache
Bücher und den Intel-Katalog. Damit musste man klar kommen. Und wir sind
damit klar gekommen weil wir uns hingesetzt haben und die Sachen
ausprobiert haben und unsere Fehler gefunden haben. Da gab es kaum
irgendwelche Entwicklungstools da wurde noch mit der Hand assembliert.
Da kannte man die Hexcodes der Controllers auswendig.
Helmut Lenzen schrieb:> Christoph schrieb:>> die hilfe ist nur dann eine hilfe wenn man auch versteht was die da von>> einen wollen. wenn die das mal für otto normalverbraucher schreiben>> würden dann ginge es.>> Ach komm, du kennst die Anfänge dir Mikrocontrollerei am Ende der 70> Jahre nicht. Da
Hi,
da haben wir die beiden Extreme zusammen, beide total daneben.
Die 70er sind schon etwas länger vorbei.
Allerdings ist das Programmieren von µC auch nicht für
Ottonormalverbraucher gedacht sondern eben für Programmierer von µC.
Bascom macht den Einstieg zwar sehr einfach aber eine AI ist das nun
auch wieder nicht.
Man muß schon mindestens die Syntax lernen und sich zuerst an der
Befehlsreferenz entlanghangeln. Das Datenblatt des µC sollte man auch zu
Rate ziehen.
Von daher ist Deine Fragerei hier nicht unbedingt dreist sondern einfach
nur naiv.
Das ist nicht Lego Mindstorm oder sowas, Du musst schon etwas mehr lesen
und selbst verstehen.
Also wenn Du mit Bascom und den entsprechenden Quellen dazu nicht
klarkommst, dann suche Dir bitte ein anderes Hobby. Sonst verfestigt
sich nur das Vorurteil, daß nur Vollpfosten Bascom nutzen (was absolut
nicht stimmt).
Gruß,
Norbert