PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Benötige Hilfe bei Programmierung mit BASCOM und ATtiny13



Mage1983
10.02.2009, 11:38
Hallo zusammen,
könnt Ihr mir helfen dieses zu realisieren.
Besitze einen ATtiny13 und möchte am Eingang einen Reedkontakt
anschließen. Wenn dieser betätigt wird, soll der Ausgang für eine genau
definierte Zeit geschlossen werden z.B. 100ms, egal wie lange der
Reedkontakt am Eingang geschlossen ist. Optimal wäre auch noch wenn die
Zeit eingestellt werden könnte von Betätigen des Reedkontakt bis zum
aktivieren des Ausgangs. Z.B. ich betätige den Reedkontakt am Eingang
dann soll eine Verzögerung von 20ms stattfinden bis der Ausgang dann für
100ms aktiv wird. Wahrscheinlich müsste der Eingang (Reedkontakt) entprellt werden.
Leider bin ich beim Schreiben eines Code nicht so fit. Aufbau bzw Programmieren des uC ist kein Problem.

Würde mich sehr freuen, wenn mir jemand beim erstellen eines Code behilflich sein könnte.

Vielen Dank

Gruß Markus

Vitis
10.02.2009, 12:28
der 13er hat pin change interrupts auf allen 5 Beinchen die er als
IO verwenden kann.
pin change bedeutet bei wechsel des Status, also high nach low oder low nach
high kann der ausgelöst werden. nun musste nur noch wissen welcher pegel
zum zeitpunkt des interrupts eben anliegen bleibt. und welcher pin des ports
den interrupt ausgelöst hat.
Such mal nach PCINT hier im Forum, da gibts da democodes drüber

Dann noch n paar kleine Warterunden ... waitms z.B. zum Entprellen und
erzeugen Deines Impulses und fertig ist die Laube

python_rocks
10.02.2009, 17:12
Hallo Markus!

Ein dazu passendes Programm könnte in etwa so aussehen (ungetestet):

$regfile = "attiny13.dat"
$crystal = 1200000
$hwstack = 24
$swstack = 10
$framesize = 24

Eingang Alias Pinb.0
Ausgang Alias Portb.1

'DEBOUNCE konfigurieren: Nach Erkennen einer Zustandsänderung am Eingang, wird
'nach 20 ms noch einmal geprüft ob der Zustand stabil geblieben ist.
Config Debounce = 20 '20 ms


Do
'Wenn der Eingang von LOW nach HIGH gezogen wird, dann wird das
'Label *Eingang_wurde_geschaltet* angesprungen.
Debounce Eingang , 1 , Eingang_wurde_geschaltet , Sub
Loop
End


Eingang_wurde_geschaltet:

'DEBOUNCE wartet bereits 20 ms um den Eingangszustand genau zu erkennen.
'Wenn zusätzlich noch etwas gewartet werden soll, dann kann man hier
'ein ``WAITMS`` unterbringen.

'Ausgang einschalten
Ausgang = 1

'100 ms warten
Waitms 100

'Ausgang ausschalten
Ausgang = 0

'Zur Hauptschleife zurückkehren
Return
Bei diesem Programm muss der Eingang mit einem Pulldown-Wiederstand (ca. 10 kOhm) nach GND gezogen werden, so dass ein stabiler Zustand garantiert werden kann. Der Reed-Schalter muss den Eingang nach VCC ziehen.

Würde man es umgekehrt machen, dann könnte man auf den externen Pulldown-Widerstand verzichten und den eingebauten Pullup-Widerstand aktivieren.

mfg
Gerold
:-)

Mage1983
11.02.2009, 07:50
Vielen Dank für Deine Unterstützung.
Ich werde es heute gleich mal testen.

Danke Viele Grüße Markus

Mage1983
12.02.2009, 23:59
Vielen Dank,
funktioniert schon sehr gut. Vielen Dank für den Code. Ein kleines Problem noch. Teilweise fällt der Ausgang nicht nach der vorgegebenen Zeit ab, sondern bleibt permanent an. Kann man da noch was machen?
Kann man am Anfang auch eine Routine zum entprellen einbringen? Anstelle von Debounce.

Gruß Markus

python_rocks
13.02.2009, 04:27
Hallo Markus!

Bitte ausprobieren (=ungetestet):

$regfile = "attiny13.dat"
$crystal = 1200000
$hwstack = 24
$swstack = 10
$framesize = 24

Eingang Alias Pinb.1 'INT0
Ausgang Alias Portb.0
Config Ausgang = Output

Config Int0 = Rising
On Int0 On_int0

Enable Int0
Enable Interrupts


Do
!NOP
Loop
End


On_int0:
Waitms 20
Ausgang = 1
Waitms 100
Ausgang = 0
Return
Achtung! Bedingt durch den INT0 ändert sich die Anschlussbelegung. Eingang und Ausgang wurden vertauscht. Pulldown-Widerstand nicht vergessen!

mfg
Gerold
:-)

PS: Mich wundert ja, dass der vorherige Code überhaupt funktioniert hat -- habe ich doch ``Config Ausgang = Output`` vergessen. :-)

.

Mage1983
13.02.2009, 07:31
Danke
Die beiden Config Zeilen hab ich gestern selber noch eingefügt. Macht ja nix. Freue mich dass man hier so gut unterstützt wird. Ich werde das Programme heute gleich testen und Rückmeldung geben.

