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

LED Only mit 4,5 V ?!

Hucky3000

Geocacher
Tach !

Es muss mal wieder schnell gehen :(
Bin gerade am basteln (muss fertig werden). Habe gemerkt, dass die Only Version (nur eine LED an PB4 - sonst nichts) mit 4,5 V nicht funzt. Damit es überhaupt geht habe ich erstmal zwei Dioden vor UB gelegt.
Da ich aber nen Servo ansteuern möchte und keine zwei Spannungsquellen benutzen möchte würde ich gerne wissen WAS ich genau in dem Code ändern muss.
Die Only Variante ist mit 3V angegeben. Als LED benutz ich ne 7000er, würde aber gerne auf eine 4000er zurückgreifen, weil ich davon noch genug habe.
Ich habe zum probieren erstmal das PRG von "meinem" SOS-Blinker benutzt:

Code:
'===============================================================================

'*************************************
'***                               ***
'***           LED only            ***
'***          SOS-Morsen           ***
'***           02.12.09            ***
'***                               ***
'*************************************


'===============================================================================


$regfile = "ATtiny13.DAT"
$crystal = 128000                                           'Reale Frequenz des internen 128kHz-Oszillators
$hwstack = 10                                               ' default use 32 for the hardware stack
$swstack = 10                                               'default use 10 for the SW stack
$framesize = 10                                             'default use 40 for the frame

Stop Ac

Config Portb = &B11101111                                   'Portb.4 auf 'Eingang' schalten
Portb = &B00000000

                                                           'keine Pullups zuschalten

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

Config Adc = Single , Prescaler = Auto , Reference = Internal       'referenzspannung Des Adc Auf "Internal" = 1,1 V

Dim A As Byte
Dim Wert1 As Word
Dim Wert2 As Word
Dim Schwelle As Word
Dim Morse$ As String * 10                                   '10 Takte, die gemorst werden sollen
Dim S$ As String * 1                                        'Merken zum Morsen (aktueller Takt)

Wert1 = 1023                                                'Wert 1 vor der ersten Messung definieren

Do

Wdtcr = &B11010100                                          'Watchdog auf 250ms einstellen
Reset Watchdog
Powerdown

Start Adc

Config Portb.4 = Output                                     'LED "entladen"
Portb.4 = 0

Waitus 1500

Config Portb.4 = Input
Portb.4 = 0

cbi adcsra,7                                                'ADEN = 0

Wdtcr = &B11010000                                          'Watchdog auf 16ms einstellen
Reset Watchdog
Powerdown

sbi adcsra,7                                                'ADEN = 1

Wert2 = Getadc(2)                                           'Spannung der LED messen

Stop Adc

Schwelle = Wert1 + 10                                       'Schwelle (10 heller als Signal)festlegen, je kleiner so empfindlicher

If Wert1 < 30 And Wert2 > Schwelle Then                     'Dunkelschwelle (30) festlegen, je kleiner umso dunkler
Gosub Morsen
End If

If Wert1 > 29 And Wert2 > 29 Then                           'bei Tag oder Dauerlicht Watchdog x n aktivieren

Wdtcr = &B11110001                                          'Watchdog auf 8s einstellen
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown

End If

Wert1 = Wert2                                               'Wert2 nach Wert1 verschieben

Loop

Morsen:

Config Portb.4 = Output
Portb.4 = 0

    Morse$ = "***---***"                                    'String aus 10 Zeichen * = kurz - = lang
    For A = 1 To 9                                          '10 Zeichen auslesen und auswerten
    S$ = Mid(morse$ , A , 1)                                'Teilstring auslesen
      If S$ = "*" Then                                      'wenn kurz blinken
        Portb.4 = 1                                         ' LED an
        Waitms 120                                          ' kurz warten
        Portb.4 = 0                                         ' LED aus
        Waitms 300                                          'lang warten
      Else                                                  'sonst lang blinken
        Portb.4 = 1                                         ' LED AN
        Waitms 550                                          'lange warten
        Portb.4 = 0                                         'LED Aus
        Waitms 300                                          'lang warten
      End If
    Next A
  Return
End

Hucky
 

thomas_st

Geowizard
Hucky3000 schrieb:
Habe gemerkt, dass die Only Version (nur eine LED an PB4 - sonst nichts) mit 4,5 V nicht funzt. Damit es überhaupt geht habe ich erstmal zwei Dioden vor UB gelegt.
Im Zusammenhang mit dem zweiten Teil hier muß ich da erstmal ein Aua loswerden. Die LED und auch der Tiny werden hier mehr als nur auf Messers Schneide gefahren - wenn schon keine Konstantstromquelle (geht hier nicht) dann doch bitte einen Widerstand vor die LED.

Hucky3000 schrieb:
Code:
Config Adc = Single , Prescaler = Auto , Reference = Internal       'referenzspannung Des Adc Auf "Internal" = 1,1 V
Hier würde ich das Problem sehen, denn das ist die einzigste feste Spannung im Programm.

HTH,
Thomas(_st)
 

stonewood

Geowizard
thomas_st schrieb:
Hucky3000 schrieb:
Code:
Config Adc = Single , Prescaler = Auto , Reference = Internal       'referenzspannung Des Adc Auf "Internal" = 1,1 V
Hier würde ich das Problem sehen, denn das ist die einzigste feste Spannung im Programm.
Die Stelle sollte aber problemlos sein: Ob da nun 3 oder 4,5V am Tiny hängen ist der LED zumindest in dem Zustand egal, und als 'Solarzelle' wird die erzeugte Spannung auch die gleiche sein.

Ich vermute daß die LED durch die erste Auslösung überlastet wurde und seitdem 'blind' ist. Also: Vorwiderstand verwenden!
 

thomas_st

Geowizard
stonewood schrieb:
thomas_st schrieb:
Hucky3000 schrieb:
Code:
Config Adc = Single , Prescaler = Auto , Reference = Internal       'referenzspannung Des Adc Auf "Internal" = 1,1 V
Hier würde ich das Problem sehen, denn das ist die einzigste feste Spannung im Programm.
Die Stelle sollte aber problemlos sein: Ob da nun 3 oder 4,5V am Tiny hängen ist der LED zumindest in dem Zustand egal, und als 'Solarzelle' wird die erzeugte Spannung auch die gleiche sein.
Stimmt schon, aber ...

stonewood schrieb:
Ich vermute daß die LED durch die erste Auslösung überlastet wurde und seitdem 'blind' ist. Also: Vorwiderstand verwenden!
Normalerweise brennt ja eine LED nicht wie eine Lampe durch, sondern wird "nur" dunkler bis hin zum glimmen - wie sich das natürlich auf die Funktion als Lichtsensor auswirkt ...

Dann stellt sich auch noch die Frage: normalerweise schafft der IO-Port des TInys ja nur eine begrenzten Stromfluss, der jetzt nicht so groß ist, dass ich eine sofortige Schädigung der LED vermuten würde

Viele Grüße,
Thomas(_st) - Hucky3000 - kannst Du mit einem hochohmigen Multimeter mal die Spannung an der LED beim Beleuchten messen
 
OP
Hucky3000

Hucky3000

Geocacher
Habs soweit hinbekommen.
Lediglich noch ein kleiner Schönheitsfehler.
UB= 4,5V
Über 2 Stk 1N4148 an den Tiny13
Der Puls für den Servo funzt auch mit der reduzierten Spannung :)
Irgendwo habe ich von Schnasemann ein PRG zwecks PWM gefunden. Ging ganz gut - flackerte aber.
Habe jetzt den Tiny mit 600KHz laufen. Klappt sehr gut :)
So. Jetzt möchte ich den Servo nicht nur tätigen durch anstrahlen der LED, sondern auch mit einem Taster.
Dieser hängt an PB1 und löst einen Interrupt aus wenn er betätigt wird. Mit dem Interrupt springe ich in die Routine, was eigentlich die LED auslösen sollte.
Das Problem ist, das ganze funzt nur einmal. Danach wird der Taster nicht mehr erkannt.
Lege ich über einen Kondensator zusäzlich Masse auf den Reset- Eingang indem ich den Taster drücke funzt es wieder. Leider reagiert die LED dann nichr mehr aus anleuchten. geht erst wieder wenn ichjurz die Batterien abklemme.
Hängt irgendwie mit de´m Watchdog und Powerdown zusammen, aber soviel versteh ich von der Materie noch nicht.

