• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

Firefly in Bascom

schnasemann

Geocacher
Hallo, die Damen und Herren, ich habe beim Surfen http://tinkerlog.com/2008/07/27/synchronizing-fireflies-ng/ gefunden und musste mich bremsen, dass ich nicht gleich 100 Tischtennisbälle und den kompletten Unterbau dazu bestelle. Toll, oder?

Nun dachte ich, das müsste sich doch auch in meine RLs reinbauen lassen. Idee war, dass ein ausgelöstes RL nach anderen blinkt und diese dann versuchen, synchron zu blinken und sich quasi alle auszulösen.

Als Sensor soll wieder die LED herhalten. Nun macht mir aber BASCOM einen Strich durch die Rechnung, weil ich zu viel Flash benötigen würde (110%).
Ist der Compiler so viel schlechter, als der WinAVR C-Compiler? Hier mein Code:

Code:
$regfile = "ATtiny13.DAT"
$crystal = 9600000                                          'Reale Frequenz des internen 128kHz-Oszillators
$hwstack = 5                                                'default use 32 for the hardware stack
$swstack = 5                                                'default use 10 for the SW stack
$framesize = 20                                             'default use 40 for the frame
Const Daylight = 240
Const Flashpower = 8000


Stop Ac

Config Portb = &B11101110                                   'Portb.4 und Portb.0 auf 'Eingang' schalten
Portb = &B00000001                                          'keine Pullups zuschalten, nur PB0

Wdtcr = &B11010100                                          'Watchdog auf 250ms einstellen
Enable Interrupts

Config Adc = Single , Prescaler = Auto , Reference = Internal       'Referenzspannung des Adc Auf "Internal" = 1,1 V
Dim Act_light As Byte                                       ' gemessenes Licht
Dim Count As Byte                                           ' Zähler für Soft-PWM
Count = 0
Dim R As Byte
Dim Rb As Byte
R = 0
Rb = 0

Config Timer0 = Timer , Prescale = 1
On Timer0 Tim0_isr
Dim I As Byte
I = 0
Dim Light As Byte
Light = 0
Dim Threshold As Word
Threshold = 0
Dim Lpower As Word
Lpower = 0
Dim Blind As Word
Blind = 0



 '// compute threshold of the ambient light
For I = 1 To 4
   Gosub Einlesen
   Threshold = Threshold + Act_light
   Waitms 500
Next I
Threshold = Threshold / 4
Threshold = Threshold + 20
I = Act_light Mod 4
While I > 0                                                 ' zufallszeit warten
   Decr I
   Waitms 1000
Wend

Do
   If Lpower > 6000 Then
      Lpower = Lpower + 1
   Elseif Lpower > 4000 Then
      Lpower = Lpower + 2
   Elseif Lpower > 3000 Then
      Lpower = Lpower + 4
   Elseif Lpower > 2000 Then
      Lpower = Lpower + 8
   Else
      Lpower = Lpower + 16
   End If
   Gosub Einlesen
   Light = Act_light
   If Blind = 0 Then
      If Light > Daylight Then
         R = 32
         Waitms 10000
         R = 0
      Elseif Light > Threshold Then
         Lpower = Lpower + 400
         Blind = 800
      End If
   End If
   If Blind > 0 Then
      Decr Blind
   End If

   If Lpower > Flashpower Then
      R = 255
      Waitms 500
      R = 0
      Lpower = 0
      Blind = 100
   End If
Loop


Einlesen:
Start Adc
Config Portb.4 = Output                                     'LED "entladen"
Portb.4 = 0
Waitms 20
Config Portb.4 = Input
Portb.4 = 0
cbi adcsra,7                                                'ADEN = 0
Waitms 20
sbi adcsra,7                                                'ADEN = 1
Act_light = Getadc(2)                                       'Spannung der LED messen
Stop Adc
Return

