| 
  • If you are citizen of an European Union member nation, you may not use this service unless you are at least 16 years old.

  • You already know Dokkio is an AI-powered assistant to organize & manage your digital files & messages. Very soon, Dokkio will support Outlook as well as One Drive. Check it out today!

View
 

Reaktivlicht mit Teachin der Blinksequenz - LEDonly Version mit AD-Wandlung - für ATtiny13V

Page history last edited by schnasemann 14 years, 2 months ago

LED Anode an Pin3, LED Kathode an Pin 4 (GND). Batterie + an Pin 8, Batterie - an Pin 4.

Brückmöglichkeit (zum Einlernen) zwischen Pin 5 und 6 (gute Kontaktiermöglichkeit kann man bei einer einfachen Feder-IC-Fassung durch Hochbiegen der Fassungsbeinchen erreichen - mit Schraubenzieher einfach brückbar).

Ganz unten ist die hier angezeigte Datei noch einmal zum Download und Einstellungen der Fuses.

Um den unten angezeigten Quellcode in den attiny13v rein zu bekommen, muss Optimize als Option beim Compiler eingeschaltet sein. Ansonsten wird Bascom beim kompilieren '101% flash used' und Fehler wie '...Program will overwrite bootloader ...' und '... Code does not fit into target chip...' anzeigen. Das Programm unten kompiliert (mit optimierung) auf '99% flash used', es ist also nicht viel Speicher über. Einschalten läßt sich die Optimierung unter 'Options -> Compiler -> Output -> [x] Optimize code -> Ok'.

Außerdem muß das generierte '.eep'-File ins EEPROM des Tiny geschrieben werden.

' Version 1.11 28.02.2010

' (c) geoclub & schnasemann

' Teachin Möglichkeit bei Tag und Brücken der Pins 5 und 6.

' Während Blinken Brücke entfernen, nach Blinkende mit Brücken von Pin 5 & 6 Muster einlernen

' Löschen und Umschalten auf Standardblinken durch Brücken der Pins über das Blinkende hinaus

' changelog

' 31.10.09 Rundenblinker in die Dunkelphasenerkennung verschoben

' 03.11.09 Rundenzähler aus, Hub auf 14 gesetzt

' 07.11.09 Version 1.10. automatisches Erkennen des Programmierendes

' 28.02.10 Version 1.11, Bugfix Ausgabezähler Schieben

$regfile = "ATtiny13.DAT"

$crystal = 128000                                           'Reale Frequenz des internen 128kHz-Oszillators

$hwstack = 10                                               'default use 32 for the hardware stack

$swstack = 20                                               'default use 10 for the SW stack

$framesize = 20                                             'default use 40 for the frame

$eeprom                                                     'the following DATA lines data will go to the EEP file

Data &B00000000

Data &B01010101

$data

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 Wert1 As Word

Dim Wert2 As Word

Dim Schwelle As Word

Dim Anzahl As Byte

Dim Runde As Byte

Dim Merker As Byte

Dim Eepromz As Byte

Dim Zaehler As Byte

Dim Teachin As Bit

Dim Entprell As Byte

Dim Result As Byte

Const Dunkelwert = 18                                       ' Wert, ab dem Nacht erkannt wird

Const Hub = 14                                              ' Hub, der eine Taschenlampe erkennt

Runde = 0

Portb.1 = 0                                                 'Masse für portb.0

Do

Gosub Warte250ms

Gosub Einlesen

Schwelle = Wert1 + Hub                                      'Schwelle heller als Signal festlegen, je kleiner desto empfindlicher

If Wert1 < Dunkelwert And Wert2 >= Schwelle Then            'Dunkelschwelle festlegen, je kleiner desto dunkler

   Gosub Blinken

End If