Vielleicht hat mal einer auf die Stelle nen Tipp :)

Code:
$regfile = "ATtiny13.DAT"
$crystal = 600000                                           'Reale Frequenz des internen 4,8mHz-Oszillators / 8
$hwstack = 10                                               ' default use 32 for the hardware stack
$swstack = 10                                               'default use 10 for the SW stack
$framesize = 10                                             'default use 40 for the frame

Stop Ac

Config Portb = &B11101101                                   'Portb.4 auf 'Eingang' schalten
Portb = &B00000010                                          'keine Pullups zuschalten

On Int0 Irq



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

Config Adc = Single , Prescaler = Auto , Reference = Internal       'referenzspannung Des Adc Auf "Internal" = 1,1 V

Dim A As Byte
Dim I As Byte
Dim Wert1 As Word
Dim Wert2 As Word
Dim Schwelle As Word
Dim Anzahl As Byte
Dim Soft1 As Byte
Dim Soft2 As Byte
Dim Aktuell As Byte
Dim Zwisum As Byte
Dim Soft3 As Word

Wert1 = 1023                                                'Wert 1 vor der ersten Messung definieren

Do


Wdtcr = &B11010100                                          'Watchdog auf 250ms einstellen
Reset Watchdog
Powerdown

Start Adc

Config Portb.4 = Output                                     'LED "entladen"
Portb.4 = 0

