Zum Inhalt springen

Stoppuhr in Assembler


Empfohlene Beiträge

Ich muss fürs Abitur eine Jahresarbeit machen und bei der muss ich eine Stoppuhr in Assembler programmieren, mit RIDE!!

Ich habe schon Timer und Interrupter soweit schon programmiert, aber ich weiß nicht wie man die Matrix-Tastatur und die LCD-Anzeige ansteuert!

Könnte mir da jemand helfen?

Ist wichtig für mein Abi und ich habe nurnoch eine Woche dafür Zeit

Das ist das was ich bisjetzt habe, ist das bis jetzt richtig? und könnte das jemand vervollständigen?

;timer2.a51

;Timer0-Interrupt alle 65 ms

;Ausgabe Lauflicht LEDs an P2

$include (reg52.inc)

ORG 0000h

ljmp init ;Das eigentliche Programm beginnt hinter

ORG 000Bh ;den Interrupt-Einsprung-Adressen

ljmp count_isr

;******* Initialisierung *************************************************************************************

init: mov TMOD, #00000010b

mov TL0, #6d

mov TH0, #6d

mov TCON, #00010000b

SETB ET0

SETB EA

;******** Hauptprogramm *************************************************************************

haupt: sjmp haupt ;Warten auf Interrupts

count_isr: INC R0

CJNE R0, #4d, marke1

MOV R0, #0h ;r0 auf 0 zurück setzen

INC R1 ;1/1000sec

CJNE R1, #10d, marke1 ;solange r1 zählen bis 10mal durchgelaufen und somit 1/100sec gedauert hat

MOV R1, #0h ;r1 auf 0 zurück setzen

INC R2 ;1/100

CJNE R2, #10d, marke1 ;solange r2 zählen bis 10mal durchgelaufen und somit 1/10sec gedauert hat

MOV R2, #0h ;r2 auf 0 zurück setzen

INC R3 ;1/10

CJNE R3, #10d, marke1 ;solange r3 zählen bis 10mal durchgelaufen und somit 1sec gedauert hat

;r3 und somit die 1/10sec ausgeben

MOV R3, #0h ;r3 auf 0 zurück setzen

INC R4 ;sec

CJNE R4, #60d, marke1 ;solange r4 zählen bis 60mal durchgelaufen und somit 1min gedauert hat

;r4 und somit die sec ausgeben

MOV R4, #0h ;r4 auf 0 zurück setzen

INC R5 ;min

CJNE R5, #60d, marke1 ;solange r5 zählen bis 60mal durchgelaufen und somit 1h gedauert hat

;r5 und somit die min ausgeben

MOV R5, #0h ;r5 auf 0 zurück setzen

INC R6 ;min

CJNE R6, #60d, marke1 ;solange r6 zählen bis 24mal durchgelaufen und somit 1d gedauert hat

;r6 und somit die h ausgeben

MOV R6, #0h ;r6 auf 0 zurück setzen

marke1: RETI

END

Zu den Hardwareangaben:

Mikrocontroller 8051

LCD 16 Zeichen Breit und 2 Zeilen hoch

Normale Matrix-Tastatur 0-9 Zeichen und Stern und Raute

Danke schonmal im Vorraus!

PS: Falls es im Falschen Thread ist, dann bitte verschieben diesen Post in den richtigen Bereich, wusste nicht wo es hin gehört!!

mfg

Michael

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hy,

also heut abend hab ich kein kopf mehr dafür noch alles zu machen.

muss mir den rest erst mal in ruhe anschauen aber sieht eigentlich schonmal ganz gut aus

aber so weit schonmal:

-dein einzeiler "haupt" ist eine endlos schleife,du solltest keine marke:rolleyes:

benutzen, du solltest "sjmp $" benutzen um auf den

interrupt zu warten (ist besser so)

-hast du vielleicht eine includedatei mit unterprogrammen für den LCD?

so müsstest du den wert nur in das vom unterprogramm verwendete register schreiben und das unterprogramm aufrufen

-für was brauchst du denn eine tastatur für eine uhr?:confused:

aber hier der code dafür (als u-prog), musst eben nur noch den port umstellen bei mir ist das p0 wie du ja siehst

start:

MOV P0,#1110$1111b

JB P0.0,m2

MOV p1,#0000$0110b

m2:

MOV P0,#1110$1111b

JB P0.1,m3

MOV p1,#0101$1011b

m3:

MOV P0,#1110$1111b

JB P0.2,m4

MOV p1,#0100$1111b

m4:

CALL sek

MOV P0,#1101$1111b

JB P0.0,m5

MOV p1,#0110$0110b

m5:

MOV P0,#1101$1111b

JB P0.1,m6

MOV p1,#0110$1101b

m6:

MOV P0,#1101$1111b

JB P0.2,m7

MOV p1,#0111$1101b

m7:

CALL sek

MOV P0,#1011$1111b

CALL sek

JB P0.0,m8

MOV p1,#1000$0111b

m8:

MOV P0,#1011$1111b

JB P0.1,m9

MOV p1,#1111$1111b

m9:

MOV P0,#1011$1111b

JB P0.2,mstern

MOV p1,#1110$1111b

mstern:

CALL sek

MOV P0,#0111$1111b

CALL sek

JB P0.0,m0

MOV p1,#1011$1111b

m0:

MOV P0,#0111$1111b

JB P0.1,mraute

MOV p1,#33h

mraute:

MOV P0,#0111$1111b

JB P0.2,m1

MOV p1,#37h

m1:

; CALL sek

JMP start

sek: MOV 79H,#1

zsek1: MOV 78H,#2

zsek2: MOV 77H,#4

DJNZ 77H,$

DJNZ 78H,zsek2

DJNZ 79H,zsek1

RET

bis dann

Link zu diesem Kommentar
Auf anderen Seiten teilen

wenn ich dir beim LCD noch helfen soll, dann sollte ich wissen ob du ein

schon vorhandenes u-programm hast (z.b. von deiner schule eins erhalten hast):confused:

bei mir geht das z.b. so

um eine zeichenkette auf dem LCD auszugeben

;lcd-initialisierung //wird dir aber wahrscheinlich nichts bringen,da ich ja ein anderes u-prog habe

call init ;lcd-initialisierung

call dis_on1 ;einstellungen für ohne blinkenden cursor

call display

call clear ;bildschirm löschen

mov r5,#0h ;

call pos ;positionsangabe

mov dptr,#text ;springt zur marke text und holt sich diesen ab, indem die

zeichebfolge in den datapointer(dptr) geschrieben wird

call lcdsend ;sendet zeichenfolge

text:

db "von goblack3",0 ;text der angezeigt werden soll

;um ein einzelnes zeichen anzuzeigen

mov r0,#48d ;48d ist die ziffer 0 im ascii-code

m:

call zeichen

call sek

inc r0

sjmp m

achtung: den teil mit db "text",0 musst du ganz am ende des programms hinschreiben, aber natürlicch vor den include-dateien und dem end:mod:

Link zu diesem Kommentar
Auf anderen Seiten teilen

also mein etziges prob ist

wie schreib ich den dass rein dass zb r3 also die 1/10sek ausgeben werden bzw auch r4 r5 usw. eben alles zusammen...und wie macht man da ne leerstelle damit zwischen sekunde minute usw. immer eine zeile frei bleibt? ich habs etz mal so gemacht könnte das funktionieren wäre aber glaub ohne leerstellen und zeigt es dann auch alles gleichzeitig an?

INC R5 ;1/10

CJNE R5, #10d, marke1 ;solange r5 zählen bis 10mal durchgelaufen und somit 1sec gedauert hat

MOV anzeigen, R5 ;r5 und somit die 1/10sec ausgeben

MOV R5, #0h ;r5 auf 0 zurück setzen

und wie mach ich dass damit man zb auf 1drückt und die stoppuhr anfängt und wenn man 2drückt stoppt...bzw. dass man eben dass interrupt starten lässt und stoppen

wie gesagt unterprogs hab ich für alles...sollt ich die auch ganz posten?

mfg michael

Link zu diesem Kommentar
Auf anderen Seiten teilen

hy,

-ja schick mir die u-progs mal an goblack3@web.de

-das mit dem leerzeichen da schau mal im ascii-code (sehr hilfreich bei

assembler) z.b. bei: http://www.inf.hs-anhalt.de/Service/ASCII-Code.htm

Leerzeichen ist: 32d oder 20h, jenachdem welche schreibform du verwendest

ich bevorzuge normalerweise die hexschreibform(ist leichter umzurechnen)

-also zu dem "aber ka wie ich die einbauen kann bzw.was ich

hinschreiben muss damit was ausgegeben wird..."

du musst dann ein einzelnes zeichen ausgeben:

;um ein einzelnes zeichen anzuzeigen

mov r0,#48d ;48d ist die ziffer 0 im ascii-code

m:

call zeichen

call sek

inc r0

sjmp m

du musst das ja in einer schleife durchlaufen lassen,ist ja klar bei der stoppuhr

da du ja hochzählst.du schreibst den momentanen wert der gerade angezeigt werden soll also z.b. jede einzelne sekunde nach dieser zählschleife in das register, das dafür vorgesehen ist, um ein einzelnes zeichen auszugeben.

bei mir ist das r0,wie du ja siehst.

ich weiß jetzt nur die adresse von r5(in hex)nicht auswendig,musst eben in deinen datenblättern nachschauen,da man ja nicht "mov r0,r5" machen darf sowiet ich gerade weiß,aber mov r0,hex-adresse von r5,

also z.b.:

marke:

INC R3

CJNE R3, #10d, marke

mov r0,#hex-adresse von r3

call zeichen ;zeichen ist ein u-prog das ich benutzte

MOV R3, #0h ;r3 auf 0 zurück setzen

-als nächstes:wieso machst du immer CJNE R4, #60d, marke1 z.b. ?

die schleife läuft ja so immer nur einmal durch und springt dann zurück ins hauptprogramm.

ich würde es so machen:

marke:

INC R1 ;1/1000sec

CJNE R1, #10d, marke ;solange r1 zählen bis 10mal durchgelaufen und somit 1/100sec gedauert hat

MOV R1, #0h ;r1 auf 0 zurück setzen

marke1:

INC R2 ;1/100

CJNE R2, #10d, marke1 ;solange r2 zählen bis 10mal durchgelaufen und somit 1/10sec gedauert hat

MOV R2, #0h ;r2 auf 0 zurück setzen

marke2:

INC R3 ;1/10

CJNE R3, #10d, marke2 ;solange r3 zählen bis 10mal durchgelaufen und somit 1sec gedauert hat

mov r0,#hex-adresse von r3

call zeichen ;zeichen ist ein u-prog das ich benutzte

MOV R3, #0h ;r3 auf 0 zurück setzen

marke3:

INC R4 ;sec

CJNE R4, #60d, marke3 ;solange r4 zählen bis 60mal durchgelaufen und somit 1min gedauert hat

mov r0,#hex-adresse von r4

call zeichen ;zeichen ist ein u-prog das ich benutzte

MOV R4, #0h ;r4 auf 0 zurück setzen

marke4:

INC R5 ;min

CJNE R5, #60d, marke4 ;solange r5 zählen bis 60mal durchgelaufen und somit 1h gedauert hat

mov r0,#hex-adresse von r5

call zeichen ;zeichen ist ein u-prog das ich benutzte

MOV R5, #0h ;r5 auf 0 zurück setzen

marke5: das läuft doch 60*mal durch und nicht ?

INC R6 ;min _/ /

CJNE R6, #60d, marke5 ;solange r6 zählen bis 24mal durchgelaufen und somit 1d gedauert hat

mov r0,#hex-adresse von r6

call zeichen ;zeichen ist ein u-prog das ich benutzte

MOV R6, #0h ;r6 auf 0 zurück setzen

so ich hoffe mal ich hab nichts vergessen oder falsch gemacht:)

wenn doch dann sorry.

achja tut das mit der matrix-tastatur denn überhaupt, zum testen kannste das ja einfach nur auf der 7-segment-anzeige machen, falls du auf deinem board/platine eine drauf hast.

ich hab den atmel t89c51cc01 mit 8051-Architektur

ach und nerven tut das nicht

gruß daniel

Link zu diesem Kommentar
Auf anderen Seiten teilen

also danke mal

aber ist dass etz nicht so dass wenn ich es so mache:

marke0:

CJNE R0, #4d, marke1

MOV R0, #0h ;r0 auf 0 zurück setzen

marke:

INC R1 ;1/1000sec

CJNE R1, #10d, marke ;solange r1 zählen bis 10mal durchgelaufen und somit 1/100sec gedauert hat

MOV R1, #0h ;r1 auf 0 zurück setzen

marke1:

INC R2 ;1/100

CJNE R2, #10d, marke1 ;solange r2 zählen bis 10mal durchgelaufen und somit 1/10sec gedauert hat

MOV R2, #0h ;r2 auf 0 zurück setzen

müsste ich nicht immer auf marke0 zurück gehen da sonst doch r1, r2 usw. zu schnell erhöht wird. sprich es läuft 4mal bei marke0 durch somit wird r1 um eins erhöht und ist es ungleich 10 wird r1 wieder um eins erhöht ist dass dann nicht zu schnell es sollte ja wieder genau 1000µs dauern damit ich auf die richtige zeit hab...

achja und warum:

mov r0,#hex-adresse von r5

hex von adresse r5 ist klar aber warum r0 bzw. muss ich dann in dem unterprog vom lcd prog r0 irgendwie als ausgabe definieren?

und dass mit der matrix tastatur müssen wir machen genau so dass lcd display dass prob ist ich muss dass morgen eingeltich abgeben und vortragen^^

ach und noch was wir haben nix bekommen wo die hex adressen von r1 r2 usw. stehen hast du ne ahnung wo man die her bkeommen könnte? weil der lehrer hat erstens überhaupt kein plan und hilft net und ich seh ihn vor der abgabe nimmer;-)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...