Forum: Mikrocontroller und Digitale Elektronik ATtiny 13 Zeiteinstellung bascom


von Tommy T. (thomas_k86)


Angehängte Dateien:

Lesenswert?

Kann mir wer erklären wie man da ausrechnet das nach dem 
Tasterdruck,Portb.1 eine Stunde auf High schaltet?

von Josef M. (josef_m)


Lesenswert?

Strg-A - Entf

von kopfkratzer (Gast)


Lesenswert?

kopfkratz
Nimm halt einen Timer und rechne Dir aus welcher Wert bei 1.2MHz Takt 
eine Stunde entspricht ...

von Daniel J. (theend)


Lesenswert?

Ziemlich komischer Code.

Für was brauchst du ein entprellen, wenn ein Tastendruck eh eine 1 
Stündige arbeit verrichtet?

Einfach:

If taste gedrückt
set portb.1 = 1
wait 3600
set portb.1 = 0
goto start


Die befehle, und wie alles zusammen gehört, findest du sicherlich selbst 
raus.

von Horst (Gast)


Lesenswert?

Daniel J. schrieb:
> wait 3600

wtf?

von Karl H. (kbuchegg)


Lesenswert?

wie kommst du auf 1 Stunde.
Rein rechnerisch sind es 100 Minuten.
Vorausgesetzt die Taktfrequenz von 1.2Mhz stimmt mit der Realität 
überein.

von Daniel J. (theend)


Lesenswert?

Was denn? :D
Hab ich was falsch verstanden?

Er möchte, nachdem er eine Taste gedrückt hat, das ein ausgang für eine 
Stunde auf High geschalten wird?

Dann ist das doch richtig? Ausser er möchte dabei noch was anderes 
machen. Aber das hat er ja nicht gesagt.

Edit:
Meinst du mich?

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

wenn ein DEBOUNCE
1
  Config Debounce = 30                                      'Zeit der Kontaktentprellung in ms
30 Millisekunden dauert, wie lange dauern dann
1
For B = 1 To 2000
2
 ....
3
 Debounce Pinb.0 , 0 , Main                                  'Wenn Taste 
4
...
5
NEXT B

2000 Stück davon?

Wenn einmal abarbeiten dieser 2000 Stück x Zeiteinheiten benötigt, wie 
lange dauert es dann, bis
1
For A = 1 To 2000                                           'Zeitschleife 
2
...
3
If A = 100 Then Goto Main                                   ''Main' wenn A 
4
...
5
Next A

100 Stück dieser 2000-er Einheiten abgearbeitet sind?

: Bearbeitet durch User
von Daniel J. (theend)


Lesenswert?

3 Sekunden

von Tommy T. (thomas_k86)


Lesenswert?

Wasss???

Ich möchte einen Taster drücken.
Es soll der Ausgang auf High schalten.
Nach einer Stunde oder wenn man inzwischen den Taster nochmal drückt 
,soll er wieder zurückkehren in den Ausgangszustand.
Später wird der Taster wieder gedrückt.

von Daniel J. (theend)


Lesenswert?

Dann mach:

start:

do
If taster gedrückt goto tastergedrückt
loop

tastergedrückt:
set portb.1 = 1


For A = 1 To 7200
waitms 500
if taster gedrückt goto stop
NEXT A

stop:

set portb.1 = 0

goto start

END

tadaa...
Musst halt, wenn du stoppen willst, den Taster dann eventuell 500ms 
gedrückt halten. Aber is ja auch ned schlimm.

von Horst (Gast)


Lesenswert?

Daniel J. schrieb:
> Aber is ja auch ned schlimm.

Doch, isses. Dein Stil ist sogar noch schlechter als der von TdB.

von Daniel J. (theend)


Lesenswert?

Begründung?
Meine lösung funktioniert wenigstens.
Ausserdem hast du noch keine Lösung vorgeschlagen.

: Bearbeitet durch User
von Tommy T. (thomas_k86)


Lesenswert?

Daniel J. schrieb:
> start:
>
> do
> If taster gedrückt goto tastergedrückt
> loop...........

meinst du so???


$regfile = "attiny13.dat"                                   'verwendeter 
Prozessor
$crystal = 1200000                                          'Definition 
des Takt
$hwstack = 15 
'Reservierung im SRAM
$swstack = 15
$framesize = 15