Waitus 1500

Config Portb.4 = Input
Portb.4 = 0

cbi adcsra,7                                                'ADEN = 0

Wdtcr = &B11010000                                          'Watchdog auf 16ms einstellen
Reset Watchdog
Powerdown

sbi adcsra,7                                                'ADEN = 1

Wert2 = Getadc(2)                                           'Spannung der LED messen

Stop Adc

Schwelle = Wert1 + 10                                       'Schwelle (10 heller als Signal)festlegen, je kleiner so empfindlicher


If Wert1 < 30 And Wert2 > Schwelle Then                     'Dunkelschwelle (30) festlegen, je kleiner umso dunkler
Gosub Blitz
End If

If Wert1 > 29 And Wert2 > 29 Then                           'bei Tag oder Dauerlicht Watchdog x n aktivieren

Wdtcr = &B11110001                                          'Watchdog auf 2s einstellen
Reset Watchdog
Powerdown


End If

Wert1 = Wert2                                               'Wert2 nach Wert1 verschieben

Loop

Blitz:
Config Portb.4 = Output
Portb.4 = 0
For Anzahl = 1 To 1
   For Soft1 = 0 To 31
      Aktuell = Lookup(soft1 , Fade)
      For Soft2 = 0 To 150
         If Soft2 < Aktuell Then
            Portb.4 = 1
            Portb.0 = 1
         Else
            Portb.4 = 0
            Portb.0 = 0
         End If
      Next Soft2
      Waitms 10
   Next Soft1

     Gosub Klapper

   For Soft1 = 0 To 31
      Zwisum = 31 - Soft1
      Aktuell = Lookup(zwisum , Fade)
      For Soft2 = 0 To 150
         If Soft2 < Aktuell Then
            Portb.4 = 1
            Portb.0 = 1
         Else
            Portb.4 = 0
            Portb.0 = 0
         End If
      Next Soft2
      Waitms 10
   Next Soft1
   Portb.4 = 0
   Wdtcr = &B11010100                                       'Watchdog auf 250ms einstellen
   Reset Watchdog
   Powerdown
   Reset Watchdog
   Powerdown
Next Anzahl
Return


End


Klapper:

