Forum: Mikrocontroller und Digitale Elektronik Lange Pausen einfügen


von F. F. (foldi)


Lesenswert?

Hallo Leute,

für Euch mal sicher wieder ne lächerliche Frage.

Bin zwar noch nicht mit C angefangen, aber gerne ein Beispiel in C.
Konnte nichts dazu finden.

Wie kann ich lange Pausen einfügen, sodass ein Sensor zum Beispiel  alle 
Stunde abgefragt wird. Alles was ich lese sind immer ms und dann in der 
Aufrechnung bis in die Sekunden, aber von Minuten oder Stunden hab ich 
noch nichts gelesen.
Wie geht das?

Gern auch zusätzlich in Assembler (will ich auch lernen:-) ).

Danke!


Grüße
Frank

von Eumel (Gast)


Lesenswert?

Mit einem Timerinterrupt und einem zusätzlichen Zähler.

von Ich (Gast)


Lesenswert?

Versuch als erstes das AVR-Tutorial durchzuarbeiten. Meine Empfehlung: 
Zuerst Assembler, wenn du das gut kannst, C. Wenn du C schon vom 
PC-Programmieren her kannst, auch eher.

Zu deiner Frage: Für so lange Verzögerungen nutzt man nicht 
Warteschleifen, die sinnlos Zeit vertrödeln, sondern einen Timer.
Wenn der Timer nach einer gewissen Zeit "klingelt", zählt man eine 
Variable um 1 hoch. Bei einem gewissen Wert (abhängig von Taktfrequenz 
und Timer-Einstellungen) ist dann eine Stunde vergangen. Solange der 
Timer läuft und dein Mikrocontroller nichts zu tun hat, kannst du ihn 
sogar in den Sleep Modus versetzen, um Strom zu sparen.

von F. F. (foldi)


Lesenswert?

Danke!!!

Mein Gott, man kann ja sooo doof sein. Tausendmal gelesen.

Ich hatte bis jetzt mit Arduino angefangen, aber das reicht mir nicht.
Wollte gleich mit C++ anfangen, aber da mir alle abrieten, habe ich mir 
nun einige Bücher bestellt. Unter anderem auch AVR1, von 
Schabel-Schmitt.
Denke auch, dass ich wahrscheinlich doch mit Assembler anfangen werde 
(hab auch mal CNC (vor ner Ewigkeit) gelernt und klare Kommandos sind 
mir eh am liebsten.
Mal sehen.

Nochmals vielen Dank!!!

Lieben Gruß
Frank

von F. F. (foldi)


Lesenswert?

Frank O. schrieb:
> Unter anderem auch AVR1, von
> Schabel-Schmitt.
Verschrieben. Der Autor heißt Manfred Schwabl-Schmidt.

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

Frank O. schrieb:
> klare Kommandos sind mir eh am liebsten.

Dafür ist ja C gut geeignet. Für mich ist es deutlich klarer zu lesen


Sekundenzaehler=60

als

ldi r16,60  ; R16 soll mein Sekundenzaehler sein

von F. F. (foldi)


Lesenswert?

Wegstaben Verbuchsler schrieb im Beitrag #29642I91:
> ldi r16,60  ; R16 soll mein Sekundenzaehler sein
>
Werde ich ja noch sehen, aber "lade sofort ins Register 16 den Wert 60" 
ist doch auch klar?!
Wenn man genau weiß wie etwas geht, dann ist sicher alles ganz einfach. 
Aber Assembler hat den Vorteil, man lernt den µC besser kennen. Denke 
ich mir. Aber ??? keine Ahnung ob ich richtig liege.

Ich denke mir Assembler ist so ein bisschen wie, "jetzt schalte den 
dritten Gang rein" und C ist mehr "Wenn du jetzt im 2 Gang bist oder 
vielleicht im 1 Gang, aber nicht im 4 Gang, dann bist du im 3 Gang. 
Schalte jetzt in den 4 Gang"

von Karl H. (kbuchegg)


Lesenswert?

Frank O. schrieb:

> Wenn man genau weiß wie etwas geht, dann ist sicher alles ganz einfach.
> Aber Assembler hat den Vorteil, man lernt den µC besser kennen. Denke
> ich mir. Aber ??? keine Ahnung ob ich richtig liege.

Im Grunde musst du auch in C die Hardware deines µC gut kennen. Das 
schenkt sich nichts.

> Ich denke mir Assembler ist so ein bisschen wie, "jetzt schalte den
> dritten Gang rein" und C ist mehr "Wenn du jetzt im 2 Gang bist oder
> vielleicht im 1 Gang, aber nicht im 4 Gang, dann bist du im 3 Gang.
> Schalte jetzt in den 4 Gang"

Nicht wirklich.
Es heisst auch in C "Leg den 3. Gang rein".
Einziger Unterschied: In C schreibst du das mehr oder weniger auch so

    Gang = 3;

ohne dich darum kümmern zu müssen, welches Zahnrad in welches andere 
Zahnrad greifen muss und dass du auch noch auf die Synchronringe 
aufpassen musst. C nimmt dir einfach nur die vielen kleinen 
Detailproblemchen ab, um die man sich im Assembler selbst kümmern muss.

Aber die ersten Schritte in Assembler zu machen, ist schon sinnvoll. Der 
Zugang ist dann ein etwas intimerer.

von Peter R. (pnu)


Lesenswert?

kurzes Beispiel: vom int gebildete kurze Zeiten werden per flag in die 
Hauptroutine übertragen und dort gezählt und alle Sekunde wird dann 
etwas ausgeführt.

Einer der Zähler ist so eingestellt, dass er alle 10 ms einen ovl-int 
macht (tick)

ovlint:   ;im int wird alle 10 ms ein Flag (t-flag) gesetzt
set
.
.         ;eventuell weitere Aktionen der int-routine
.
reti

main:
.
.
brtc   ;wenn kein t, dann in main bleiben
clt    ;t-flag rücksetzen
inc r22   ;ticks zählen
cpi r22,100 ;Wenn 100 tics, dann eine sec vorbei
brne weiter
.
  ;Aktion, die jede sec ablaufen soll
.
clr r22     ;Zähler neu setzen

weiter:
rjmp main

von Fabian O. (xfr)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Aber die ersten Schritte in Assembler zu machen, ist schon sinnvoll. Der
> Zugang ist dann ein etwas intimerer.

Da bin ich anderer Meinung. Ich würde ja in Assembler als Anfänger 
verzweifeln, sobald das Programm etwas sinnvolles machen soll, das über 
LED-Blinken hinaus geht. Man muss jeden einzelnen Prozessorbefehl 
mitsamt seinen Nebenwirkungen kennen und die ganzen Standardkonstrukte 
wie Schleifen, Funktionen, Datentypen mit mehr als 8 Bit usw. mühsam von 
Hand implementieren, die in C selbsterklärend sind. Imo ist das reine 
Strafarbeit.

"Etwas intimer" ist es allerdings schon, das stimmt natürlich. Das kann 
man sich aber auch noch aufheben, wenn man C schon kann. Ob man das 
allerdings dann noch will, steht auf einem anderen Blatt. Ich habe nie 
den Drang verspürt. Habe mich zwar schon mal an kleineren 
Inline-Assembler-Stückchen versucht und mir ab und zu angeschaut, was 
der Compiler aus meinem Code macht, kann es also einigermaßen lesen, 
aber selber schreiben möchte ich das nicht.

von F. F. (foldi)


Lesenswert?

Mein Kerninghan & Ritchie hat ein anderer, wer weiß ich nicht mehr. Nun 
hab ich mir folgende Bücher bestellt. Nur schade ums C++ Buch. Das wäre 
mein Stil gewesen, aber leider seid ihr alle (aus gutem Grund, den ich 
nun nachvollziehen kann) dagegen.
Diese Bücher hab ich mir bestellt:

C: Programmieren von Anfang an

Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie: 
Programmierung in Assembler und C - Schaltungen und Anwendungen 
[Taschenbuch]

AVR-Programmierung 1: Grundlagen und der Aufbau von Programmstrukturen: 
BD 1 [Broschiert]

AVR-Mikrocontroller in C programmieren: Über 30 Selbstbauprojekte mit 
ATtiny13, ATmega8, ATmega32: Über 30 Selbstbauprojekte mit ATtiny13, 
ATmega8 und ATmega32 [Gebundene Ausgabe]

Hat jemand von euch eines dieser Bücher gelesen oder kann mir jemand 
sagen welches das sinnvollste aus seiner Sicht ist; dann bitte 
begründen.

Zunächst tendiere ich zum AVR-Programmierung. Gerade Assembler, weil ich 
mir so erhoffe gleichzeitig das "Innenleben" der µC's richtig zu 
verstehen.

Wenn man das erstmal kann, und hier knüpfe ich gern an die Synchronringe 
an, dann ist der Rest sicher leichter.
Um bei den Synchronringen zu bleiben. Viele die ein Auto fahren wissen 
nicht mal was da im Getriebe passiert und dass es Synchronringe hat 
schon mal gar nicht.
So ähnlich ist es sicher auch mit den Hochsprachen.
Hab gerade noch einen Umrichter zerlegt um zu sehen was da kaputt 
gegangen ist und wie das Teil aufgebaut ist. Es ist meine Natur den 
Dingen auf den Grund zu gehen und ich möchte jedem Bit die Hand 
geschüttelt haben -nicht sofort, aber irgendwann- denn erst dann fühle 
ich mich sicher.
Bei der CNC Programmierung war es auch so, da musste ich jede 
Kleinigkeit und jeden Millimeter im Programm vorgeben. Ich fand das gut.
Denke, wenn man das "Innenleben" erstmal richtig versteht, dann kann man 
auch besser die Fehler finden, ganz gleich mit welcher Sprache man 
programmiert.

von Simon B. (nomis)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Es heisst auch in C "Leg den 3. Gang rein".
> Einziger Unterschied: In C schreibst du das mehr oder weniger auch so
>
>     Gang = 3;

In C wird ab 0 gezählt. Der dritte Gang ist also der Gang mit der Nr. 2 
:-)