If Wert1 >= Dunkelwert And Wert2 >= Dunkelwert Then         'bei Tag oder Dauerlicht

   Teachin = Pinb.0

   If Teachin = 0 Then                                      ' Teachin beginnt

      Gosub Blitz

      Teachin = Pinb.0                                      ' nicht mehr gedrückt, dann einlernen

      If Teachin = 1 Then

         Config Portb.4 = Output

         Portb.4 = 0

         Runde = 0

         For Eepromz = 1 To 62

            Merker = 0

            For Zaehler = 1 To 8                            'bitzähler

               Result = 0

               Rotate Merker , Left

               For Entprell = 1 To 5

                  If Entprell > 1 Then

                     Gosub Warte16ms

                  End If

                  Teachin = Pinb.0

                  If Teachin = 0 Then

                     Result = Result + 1

                     Portb.4 = 1

                  Else

                     Portb.4 = 0

                  End If

               Next Entprell

               If Result > 2 Then

                  Merker = Merker + 1

                  Runde = Eepromz                           ' Merken, wann als Letztes eine "1" getastet wurde

               End If

            Next Zaehler

            Writeeeprom Merker , Eepromz

         Next Eepromz

         If Runde < 62 Then

            Incr Runde

            Merker = &B01010101                             ' Zum Schluss magic byte an das Ende schreiben

            Writeeeprom Merker , Runde

         End If

         Gosub Blitz

      Else                                                  ' Teachin immer noch gedrückt

         Merker = &B01010101                                ' Magic byte schreiben, damit Programmierung löschen

         Writeeeprom Merker , 1

         Gosub Warte250ms

         Gosub Warte250ms

         Gosub Warte250ms

         Gosub Warte250ms

         Gosub Blitz

         Gosub Blitz

         Gosub Warte8s

      End If

   Gosub Blinken

   Else

    Runde = Runde + 1

    Gosub Warte8s

   End If

'(

   If Runde >= 4 Then                                       ' alle gute 1/2 Minute einmal blitzen am Tag

      Config Portb.4 = Output

      Portb.4 = 1

      Gosub Warte16ms

      Portb.4 = 0

      Runde = 0

   End If

')

End If

Wert1 = Wert2                                               'Wert2 nach Wert1 verschieben

Loop

Blitz:                                                      'LED getaktet blinken lassen

Config Portb.4 = Output

Portb.4 = 0

For Anzahl = 1 To 10

   Portb.4 = 1

   Gosub Warte16ms

   Portb.4 = 0

   Gosub Warte250ms

Next Anzahl

Return

Einlesen:

Start Adc

Config Portb.4 = Output                                     'LED "entladen"

Portb.4 = 0

Gosub Warte16ms

Config Portb.4 = Input

Portb.4 = 0

cbi adcsra,7                                                'ADEN = 0

Gosub Warte16ms

sbi adcsra,7                                                'ADEN = 1

Wert2 = Getadc(2)                                           'Spannung der LED messen

Stop Adc

Return

Blinken:

Config Portb.4 = Output

Portb.4 = 0

For Eepromz = 1 To 62

   Readeeprom Merker , Eepromz                              'Byte lesen aus Eeprom

   If Merker = &B01010101 Then

      If Eepromz = 1 Then

         Gosub Blitz

      End If

      Exit For

   End If

   For Zaehler = 1 To 8                                     ' ansonsten bitweise schieben

      If Merker > 127 Then                                  ' und blinken

         Portb.4 = 1

         Gosub Warte64ms

         Portb.4 = 0

      Else

         Gosub Warte64ms                                    ' oder Pause

         nop

         nop

         nop

         nop

      End If

   Rotate Merker , Left

  Next Zaehler

Next Eepromz

Return

Warte8s:

Wdtcr = &B11110001                                          'Watchdog auf 8s einstellen

Reset Watchdog

Powerdown

Return

Warte16ms:

Wdtcr = &B11010000                                          'Watchdog auf 16ms einstellen

Reset Watchdog

Powerdown

Return

Warte64ms:

Wdtcr = &B11010010                                          'Watchdog auf 64ms einstellen

Reset Watchdog

Powerdown

Return

Warte250ms:

Wdtcr = &B11010100                                          'Watchdog auf 250ms einstellen

Reset Watchdog

Powerdown

Return

End

 

 

 

Und weil manche Probleme damit haben, das mit Drag & Drop zu kompilieren, hier das ganze noch einmal als Datei: reaktivlicht_wdt_teachin_autoend.bas

Und hier das Gleiche als Hex-File und EEPROM-File zum direkten Flashen. An Fuses muss interner 128kHz Oszillator, kein WDT eingestellt sein: reaktivlicht_wdt_teachin_autoend.hex reaktivlicht_wdt_teachin_autoend.eep

 

Fuese müssen wie folgt eingestellt sein:

 

Weiteres zu den Fuses auch unter Atmel Mikrocontroller

Comments (1)

schnasemann said

at 11:10 am on Feb 28, 2010

Heute den Code nochmal von einem kleinen Bug befreit (Ausgabezähler war nur auf 7 statt auf 8)

You don't have permission to comment on this page.