For A = 1 To 4
  For I = 1 To 22                                           'Servo links
    Portb.3 = 1
    Waitus 1100
    Portb.3 = 0
    Waitms 19
  Next I

  For I = 1 To 22                                           'Servo rechts
    Portb.3 = 1
    Waitus 1900
    Portb.3 = 0
    Waitms 19
  Next I
Next A
Return

Irq:
Gosub Blitz
Return

Fade:
Data 0 , 1 , 2 , 2 , 2 , 3 , 3 , 4 , 5 , 6 , 7 , 8 , 10 , 11 , 13 , 16 , 19 , 23 , 27 , 32 , 38 , 45 , 54 , 64 , 76 , 91 , 108 , 128 , 152 , 181 , 215 , 255

Hucky
 

thomas_st

Geowizard
Hucky3000 schrieb:
Habs soweit hinbekommen.
Lediglich noch ein kleiner Schönheitsfehler.
UB= 4,5V
Über 2 Stk 1N4148 an den Tiny13
Schön. Freut mich dass es funktioniert, wenn auch das Problem damit nicht gelöst sondern nur umgangen ist.

Hucky3000 schrieb:
Der Puls für den Servo funzt auch mit der reduzierten Spannung :)
Irgendwo habe ich von Schnasemann ein PRG zwecks PWM gefunden. Ging ganz gut - flackerte aber.
Was flackert? Die am PWM angeschlossene LED - mal überprüfen, was Schnasemann da für einen Takt am Tiny nutzte! Die PWM teilt den Prozessortakt ja nur runter und da könnte es sein, dass Deine 600kHz zu wenig sind.

BTW: Muss der Servo nicht sowieso über eine PWM angesteuert werden?

Hucky3000 schrieb:
So. Jetzt möchte ich den Servo nicht nur tätigen durch anstrahlen der LED, sondern auch mit einem Taster.
Dieser hängt an PB1 und löst einen Interrupt aus wenn er betätigt wird. Mit dem Interrupt springe ich in die Routine, was eigentlich die LED auslösen sollte.
Das Problem ist, das ganze funzt nur einmal. Danach wird der Taster nicht mehr erkannt.
Lege ich über einen Kondensator zusäzlich Masse auf den Reset- Eingang indem ich den Taster drücke funzt es wieder.
Ich vermute der Taster schaltet gegen Vcc, dann baue mal einen Pi*Daumen 100k Widerstand zwischen PB1 und Masse ein - irgend wie muss die Spannung ja auch wieder abfließe und so ein Pin am Tiny ist recht hochohmig.

Beachte auch, dass der Taster prellen wird - zum Auslösen wird es funktionieren, aber wenn Du irgend etwas zählen möchtest, wäre ein Zeitglied sinnvoll.

Viele Grüße,
Thomas(_st)
 

huzzel

Geowizard
Hucky3000 schrieb:
stonewood schrieb:
Ich vermute daß die LED durch die erste Auslösung überlastet wurde und seitdem 'blind' ist. Also: Vorwiderstand verwenden!
Normalerweise brennt ja eine LED nicht wie eine Lampe durch, sondern wird "nur" dunkler bis hin zum glimmen - wie sich das natürlich auf die Funktion als Lichtsensor auswirkt ...
Nicht gut.
Bei meinen Tests hatte ich ursprünglich die LEDS als Anpeilhilfe benutzt. Habs aber bald wieder gelassen, da sie, wenn sie selbst geblinkt hatten, danach noch eine gewisse Zeit selber einen hohen Ausschlag als Sensor erzeugten.
 
OP
Hucky3000

Hucky3000

Geocacher
Tach !

Bei dem Programm von Schnasemann handelt es sich um eine "gebastelte" PWM

Hier der Link: http://www.geoclub.de/viewtopic.php?f=57&t=5753&start=1380

Läuft mit 128KHz.

Mir mir flackerts etwas. Im dunkeln bei einem Abstand von 2-3 Metern merkt man das aber nicht.
Mit 600KHz ist das flackern weg. Musste noch ne kleine Verzögerung einbauen, weil sonst die Daten zu schnell gelesen wurden.