Config Portb.0 = Output                                     ''Buzzer
Config Pinb.1 = Input

Dim A As Integer

start:

do
If Pinb.1 = 0 Then Goto Tastergedrückt
loop

tastergedrückt:
Portb.1 = 1


For A = 1 To 6200
Waitms 500


If Pinb.1 = 0 Then Goto Stopp
Next A


Stopp:

Portb.1 = 0

goto start

END

von Daniel J. (theend)


Lesenswert?

Ja genau.

Nur anstelle von

tastergedrückt:
Portb.1 = 1

musst du Portb.0 = 0 da das ja der Output ist.
Bei "stopp" dann auch portb.0

und

For A = 1 To 6200

wird zu

For A = 1 To 7200

Da jede schleife circa 500ms dauert und eine Stunde 3600 Sekunden hat. 
Also pro sekunde 2 Schleifen = 7200.

Ausserdem fehlt noch der Pullup
Vor Start:
kommt ein "Portb.1 = 1"
der ist dafür da, dass wenn der Taster nicht gedrückt ist, dieser 
eingang dann immer eine "1" hat.

Da jede schleife circa 500ms dauert und eine Stunde 3600 Sekunden hat. 
Also pro sekunde 2 Schleifen = 7200.

So hätte ich das gemacht. Andere würde eventuell mit dem Timer arbeiten 
usw. Aber so funktioniert das auch. Natürlich nur wenn der Controller 
nichts anderes mehr innerhalb der Stunde mache muss.

von Daniel J. (theend)


Angehängte Dateien:

Lesenswert?

So hier die eigentlich fertige Datei.

Habe noch ein wenig verändert, kannst dirs ja ankucken. Sollte 
eigentlich jetzt das machen was du willst. Genau eine Stunde wirds damit 
zwar nicht gehen, dafür benötigst du sicherlich einen externen Quarz 
usw, aber sollte annähernd ne Stunde sein.

von Hannes L. (hannes)


Angehängte Dateien:

Lesenswert?

Daniel J. schrieb:
> Andere würde eventuell mit dem Timer arbeiten

Ja sicher doch. Obwohl der interne RC-Oszillator des Tiny13(A) ganz 
schönen Exemplarstreuungen unterliegt, was ihn für genaues Timing recht 
unbrauchbar macht. Der "Auftraggeber" hatte ganz schön damit zu tun, das 
Programm auf mehrere Exemplare abzugleichen. Der Feinabgleich erfolgte 
aus Gründen der Bequemlichkeit mit der Konstante "Stusek".

Das Programm im Anhang ist zwar für einen etwas anderen Zweck, zeigt 
aber, wie man an die Sache herangehen könnte. Es schaltet einstellbare 
Tage und Stunden nach dem Aktivieren einen Verbraucher für eine 
einstellbare Anzahl Stunden ein und geht nach dem Ausschalten des 
Verbrauchers in den Tiefschlaf.

...

von Tommy T. (thomas_k86)


Lesenswert?

Daniel J. schrieb:
> Genau eine Stunde wirds damit
> zwar nicht gehen, dafür benötigst du sicherlich einen externen Quarz

Danke Daniel!!
Hast da zufällig was im Angebot? :)
Ein Timer wäre schon recht,da das schon ziemlich genau und zuverlässig 
sein sollte.

Hannes Lux schrieb:
> Ja sicher doch. Obwohl der interne RC-Oszillator des Tiny13(A) ganz
> sch....
Danke auch an Hannes!!
Das hab ich schon mal wo gesehen und auch getestet.Hab bis heute keine 
Anwendung dafür gefunden.

von Hannes L. (hannes)


Lesenswert?

Tommy Tomatronic schrieb:
> Daniel J. schrieb:
>> Genau eine Stunde wirds damit
>> zwar nicht gehen, dafür benötigst du sicherlich einen externen Quarz
>
> Danke Daniel!!
> Hast da zufällig was im Angebot? :)

Der Tiny13 und Tiny13A ist nicht für Betrieb mit externem Quarz 
geeignet. Neben den Varianten des internen RC-Oszillators gibt es nur 
die Möglichkeit, mit einem externen Takt zu arbeiten. Wenn dies ein 
Quarztakt sein soll, dann ist ein externer Quarzgenerator notwendig. Ein 
Quarz alleine, wie bei anderen AVRs üblich, reicht dazu nicht. Siehe 
Datenblatt, Kapitel 6. "System Clock and Clock Options".

