Hallo ich habe folgende Aufgabe zu meistern: Bei zahlreichen technischen Prozessen kommt es auf eine genaue Einhaltung vorgegebener Zeiten an. Auch dafür eignet sich der Mikrocontroller. Entwickeln Sie ein Timer-Programm. Die Zeit wird im Format „HH:MM:SS“ eingegeben. Von diesem Wert an soll der Timer nach Betätigen der Start-Taste rückwärts zählen und stets den aktuellen Wert anzeigen bis „0“ erreicht ist. Das ganze soll auf einem sogennanten MILES-Gerät laufen. http://sund.de/miles/handbuch/index2.htm Da ich keine Ahnung von Assembler habe, brauche ich eure Hilfe Im Anhang ist die .asm Datei mit meinem bisher geschriebenen Code. LG Chris
Ja wo hängst du denn? Wir können dir hier schlecht den ganzen Code schreiben. Grundsätzlich sind das ja einfach 3 Variabeln, die runtergezählt werden müssen? Also so quasi: if (sekunden > 0) sekunden--; if (sekunden == 0) { minuten--; sekunden = 59; } if (minuten == 0) { stunden--; minuten = 59; } Ich kann kein Assembler, aber aus der Syntax solltest du wohl verstehen was ich meine. Gruss
> Da ich keine Ahnung von Assembler habe, brauche ich eure Hilfe autsch Mit der Aussage suggerierst du dass wir das jetzt für dich machen sollen. Vor allem entsteht der Eindruck, dass du im Unterricht nicht aufgepasst hast... > Im Anhang ist die .asm Datei mit meinem bisher geschriebenen Code. Schön. Und jetzt? Beschreib mal schön, was nicht geht, was du erwartest, was es tatsächlich macht, und wo du konkret nicht weiterkommst. Du darfst ruhig mitmachen... Ralf
Christian Molecki schrieb: > Da ich keine Ahnung von Assembler habe, brauche ich eure Hilfe Habe ich gar nicht gesehen.. Hausaufgaben musst du wohl selbst machen oder zumindest einen Ansatz bringen, sonst hilft dir üblicherweise niemand.
etwas mehr als "hello world" sollte in Deinem Code aber schon an Vorarbeiten vorhanden sein.
Oh, da wird ja fast museumsreife Hardware recycled. Nix gegen 8051, aber EPROM-Simulator mit Batteriegepuffertem RAM ist seit 15 Jahren Out. Für deine Aufgabe solltest Du zunächst mal den Timer zur Zeiterzeugung verstehen. Timer 1 ist bei Dir für die serielle Schnittstelle verbraten, also Timer 0 nutzen. Den auf z.B. 50ms einstellen (Mode 1, Reload 65536-50000 - vorausgesetzt der Controller läuft mit 12MHz). Bei Überlauf einen Hilfszähler erhöhen, bis eine Sekunde voll ist. Danach Sekunde erniedrigen. Dest wir oben beschrieben. Zum Test gibtst Du die Zeit erstmal aufs Display. Beginne mit 3 Variablen für Stunde, Minute und Sekunde, die fest im Programm initialisiert werden. Die Tastatureingabe ist Dein 2. Problem... Also: Stunde data 07fh ; RAM-Adresse 0x7F für Stundenzähler Minute data 07eh ; RAM-Adresse 0x7E für Minutenzähler Sekunde data 0x7dh; dto. Init: mov Stunde, #0 ; erstmal kurze Zeiten... mov Minute, #1 mov Sekunde,#10 ; so sollte nach 10 Sekunden die Zeit auf 0:0:59 springen. Wenn das erstmal geht, dann testest Du Zeiten über 10Minuten und über 1 Stunde. Danach geht es an die Auswertung der Tastatur. Dies ist aber eine völlig neue Baustelle.
> Reisst mir doch nicht gleich den Kopf ab :(
Tut doch keiner. Lediglich Mitarbeit deinerseits und konkrete
Erklärungen/Infos zu dem was nicht tut bzw. was du nicht verstehst sind
gefordert :)
Ralf
>> Reisst mir doch nicht gleich den Kopf ab :( Du hast rein garnichts gemacht. >> Im Anhang ist die .asm Datei mit meinem bisher geschriebenen Code. Genau dieses Programm findet sich im Link den du auch noch selbst gesetzt hast. http://sund.de/miles/handbuch/index2.htm
So Leute, ich war mal fleissig :=) Ich habe den aktuellen Stand mal angehangen Bei dem Timer bin ich mir nicht sicher ob das so korrekt ist. Der Controller läuft mit 12 MHz. Ich lasse 10.000 x je 1µs inkrementieren um 10ms zu erreichen. Das lasse ich dann 100 wiederholen um 1 sek zu erreichen.
Bei Deinem Code würde ich vorschlagen, dass Du erstmal ein paar Blinkprogramme mit Unterprogrammaufruf ausprobierst... In den paar Zeilen sind ein paar elementare Hämmer drin: main: call delay ; Aufruf der Funktion Delay, erstmal ok. ; rest erstmal entsorgt jmp main delay: mov a, tmod ; Timer Modi laden ==> wozu denn, wenn Du das Ergebnis nie wieder nach tmod zurückschreibst? anl a, #0F0h ; nur Timer 0 ändern orl a, #001h ; auf Modus 1 ==> in welchem Mode ist damit also der Timer 1?? mov th1, #0xD8 ; Nachladewerte für 10 ms mov tl0, #0xF0 setb tr1 ; Start Timer ret ; Rücksprung ist beim Aufruf aus main ok wait_tick: jnb tf0, wait_tick ==> ok, irgendwann wird der Timer 0 überlaufen, falls Du ihn irgendwo gestartet hast (hast Du nicht) clr tr1 ; Timer anhalten ==> wozu? Timer 1 brauchst Du für die Baudrate clr tf1 ; Timer rücksetzen ==> wenn überhaupt, wäre hier tf0 gesetzt. djnz ticks, delay ; 100 mal ausführen ==> RUMMS! ein Sprung zu einem Unterprogramm... das endet mit ret und springt wohin zurück?? Jetzt ist der Controller abgestürzt. Was hast Du denn an Schulungsunterlagen/Büchern zum Thema 8051 und Assembler bisher gelesen?? Für die wichtigsten Grundlagen lies bitte erstmal den kompletten Assembler-Kurs hier durch: http://www.ipd.uka.de/~buchmann/microcontroller/index.htm Die Beispiele müssten auch für Dein Board passen. Die Ports 0 und 2 sind bei dem System ja für den exterenen Bus verbraten worden, da wirst Du auch P1 und P3 als Ein- und Ausgänge haben.
Ahoi, Vielen Dank Peter für den Link. Er war sehr hilfreich. Ich habe das Programm mal angepasst, muss aber noch die Ausgabe schreiben. Könnt ihr mal drüber schauen?
Von 8051 Assembler versteh ich nichts oder nicht viel. Aber du zählst falsch. AM Beispiel deiner Sekunden wird da gezählt ... 35 34 33 32 31 29 28 27 ... du hast die 30 ausgelassen. (Das hat auch Dr. Who weiter oben schon verbockt) Brenn es in einen µC und teste es. Da lernst du 100 mal mehr, als wenn du hier nach jeweils 15 Zeilen Code jemanden drüberschauen lässt.
Wenn ich mit Keil4 debuggen will, kommt der Fehler "*** error 65: access violation at C:0x0000 : no 'execute/read' permission" was muss ich da machen?
> was muss ich da machen?
Da gibt's verschiedene Möglichkeiten... Compilerhandbuch zum Fehler
lesen... Prüfen, was sich alles seit der letzten funktionierenden
Version geändert hat... Variante 1 hat mir beim Keil immer recht gut
geholfen.
Ralf
Dr.Who schrieb: > Karl Heinz Buchegger schrieb: >> (Das hat auch Dr. Who weiter oben schon verbockt) > > Warum? weil deine Programmskizze
1 | if (sekunden > 0) |
2 | sekunden--; |
3 | |
4 | if (sekunden == 0) |
5 | {
|
6 | minuten--; |
7 | sekunden = 59; |
8 | }
|
9 | |
10 | if (minuten == 0) |
11 | {
|
12 | stunden--; |
13 | minuten = 59; |
14 | }
|
zählt (am Beispiel der Sekunden) .. 3, 2, 1, 59, 58, .... d.h. du lässt die 0 aus (weil du die 0 nach dem Dekrement sofort zu 59 korrigierst)
1 | if (sekunden > 0) |
2 | sekunden--; |
3 | |
4 | if (sekunden == -1) // <--------- |
5 | {
|
6 | minuten--; |
7 | sekunden = 59; |
8 | }
|
9 | |
10 | if (minuten == -1) // <--------- |
11 | {
|
12 | stunden--; |
13 | minuten = 59; |
14 | }
|
Karl Heinz Buchegger schrieb: > d.h. du lässt die 0 aus (weil du die 0 nach dem Dekrement sofort zu 59 > korrigierst) Oh, stimmt. Ich habe jetzt überlegen müssen wie du darauf kommst, dass der Code 35 34 33 32 31 29 28 27 Zählen soll :P
Dr.Who schrieb: > Ich habe jetzt überlegen müssen wie du darauf kommst, dass der Code Er hat im Assembler Code genau denselben Fehler gemacht. Nur halt für Zehner und Einer getrennt. Ist aber nicht schlimm. Spätestens wenn die Anzeige dann das erste mal drann hängt, wärs aufgefallen :-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.