Das mit dem IRQ habe ich noch nicht so recht geblickt. Habe AUCH was gelesen, dass Vcc an dem Pin anstehen muss um den auszulösen.
Es passierte aber nichts :(
So. Dann habe ich den IRQ Port auf Eingang gesetzt und zum auslösen mit nem Taster Masse drauf gelegt,
funktioniert.
Komischerweise nur einmal.
Oder muss der IRQ danach etwa wieder aktiviert werden ?!
Ich glaube bald... Ist mir gerade so eingefallen. Gestern wars halt wieder spät.
Also am Ende der Schleife, bevor Return kommt ein ENABLE INT0 setzen ?
Das wirds wohl gewesen sein. Schade - habe die Schaltung bei der Arbeit liegen.
Morgen mal testen...
Da kann ich mir den Quatsch mit dem Reset ja sparen.
Schade nur, dass der Speicher komplett voll ist. Mal sehen was der ENABLE INT0 Befehl so an Speicher frisst......

Das Auslösen funzt übrigens auch mit einer 4000 ccd LED bestens.

Ich habe jetzt doch auf Vorwiderstände verzichtet. Funktioniert so weit alles prima :)

Ach ja, der Servo kommt AUCH mit einer "gebastelten" PWM aus. Klappt gut so. Ich muss das Teil ja nicht EXAKT setzen. Zwei Anschläge reichen. Es soll nur ein Faden gezogen werden...

Hucky
 

thomas_st

Geowizard
Hucky3000 schrieb:
Bei dem Programm von Schnasemann handelt es sich um eine "gebastelte" PWM

Hier der Link: http://www.geoclub.de/viewtopic.php?f=57&t=5753&start=1380
Wie schnell die PWM läuft kann ich jetzt nicht ausmachen (hängt davon ab, wie schnell die
Code:
For Soft2 = 0 To 150
[...]
Next Soft2
-Schleife

abgearbeitet wird. Aber setzen wir mal nicht unrealistische 10 Takte voraus, kommt bei einer Schleife bis 150 insgesamt 1510 Takte pro Zyklus und bei 128kHz eine PWM-Frequenz von 85 Hz - sollte eigentlich nur noch beim genauen Hinsehen flackern.

Hucky3000 schrieb:
Das mit dem IRQ habe ich noch nicht so recht geblickt. Habe AUCH was gelesen, dass Vcc an dem Pin anstehen muss um den auszulösen.
Meine Überlegung gingen von etwas anderem aus: Taster, Leitungen, ... bilden einen Kondensator zu den Versorgungsleitungen. Wenn Du nun den Taster schließt, wird neben dem Auslösen des IRQs auch dieser Kondensator geladen - Wirkung, der Pin des Tiny bleibt erstmal auf dem Schaltpotential (bei INT0 auf GND). Wenn Du nun den Taster erneut auslöst, passiert nichts, da das Ganze noch auf GND liegt. Ein Widerstand (in diesem Fall gegen Vcc) entlädt den Taster und das Ganze funktioniert. Nicht lachen oder denken, das wäre weit hergeholt - ist mir so schon passiert.

Hucky3000 schrieb:
Oder muss der IRQ danach etwa wieder aktiviert werden ?!
Nöp. esseidenn, Bascom kocht hier ein eigenes Süppchen. Was aber passiert: während des Abarbeitens der ISR wird vom Tiny die Interrupts global gesperrt (das Interruptflag wird gelöscht). Dass passiert von selbst, ohne dass das per Software realisiert werden muss. Allerdings wird beim Rücksprung aus der ISR dieses Flag wieder gesetzt (auch ohne SW-Unterstützung). Damit wird verhindert, das die ISR durch einen weiteren Interrupt erneut unterbrochen wird, was oft (nicht immer) zu einem Abschmieren des Tinys führt.

Hucky3000 schrieb:
Schade nur, dass der Speicher komplett voll ist. Mal sehen was der ENABLE INT0 Befehl so an Speicher frisst......

Nicht viel (C-Code):
Code:
MCUCR &= ~ISC01 & ~ISC00; // INT0 low active
GIMSK|= INT0; // INT0 enable
sei(); // IRQ global enable

Hucky3000 schrieb:
Ich habe jetzt doch auf Vorwiderstände verzichtet. Funktioniert so weit alles prima :)
*Grummel* Da sparst Du aber eindeutig am falschen Ende. Soviel kostet ein Widerstand nun auch nicht (ok,ok, die Bauteilanzahl erhöht sich für ein einfaches RL dadurch gleich mal um 50%).

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