...

von kopfkratzer (Gast)


Lesenswert?

kopfkratz
Man könnte auch einen Tiny85 statt des Tiny13 nehmen und hat mehr Timer 
und weniger Abgleichsprobleme ...
Es fehlen halt wieder die notwendigen Daten, wie genau muß die Stunde 
sein, was soll geschaltet werden usw. usf.
Mit Quarzoszillator wird's genauso "teuer" wie mit Tiny85 nur das man 
dann noch mehr Platz braucht ...

von Hannes L. (hannes)


Lesenswert?

kopfkratzer schrieb:
> Mit Quarzoszillator wird's genauso "teuer" wie mit Tiny85 nur das man
> dann noch mehr Platz braucht ...

Eher noch teurer...
Allerdings sollte man bedenken, dass der Quarz dann wieder zwei der 5 
I/O-Pins des Tiny25/85 blockiert.

...

von kopfkratzer (Gast)


Lesenswert?

Hannes Lux schrieb:
> kopfkratzer schrieb:
>> Mit Quarzoszillator wird's genauso "teuer" wie mit Tiny85 nur das man
>> dann noch mehr Platz braucht ...
>
> Eher noch teurer...
> Allerdings sollte man bedenken, dass der Quarz dann wieder zwei der 5
> I/O-Pins des Tiny25/85 blockiert.
>
> ...

Nein ist ja ein Oszillator ;-)
Und ich meinte Tiny13+Oszillator oder abgeglichener Tiny85 der geht 
recht genau im vergleich zum Tiny13.

von Daniel J. (theend)


Lesenswert?

Also du kannst mein Code verwenden.
Willst du nun einen schon vorhandenen Attiny verwenden, oder bist du da 
noch flexibel?
Der Attiny85 wäre z.B. mit einem Quarz zu betreiben.

Dazu einfach den Attiny so fusen, das er mit einem externen Quarz 
arbeitet und in Bascom angeben wie schnell er ist. Dann bleibt der Code 
unverändert ;)

von Tommy T. (thomas_k86)


Lesenswert?

Ich hätte noch einen ATtiny 45 zur Hand. Auch einige Quarz hab ich. Ich 
hätte da schon gerne einen Timer drin. Die reaktionszeit vom Taster soll 
ja auch gleich bleiben.
In der Stunde kann er ruig einige Sekunden falsch laufen da brauch ich 
keinen Quarz, aber es soll immer fast gleich laufen.
Ich hab nur einen eingang und einen ausgang.

von kopfkratzer (Gast)


Lesenswert?

Tommy Tomatronic schrieb:
> Ich hätte noch einen ATtiny 45 zur Hand. Auch einige Quarz hab
> ich. Ich
> hätte da schon gerne einen Timer drin. Die reaktionszeit vom Taster soll
> ja auch gleich bleiben.
> In der Stunde kann er ruig einige Sekunden falsch laufen da brauch ich
> keinen Quarz, aber es soll immer fast gleich laufen.
> Ich hab nur einen eingang und einen ausgang.

Dann nimm den Tiny45 mit einem passenden Quarz und Du hast es auf die 
Sekunde genau.
Oder Du schaust mal wie gut Du in BASCOM die interne Kalibrierung 
hinbekommst.
Wenn es in der Stunde auf 10 Sekunden nicht ankommt und nur der Taster 
korrekt entprellt werden soll reicht das aus.

von Daniel J. (theend)


Lesenswert?

Dann ändere die 7200 in 14400 und die waitms 500 in waitms 250
Dann gibst du oben an, welchen Quarz du angeschlossen hast, und das 
wars.

von Tommy T. (thomas_k86)


Lesenswert?

Daniel J. schrieb:
> Dann ändere die 7200 in 14400 und die waitms 500 in waitms 250
> Dann gibst du oben an, welchen Quarz du angeschlossen hast, und das
> wars.

Danke!

Hi!! Hab da jetzt ein Uhrprogramm genommen,habs umgestrickt für ATiny13 
und ATtiny 45.
Läuft seit ein paar Tagen ohne Problem. :)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.