-
        

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 21

Thema: Attiny13 Bewegungsmeldersignal auswerten

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.12.2005
    Ort
    NRW
    Alter
    41
    Beiträge
    142

    Attiny13 Bewegungsmeldersignal auswerten

    Anzeige

    Hi,
    ich habe in meinem Flur einen selbstgebauten LED Spiegel mit Bewegungsmelder. War sündhaft teuer.
    Mein Problem ist, seit dem ich meinen Wlan Router und mein Telefon im Flur habe, schaltet sich der Spiegel schonmal öfters kurz ein.

    Die Zeitschaltung funktioniert mit einem Schmitt Trigger und nem Kondensator. Der Bewegungsmelder hat einen 5 V TTl Ausgang.

    Jetzt soll er wieder richtig funktionieren und bekommt einen Microcontroller.

    Ich möchte das er bei Bewegungserkennung 3- 5 Minuten einschaltet und danach aus. Werden in einer bestimmten Zeit zu viele Bewegungen registriert, soll er für ca 20 Minuten ausgeschaltet bleiben.

    Irgendwie finde ich nicht den richtigen Ansatz.
    Hier mal mein Programm. Ich bin sicher es gibt eine ganz einfache Lösung.

    Wie
    Wenn in 5 Minuten 20 x einschalten kommt, dann für 20 Minuten aus.

    Ich danke euch.
    Code:
    $regfile = "attiny13.dat"
    $crystal = 1000000
    
    Ddrb = &B11101111                                           'Pin PB4 Eingang Rest Ausgang
    
    Dim Stufe1 As Byte
    Dim Zaehler As Word
    Dim Tilt As Word
    Declare Sub Unterprogramm
    Config Adc = Single , Prescaler = Auto
    Start Adc
    
                                                   'schalte den Timer1 ein
    Config Timer0 = Timer , Prescale = 256                      'timer 1 0 bis 65535  Zählen Taktfrequenz durch 256 =1000000/256=3906,25 Hz
    Enable Timer0                                               ' 65536 - 3906 = 61630
    On Timer0 Isr_von_timer1                                    'verzweige bei Timer1 überlauf zu   Isr_von_Timer0
    Enable Interrupts
    Timer0 = 0                                                  'Leider Nur 8 Bit Timer Bis 255 Ca 15 X Interrupt = 1 Sekunde       '61630
    
    
    
    
    
    Do
    
    
       If Stufe1 = 2000000 And Portb.4 = 1 Then                 'nach 2000000 bewegungsmeldungen/Programmdurchläufen und eingang eingeschaltet Ausgang aus
       Portb.3 = 0
       Stufe1 = 0
       Zaehler = 61                                             'Zähler auf 61 Setzen um Auszeit zu zählen
       End If
    If Portb.4 = 1 Then                                         'wenn Eingang auf 1 Pin B4 auf 1
       Portb.3 = 1
       Stufe1 = Stufe1 + 1                                       'Einschalthäufigkeit zählen
       Gosub Unterprogramm
       End If
    
    Loop
    
    
    Sub Unterprogramm
    
    If Zaehler = 900 Then                                       ' nach 60 sekunden ausschalten
       Portb.3 = 0
       Zaehler = 0
       End If
    
    
    
    If Zaehler = 4500 Then                                      'nach 5 Minuten ausgeschaltet auch wenn eine Bewegung erfasst wird
       Zaehler = 0                                              'wieder in den normalen Modus
       End If
    
    
    
    
    
    
    
    End Sub
    
    
    
    
    End
    
    Isr_von_timer1:                                             'ISR von Timer1
    Timer0 = 0
    Zaehler = Zaehler + 1
    
    Return

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    705
    ...wieso hast Du denn für diese Anwendung ausgerechnet den einzigen (!) Controller mit nur einem Timer ausgsucht?

    Aber auch damit könnte es klappen. Die Aufgabe müsste nur noch etwas genauer beschrieben sein.
    Nach ca. 20 Bewegungen innerhalb einer bestimmten Zeit (welche?) soll das Licht ausgehen, o.k. Ansonsten soll es 3-5 Minuten anbleiben, auch o.k.

    Was aber soll passieren, wenn z.B. jede Minute eine Bewegung detektiert wird? Soll es dann nach 5 Bewegungen (d.h. 5 Minuten) ausgehen? Oder 5 Minuten nach der letzten detektierten Bewegung? Oder wie oder was?

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.12.2005
    Ort
    NRW
    Alter
    41
    Beiträge
    142
    Hi Sauerbruch,
    naja ich habe von diesen Controllern halt noch welche und er ist sehr klein und einfach zu löten. Ich muss die Schaltung in den Holzrahmen einbauen können. Da hat die Schreinerei nur ne flache Nut Platz gelassen.

    Ich habe festgestellt, das die Steuerung wenn Sie anfängt ohne Bewegung zu schalten sich irgendwie nicht mehr einkriegt. Das heisst der Spiegel bleibt dann auch schonmal ne Stunde an und flackert nur kurz aus und wieder an. Je nachdem wie lange der Bewegungsmelder die 5 Volt geschickt hat und der Kondensator sich aufladen konnte.
    Ich gehe davon aus das die Funkstrahlung meines Routers/ Telefon in die Verstärkerschaltung des Bewegungsmelders einstrahlt. So wird der Kondensator nicht richtig geladen und der Spiegel schaltet dann auch schneller wieder ab, geht dann aber wieder sofort an als wenn er sich aufschwingen würde.

    Also müsste ich in einer bestimmten Zeit die Einschaltimpulse zählen und wenn der Wert zum Beispiel in 5 Minuten höher ist als 10, soll der Spiegel für 20 Minuten aus bleiben.

    Das Problem in meinem Programm ist das in jedem Programmlauf wenn das Licht eingeschaltet ist hochgezählt wird. Also sinnlos.

    Kann ich Flanken zählen lassen ? Wenn ja wie heisst der Befehl?

    Danke schonmal für deine Antwort.

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    705
    Kann ich Flanken zählen lassen ? Wenn ja wie heisst der Befehl?
    Klar: Du legst die Flanke auf einen Interupt-fähigen Eingang, d.h. entweder INT0 (=PINB.1), oder an einen der PCINT-Eingänge (PINB.0, 1, 2, 3 oder 4). In der Interrupt-Routine lässt Du dann eine Variable um 1 hochzählen - fertig!

    Bei den PinChange-Interrupts (PCINT) musst Du nur bedenken, dass sie jeden Flankenwechsel zählen (also beim Ein- und Ausschalten des Signals).

    Welcher der PinChange-Interrupts aktiviert sein soll (denn es sollen ja sicherlich nicht alle Pins den Interrupt auslösen), legst Du im PCMSK-Register fest.

    Gruß & Co,

    Daniel

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.12.2005
    Ort
    NRW
    Alter
    41
    Beiträge
    142
    Okay ich würde es dann so machen (habe gerade die Suche gefragt):

    Nur Pinb.1 kann int0

    PCMSK = &B0000010 ' Pin B1 als interrupt /brauche ich das Register bei int0?
    INT0 = Portb.1 'ist das so richtig?




    Int0_ISR: Ist das der richtige isr Name? wie deklariere ich Ihn?
    If Pinb.1=1 then 'abfrage nach steigender Flanke
    ..... (was auch immer getan werden soll)
    .....
    End if
    Return


    Ich habe hier in der Firma kein bascom, daher kann ich es nicht testen oder rantasten.
    Muss ich bei int0 das Register trotzdem schreiben?
    Woher weiss das Programm das beim Interrupt nach int0_isr gesprungen werden soll?

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    705
    Für den "klassischen" Interrupt INT0 brauchst Du das PCMSK-Register nicht. Dafür ist er immer fest mit PinB1 verbunden.

    Alles wissenswerte gibt´s in der Bascom-Hilfe, für erste Aktivitäten in der Firma ( ) aber schon mal soviel vorweg:

    Code:
    Config Int0 = rising   'steigende Flanke
    On Int0 Weizenkeim   'Man kann seine ISR´s nennen wie man möchte...
    Enable Int0  'extrem wichtig: Interrupt 0 muss aktiviert werden! 
    Enable interrupts  'auch extrem wichtig: Interrupts müssen "global" freigegeben werden!
    
    Do
    ...
    ...
    Loop
    
    Weizenkeim:
    ...  'was auch immer hier geschehen soll
    ...
    ...
    return
    Klar?

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.12.2005
    Ort
    NRW
    Alter
    41
    Beiträge
    142
    =D> SUUUUUUUPER DANKE =D>

    Ich verstehe nur nicht wie man auf weizenkeim kommt

    Ich danke dir

  8. #8
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    28.03.2008
    Ort
    Huntlosen
    Alter
    25
    Beiträge
    391
    versuchs mal mit n atmega8 der is genauso teuer, hat zwei timer und is nich viel größer, dann haste nich so die probelme

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    705
    is nich viel größer
    na ja - immerhin 3 mal so groß...

    In ´nem Tiny 15, 25, 45 oder 85 hättest Du auch 2 Timer - und das bei 8 Pins.

  10. #10
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    28.03.2008
    Ort
    Huntlosen
    Alter
    25
    Beiträge
    391
    ja gut hast recht.

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •