Forum: Mikrocontroller und Digitale Elektronik ATMEGA8 Ausgang mit Timer schalten


von Boris L. (boriza)


Angehängte Dateien:

Lesenswert?

Hallo,
ich habe folgendes Problem, ich möchte durch das drücken eines Tasters 
am PB0 des ATMEGA8 (wird auf Masse gezogen)einen Ausgang PC0 für ca.30 
Sekunden auf High setzen. Allerdings soll beim erneuten drücken des 
Tasters der Ausgang PC0 sofort wieder auf Low gehen.
Die Ausgänge mit Taster einschalten, solange man drückt ist kein 
Problem...  aber das mit der Zeitverzögerung und Abschaltung durch 
erneutes drücken schon.
Also bitte, wenn mir wer helfen könnte...
Vielen Dank !

von jack (Gast)


Lesenswert?

Du kommst scheinbar ohne Entprellung aus. Das ist seltsam.

In der Codesammlung findet sich ein Beitrag "Tasten entprellen", den
würde ich mir mal ansehen.

von Peter D. (peda)


Lesenswert?

Klingt nach Treppenhausautomat.

Hier ist ein Beispielcode dafür:

Beitrag "Wartezeiten effektiv (Scheduler)"


Peter

P.S.:
Programme sind keine Briefe (*.txt), sondern je nach Sprache *.c, *.asm, 
*.pas usw.

von Boris L. (boriza)


Lesenswert?

Hallo und Danke für die tollen Tips !
Aber das bringt mich nicht wirklich weiter....
Also hat keiner eine Idee wie er helfen kann ?
Das ist doch wenn man fit ist eine banale Programmieraufgabe....
Danke !

Gruss
Boriza

von Jean P. (fubu1000)


Lesenswert?

Hi,
das ist wirklich poppelig Aber ohne zu wissen auf welchem Takt dein µC 
läuft, kann man nur raten wie der Timer eingestellt werden muß. Also 
wäre es sehr hilfreich dies zu wissen. Dann würde ich mich auch 
erbarmen, dir den Code (Hausaufgabe) schnell hin zu kritzeln.

Gruß

von Peter D. (peda)


Lesenswert?

Boris wrote:
> Aber das bringt mich nicht wirklich weiter....

Diese Aussage ist nutzlos, da sie nicht erklärt, wo Du nicht weiter 
kommst.


> Also hat keiner eine Idee wie er helfen kann ?

Nun, der Link ist doch schon zu 98% die Lösung.


> Das ist doch wenn man fit ist eine banale Programmieraufgabe....

Wenn man einen Scheduler und einen Entpreller schon als fertige Module 
hat, dann ja.

Und da es so banal ist, will ich Dir nicht das Vergnügen nehmen, die 
restlichen 2% Anpassung selber zu machen.


Peter

von Hmm... (Gast)


Lesenswert?

> Das ist doch wenn man fit ist eine banale Programmieraufgabe....

Deshalb ist es wahrscheinlich auch eine Hausaufgabe ;)

Nagut, was ist nun zu tun? Irgendwie müssen wir den Timer 0 zum laufen 
bekommen. Hierfür gibt es laut Datenblatt (ich geh davon aus dass du das 
Kapitel zum 8-Bit Timer 0 gelesen hast. Bitte bezieh dich bei späteren 
Fragen darauf!) die Special-Function-Register TCCR0, TCNT0, TIFR und 
TIMSK.

Damit ist der Timer 0 bedeutend einfacher als z.B. der mächtige 16-Bit 
Timer mit seinen vielen Betriebsarten.

Folgendes hast du schon:

> TCCR0|=(1<<CS00)|(1<<CS02);

Damit hast du schonmal den Timer mit einen Prescaler von 1024 am laufen. 
Wenn dein Controller z.B. mit 8 MHz läuft, zählt der Timer nun mit 1953 
Hz oder in Schritten von 512µs.

Schau dir mal im Datenblatt das Register TIFR an und versuch den Sinn 
von TOV0 zu verstehen. Wenn du z.B in in der Hauptschleife pollst ob es 
gesetzt ist und es dann wieder löschst (->Datenblatt!) und eine Variable 
inkrementierst hast du schon einen Zähler mit ca. 131ms. Ist das ein 
Anfang?

Zwei Dinge noch:

1. Es gibt hier für die Timer prima Tutorials. Lies sie durch und 
versuch
   sie zu verstehen. Bezieh dich dann in weiteren Fragen auf das 
Tutorial
   und die Seite im Datenblatt deines Controllers.

2. Du benötigst trotzdem noch eine Tastenentprellung. Kurz: Nur wenn du
   über eine Zeitspanne von mehreren 10ms einen konstanten Zustand an
   deinem Pin hast, ist die Messung gültig.

   Auch hierfür gibt es Artikel auf dieser Seite. Peter Danneger hat 
hierzu
   eine wunderbar schnelle Routine geschrieben. Wenn du bereit bist dich
   mit Interrupts zu beschäftigen würde ich dir nahelegen seine Routine
   mal genauer anzusehen.

von Hmm... (Gast)


Lesenswert?

Noch etwas:

Viele die dir hier bereitwillig helfen wollen haben sich ihr Wissen zu 
einer Zeit angeeignet, wo es keine Internet-Foren gab wo man fragen 
konnte. Datenblätter waren auch nicht soo einfach zu bekommen und es gab 
keine Tutorials. Man musste trockene Fachliteratur in Büchereien wälzen 
und häufig waren die ersten wackeligen Gehversuche mit stunden und 
bisweilen tagelangem herum probieren verbunden.

Also sei lieber froh über die Möglichkeiten die sich dir hier in diesem 
Forum bieten und passe auch deinen Ton entsprechend an. Ist nicht bös 
gemeint, erleichtert dir aber das Leben hier ungemein.

von Boris L. (boriza)


Lesenswert?

Hallo,

also erstmal vielen Dank für euere schnellen Antworten.
Ja, es ist schön das es dieses Forum gibt und das Forum ist auch 
wirklich gut - aber man muss ja nicht gleich alles was hier geschrieben 
wird auf die Goldwaage legen oder ?!
Entspannt euch mal, es gibt auch noch ein Leben ausserhalb der 
Programmierung von Controllern und das ist manchmal auch sehr 
anstrengend. Ich wollte hier niemanden nötigen oder beleidigen, ich habe 
nur ein Problem bei der Umsetzung meiner Idee und würde das gerne 
möglichst schnell lösen und wäre sehr froh, wenn jemand dabei helfen 
will.
Wenn ich mehr Zeit hätte, würde ich mir das auch mühsam aus Büchern 
aneignen aber das wird in der nächsten Zeit eher schwer, was aber nicht 
heissen soll das ich hier nur Wissen abgreifen will und dann nicht 
bereit wäre auch etwas dafür zu tun und zu teilen.

PS: Der Takt auf dem der Controller läuft ist mir relativ egal, ich habe 
noch genug Quarze in 6 und 8MHz. Z.Zt. läuft er auf Takt 1,843 MHZ des 
STK500 Boards.

Gruss
Boriza

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.