Tim0_isr:
Incr Count
If Count = 0 Then
   Rb = R
   If Rb > 0 Then
      Config Portb.4 = Output
      Portb.4 = 1
   End If
   If Count = Rb Then
      Portb.4 = 0
   End If
End If
Return
End

Any hints?
Seid gegrüßt,
schnasemann
 

stonewood

Geowizard
Ich seh da 'incr' und 'decr' - vielleicht zieht das eine Mathebibliothek mit rein?

(edit) - und '/ 4' ... das zieht garantiert mehr mit rein. Der Tiny kann nicht von sich aus teilen. Eigentlich kann er nicht mal multiplizieren.
 

chrysophylax

Geomaster
stonewood schrieb:
und '/ 4' ... das zieht garantiert mehr mit rein. Der Tiny kann nicht von sich aus teilen. Eigentlich kann er nicht mal multiplizieren.

Äh, also gerade teilen durch 4 ist doch nichts anderes als 2mal rechts shiften und damit die allerleichteste Übung. Das muß doch sogar so ein komisches Basic können..... In Assembler sind das bei Byte-Variablen wenn man ganz sicher gehen will 4 Programmworte, bei 16Bit-Integers 6 Programmworte auf dem AVR....
Wenn das eine ganze Bibliothek spart.... Ich hab die AVRs nie in Hochsprache programmiert (immer nur in Assembler), und da ist sowas überhaupt kein Problem.... Wobei heutige Compiler für egal welche Sprache üblicherweise auch so intelligent sind, ein /4 durch 2mal ShiftRight zu ersetzen....

chrysophylax....
 

huzzel

Geowizard
was evtl spart:
Bei den ganzen Waits sich auf eine Zeit einigen und die in eine Sub auslagern.
Hab ich so bei meinem Telefon gemacht. Spart recht schnell Speicherplatz.

Die ganzen Ifs brauchen halt auch viel Platz.
 
OP
schnasemann

schnasemann

Geocacher
die ifs müssen sein, sonst kann ich keine Fallunterscheidungen machen. Das soll eine e-Funktion andeuten.
das Teilen habe ich auch mit rotate right ohne carry vermutet und sehe da nicht den Speicherfresser.
Ich fände es eh gut, einzelne Brocken compilieren zu können, dann würde man sehen, wo es denn Platz kostet.
Und incr und decr kann direkt aufs Register angewendet werden, wenn das der Compiler anders macht, isses Stuss.
Die Waits erwarte ich eigentlich schon, dass die über einen Timer gemacht werden und dann nur Schleifen gedreht werden. Dann ist es egal, ob ich immer den gleichen Wert als Schleifenanzahl habe, oder unterschiedliche.
Vielleicht kann mir da einfach einer weiterhelfen.
 
OP
schnasemann

schnasemann

Geocacher
stonewood hat recht und BASCOM kann nicht teilen. Ein /4 wird nicht als RR2 erkannt. Peinlich. Nun hier mein Code, mit denen meine Reaktivlichter miteinander kommunizieren. Aber eine Kombination macht dennoch keinen Sinn. Die RLs müssen als Firefly recht nah beieinander sein oder ich brauche doch irgendwelche Diffusoren. Als RL will ich eine große Reichweite und eine Richtungsabhängigkeit (kleiner Einfallwinkel) haben. Widerspricht sich also.

Wer also Lust hat, mal ein wenig Firefly zu spielen, hier der Code.

Code:
$regfile = "ATtiny13.DAT"
$crystal = 9600000                                          'Reale Frequenz des internen 128kHz-Oszillators
$hwstack = 5                                                'default use 32 for the hardware stack
$swstack = 5                                                'default use 10 for the SW stack
$framesize = 20                                             'default use 40 for the frame
Const Daylight = 1000
Const Flashpower = 800


Stop Ac
Config Timer0 = Timer , Prescale = 1
On Timer0 Tim0_isr
Config Portb = &B11101110                                   'Portb.4 und Portb.0 auf 'Eingang' schalten
Portb = &B00000001                                          'keine Pullups zuschalten, nur PB0

