Forum: Mikrocontroller und Digitale Elektronik Programmierung einer Zeitsteuerung mit AVR Atmega32


von Andreas G. (fritzle_112)


Lesenswert?

Hallo zusammen,

Ich bin noch recht neu auf dem Gebiet Programmieren und habe daher vorab 
ein paar fragen, damit ich nicht gleich fehler bei meinem ersten 
Programm mache.

Gegeben ist ein Atmega32 welchen ich mit assambler programmieren soll.
Die aufgabe besteht darin einen Ausgang zu schalten welcher immer im 
gleichen Abstand ein High- und Low-Signal ausgibt. Diese Zeit sollte in 
gewisser m´ßen einstellbar sein. gegeben sind 1min ein/aus, 2min 
ein/aus, 3min ein/aus.

Meine überlegung ist es dass ganze mit dem Timer zu gestallen, ich lass 
den Timer durchlaufen und bei jedem Overflow erhöht er ein register um 1 
bis eben die zeit rum ist dass er den ausgang schlaten bzw. ausschaltet.
oder aber ich habe ein taster der durch drücken das vergleichsregister 
um 1 erhöht und einen der es verringert somit könnte ich z.B. in 30sek 
Schritten die Zeit sehr stark varieren lassen was ich besser fände. Das 
Bitmuster des vergleichregisters würde ich dann an 8 led ausgeben damit 
man sieht wie lange die zeit ist die man einstellt. Und zum schluss 
bräuchte ich nur noch einen Taster zum starten und einem um es zu 
stopen.

Hättet ihr eine besser Idee dies zu realisieren und 
verbesserungsvorschläge?

Weil ich bin mir meiner Sache nicht ganz sicher und bin um jeden raat 
froh.
Habe mich davor noch nie mit Timer usw beschäftigt.

Und zu letzt das ganze sollte noch vor Weihnachten fertig sein.... :(


Ich danke euch schonmal für euro Antworten

von Ben _. (burning_silicon)


Lesenswert?

> Gegeben ist ein Atmega32 welchen ich mit assembler programmieren soll.
richtig so! ;)

aber ich find einen atMEGA dafür übertrieben, ein attiny2313 oder so 
würde den job auch mehr als locker machen.

im grunde kommts drauf an was du willst. wenn der µC nichts weiter 
machen soll als diese zeitsteuerung kannst du alles in software machen. 
sprich du taktest das ding mit einem recht niedrigen takt, evtl. 1mhz. 
dann nimmst einen der timer und programmierst den so, daß du alle 
sekunde einen interrupt erhältst. von mir aus auch alle 5 oder 10 
sekunden, das verringert den zähler-aufwand bei längeren zeiten. dieser 
interrupt kann dir einen zähler inkrementieren, ganz stupide und nicht 
mehr - damit hast du eine stabile zeitbasis, quarzstabil sogar wenn es 
sein muß.

das hauptprogramm macht nun nichts weiter als den zähler auf null zu 
setzen und dann fortlaufend zu prüfen ob der zähler den sollwert für die 
eingestellte zeit erreicht hat. wenn ja -> weiter.

mehr isses nicht, das umfangreichste dabei ist wohl der timer, und ggf. 
das user-interface - aber da hast du genug pins wo man jumper 
anschließen und diese auslesen kann.

im grunde ist deine idee also richtig, ich würd wie gesagt nur einen 
kleineren AVR nehmen.

von Andreas G. (fritzle_112)


Lesenswert?

bin ja froh dass meine Idde nichtz komplett falsch war.

Der Controller sol erstmal nicht anderes machen als das. Aber soll 
später für andere Zwecke auch verwendbar sein, natürlich durch ein neues 
Programm.
Daher der Quarz wohl nicht nur 1MHz haben sonder eher 8MHz oder ?

Hätte zufällig einer ein Programmbeispiel dass in die nähe dieser 
Aufgabe kommt?

von Ben _. (burning_silicon)


Lesenswert?

wenn du was größeres vorhast dann halte dich nicht an beispielen oder so 
fest sondern mach es selber. datenblatt raus, timer und 
interruptprogrammierung und ab gehts!

im prinzip geht jede frequenz die du willst, bei höherem takt brauchst 
du halt einen entsprechend höheren vorteiler oder endwert für deinen 
timer damit du deine zeitbasis von x sekunden bekommst.

von Andreas G. (fritzle_112)


Lesenswert?

Ok, dann werde ich mich mal daran machen und euch es schicken mal 
schauen was ihr dann dazu sagt wenn es klappt

von Andreas G. (fritzle_112)


Lesenswert?

Gibt es eigentlich eine Funktion dass ich den Timer via Tastensdruck 
starten kann? Hab mal geschaut aber finde irgendwie nichts.

von Dennis U. (atmegadennis)


Lesenswert?

Hallo Andreas,

was heisst starten ??

Du kannst das Timer register auf Null setzten und somit "startet" der 
Timer von vorn, wenn du mit dem Tastendruck ebenfalls erst mit der 
Auswertung der Überläufe anfängst hast du ihn quasi Neugestartet.

Gruß

Dennis

von Ben _. (burning_silicon)


Lesenswert?

wenn du es interruptgesteuert machst kannst du zum deaktivieren einfach 
den entsprechenden interrupt abschalten. dann kann der zähler im 
hintergrund machen was er will, das programm interessiert es nicht bis 
du den interrupt wieder zuläßt. unmittelbar vor dem wiedereinschalten 
mußt du aber den zähler vom timer resetten, sonst stimmt das erste 
intervall nicht.

von Andreas G. (fritzle_112)


Lesenswert?

Hi ich hab mein Programm jerzt fertig, bevor ich dass nun auf den atmega 
downloaden kann müsste ich ja noch dir fuse-/ lockbits setzten.
Meine frage ist wie ich dies machen muss ?

Benutzte einen externen crystal oscillator mit 8MHz.
Das Programm selbst muss nicht geschützt sein soll also auch auslesbar 
sein.


Wäre nett wenn ihr mir helfen könnten. Danke im vorraus.

von Gastofatz (Gast)


Lesenswert?

>Meine frage ist wie ich dies machen muss ?

Was hast denn an den Erklärungen im Datenblatt Deines Controllers und im 
Manual Deiner Programmiersoftware nicht verstanden?

von Andreas G. (fritzle_112)


Lesenswert?

Also ich habe es nun hinbekommen dass das Programm halbwegs läuft, meine 
Ausgänge schlaten so wie sie es sollen allerding habe ich an Port B 
Leds, diese leuchten aber nicht da an Port B sich die Pegel nicht 
verändern wie sie es sollten.

kann mir da einer helfen?
muss ich den A/D Wandler erst aussschalten oder ähnliches ?

von Karl H. (kbuchegg)


Lesenswert?

Andreas G. schrieb:
> Also ich habe es nun hinbekommen dass das Programm halbwegs läuft, meine
> Ausgänge schlaten so wie sie es sollen allerding habe ich an Port B
> Leds, diese leuchten aber nicht da an Port B sich die Pegel nicht
> verändern wie sie es sollten.

Dann wirst du wohl einen Fehler im (unbekannten) Programm haben

von Andreas G. (fritzle_112)


Lesenswert?

so hab den Fehler gefunden, nun geht alles wie es soll.

Danke für eure Hilfe

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.