Hallo,
Nun wir haben hier in der Schule ein Problem. Wir sollen den AT Tiny
2313 mit Assembler Programmieren.
Aufgabenstellung:
Das Programm soll im Sekunden Takt eine 7 Segment anzeige hochzählen,
auf Tastendruck soll die Zählrichtung umgekehrt werden.
wir brauchen:
Hauptprogramm, Timer Interrupt, Taster Interrupt und Unterprogramm.
Bitte zu allem den Programmiercode mit Erklärung thank you.
mfg
Boris
> Nun wir haben hier in der Schule ein Problem. Wir sollen den AT> Tiny 2313 mit Assembler Programmieren.
Ich wünschte mir, sowas hätt's zu meiner Zeit schon an der Schule
gegeben.
> Aufgabenstellung:> Das Programm soll im Sekunden Takt eine 7 Segment anzeige> hochzählen, auf Tastendruck soll die Zählrichtung umgekehrt> werden. wir brauchen:> Hauptprogramm, Timer Interrupt, Taster Interrupt und> Unterprogramm. Bitte zu allem den Programmiercode mit Erklärung> thank you.
Lol... sonst noch Wünsche? Die Aufgabe war bestimmt nicht, jemanden zu
suchen, der es euch programmiert, sondern dies selbst zu tun, oder ist
es vielleicht eine Management-Schule?
Also: Wenn ihr spezifische Probleme habt, wird euch hier sicher
geholfen, aber euer Arbeit macht euch hier keiner. Ehrlich gesagt finde
ich so eine Frage schon ziemlich dreist und unverschämt.
@rolf
Is keine Schulaufgabe oder sowas, ist nur ein kleines Projekt, bei dem
wir halt überhaupt nicht wissen wie wir es hinbekommen sollen.
Wär halt cool wenn uns jemand helfen könnte.
>Wir sollen den AT Tiny 2313 mit Assembler Programmieren.
Das klingt aber schon nach einer Schulaufgabe
>wir brauchen:>Hauptprogramm, Timer Interrupt, Taster Interrupt und Unterprogramm.>Bitte zu allem den Programmiercode mit Erklärung thank you.
...Und das ist wirklich dreist und unverschämt!
Wir sind in einer Computerfachschule, in der wir in 6 wochen
abschlusspfüfung haben, es ist eine Abschlussübung, wir haben leider
kein plan. für eine schulaufgabe wär die zeit zu kurz, um die Frage ins
forum zu schreiben.
thx
mfg
Wenn du keinen Plan hast, dann hast du jede Menge Zeit, da du das Jahr
sehr wahrscheinlich wiederholen wirst.
6 Wochen sind aber eigentlich auch genug Zeit, um sich nochmal hinter
die Bücher zu klemmen.
Was willst du eigentlich nach dem Abschluss deiner Ausbildung werden?
Ich möchte bei Microsoft als Assembler Programmierer einsteigen und
nicht so ein freak sein der bei solchem wetter vorm pc hockt und
bescheuerte assembler fragen beantwortet.
wir wurden gleich zusammengeschissen mfg, wir werden das jahr
wiederholne logisch ja, und was bist du vom beruf?
Wenn du dann allmählich verstanden hast, worum's geht, kannst du bitte
gleich noch die Aufgabenstellung korrigieren. Ihr braucht keinen
Taster-Interrupt, sondern nur den Timer-Interrupt. Mechanische Tasten
prellen sowieso immer, daher ist es eine blöde Idee, sie einen
Interrupt auslösen zu lassen. Stattdessen fragt man deren Zustand im
Timer-Interrupt ab und meldet die Taste als gedrückt, wenn sie
z. B. über 20 ms eine stabile Lage signalisiert hat (Tasten
entprellen, Englisch: "key debouncing").
> überhaupt nicht wissen wie wir es hinbekommen sollen.
Wie immer beim Programmieren: in kleinen Stücken. Zerleg das Problem
in Teilprobleme:
. Timer-Interrupt; sinnvoll ist sowas wie 10 ms (du sollst ja die
Taste mit abfragen darin), wenn er 100mal getriggert hat, war eine
Sekunde um. Beim ersten Test wirst du in diesem Takt eine LED
blinken lassen, damit hast du den Timer komplett vom Rest (z. B.
der 7-Segment-Anzeige) entkoppelt.
. 7-Segment-Anzeige. Ich vermute, sie hat mehr als nur eine Stelle
und muss daher multiplex betrieben werden. Das setzt natürlich
einen funktionierenden Timer voraus, da man mit dem Interrupt
jeweils die nächste Stelle ausgeben kann (die 10 ms wären wieder ein
brauchbarer Wert hier, damit es nicht zu sehr flimmert). Fang mit
einer Stelle an, den Dekoder zu bauen, der muss aus einer Tabelle
dann die Segmentbelegung für die jeweilige Ziffer auslesen und auf
den Port ausgeben. Mal in der Annahme, dass die Segmente A bis G
auf den Bits 0 bis 6 eines Ports auszugeben sind und dass die
Segmente high-aktiv sind, dann wäre die Codierung für die Ziffer 0
also 0b00111111 oder 0x3F. Sind die Segmente low-aktiv, musst du
das Bitmuster negieren, entweder manuell (0b11000000 alias 0xC0,
wobei das Bit 7 hier "don't care" ist), oder gleich per
~-Operator
(oder was auch immer dein Assembler versteht -- du postest im
GCC-Forum, daher gehe ich vom GNU-Assembler aus, für den Atmel-
Assembler lies das bitte in dessen Manual nach).
. Taster-Erkennung in den Timer-Interrupt einbauen, damit du die
Zählrichtung umschalten kannst.
. Das Hauptprogramm ergibt sich von selbst. Das wird im Wesentlichen
so aussehen:
main: rcall ioinit
l1: rjmp l1 ; Interrupts are doing the rest
oder besser so:
main: rcall ioinit
l1: sleep
rcall l1
In ioinit sammelt sich alles, was an Peripheriegeräten zu
initialisieren ist, einschließlich der Aktivierung des nötigen
Interrupts. Da praktisch alle Aktivitäten im 10-ms-Rhythmus durch
den Timer-Interrupt erledigt werden, besteht das Hauptprogramm aus
einer Endlosschleife. SLEEP lässt den Prozessor Strom sparen (und
wird von einem Interrupt wieder verlassen), wobei das bei einer
LED-Anzeige sicher wenig von Belang ist. Kann aber nicht schaden,
sich das gleich mal grundlegen anzugewöhnen, dass die main loop die
CPU schlafen legt, wenn nix mehr zu tun ist.
OK, die Hausaufgaben müsst ihr natürlich selbst machen...
Nun ja, wenn ich dir das schreibe, dann hast du deine
Abschlussarbeit. Das Problem ist nur: Danach hast du immer
noch keinen Plan. Irgendwann wirst du einen Job bekommen,
und da hast immer noch keinen Plan. Vielleicht arbeitest
du eines Tages mit einem aus dem Forum zusammen und
hast immer noch keinen Plan. Du verdienst gutes Geld
(obwohl du immer noch keinen Plan hast) aber Dein
Partner macht die ganze Arbeit. Das will ich nicht
und ich denke auch sonst niemand in diesem Forum.
Was wir aber tun können: Wir können Dir helfen
das Pgm zu schreiben. Ist ja auch nicht sooo schwer.
(Eigentlich sollte jemand der in einer Computer-
fachschule seinen Abschluss macht, damit überhaupt
keine Probleme haben. Die Aufgabenstellung ist eher
in die Kategorie: 'Übung nach der 10 Unterrichtseinheit'
einzuordnen und nicht 'Abschlussarbeit'. Aber was solls)
Womit hast du denn konkret Probleme. Konzentrier dich mal
auf die Teile die du alleine hinkriegst.
Kannst du auf einer 7-Segment Anzeige die verschiedenen
Ziffern erzeugen?
Kannst du einen Timer aufsetzen?
Kannst du die Dinge so einrichten, dass der Timer im Sekunden-
rythmus irgendetwas macht (zb. eine stinknormale LED blinken
lassen)?
Kannst du einen Taster einlesen?
Du weisst wie man ein µC-Register hochzählt bzw. runterzählt?
Jeder einzelne dieser Punkte ist nicht besonders schwer.
Und die Einzelteile miteinander zu verbinden, ist auch nicht
gerade Raketentechnik.
>Wir sind in einer >>Computerfachschule<<, in der wir in 6 wochen>abschlusspfüfung haben, es ist eine Abschlussübung, wir haben leider>kein plan.
Harrrr!!
Was soll man dazu sagen? Vielleicht:
- DU bist Deutschland! (Nein! Hoffentlich nicht!)
- Öfter mal hingehen UND zuhören! (Ja!!)
- Nach der Computerfachschule in die Fachschule für normalen Umgangston
und Betragen (Ja, aber.. hab kein Plan, Alter.)
Naja, wir waren alle mal 15, oder? :)
@Boris
"Bitte zu allem den Programmiercode mit Erklärung thank you."
Da fehlen mir glatt die Worte.
"es ist eine Abschlussübung, wir haben leider kein plan."
Ist bei euch der Unterricht total ausgefallen ?
Irgendwas müssen doch die Lehrer die ganze Zeit gemacht haben.
Wenn davon wirklich nichts hängengeblieben ist, dann dürfte der
Computerkurs die falsche Wahl gewesen sein und Du solltest besser zu
Musik, Malerei o.ä. wechseln.
Ich fürchte, die große Mühe, die sich Jörg mit seinen Erklärungen
gegeben hat, wird total vergebens gewesen sein.
Im GCC-Forum sind auch nicht so viele zu finden, die sich gerne in
Assembler anstrengen wollen. Man hat ja schließlich C gelernt, um es
bequemer zu haben.
Peter