Wdtcr = &B11010100                                          'Watchdog auf 250ms einstellen
Enable Interrupts
Enable Ovf0
Config Adc = Single , Prescaler = Auto , Reference = Internal       'Referenzspannung des Adc Auf "Internal" = 1,1 V
Dim Act_light As Word                                       ' gemessenes Licht
Dim Count As Byte                                           ' Zähler für Soft-PWM
Count = 0
Dim R As Byte
Dim Rb As Byte
R = 0
Rb = 0

Dim I As Byte
I = 0
Dim Light As Word
Light = 0
Dim Threshold As Word
Threshold = 0
Dim Lpower As Word
Lpower = 0
Dim Blind As Word
Blind = 0



 '// compute threshold of the ambient light
For I = 1 To 4
   Gosub Einlesen
   Threshold = Threshold + Act_light
   Waitms 500
Next I
Shift Threshold , Right , 2
Threshold = Threshold + 20

If Act_light > 250 Then
   Waitms 750
Else
   Waitms 250
End If
Do
   If Lpower > 600 Then
      Lpower = Lpower + 1
   Elseif Lpower > 400 Then
      Lpower = Lpower + 2
   Elseif Lpower > 300 Then
      Lpower = Lpower + 4
   Elseif Lpower > 200 Then
      Lpower = Lpower + 8
   Else
      Lpower = Lpower + 16
   End If
   Gosub Einlesen
   Light = Act_light
   If Blind = 0 Then                                        ' wenn nicht mehr blind dann
      If Light > Daylight Then                              ' prüfen, ob Tageslicht, dann glimmen
         R = 10
         Waitms 2500
         R = 0
      Elseif Light > Threshold Then                         ' wenn heller als Umgebung, dann hat einer geblitzt
         Lpower = Lpower + 200                              ' schneller werden
         Blind = 160                                        ' die nächsten Blitze ignorieren
      End If
   End If
   If Blind > 0 Then
      Decr Blind
   End If

   If Lpower > Flashpower Then                              ' genügend Kraft zum Blitzen
      R = 180                                               ' also los
      Waitms 200
      R = 0
      Lpower = 0
      Blind = 20                                            ' eignes Blitzen ignorieren
   End If
Loop


Einlesen:
Start Adc
Config Portb.4 = Output                                     'LED "entladen"
Portb.4 = 0
Waitms 2
Config Portb.4 = Input
Portb.4 = 0
cbi adcsra,7                                                'ADEN = 0
Waitms 2
sbi adcsra,7                                                'ADEN = 1
Act_light = Getadc(2)                                       'Spannung der LED messen
Stop Adc
Return

Tim0_isr:
Incr Count
If Count = 255 Then
   Rb = R
   Count = 0
   If Rb > 0 Then
      Config Portb.4 = Output
      Portb.4 = 1
   End If
End If
If Count = Rb Then
   Portb.4 = 0
End If
Return
End

Grüße, schnasemann
 

thomas_st

Geowizard
schnasemann schrieb:
Hallo, die Damen und Herren, ich habe beim Surfen http://tinkerlog.com/2008/07/27/synchronizing-fireflies-ng/ gefunden und musste mich bremsen, dass ich nicht gleich 100 Tischtennisbälle und den kompletten Unterbau dazu bestelle. Toll, oder?
Ich bin mal im I-Net über eine Seite gestolpert, wo dutzende solche Spielereien vorgestellt waren - war echt klasse, nur habe ich leider vergessen, wo diese Seite war :(

schnasemann schrieb:
Als Sensor soll wieder die LED herhalten.
Wie willst Du das realisieren - wenn die LED an ist, kannst Du ja die Helligkeit nicht testen - du müsstest also eher auf Dunkelheit testet?!

Viele Grüße,
Thomas(_st) - stellt sich gerade einen synchron blinkenden Wald vor ;)
 