Hucky3000

Geocacher
Meine Überlegung gingen von etwas anderem aus: Taster, Leitungen, ... bilden einen Kondensator zu den Versorgungsleitungen. Wenn Du nun den Taster schließt, wird neben dem Auslösen des IRQs auch dieser Kondensator geladen - Wirkung, der Pin des Tiny bleibt erstmal auf dem Schaltpotential (bei INT0 auf GND). Wenn Du nun den Taster erneut auslöst, passiert nichts, da das Ganze noch auf GND liegt. Ein Widerstand (in diesem Fall gegen Vcc) entlädt den Taster und das Ganze funktioniert. Nicht lachen oder denken, das wäre weit hergeholt - ist mir so schon passiert.

Aber in dem Ding ist doch nen Pull-Up Widerstand drin ? Den habe ich doch auch eingeschaltet ?
Ich probiers mal aus.

Nicht viel (C-Code):
:shocked:

Im Moment greif ich nur auf Bascom zurück. Assembler ruht, C wollte ich eigentlich nie was mit zu tun haben...

Mit dem Vowiderstand funtionierte das mit dem auslösen nicht mehr. Weiß nicht warum.

Hucky
 

thomas_st

Geowizard
Hucky3000 schrieb:
Ein Widerstand (in diesem Fall gegen Vcc) entlädt den Taster und das Ganze funktioniert.

Aber in dem Ding ist doch nen Pull-Up Widerstand drin ? Den habe ich doch auch eingeschaltet ?
Ok. Dann vergiss meinen Einwand - der Pull-Up Widerstand reicht (das ist ja auch seine Aufgabe ...)

Hucky3000 schrieb:
Nicht viel (C-Code):
:shocked:
Na ja, so schlimm ist es doch auch nicht (die Bezeichner findet man übrigens so 1:1 im Datenblatt ;) Übrigens übersetzt der Compiler diesen Code zu
Code:
MCUCR &= ~ISC01 & ~ISC00; // INT0 low active
    19f6:	85 b7   in   r24, 0x35	; 53
    19f8:	8e 7f   andi r24, 0xFE	; 254
    19fa:	85 bf   out  0x35, r24	; 53
GIMSK|= INT0; // INT0 enable
    19fc:	8b b7   in   r24, 0x3b	; 59
    19fe:	86 60   ori  r24, 0x06	; 6
    1a00:	8b bf   out  0x3b, r24	; 59
sei(); // IRQ global enable	
    1a02:   78 94   sei
So das dieses Schnipsel 14 Bytes Programmspeicher benötigt.

Hucky3000 schrieb:
Im Moment greif ich nur auf Bascom zurück. Assembler ruht, C wollte ich eigentlich nie was mit zu tun haben...
Das ist ja das Gute, man hat eine Vielzahl an Möglichkeiten - da ist für jeden was dabei, für Dich halt Basic für mich halt C. :)

Hucky3000 schrieb:
Mit dem Vowiderstand funtionierte das mit dem auslösen nicht mehr. Weiß nicht warum.
Das ist merkwürdig. Falls Du jetzt nicht ein x Megaohm Vorwiderstand genutzt hast, sollte dessen Wert im Sensorbetrieb nicht ins Gewischt fallen.

Ähm, so was wie Pull-Up Widerstände sind am LED-Pin hoffentlich aus?

Viele Grüße,
Thomas(_st)
 
Oben