Viele Grüße,
        Simon

von Eumel (Gast)


Lesenswert?

Simon Budig schrieb:
> In C wird ab 0 gezählt. Der dritte Gang ist also der Gang mit der Nr. 2
> :-)
>
> Viele Grüße,
>         Simon

Vielleicht wäre die 0 ganz gut für den Rückwärtagang ;)

von Troll (Gast)


Lesenswert?

Eumel schrieb:
> Vielleicht wäre die 0 ganz gut für den Rückwärtagang ;)

Mh -1 wäre auch tauglich, aber dann müsste man mit signed arbeiten aber 
man könnte die 0 nutzen für leerlauf

von Karl H. (kbuchegg)


Lesenswert?

Simon Budig schrieb:
> Karl Heinz Buchegger schrieb:
>> Es heisst auch in C "Leg den 3. Gang rein".
>> Einziger Unterschied: In C schreibst du das mehr oder weniger auch so
>>
>>     Gang = 3;
>
> In C wird ab 0 gezählt. Der dritte Gang ist also der Gang mit der Nr. 2
> :-)
>
> Viele Grüße,
>         Simon

Mist. Jetzt wird mir so einiges klar :-)

von Fabian O. (xfr)


Lesenswert?

Frank O. schrieb:
> Um bei den Synchronringen zu bleiben. Viele die ein Auto fahren wissen
> nicht mal was da im Getriebe passiert und dass es Synchronringe hat
> schon mal gar nicht.

Das ist schon ein gutes Beispiel. Hast Du Dir als Fahranfänger auch 
erstmal Bücher über Fahrzeugtechnik gekauft und im Detail studiert, wie 
das Getriebe, der Motor etc. funktioniert, bevor Du losgefahren bist? 
Und Dich dann als erstes in einen Oldtimer ohne synchronisiertes 
Getriebe gesetzt, um gleich mit Zwischengas schalten zu lernen? Klar 
kann man das machen und danach kommt man mit einem modernen Auto sicher 
leichter zurecht, also wenn man zum ersten mal am Steuer sitzt. Aber der 
Einstieg ist doch um einiges erschwerlicher und die Gefahr groß, dass 
man die Motivation verliert.

Fang doch einfach mal mit etwas an, zum Beispiel mit dem 
AVR-GCC-Tutorial hier auf der Seite oder auch mit dem AVR-Tutorial für 
Assembler. Mach die ersten Programme (LED blinken etc.) sowohl in C als 
auch in Assembler und vergleiche sie. Dann siehst Du nach ein paar 
Versuchen, was Dir für den Anfang besser liegt. Ich würde dann das 
Tutorial durcharbeiten bzw. ein eigenes Projekt versuchen und die Bücher 
zur Vertiefung nebenbei lesen. Aber gut, jeder ist ein anderer Lerntyp. 
Wenn Du lieber zuerst die Theorie liest, dann mach es so. Die Bücher 
kenne ich nicht, daher kann ich Dir dazu keinen konkreten Tipp geben.

von F. F. (foldi)


Lesenswert?

Hallo Fabian,

das ist eine tolle Idee (und so nahe liegend), das beides im Vergleich 
zu machen.
Ich hatte eine ähnliche Idee. Da das eine Buch C allein ist und nicht 
explizit für Mikrocontroller, wollte ich das als Theorie nehmen und das 
andere, vom Professor Schmitt, das geht auf Assembler und auf C ein und 
ist für die Anwendung auf Mikrocontroller geschrieben.
Werde dann noch mal mit dem Blinkdings anfangen und möglichst schnell 
mein Projekt (das ich mit Arduino machte) dann in C und Assembler 
realisieren. So denke ich eine gute Basis für weitere Richtungen zu 
bekommen. Und wenn ich das Projekt dann umschreiben will (muss ich 
sowieso noch), dann kann ich das gleich in einer "richtigen" Sprache 
machen.

Danke für die vielen Tipps!

Zu der Art wie ich lerne. Ich springe oft zwischen verschiedenen Sachen 
rum (bei der Elektronik ist ja auch noch die Hardware zu bewältigen) und 
aus der Summe (sogar aus den Pausen dazwischen) bildet sich dann das 
Verständnis dafür. Wenn ich immer nur auf einem sitze, dann ist immer 
die Gefahr da, dass ich nicht erst los fahre, sondern zunächst erst die 
"Synchronringe" ausbaue und sehe wie sie so aussehen, um dann das 
Getriebe ohne selbige auch noch ausprobieren zu wollen. Am Ende lande 
ich dann ganz schnell bei Adam und Eva.

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.