Gruß Markus

Mage1983
15.02.2009, 20:34
Hallo,
hab den Code ausprobiert. Funktioniert genau so, wie ich es mir vorgestellt habe. Jedoch hab ich noch das Problem, dass der Ausgang teilweise hängen bleibt und nicht abfällt. Habe am Ausgang des uC einen solid state Relais S202S02 mit 240 Ohm Vorwiderstand. An was kann das liegen? Denke nicht dass es an dem solid state liegt. Hab auch schon einen BC547 und ein mech. Relais verbaut gehabt. Dort hatte ich das gleiche Problem. Was könnte man noch im Code machen, dass er Eingang sicher abfällt. Oft fällt der Ausgang erst dann ab, wenn man den Eingang erneut betätigt. Vielleicht hängt es auch damit zusammen, wenn der Eingang nicht sauber betätigt wird.

Vielen Dank

Gruß Markus

python_rocks
15.02.2009, 20:53
Oft fällt der Ausgang erst dann ab, wenn man den Eingang erneut betätigt.
Hallo Markus!

Also ganz ehrlich -- ich kann mir nicht vorstellen, warum der Ausgang nicht zurückschalten sollte. Wenn der ATtiny13 abgestürzt wäre, dann dürfte ein erneutes Betätigen des Schalters auch nichts mehr bringen -- tut es aber.

Dann lass und mal die Symptome behandeln -- ohne auf die Ursache einzugehen. Lass die Hauptschleife den Ausgang ständig neu zurücksetzen:

Do
Ausgang = 0
!NOP
Loop
End
Und dann entprellen wir mal den Eingang mit einem Keramikkondensator. So wie hier in diesem Bild:

http://halvar.at/krimskrams3/schalter_am_attiny13_v02.gif

Statt dem 10n Kondensator kannst du es ruhig mal mit 100n versuchen.

Damit nicht sofort nach dem Starten des Programmes der Interrupt ausgelöst wird, musst du den µC ein wenig warten lassen. Das ganze Programm könnte dann in etwa so aussehen:

$regfile = "attiny13.dat"
$crystal = 1200000
$hwstack = 24
$swstack = 10
$framesize = 24

Eingang Alias Pinb.1 'INT0
Ausgang Alias Portb.0
Config Ausgang = Output

WAITMS 100

Config Int0 = Rising
On Int0 On_int0

Enable Int0
Enable Interrupts


Do
Ausgang = 0
!NOP
Loop
End


On_int0:
Waitms 20
Ausgang = 1
Waitms 100
Ausgang = 0
Return
Mehr fällt mir im Moment nicht ein.

mfg
Gerold
:-)

Edit: Sorry, war etwas abgelenkt. Es fehlte der Stützkondensator.

.

Mage1983
15.02.2009, 21:59
Danke. Werde ich morgen gleich mal ausprobieren.
Gehört Pin1 (Reset) auf +5V? Bis jetzt hängt dieser Pin bei mir nur am ISP.
Melde mich morgen wieder und gebe Bescheid.

Gruß Markus

Mage1983
16.02.2009, 16:18
Hallo,
jetzt funktioniert alles optimal. Vielen Dank für Deine super Arbeit.
Da die Schaltung bzw. das Reed Relais Vibrationen ausgesetzt ist, möchte ich einen Hall Geber verbauen (MP101402, siehe Anhang). Das Reed Relais hat aufgrund der starken Vibrationen teilweise einen Kontakt verursacht.
Wie muss ich vorgehen wenn ich diesen Hallgeber verbaue. Kann ich Ihn an die jetzige Schaltung anschließen oder muss der Widerstand bzw. der Code geändert werden. Vielen Dank
Gruß Markus

python_rocks
16.02.2009, 17:21
Wie muss ich vorgehen wenn ich diesen Hallgeber verbaue.
Hallo Markus!

Ich habe noch keine Erfahrung mit solchen Sensoren gemacht. Aber ich kann mir vorstellen, wie es funktionieren sollte.

http://halvar.at/krimskrams3/hall_sensor_am_attiny13_v01.gif

Das Programm muss dementsprechend angepasst werden.

UNGETESTET:

$regfile = "attiny13.dat"
$crystal = 1200000
$hwstack = 24
$swstack = 10
$framesize = 24

Eingang Alias Pinb.1 'INT0
PORTB.1 = 1 'PullUp-Widerstand aktivieren

Ausgang Alias Portb.0
Config Ausgang = Output

WAITMS 10

Config Int0 = Falling
On Int0 On_int0

Enable Int0
Enable Interrupts


Do
Ausgang = 0
!NOP
Loop
End


On_int0:
Waitms 20
Ausgang = 1
Waitms 100
Ausgang = 0
Return
mfg
Gerold
:-)

Mage1983
16.02.2009, 20:24
=D> Jetzt funktioniert alles einwandfrei. Nochmals recht herzlichen Dank.
Freut mich dass man hier so gut unterstützt wird. Danke Viele Grüße Markus
Jetzt werde ich nur noch eine Sleep Funktion einbauen, wenn keine Signale am Eingang anliegen. Um den Verbrauch ein wenig zu reduzieren. Denke aber dass ich mit Sicherheit etwas hierzu im Forum finden werde.