Bascom, at mega8 ausgänge sporadisch schalten.

Gast #2555608
Lesenswert?

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
Gast #2555626
Lesenswert?

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!
Gast #2555654
Lesenswert?

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
Gast #2555758
Lesenswert?

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
Gast #2555815
Lesenswert?

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.
Gast #2556810
Lesenswert?

Hallo,

ich hab mich jetzt mal versucht aber so wie ich es verstanden hab.
1
Ddrd = &B00000001
2

3
Dim I As Word       ' dim variable
4

5
Do
6

7
I = Rnd(1)       'get random number (0-1)
8
I = Portd.0       'print the value
9

10
Wait 1

nur es kommt nichts raus.


m
MFG
#2557567
Lesenswert?

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.
#2557581
Lesenswert?

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.
Gast #2557596
Lesenswert?

hallo,

hab nen bissel lange weile geahbt und hab mir nen lauflicht gebaut.
das sieht bei mir so aus:
1
Ddrd = &B00111111
2

3

4
Do
5

6
Portd.3 = 1       
7
Waitms 300
8
Portd.2 = 1
9
Waitms 300
10
Portd.4 = 1       
11
Waitms 300
12
Portd.5 = 1
13
Waitms 300
14
Portd.1 = 1       
15
Waitms 300
16
Portd.0 = 1
17
waitms 300
18
Portd.0 = 0       
19
Waitms 300
20
Portd.1 = 0
21
waitms 300
22
Portd.5 = 0      
23
Waitms 300
24
Portd.4 = 0
25
waitms 300
26
Portd.2 = 0      
27
Waitms 300
28
Portd.3 = 0
29
Waitms 300
30

31
loop
32

33
end

das geht auch wunderschön

MGH
#2557607
Lesenswert?

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.
#2557649
Lesenswert?

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.
#2557705
Lesenswert?

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.
Gast #2557810
Lesenswert?

hallo,

wenn ich das mache dann kommt immer error 31
1
$regfile = "m8def.dat"
2
$crystal = 1000000
3
$hwstack=40
4
$swstack=16
5
$framesize=32
6

7

8
Lampe1dauer = 5 + Rnd(4 )
9
Lampe2dauer = 5 + Rnd(4 )
10

11
do
12

13
  if Lampe1Dauer = 0 then
14
    Portd.0 Lampe Umschalten
15
    Lampe1Dauer = 5 + RND( 4 )
16
  end if
17

18
  if Lampe2Dauer = 0 then
19
    Portd.1 Lampe Umschalten
20
    Lampe2Dauer = 5 + RND( 4 )
21
  end if
22

23
  wait 1
24

25
  Lampe1Dauer = Lampe1Dauer - 1
26
  Lampe2Dauer = Lampe2Dauer - 1
27
loop
#2557826
Lesenswert?

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.
Gast #2557859
Lesenswert?

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
#2557877
Lesenswert?

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
Gast #2557915
Lesenswert?

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
#2557932
Lesenswert?

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.
Gast #2557962
Lesenswert?

hallo,
1
Ddrd = &B00111111
2

3
Dim Lampe1dauer As Byte
4
Dim Lampe2dauer As Byte
5

6
Lampe1dauer = 5 + Rnd(4 )
7
Lampe2dauer = 5 + Rnd(4 )
8

9
do
10

11
  if Lampe1Dauer = 0 then
12
    Toggle Portd.0
13
    Lampe1Dauer = 5 + RND( 4 )
14
  end if
15

16
  if Lampe2Dauer = 0 then
17
    Toggle Portd.1
18
    Lampe2Dauer = 5 + RND( 4 )
19
  end if
20

21
  wait 1
22

23
  Lampe1Dauer = Lampe1Dauer - 1
24
  Lampe2Dauer = Lampe2Dauer - 1
25
Loop
26
End

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
#2557986
Lesenswert?

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.
#2558089
Lesenswert?

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 )
#2558144
Lesenswert?

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.
#2559018
Lesenswert?

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.
#2559047
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren