Forum: Mikrocontroller und Digitale Elektronik 8051 Kurzzeittimer


von Ch M. (Gast)


Angehängte Dateien:

Lesenswert?

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

von Dr.Who (Gast)


Lesenswert?

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

von Ralf (Gast)


Lesenswert?

> 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

von Dr.Who (Gast)


Lesenswert?

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.

von Joerg L. (Firma: 100nF 0603 X7R) (joergl)


Lesenswert?

etwas mehr als "hello world" sollte in Deinem Code aber schon an 
Vorarbeiten vorhanden sein.

von Bernhard S. (b_spitzer)


Lesenswert?

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.

von Ch M. (Gast)


Lesenswert?

Reisst mir doch nicht gleich den Kopf ab :(

von Ralf (Gast)


Lesenswert?

> 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

von Bernd N. (Gast)


Lesenswert?

>> 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

von Ch M. (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Bernhard S. (b_spitzer)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?


von Ch M. (Gast)


Angehängte Dateien:

Lesenswert?

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 Karl H. (kbuchegg)


Lesenswert?

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.

von Ch M. (Gast)


Lesenswert?

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?

von Ralf (Gast)


Lesenswert?

> 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

von Dr.Who (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> (Das hat auch Dr. Who weiter oben schon verbockt)

Warum?

Gruss

von Karl H. (kbuchegg)


Lesenswert?

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
 }

von Dr.Who (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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 :-)

von Ch M. (Gast)


Lesenswert?

Ich lasse jetzt bis -1 zählen

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.