hendyp

Geocacher
thomas_st schrieb:
schnasemann schrieb:
Hallo, die Damen und Herren, ich habe beim Surfen http://tinkerlog.com/2008/07/27/synchronizing-fireflies-ng/ gefunden und musste mich bremsen, dass ich nicht gleich 100 Tischtennisbälle und den kompletten Unterbau dazu bestelle. Toll, oder?
Ich bin mal im I-Net über eine Seite gestolpert, wo dutzende solche Spielereien vorgestellt waren - war echt klasse, nur habe ich leider vergessen, wo diese Seite war :(
Meine bevorzugte Seite mit ganz vielen Spieler- und Basteleien ist http://www.instructables.com/ :D . Das Jar of Fireflies habe ich in abgewandelter Form auch schon einmal "erfolgreich" verschenkt.
 

thomas_st

Geowizard
hendyp schrieb:
thomas_st schrieb:
schnasemann schrieb:
Hallo, die Damen und Herren, ich habe beim Surfen http://tinkerlog.com/2008/07/27/synchronizing-fireflies-ng/ gefunden und musste mich bremsen, dass ich nicht gleich 100 Tischtennisbälle und den kompletten Unterbau dazu bestelle. Toll, oder?
Ich bin mal im I-Net über eine Seite gestolpert, wo dutzende solche Spielereien vorgestellt waren - war echt klasse, nur habe ich leider vergessen, wo diese Seite war :(
Meine bevorzugte Seite mit ganz vielen Spieler- und Basteleien ist http://www.instructables.com/ :D . Das Jar of Fireflies habe ich in abgewandelter Form auch schon einmal "erfolgreich" verschenkt.
Ha, Du bist klasse! Genau diese Seite meinte ich :D :D

Viele Grüße,
Thomas(_st)
 
OP
schnasemann

schnasemann

Geocacher
Thomas, schaue Dir den C-Quellcode an. Im Endeffekt gehen die Fireflies davon aus, dass sie die anderen nicht sehen, wenn sie synchron mit ihnen blinken, weil während des Blinkens der LDR auch nicht ausgewertet wird. Sonst wäre unklar, ob man nach "vorne" oder nach "hinten" synchronisieren sollte. So versuchen alle, früher zu blinken, wenn sie nicht in einem gewissen Fenster sind. Klappt ja auch, aber die Dinger müssen dann recht nah beieinander liegen. Was sie bei einem Nightcache nicht würden.
Nette Spielerei trotzdem.
Die Site kannte ich auch, die ist echt gut.
Grüße,
schnasemann
 

thomas_st

Geowizard
schnasemann schrieb:
Thomas, schaue Dir den C-Quellcode an. Im Endeffekt gehen die Fireflies davon aus, dass sie die anderen nicht sehen, wenn sie synchron mit ihnen blinken, weil während des Blinkens der LDR auch nicht ausgewertet wird.
Das meinte ich mit "auf Dunkelheit testen"; allerdings gestehet ich, dass ich den Code mir noch nicht angesehen habe ;)

Viele Grüße,
Thomas(_st) - die Idee ist klasse - das werde ich bestimmt mal einfach als Gag bauen - sieht bestimmt klasse aus, wenn zufällig verteilte "Fireflies" synchron rumblinken :)
 
OP
schnasemann

schnasemann

Geocacher
aber wie gesagt, die Reichweite ist da nicht so doll. Ohne Diffusor brauchts eine reflektierende Fläche (z.B. mein Computertisch), dann liegen die Dinger aber 10cm (!) auseinander, leider keine Meter mehr.
Bei RLs ginge das auf größere Entfernungen nur, wenn die sauber aufeinander ausgerichtet sind. Dann tuts aber der normale Algo der RLs, halt etwas Pause vor dem nächsten Auslösen noch rein, damit sich die blinkenden nicht gegenseitig dauernd erneut auslösen.
 
Oben