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

Reaktives Licht mit Atmel AVR

Hi Dr.Gonzo,

nun - auf den ersten Blick kann ich im "EEPROM-Schreiber" keinen Fehler feststellen.

Hast Du denn auch im Hauptprogramm den Wert für die Morsezeichenanzahl entsprechend eingestellt?

Poste das modifizierte Hauptprogramm doch bitte auch einmal hier - mit der "Code"-Schaltfläche oben gibt es auch so einen schönen weißen Rahmen :D

Zur Not beschreibe das EEPROM doch einfach "per Hand". Dazu mußt Du die Binärwerte allerdings in Hex-Werte umwandeln.

Gruß, Thomas
 

dr.gonzo

Geonewbie
Danke für die schnelle Antwort, Ubique Terrarum


Ich habe die Länge im Grundprogramm angepasst und auch schon verschiedene Längen probiert. Das Interresante daran ist, dass ich z.B. bei einer Länge von 43 Zeichen den beschriebenen Fehler ab dem 35 Buchstaben hatte. Als er kürzer war hatte ich den Fehler bei 18, glaub ich. Echt toller Fehler, oder? Könntest du mir vielleicht genauer beschreiben, wie ich das EEPROM per Hand beschreiben kann? Werte umrechnen ist dabei nicht mein Problem, nur das Beschreiben. Damit könnte ich den Fehler vielleicht eingrenzen. Vielen Dank im Voraus!!

Jetzt noch den Code im weißen Rahmen :lol: !
Ich hab eigentlich nur die Art der Variablen D1 geändert um die Morsegeschwindigkeit zu verlangsamen.
Code:
'============================================================
'
' ***********************************************************
' *** ***
' *** Reaktiv-Tiny v0.5 2006-02-25 (AP) ***
' *** ***
' *** Morsecodeabfrage eines Morsezeichens mit ***
' *** anschliesender Ausgabe von bis zu 64 Morsezeichen. ***
' *** Es konnen Koordinaten oder beliebiger Text ***
' *** ausgegeben werden. ***
' *** Die Eingabegeschwindigkeit wird mit der ersten ***
' *** empfangenen Zeichenlange bestimmt ***
' *** ***
' *** ***
' *** --------------- Einstellungen --------------------- ***
' *** ***
' *** Fusebit H: 0 ***
' *** Fusebit G: 0 ***
' *** Fusebit F: 1 ***
' *** Fusebit E: 1 ***
' *** Fusebit DCBA: 1011 ***
' *** ***
' *** Beachtet das Fusebit G. Es muss auf 0 stehen! ***
' *** ***
' *** Unter 'Options' ' Compiler' 'Chip' ***
' *** den "HW Stack" runterstellen. z.B. auf 6 ***
' *** ***
' ***********************************************************
'
' ƒÊC: ATtiny13V
'
'============================================================
'
$regfile = "ATtiny13.DAT"
$crystal = 113000                                           'Reale Frequenz des internen 128kHz-Oszillators
$hwstack = 6
'
Config Portb = &B00011000                                   'Pinb.3 und .4 auf 'Ausgang', Rest auf 'Eingang' schalten
Portb = &B11100111                                          'Pullups zuschalten, auser fur Pinb.3 und .4
'
Stop Adc                                                    'A/D-Wandler abschalten, um Strom zu sparen
Stop Ac                                                     'Analog-Komparator abschalten, um Strom zu sparen
''
'Anmerkung zur Deklaration: bin sparsam mit den Variablen umgegangen,
'd.h. diese werden zum Teil im Programm mehrfach fur verschiedene Aufgaben verwendet.
'Grund: ich kenne das "Drosseln" des HW Stack erst seit es hier im Fred stand. Dank an Gonzoarts.
Dim Hell As Bit
Dim Vhell As Bit
Dim Ok As Bit
Dim A As Byte
Dim B As Byte
Dim Ein As Integer
Dim Bx As Byte
Dim Z As Byte
Dim D1 As Integer
Dim D2 As Integer
''''
' Es konnen alle Buchstaben und Zahlen gesendet werden, da diese maximal 5 Zeichen lang sind.
' Ausgabe der Zeichen aus dem EEPROM mit Lange
'
''
' dit = kurz = . = 0
' dah = lang = - = 1
'
'
' 765 43210
' \_/ \___/
' | |
' Lange |
' |
' Morsezeichen v.rechts (ruckwarts)
'
' Morse Bit v.r.
'1 = .---- = 100|11110
'2 = ..--- = 100|11100
'3 = ...-- = 100|11000
'4 = ....- = 100|10000
'5 = ..... = 100|00000
'6 = -.... = 100|00001
'7 = --... = 100|00011
'8 = ---.. = 100|00111
'9 = ----. = 100|01111
'0 = ----- = 100|11111
'
'N = -. = 001|00010
'E = . = 000|00000
'
'KA (Spruch Anfang) = -.-.- = 100|10101
'AR (Spruch Ende) = .-.-. = 100|01010
'
'Wortabstand einfugen mit 111|11111 (FF)
''
' Ubertragungsrate
' 1 WPM: 1 dit = 1200 ms
' 5 WPM: 1 dit = 240 ms
'10 WPM: 1 dit = 120 ms
'20 WPM: 1 dit = 60 ms
'' '==> Ubertragungsrate festlegen, hier 5Wortern pro Minute (WPM)
D1 = 480                                                    'D1 entspricht der Lange eines dit in Millisekunden
D2 = 960                                                    'D2 entspricht der doppelten Lange eines dit
'
'==> Abgefragtes Zeichen festlegen
Ein = &B0000000000111000                                    'Beispiel: SOS ...---...
''
Ok = 1
Gosub Morsen                                                'beim Start das ganze mal testweise Morsen
'
' Morsezeichen - Abfrage:
Do
Gosub Led_abfrage
If Hell = 1 Then Vhell = 1                                  'Bei Licht Merker setzen
If Vhell = 1 And B < 255 Then B = B + 1                     'Wenn Merker gesetzt wurde, Zahler fur Lichtdauer
'erhohen (bis max. 255)
If Hell = 0 Then
If Vhell = 1 Or B = 255 Then                                'Ubergang zu Dunkel
If Z = 0 Then
Ok = 1                                                      'Neues Spiel, neues Gluck
'Festlegen der Grenzdauer. Diese entscheidet, ob
'ein dit oder dah eingegeben wurde.
'==> Leider muss man hier "von Hand" eintragen,
'ob das erste Zeichen dit oder dah ist. Bei dit B),
'bei dah A) auskommentieren
'Die benotigte If-Abfrage hat im 1k Programmspeicher
'des ATtiny13V keinen Platz mehr.
'A) erstes abgefragtes Zeichen ist ein dit
If B < 127 Then                                             'A) dies sollte nicht zu lange sein
Bx = B * 1.7                                                'A) Grenzdauer Bx durch Lange des ersten dit festlegen
Else                                                        'A)
Ok = 0                                                      'A) das war zu lange furs erste dit
End If                                                      'A)
'B) erstes abgefragtes Zeichen ist ein dah
'Bx = B / 2 'B) Grenzdauer Bx durch Lange des ersten dah festlegen
End If
If B < Bx Then
If Ein.z = 1 Then Ok = 0                                    'dit empfangen, wenn Ein.z = 0, dann richtig
Else
If Ein.z = 0 Then Ok = 0                                    'dah empfangen, wenn Ein.z = 1, dann richtig
End If
Z = Z + 1
If Z = 9 Or Ok = 0 Then                                     'Auswerten wenn Falsch ODER Anzahl Zeichen erreicht
Gosub Morsen                                                '==> Z auf die Anzahl abgefragter Zeichen einstellen
End If
End If
End If
If Hell = 0 Then                                            'Bei Dunkelheit Merker und Zahler fur Lichtdauer loschen
Vhell = 0
B = 0
End If
Loop
Morsen:
Waitms 500                                                  'Pause, sonst ist das erste Zeichen schwer zu lesen
If Ok = 1 Then                                              'Morsezeichen senden
For Bx = 0 To 28                                            '=> Lange anpassen!
Readeeprom A , Bx                                           'in A steht der zu morsende Code (Bit 0 bis 4 dit und
'dah, Bit 5 bis 7 die Anzahl
Z = 0
Z.0 = A.5                                                   'Zeichenlange steht in den vorderen 3 Bit (A.5 bis 7)
Z.1 = A.6
Z.2 = A.7
If Z = 7 Then                                               'bei FF einen Wortabstand einfugen (4dit = 7dit - 3dit)
Waitms D2
Waitms D2
Else                                                        'Zeichenlange: 1 bis 5 (0 bis 4)
Gosub Licht
End If
Next Bx
Else                                                        ' IRRUNG senden
If B < 255 Then                                             ' aber nicht, wenn die Dammerung eintritt bzw. ein
'langes Lichtsignal anlag
Z = 7
A = 0                                                       ' Irrung = ........ = 0
Gosub Licht
End If
End If
'A = 0
B = 0
Z = 0
Return
Licht:
For B = 0 To Z
Portb.3 = 1                                                 'LED an
Waitms D1                                                   '1 . dit
If A.b = 1 Then
Waitms D2                                                   '3 - dah
End If
Portb.3 = 0                                                 'LED aus
Waitms D1                                                   '1 dit Pause
Next B
Waitms D2                                                   '+2 dit Pause nach Ziffer
Return
Led_abfrage:
Portb.3 = 0                                                 'Portb.3 auf Masse schalten
Portb.4 = 1                                                 'Portb.4 auf +Ub schalten, um die LED zu 'laden'
Waitus 1                                                    'Ladezeit 1 ƒÊs, kann ggf. noch verkleinert werden
Config Portb.4 = Input                                      'Portb.4 nun zwecks Abfrage der LED-Ladung
'auf 'Eingang' schalten
Portb.4 = 0                                                 'Pullup abschalten, sonst geht's nicht!
Waitms 20                                                   'Entladezeit 20 ms - je groser, desto weniger Licht genugt
'_(je kleiner, je unempfindlicher)
If Pinb.4 = 0 Then                                          'Ladezustand einlesen: '1' -> dunkel, '0' -> hell
Hell = 1
Else
Hell = 0
End If
Config Portb.4 = Output                                     'Portb.4 wieder auf Ausgang schalten
Portb.4 = 0                                                 'Portb.4 auf Masse schalten
Return
End
 
Hi,

ich weiß jetzt nicht auf die Schnelle inwieweit die Integer-Variable reicht. - müßte eigentlich 2^16 sein.
Setz doch bitte wieder die alten Variablenwerte für D1 und D2 ein, auch als Byte UND Integer.

Wenn Du jetzt die Zeiten verlängern möchtest, schreib einfach noch einen "Waitms D1" bzw. "Waitms D2" in die nächste Zeile dazu.

EEPROM programmieren unter BASCOM geht unter "Program" -> "Send to Chip" - Aber jetzt nur der rechte PFEIL !!! -> "Manual Program"

Das ist genau da, wo Du die Fusebits eingestellt hast.

Jetzt die mittlere Karteikarte "EEPROM" auswählen.

Ändere die entsprechenden Adressen auf dem "Schachbrett" durch überschreiben.

Jetzt noch "Write Buffer into EEPROM" - der rote Pfeil!

Fertig!

Das Fusebit G=0 muß allerdings vorher gesetzt sein.



Und - hilft das weiter?

Gruß, Thomas
 

dr.gonzo

Geonewbie
Vielen Dank für die Antwort!!! :D

Ich habe das Programm nochmal mit den alten Variablen eingespielt, leider ohne erfolg. Mit dem manuellen Beschreiben hat alles vorzüglich geklappt! Warum ich das EEPROM mit einem Programm Code nicht komplett beschreiben konnte ist mir immer noch schleierhaft. Die Bytes von 24 - 30 hatten immer den Wert 01!

Ist aber auch egal, das reaktive Licht ist jetzt bereit und wird bald platziert!

Vielen Dank für deine Hilfe!!!
 
Hi,

prima, daß es jetzt geklappt hat :D

Nimm doch noch bitte in Deinem ersten Posting die Koordinaten wieder raus 8) , sonst kommen die Leute noch auf "dumme Gedanken" :)

Viele Grüße nach Bühne,

Thomas
 

DerWoersy

Geocacher
ich weis passt vieleicht nicht hier hin aber ich wollte den blinker etwas missbrauchen :)

es ist doch bestimmt möglich den atiny13 so zu programieren das er 3 schnelle helle blitze abgibt und dann ca 0,5 sec wartet und dann wieder 3 blitze abgibt. und dies dann als dauer blitzer.

kenne mich mit dem programmieren nicht so mit bascom aus.

schonmal danke im vorraus.
 
Hi Woersy,

klar, mißbrauch Du nur :D

Hier - Bitteschön:

Code:
$regfile = "ATtiny13.DAT"
$crystal = 16000                                            'Frequenz des internen Oszillators
$hwstack = 6                                                'hardwarestack herabsetzen damit genügend variablen zur verfügung stehen
Config Adc = Single , Prescaler = Auto
Config Portb = &B00001000                                   'Pinb.3 auf 'Ausgang', Rest auf 'Eingang' schalten
Portb = 0                                                   'Ausgänge auf Low setzen
Stop Ac                                                     'Analog-Komparator abschalten, um Strom zu sparen
Wdtcr = &B11010011                                          'Watchdog definieren: 0.125 Sekunden, Interrupt auslösen, kein Reset
Enable Interrupts                                           'Interrupts freigeben


Dim A As Byte                                               'Variablen definieren
Dim B As Byte


Stop Adc                                                    'A/D-Wandler zum Stromsparen wieder stoppen

Do                                                          'LED blinken lassen
For A = 1 To 3
Portb.3 = 1
Reset Watchdog
Powerdown
Portb.3 = 0
Reset Watchdog
Powerdown
Next A
For B = 1 To 6
Reset Watchdog
Powerdown
Next B


Loop

Gruß, Thomas
 

Kappler

Geowizard
... und wenn du jetzt noch in der Do-Schleife statt des waitms Befehls den Prozessor schlafen schickst, sparst du noch einiges an Strom:

Code:
Do                                                          'LED blinken lassen 

Wdtcr = &B11010011 ' 125 ms
For A = 0 To 3 
Portb.3 = 1 
Reset Watchdog 
Powerdown 
Portb.3 = 0 
Reset Watchdog 
Powerdown 
Next A 
Wdtcr = &B11010101 ' 500 ms
Reset Watchdog
Powerdown

Loop
 

DerWoersy

Geocacher
danke für die schnelle antw.

nur besteht die möglichkeit es noch schneller blinken zu lassen so etwa 2x so schnell ?
wenn ich den Reset Watchdog Powerdown direkt unter dem wie oft der blinken soll raus nehme habe ich die frequenz an blinken die ich haben will aber dann funzelt die led nur noch herum :(
 

stonewood

Geowizard
Woersy & Bianca schrieb:
nur besteht die möglichkeit es noch schneller blinken zu lassen so etwa 2x so schnell ?
Grundsätzlich ja. Also nehm ich mal das Programm etwas auseinander:
Code:
Wdtcr = &B11010011 ' 125 ms
setzt den Watchdog-Timer auf 1/8 Sekunde. Damit macht jede Sequenz aus
Code:
Reset Watchdog 
Powerdown
1/8 sekunde pause.

Konkret sieht Wdtcr so aus: WDTIF WDTIE WDP3 WDCE WDE WDP2 WDP1 WDP0 (Datenblatt Seite 39)

WDTIF=1, WDTIE=1, WDCE=1, WDE=0 sind fest, die Zeit wird durch WDP3..WDP0 festgelegt, also (Datenblatt Seite 40):
0101=500ms (daher kommt Wdtcr = &B11010101 ' 500 ms)
0011=125ms (daher kommt Wdtcr = &B11010011 ' 125 ms)
Und damit
0010=64ms, also Wdtcr = &B11010010 ' 64 ms

(ungetestet), aber statt der 125ms sollte der 64ms-Watchdog das ganze doppelt so schnell machen.

Von 16ms bis 8s ist fast alles möglich, wer's braucht kann das im Datenblatt nachlesen.

Das Reset watchdog - powerdown selbst ist quasi 'warte 125ms', wenn Du das komplett rausnimmst siehst Du eher nur noch ein Flimmern. Vielleicht blinkt das nur dadurch daß der Tiny das Programm ruckzuck abarbeitet, und das Blinken kommt nur noch vom Reset des Tiny ...

Ach ja, natürlich machen nun z.B. zwei 'Reset Watchdog -powerdown'-Sequenzen 2x64ms=128ms Wartezeit aus, Du kannst also damit recht einfach an den Zeiten spielen. Sieht zwar nicht schön aus, aber tut zuverlässig seinen Dienst. Ist halt die Frage was dabei rauskommen soll.
 

DerWoersy

Geocacher
also ich wollte mit diesem blitzer so in richtung stroboblitzer gehen der dann halt 3x hell aufblitzt 0,5sec pause usw.
nur im mom habe ich hier nur nen blinker der alle 0,5sec blinkt :(
 

stonewood

Geowizard
Ja, quasi das was ich geschrieben habe: Die eigentliche Blinksequenz macht ja nun keine Pause mehr, sondern wird alle 0,5s ziiiiemlich schnell abgespult.

Also brauchst Du sowas wie:
Code:
Do                                                          'LED blinken lassen 
Wdtcr = &B11010010   ' 64 ms einstellen
For A = 0 To 3       ' 3 mal blinken
Portb.3 = 1          ' LED ein
Reset Watchdog       ' 64ms warten
Powerdown 
Portb.3 = 0          ' LED aus
Reset Watchdog       ' 64ms warten
Powerdown       
Reset Watchdog       ' 64ms warten
Powerdown 
Next A 
Wdtcr = &B11010101   ' 500 ms einstellen
Reset Watchdog       ' 500ms warten
Powerdown

Loop

Dann ist die LED kürzer an(1/16s), aber gleich lang aus (2/16=1/8s).

Wie gesagt, da kannst Du nun dran spielen. Falls Du noch kürzere Intervalle willst wäre das dann z.b. mit
0001=32ms=1/32s möglich. Nur macht das menschliche Auge unter 1/25s nicht mehr wirklich viel mit und sieht dann vielleicht statt drei hellen Blinkzeichen quasi nur ein etwas dunkleres blinken.
 

DerWoersy

Geocacher
also mal denen von gestern danke für den code für den blitzer.
ich habe mal wie "stonewood" meinte mit den werten gespielt und mir den code so zeitlich gemacht wie ich das dachte.
kommt jetzt richtig gut mit der super hellen led ;-)

Code:
$regfile = "ATtiny13.DAT"
$crystal = 16000                                            'Frequenz des internen Oszillators
$hwstack = 6                                                'hardwarestack herabsetzen damit genügend variablen zur verfügung stehen
Config Adc = Single , Prescaler = Auto
Config Portb = &B00001000                                   'Pinb.3 auf 'Ausgang', Rest auf 'Eingang' schalten
Portb = 0                                                   'Ausgänge auf Low setzen
Stop Ac                                                     'Analog-Komparator abschalten, um Strom zu sparen
Wdtcr = &B11010001                                          'Watchdog definieren: 0.032 Sekunden, Interrupt auslösen, kein Reset
Enable Interrupts                                           'Interrupts freigeben


Dim A As Byte                                               'Variablen definieren
Dim B As Byte


Stop Adc                                                    'A/D-Wandler zum Stromsparen wieder stoppen

Do                                                          'LED blinken lassen
For A = 1 To 3
Portb.3 = 1
Reset Watchdog
Powerdown
Portb.3 = 0
Reset Watchdog
Powerdown
Next A
For B = 1 To 6
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Next B


Loop
 

conrad

Geocacher
Windi schrieb:
Code:
'============================================================
'
' ********************************************************
' ***                                                  ***
' ***    Tiny-Reaktivlicht mit LDR und A/D-Wandler     ***
' *** mit Watchdog-Energiesparmodus und Tagabschaltung ***
' *** Ausgabe von Morsesignalen beim Anleuchten        ***
' ***                                                  ***
' ***      erstellt von Windi für http://www.geoclub.de       ***
' ***                   04.01.2008                     ***
' ***                                                  ***
' ********************************************************
'
' µC: ATtiny13V
' +Ub: 3,00 V
' I: 17 µA im Leerlauf (Nachtbetrieb)
' I: 5 µA bei Tagabschaltung
' Reichweite: 650 m mit Maglite 5D
'
[/quote]

Eine Frage hab ich noch, ist es möglich in Deine "vereinfachte Morseschaltung" eine Pause einzubauen? Quasi um ein erneutes auslösen innerhalb 30 sek. zu verhindern? 
Danke im Vorraus
Conrad
 

Windi

Geoguru
conrad schrieb:
Eine Frage hab ich noch, ist es möglich in Deine "vereinfachte Morseschaltung" eine Pause einzubauen? Quasi um ein erneutes auslösen innerhalb 30 sek. zu verhindern?
Danke im Vorraus
Gar kein Problem:
Einfach direkt nach der Ausgabe der Morsezeichen den Watchdog-Timer auf 8 Sekunden einstellen und 4 mal aufrufen.
Ergibt dann halt ca. 32 Sekunden aber der interne Timer ist eh nicht so genau. Können daher auch ein paar Sekunden mehr oder weniger sein.

Code:
Wdtcr = &B11110001                                          'Watchdog auf 8 Sekunden stellen
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Wdtcr = &B11010011                                          'Watchdog wieder auf 0,125 Sekunden zurückstellen
 

doncorso

Geocacher
Männerz, also echt...
herrjeh ...
erstens: ihr seid ja total wahnsinnig! erstmal so eine Idee zu haben, die dann auch noch zu realisieren und dann neben einem so gigantischem Thread auch noch ein "Kochbuch" zur Verfügung zu stellen: KLASSE!
zweitens: ihr treibt mich ebenfalls in den Wahnsinn:
natürlich musste ich von euren Ausführungen begeistert sein und zwar von der ersten Seite an. Ich hab den kompletten Thread gelesen und es war schon länger klar: "reaktives Licht? wird gebaut!" nachdem ich ein bisschen Zeit gefunden hab und die ersten zehn Hürden schon überwunden hab, stehe ich jetzt völlig planlos da.

Mein Hilferuf an euch: "Was mache ich falsch?"
ich habe mein Steckbrett so bestückt, wie es im Kochbuch auf Seite 6 auf der Abbildung 2 gezeigt wird. (okay: den Kondensator hab ich nich da, drum fehlt der bei mir ...)

Mein C-Programm entspricht im Wesentlichen auch dem des Kochbuchs auf Seite 15:

Code:
#define F_CPU 8000000 // Quarzfrequenz 8MHz
#include </usr/avr/include/avr/io.h>
#include </usr/avr/include/util/delay.h>
unsigned char f, i;


unsigned char led_abfrage(unsigned char zeit) 
{
  PORTB &= ~(1<<PB3); // Portb.3 auf Masse schalten
  PORTB |= (1<<PB4); // Portb.4 auf +Ub schalten, um die LED zu 'laden'
  _delay_us(10); // Ladezeit 10 (1) __s, kann ggf. noch verkleinert werden
  DDRB &= ~(1<<PB4); // Portb.4 nun zwecks Abfrage der LED-Ladung auf 'Eingang' schalten
  PORTB &= ~(1<<PB4); // Pullup abschalten, sonst geht's nicht!
  _delay_ms(6);
  i = (PINB & (1<<PINB4)); // Ladezustand einlesen
  DDRB |= (1<<PB4); // Portb.4 wieder auf Ausgang schalten
  PORTB &= ~(1<<PB4); // Portb.4 auf Masse schalten
  return i;
}
int main(void) {
DDRB = 0b00011000; // Pinb.3 und .4 auf 'Ausgang', Rest auf 'Eingang' schalten
PORTB = 0b11100111; // Pullups zuschalten, ausser fuer Pinb.3 und .4
while (1) 
{
    if ( led_abfrage(6) == 0) 
    { // LED durch Licht entladen?
      for (f = 0; f < 3; f++) 
      { // fx blinken
        PORTB |= (1<<PB3); // PB3 auf Vcc schalten
        delay(32); // 32 ms Blitz
        PORTB &= ~(1<<PB3); // PB3 auf GND schalten
        for (i = 0; i < 10; i++) 
          delay(32); // ca. 320ms(10x32ms) Pause (workaround wegen 8MHz Quarz)
      }
    }
}
return 0;
}

kompilieren, draufspielen, geht alles, aber meine LED will nich blinken ...
also ganz korrekt ist "nicht blinken" nicht: wenn ich sie umdrehe, blinkt sie ganz narrisch sogar, aber das is ja nich der Sinn. Baue ich ein _delay_ms(100) in die while(1) -Schleife ein, blinkt sie dann auch ruhiger, also sehe ich bei falschrum eingebauter LED sozusagen das Geschehen in der Whileschleife.

Daraus ziehe ich den Schluss:
- Das Programm läuft
- Die Komponenten funktionieren
- Also liegt´s vllt. am Zusammenspiel?!

okay: hab ich ne "falsche" LED? ich hab diese hier: link zu reichelt
dazu verwende ich einen 220 Ohm-Widerstand.


okay...
Danke schonmal vorneweg und wie gesagt: RESPEKT für eure bisherigen Beiträge... wahnsinn!

wer möchte, findet hier ein paar Bilder vom Basteln:klick
DC


.
 

stonewood

Geowizard
doncorso schrieb:
natürlich musste ich von euren Ausführungen begeistert sein und zwar von der ersten Seite an. Ich hab den kompletten Thread gelesen und es war schon länger klar: "reaktives Licht? wird gebaut!" nachdem ich ein bisschen Zeit gefunden hab und die ersten zehn Hürden schon überwunden hab, stehe ich jetzt völlig planlos da.

Mein Hilferuf an euch: "Was mache ich falsch?"
ich habe mein Steckbrett so bestückt, wie es im Kochbuch auf Seite 6 auf der Abbildung 2 gezeigt wird. (okay: den Kondensator hab ich nich da, drum fehlt der bei mir ...)
[..]

kompilieren, draufspielen, geht alles, aber meine LED will nich blinken ...
also ganz korrekt ist "nicht blinken" nicht: wenn ich sie umdrehe, blinkt sie ganz narrisch sogar, aber das is ja nich der Sinn. Baue ich ein _delay_ms(100) in die while(1) -Schleife ein, blinkt sie dann auch ruhiger, also sehe ich bei falschrum eingebauter LED sozusagen das Geschehen in der Whileschleife.

Daraus ziehe ich den Schluss:
- Das Programm läuft
- Die Komponenten funktionieren
- Also liegt´s vllt. am Zusammenspiel?!

okay: hab ich ne "falsche" LED? ich hab diese hier: link zu reichelt
dazu verwende ich einen 220 Ohm-Widerstand.
Also noch mal zur Zusammenfassung: Du willst die nur-LED variante basteln, richtig?

Mit der C-Variante kann ich nicht viel anfangen - ist das 1:1 das Listing aus dem Kochbuch? Oder hast Du was verändert?

Daß die LED in anderer Richtung blinkt ist normal. Das ist die 'Aufladung' der LED, die dann durch Licht wieder entladen wird. Der LED-Typ sieht gut aus - mit klaren roten LEDs sollte das tun. Der Widerstand kann auch erheblich kleiner sein, die 56 Ohm der LDR-Variante sollten auch mit der nur-LED funktionieren. Wieviel Spannung hast Du an deinem Tiny? 5V, oder schon 3V aus zwei Batterien? Ach ja, der Abblockkondensator ist eh nicht wirklich nötig, der ist vielleicht nützlich wenn die Batterien fast leer sind.

Problem ist nur bei dieser Variante: Die ist extrem feuchteempfindlich. Taugt also nicht so richtig für den Wald. Versuch doch gleich die LDR-Variante, das sind zwar ein wenig mehr Bauteile, aber a) funktioniert das dann auch noch quasi 'unter Wasser', und b) kann man da einfach mit dem Multimeter nachmessen wie hell die Nacht für den Tiny jetzt eigentlich ist.

Ansonsten versuch mal den _delay_ms(6) zu ändern. Kann sein daß Deine LED schneller oder langsamer entlädt als im Beispiel.
 

doncorso

Geocacher
okay:
also das C-Programm is fast unverändert aus dem Kochbuch übernommen.

Als Spannungsquelle verwende ich den Parallelport meines Rechners, das is ganz praktisch, weil ich den auch zum Programmieren verwende und dann nix umsteckern muss.

an _delay_ms() hab ich auch schon ein bisschen geschraubt, leider ohne Erfolg.

Ich werd dann mal die LDR-Variante versuchen - wenn die eh praxistauglicher ist, is ja umso besser, trotzdem hätte ich auch gerne die NU-LED-Variante aus Prinzip gerne hinbekommen.

Danke stonewood für die schnelle Antwort!

LG

DC

.
 

stonewood

Geowizard
doncorso schrieb:
okay:
also das C-Programm is fast unverändert aus dem Kochbuch übernommen.

Als Spannungsquelle verwende ich den Parallelport meines Rechners, das is ganz praktisch, weil ich den auch zum Programmieren verwende und dann nix umsteckern muss.

an _delay_ms() hab ich auch schon ein bisschen geschraubt, leider ohne Erfolg.

Ich werd dann mal die LDR-Variante versuchen - wenn die eh praxistauglicher ist, is ja umso besser, trotzdem hätte ich auch gerne die NU-LED-Variante aus Prinzip gerne hinbekommen.
Hmm. Den Parallelport als Spannungsquelle zu verwenden ist nicht empfehlenswert. Der kann pro Pin nicht mehr als ca. 10mA liefern, und wenn Deine LED dann mehr als das zieht könnte die Spannung unter 1,8V fallen - und der Tiny macht einen Reset, und damit die LED gleich wieder aus. Ach ja, Du hast doch einen Attiny13V? Falls das nur ein Attiny13 ist (also ohne das 'V') kann der nur bis 4,5V arbeiten, darunter schaltet der ab.

Zur Not tut es als Spannungsversorgung ein halbes USB-Kabel, da kommen stabil 5V raus. Nur ist das dann natürlich nicht Kurzschlußfest, aber das ist es ja beim Parallelport eh schon nicht.
 
Oben