Advertisement
Guest User

Untitled

a guest
May 19th, 2017
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. Home
  3. AVR
  4. ARM
  5. MSP430
  6. FPGA, CPLD & Co.
  7. DSP
  8. Elektronik allgemein
  9. Forum
  10. µC & Elektronik
  11. Analogtechnik
  12. FPGA, VHDL & Co.
  13. DSP
  14. Compiler & IDEs
  15. Projekte & Code
  16. Markt
  17. Platinen
  18. Mechanik & Werkzeug
  19. HF, Funk & Felder
  20. Haus & Smart Home
  21. PC-Programmierung
  22. PC Hard- & Software
  23. Ausbildung & Beruf
  24. Offtopic
  25. Webseite
  26. Artikelübersicht
  27. Letzte Änderungen
  28. Forum: Mikrocontroller und Digitale Elektronik
  29. Projekt Stoppuhr in 8051 Assembler
  30. Forenliste Threadliste Neuer Beitrag Suchen Anmelden Benutzerliste Bildergalerie Hilfe Login
  31. Projekt Stoppuhr in 8051 Assembler
  32. Autor: Clemens (Gast)
  33. Datum: 12.06.2006 15:42
  34. Hallo!
  35.  
  36. Zu meinem verwendeten System:
  37. Ich habe ein Mikrocontroller System mit einen 12Mhz Mikrocntroller.
  38. Die Ausgabe der Stoppuhr erfolgt auf der BCD-7-Segment Anzeige (welche
  39. an Port 1 und 2 des Mikrocontrollers angeschlossen ist). Außerdem ist
  40. eine Schalterplatine an Port 0 angeschlossen für Zusatzfunktionen.
  41.  
  42. Zur besseren Veranschaulichung können diese einzelne Elemente meines
  43. Systems untern folgenden Links angeschaut werden:
  44. Mikroconroller:
  45. http://dbi-design.de/clemens/projekt/mikrocontroller.jpg
  46. BCD-7-Segment Anzeige:
  47. http://dbi-design.de/clemens/projekt/bcd_7_seg.jpg
  48. Tasterplatine: http://dbi-design.de/clemens/projekt/taster.jpg
  49.  
  50. Mit diesem System will ich nun eine Stoppuhr in Assembler realisieren.
  51. Die Stoppuhr soll folgende Funktionen aufweisen:
  52. 1. Start
  53. 2. Stopp
  54. 3. Speichern einer gestoppten Zeit
  55. 4. Abrufen einer gespeicherten Zeit
  56.  
  57. Diese 4 Funktionen sollten für die Schalter aufgerufen werden können.
  58.  
  59. Das Stoppuhr Programm muss in Assembler geschrieben werden und muss
  60. ebenso mit Interrupts arbeiten.
  61. Dies ist vorgeschrieben daran kann ich nichts ändern. Tipps für andere
  62. Sprachen oder ohne Interrupts bringen mir deswegen relativ wenig,
  63. trotzdem danke schonmal!
  64.  
  65. Nun zu meinem eigenlichen Problem. Ich habe natürlich schon angefangen
  66. mit diesem Projekt komme aber einfach nichtmehr weiter.
  67. Ich steh irgendwie total auf dem Schlauch wie man gerne zu sagen pflegt
  68. ich hoffe deswegen auf eure Hilfe.
  69.  
  70.  
  71. Vielen Dank schoneinmal für Tipps oder Programmänderungsvorschläge!
  72.  
  73. --------------------------------------------------------------------
  74. Nun das bisherige Programm:
  75.  
  76.  
  77. $include (reg52.inc)
  78.  
  79. org 0000h
  80.       MOV   R0,#0    ; Zähler
  81.  
  82.       MOV   R1,#0
  83.       MOV  R2,#0
  84.             ; bestimmt welche der Anzeigen aktiv ist
  85.       MOV   R3,#0
  86.       MOV  R4,#0   ; für Segment rechts          Hundertstel Zehner
  87.       MOV  R5,#0  ; für Segment Mitte rechts    Sekunden Einer
  88.       MOV  R6,#0    ; für Segment Mitte links     Sekunden Zehner
  89.       MOV  R7,#0    ; für Segment links           Minuten Einer
  90.  
  91.  
  92. loop:    ; hier wird zukünftig die neue Uhrzeit berechnet
  93.          call neueUhrzeit    ;aufrufen Hauptprogramm neueUhrzeit
  94.       call ausgabe         ;aufrufen Ausgabe Programm
  95.       call wait     ; aufrufen Warte Programm, wartet 4 ms
  96.       LJMP loop     ; aufrufen loop
  97.  
  98.  
  99. neueUhrzeit:
  100.  
  101.          INC R1        ; erhoehe Register 1
  102.          CJNE R1,#250d,weiter      ;Springe nach weiter wenn der Inhalt
  103. von R1 ungleich 250d ist
  104.          MOV  R1,#0d            ;Lade Register 1 mit dem Wert 0
  105.  
  106.  
  107.          INC R2              ; erhoehe Register 2
  108.          CJNE R2,#10d,weiter      ;Springe nach weiter wenn der Inhalt
  109. von
  110. R2 ungleich 10d ist
  111.          MOV R2,#0d            ;Lade Register 2 mit dem Wert 0
  112.          INC R3              ; erhoehe Register 3
  113.          CJNE R3,#10d,weiter      ;Springe nach weiter wenn der Inhalt
  114. von
  115. R3 ungleich 10d ist
  116.          MOV R3,#0d            ;Lade Register 3 mit dem Wert 0
  117. mSek:    INC R4              ; erhoehe Register 4
  118.          CJNE R4,#10d,weiter      ;Springe nach weiter wenn der Inhalt
  119. von
  120. R4 ungleich 10d ist
  121.          MOV R4,#0d            ;Lade Register 4 mit dem Wert 0
  122.          INC R5              ; erhoehe Register 5
  123.          CJNE R5,#10d,weiter      ;Springe nach weiter wenn der Inhalt
  124. von
  125. R5 ungleich 10d ist
  126.          MOV R5,#0d            ;Lade Register 5 mit dem Wert 0
  127. mMin:    INC R6              ; erhoehe Register 6
  128.          CJNE R6,#6d,m2          ;Springe nach m2 wenn der Inhalt von R6
  129. ungleich 6d ist
  130.          CJNE R7,#10d,m2        ;Springe nach m2 wenn der Inhalt von R7
  131. ungleich 0d ist
  132.          MOV R6,#0            ;Lade Register 6 mit dem Wert 0
  133.          MOV R7,#0            ;Lade Register 7 mit dem Wert 0
  134.  
  135.  
  136.  
  137. m2:      CJNE R6,#10,weiter      ;Springe nach weiter wenn der Inhalt
  138. von
  139. R6 ungleich 10 ist
  140.       MOV R6,#9            ;Lade Register 6 mit dem Wert 9
  141.       INC R7              ; erhoehe Register 7
  142.       LJMP weiter            ;aufrufen von weiter
  143.  
  144. weiter:  RET                ;Rücksprung aus dem Unterprogramm
  145.  
  146. ;Unterprogramm wait benötigt genau 4ms bei 12MHz
  147. wait:    PUSH  01
  148.       PUSH  02
  149.       MOV  R1,#1
  150. wait1:  MOV  R2,#164
  151. wait2:  DJNZ  R2,wait2
  152.       NOP
  153.       DJNZ  R1,wait1
  154.       NOP
  155.       NOP
  156.       NOP
  157.       POP  02
  158.       POP  01
  159.       RET
  160.  
  161.  
  162. ausgabe:  INC   R0
  163.       CJNE  R0,#04,rechts
  164.       MOV  R0,#0
  165.  
  166. rechts:  CJNE  R0,#0,mire
  167.       MOV  A,R4
  168.       CALL  BCD7Seg
  169.       MOV  P1,A
  170.       MOV  P2,#00001110b
  171. mire:    CJNE  R0,#1,mili
  172.       MOV  A,R5
  173.       CALL  BCD7Seg
  174.       MOV  P1,A
  175.       MOV  P2,#00001101b
  176. mili:    CJNE  R0,#2,links
  177.       MOV  A,R6
  178.       CALL  BCD7Seg
  179.       MOV  P1,A
  180.       MOV  P2,#00001011b
  181. links:  CJNE  R0,#3,m1
  182.       MOV  A,R7
  183.       CALL  BCD7Seg
  184.       MOV  P1,A
  185.       MOV  P2,#00000111b
  186. m1:    RET
  187.  
  188. ; Wandelt vom BCD-Code in den 7-Segment-Code
  189. BCD7Seg:  INC  A
  190.       MOVC  A,@A+PC
  191.       RET
  192.       DB  3Fh, 06h, 5Bh, 4Fh, 66h, 6Dh, 7Dh, 07h, 7Fh, 6Fh
  193.  
  194.  
  195.  
  196.  
  197. end
  198.  
  199. Markierten Text zitieren Antwort
  200. Re: Projekt Stoppuhr in 8051 Assembler
  201. Autor: Peter Dannegger (peda)
  202. Datum: 12.06.2006 17:10
  203. Wie wärs, wenn Du erstmal nen Programmablaufplan schreibst, also verbal
  204. ausdrückst, was wann und wie zu tun ist.
  205.  
  206.  
  207. Eine Aufgabe in Code umzusetzen ist leicht.
  208.  
  209. Das Schwierige am Programmieren ist jedoch, erstmal diese Aufgaben
  210. sinnvoll zu formulieren.
  211.  
  212.  
  213. Peter
  214.  
  215. Markierten Text zitieren Antwort
  216. Re: Projekt Stoppuhr in 8051 Assembler
  217. Autor: Stephan Henning (stephan-)
  218. Datum: 12.06.2006 21:18
  219. @Clemens,
  220.  das wichtigste fehlt ja wohl..oder ????
  221. Was ist denn mit Timer ?????
  222. Normalerweise läßt man den bei Betätigung einer Taste laufen.
  223. Incrmentiert im Interrupt eine Variable ( RAM Zelle) auf.
  224. Überträge auf die nächtse und so weiter. Ne Kette eben.
  225. Allerdings wirst Du wohl um Interruptprioritäten nicht herum kommen.
  226. Die Anzeige ist ja nicht so wichtig wie die exakte Erfassung der Zeit.
  227. Den LED Multiplex inkl. oder exkl. Decoder kann der 2. Timer machen.
  228.  
  229. Wie Peter sagt, Dir fehlt das eigentliche Konzept.
  230.  
  231. So denn..... ran ans Schmierblatt....
  232.  
  233. Markierten Text zitieren Antwort
  234. Re: Projekt Stoppuhr in 8051 Assembler
  235. Autor: Jasmin (Gast)
  236. Datum: 12.06.2006 22:14
  237. Clemens,
  238.  
  239. in einer Elektor Ausgabe der letzten 2 Jahre war eine solche Stoppuhr
  240. realisiert. Hier kannst Du Dich einmal konzeptionell befruchten lassen,
  241. denn da scheinst Du etwas Nachholbedarf zu haben.
  242. Der "Schwierigkeitsgrad" einer solchen Aufgabenstellung ist nicht
  243. sehr anspruchsvoll, wenn man sich etwas einliest und vor allem einen
  244. "Plan" entwickelt. Die Zutaten sind ja schon genannt:
  245. Timer geschickt initialisieren (Quarztakt beachten, denn die Uhr soll
  246. ja nicht zum Pfandhaus gehen), Interruptserviceroutine (fehlt bei Dir
  247. völlig) für den Timer (Kurz halten, am besten mit einem "Flag"
  248. arbeiten) drumherum baust Du dann schön Dein Zählwerk auf !! In der
  249. Hauptroutine kannst Du dann prima Deine 7-Segmentanzeige (Multiplexen
  250. oder statisch) versorgen und auch die Tasten befragen.
  251. Hier mußt Du selbst bewerten ob ein paar Mikrosekunden Verzögerung bis
  252. zur Abfrage des Tastenstatus ein Problem darstellen. Du kannst die
  253. Tasten natürlich auch per Interrupt befragen, aber ein paar
  254. Befehlszyklen gehen Dir immer verloren, wahrsagen können die Controller
  255. leider nicht.
  256.  
  257. Hau rein !
  258.  
  259.  
  260. D.S.
  261.  
  262. Markierten Text zitieren Antwort
  263. Re: Projekt Stoppuhr in 8051 Assembler
  264. Autor: Clemens (Gast)
  265. Datum: 19.06.2006 15:59
  266. Hallo
  267.  
  268. Danke schoneinmal für die Tipps.
  269. Also die obige Datei habe ich bekommen und mit der soll ich Arbeiten.
  270. Ehrlich gesagt versteh ich das mit dem Interrupt allerdings selbst
  271. nicht so ganz. Kennt jemand von euch eine gute Erklärung dazu?
  272. Das würde mir auch sehr weiterhelfen.
  273.  
  274. Ansonsten habe ich mittlerweile mal einen sehr allegemeinen
  275. Programmablaufplan erstellt:
  276. http://dbi-design.de/clemens/projekt/pap.jpg
  277.  
  278. Ich weiß allerdings nicht wie ich das Abrufen der gespeicherten Zeit
  279. bewerkstelligen soll.
  280.  
  281. Markierten Text zitieren Antwort
  282. Re: Projekt Stoppuhr in 8051 Assembler
  283. Autor: Stephan Henning (stephan-)
  284. Datum: 19.06.2006 16:17
  285. naja geht doch schon.
  286. So nun brauchst Du noch nen Timer,der Dir ne Zeitbasis macht. zB alle
  287. 100ms oder alles 10ms etc.pp
  288. Dazu nimmt man Timer 1 oder Timer 0.
  289. Deine Quarzfrequenz kennst Du ja oder wählst sie entsprechend zB 12
  290. Mhz.
  291. Dann hast du 1uS Zykluszeit, damit läßt sich prima arbeiten, da der
  292. 8051 12 Takte für einen Zyklus ( Befehl) braucht.
  293. Der Start des Stoppuhrprogramms macht nichts anderes als einfach den
  294. Timer zu starten. Und bei Stopptaste einfach den Timer stoppen.
  295. Wie gesagt, das Schlüsselwort lautet "Timer" !!
  296.  
  297. Beim Überlauf löst der Timer nen Interrupt (Programmunterbrechung) aus.
  298. Im Interrupt muß Du nur noch ne Variable oder Speicherstelle hochzählen
  299. und wieder raus. Wenns ganz genau sein soll dann setzt Du im Interrupt
  300. nur nen Flag und springst mit RETI gleich wieder raus.
  301. Der Rest siehe oben....
  302.  
  303. Markierten Text zitieren Antwort
  304. Re: Projekt Stoppuhr in 8051 Assembler
  305. Autor: norad (Gast)
  306. Datum: 21.06.2006 17:00
  307. ähhmm!
  308.  
  309. Das Programm sollte nicht gerade bei Adresse 0000h starten, weil gleich
  310. dahinter ja die Interrupt Einsprungadressen befinden.
  311. Könnte  so unerwünschte effekte geben.
  312.  
  313.  
  314.  
  315. Lieber mal so machen:
  316.  
  317. org  0000h
  318.      LJMP Start
  319. ...
  320.  
  321. ;Ab Adresse 03h Hardware Einsprung Aderessen für Interrupt
  322. org  000Bh              ;Interrupt Timer 0
  323.      LJMP ISR_Timer0
  324.  
  325. ...  oder
  326.  
  327. org 001bh              ;Interrupt Timer 1
  328.     LJMP ISR_Timer1
  329.  
  330. ...
  331. ...
  332.  
  333. von mir aus ab Adresse 100 oder höher egal
  334.  
  335. org   0100h
  336.  
  337. Start:  ...
  338.         ...
  339.         mov  TMOD,#00000010b  ;Timer0 aktivieren
  340.   mov  TL0,#0
  341.   mov  TH0,#0
  342.   SETB  EA
  343.   SETB  ET0
  344.   clr  TF0
  345.   SETB  TR0
  346.         LJMP Start
  347.  
  348. ISR_Timer0:
  349.          clr  TF0
  350.          ...
  351.          ...
  352.  
  353.          RETI    ;Return Interrupt
  354.  
  355. oder
  356.  
  357. ISR_Timer1:
  358.        clr  TF1
  359.        ...
  360.        ...
  361.        RETI   ; Return Interrupt
  362.  
  363.  
  364.  
  365. Gruß norad
  366.  
  367. Markierten Text zitieren Antwort
  368. Re: Projekt Stoppuhr in 8051 Assembler
  369. Autor: buz11 (Gast)
  370. Datum: 21.06.2006 22:13
  371. http://www.erikbuchmann.de/  ( Codegenerator! )
  372.  
  373. http://www.goblack.de/desy/mc8051chip/index.html
  374.  
  375. Markierten Text zitieren Antwort
  376. Re: Projekt Stoppuhr in 8051 Assembler
  377. Autor: Oliver (Gast)
  378. Datum: 22.06.2006 14:53
  379. Wer bitte schreibt heute noch Programme in Assembler?
  380.  
  381. Markierten Text zitieren Antwort
  382. Re: Projekt Stoppuhr in 8051 Assembler
  383. Autor: Stephan Henning (stephan-)
  384. Datum: 22.06.2006 17:59
  385. der,
  386. der Ahnung davon hat und Recourcenaufteilung der MCU nicht einem
  387. Compiler überlassen will !
  388.  
  389. Markierten Text zitieren Antwort
  390. Re: Projekt Stoppuhr in 8051 Assembler
  391. Autor: Oliver (Gast)
  392. Datum: 23.06.2006 00:05
  393. Sorry Stephan.
  394. Aber es bleibt dabei, heute schreibt niemand mehr in Assembler. Zu
  395. mindestens Keiner der der ernst genohmmen werden will.
  396.  
  397. PS.: Bei mir in der Firma & Kunden hat es sich immer weider
  398. rausgestellt das ein Prozessor zu klein/schwach war und er gewechselt
  399. werden musste. Wie geht den das in Assembler?
  400.  
  401. Also bitte nie Assembler, Ihr macht euch das leben nur unnötig schwer.
  402.  
  403. Markierten Text zitieren Antwort
  404. Re: Projekt Stoppuhr in 8051 Assembler
  405. Autor: Stephan Henning (stephan-)
  406. Datum: 23.06.2006 09:20
  407. jedem das Seine ......
  408.  
  409. Markierten Text zitieren Antwort
  410. Re: Projekt Stoppuhr in 8051 Assembler
  411. Autor: Clemens (Gast)
  412. Datum: 25.06.2006 14:00
  413. Mittlerweile habe ich das Programm ergänzt, so gut es ging.
  414. Könntet ihr das mal durchschauen?
  415. Wäre nett!
  416.  
  417.  
  418. $include (reg52.inc)
  419.  
  420. Starttaster    bit P0.1
  421. Resettaster    bit P0.2
  422.  
  423.  
  424. org 0000h
  425.   LJMP start
  426.  
  427.  
  428.  
  429.  
  430. ;Einsprungadresse Interrupt-Serviceroutine für Timer 0
  431. org 000Bh
  432.       LJMP isrTimer0
  433.  
  434.  
  435.  
  436. org 0100h
  437. Start:      SETB P1.0      ;Taster an P1, um Port als Eingang zu haben
  438. abfrage:    MOV a,p1
  439.             JB  a.0,abfrage
  440.       Hilfsflag ist 1? Wenn ja dann
  441.       SETB TR0
  442.       wenn nein
  443.       SETB Taster
  444.       CALL neueUhrzeit
  445.       CALL ausgabe
  446.       CALL wait
  447.       JMP abfrage
  448.  
  449.  
  450. initRegister:
  451.       MOV  R0,#0      ;bestimmt welche der Anzeigen aktiv ist
  452.       MOV  R1,#0       ;Zähler von o bis 249 -->4ms*250 = 1 Sec
  453.  
  454.       MOV  R2,#0      ;Sekunden Einer
  455.       MOV  R3,#0       ;Sekunden Zehner
  456.       MOV  R4,#0       ;für Segment rechts          Minuten Einer
  457.       MOV  R5,#0       ;für Segment Mitte rechts      Minuten Zehner
  458.       MOV  R6,#0       ;für Segment Mitte links      Stunden Einer
  459.       MOV  R7,#0       ;für Segment links          Stunden Zehner
  460.  
  461.       RET
  462.  
  463. initTimer0:
  464.  
  465.       SETB  ET0          ;Freigabe Timer0. Bit im Reg IE, Reg.-Adresse
  466.  
  467.       SETB   EA            ;Globale INT Freigabe. Bit im Reg IE
  468.  
  469.       MOV  TMOD,#00000001b  ;Timer0 konfiguieren, Modus1: 16bit
  470. Zaehler
  471.  
  472.       MOV  TL0,#060h      ;Timer0 vorladen
  473.  
  474.       MOV  TH0,#0F0h      ;65536 - 4000 = 61536 = F060h (4ms)
  475.  
  476.       CLR  TF0
  477.  
  478.       SETB  TR0          ;Start Timer0
  479.  
  480.       LJMP start
  481.  
  482. ;Interrupt-Service-Routine für Timer0
  483. isrTimer0:
  484.  
  485.   CLR TF0
  486.  
  487.       MOV  TL0,#060h      ;Timer0 erneut vorladen
  488.  
  489.       MOV  TH0,#0F0h      ;65536 - 4000 = 61536 = F060h (4ms)
  490.  
  491.       CALL  neueUhrzeit      ;neue Uhrzeit berechnen
  492.  
  493.       CALL  ausgabe        ;Ausgabe auf Anzeige
  494.  
  495.       RETI              ;Ende der Interrupt-Service-Routine
  496.  
  497.  
  498.  
  499.  
  500.  
  501. neueUhrzeit:
  502.  
  503.          INC R1        ; erhoehe Register 1
  504.          CJNE R1,#250d,weiter      ;Springe nach weiter wenn der
  505. Inhalt
  506. von R1 ungleich 250d ist
  507.          MOV  R1,#0d            ;Lade Register 1 mit dem Wert 0
  508.  
  509.  
  510.  
  511.  
  512.          INC R2              ; erhoehe Register 2
  513.          CJNE R2,#10d,weiter      ;Springe nach weiter wenn der Inhalt
  514. von
  515. R2 ungleich 10d ist
  516.          MOV R2,#0d            ;Lade Register 2 mit dem Wert 0
  517.  
  518.  
  519.          INC R3              ; erhoehe Register 3
  520.          CJNE R3,#10d,weiter      ;Springe nach weiter wenn der Inhalt
  521. von
  522. R3 ungleich 10d ist
  523.          MOV R3,#0d            ;Lade Register 3 mit dem Wert 0
  524. mSek:    INC R4              ; erhoehe Register 4
  525.          CJNE R4,#10d,weiter      ;Springe nach weiter wenn der Inhalt
  526. von
  527. R4 ungleich 10d ist
  528.          MOV R4,#0d            ;Lade Register 4 mit dem Wert 0
  529.          INC R5              ; erhoehe Register 5
  530.          CJNE R5,#10d,weiter      ;Springe nach weiter wenn der Inhalt
  531. von
  532. R5 ungleich 10d ist
  533.          MOV R5,#0d            ;Lade Register 5 mit dem Wert 0
  534. mMin:    INC R6              ; erhoehe Register 6
  535.          CJNE R6,#6d,m2          ;Springe nach m2 wenn der Inhalt von
  536. R6
  537. ungleich 6d ist
  538.          CJNE R7,#10d,m2        ;Springe nach m2 wenn der Inhalt von
  539. R7
  540. ungleich 0d ist
  541.          MOV R6,#0            ;Lade Register 6 mit dem Wert 0
  542.          MOV R7,#0            ;Lade Register 7 mit dem Wert 0
  543.  
  544.  
  545.  
  546. m2:      CJNE R6,#10,weiter      ;Springe nach weiter wenn der Inhalt
  547. von
  548. R6 ungleich 10 ist
  549.       MOV R6,#9            ;Lade Register 6 mit dem Wert 9
  550.       INC R7              ; erhoehe Register 7
  551.       LJMP weiter            ;aufrufen von weiter
  552.  
  553. weiter:  RET                ;Rücksprung aus dem Unterprogramm
  554.  
  555. ;Unterprogramm wait benötigt genau 4ms bei 12MHz
  556. wait:    PUSH  01
  557.       PUSH  02
  558.       MOV  R1,#1
  559. wait1:  MOV  R2,#164
  560. wait2:  DJNZ  R2,wait2
  561.       NOP
  562.       DJNZ  R1,wait1
  563.       NOP
  564.       NOP
  565.       NOP
  566.       POP  02
  567.       POP  01
  568.       RET
  569.  
  570.  
  571. ausgabe:  INC   R0
  572.       CJNE  R0,#04,rechts
  573.       MOV  R0,#0
  574.  
  575. rechts:  CJNE  R0,#0,mire
  576.       MOV  A,R4
  577.       CALL  BCD7Seg
  578.       MOV  P1,A
  579.       MOV  P2,#00001110b
  580. mire:    CJNE  R0,#1,mili
  581.       MOV  A,R5
  582.       CALL  BCD7Seg
  583.       MOV  P1,A
  584.       MOV  P2,#00001101b
  585. mili:    CJNE  R0,#2,links
  586.       MOV  A,R6
  587.       CALL  BCD7Seg
  588.       MOV  P1,A
  589.       MOV  P2,#00001011b
  590. links:  CJNE  R0,#3,m1
  591.       MOV  A,R7
  592.       CALL  BCD7Seg
  593.       MOV  P1,A
  594.       MOV  P2,#00000111b
  595. m1:    RET
  596.  
  597. ; Wandelt vom BCD-Code in den 7-Segment-Code
  598. BCD7Seg:  INC  A
  599.       MOVC  A,@A+PC
  600.       RET
  601.       DB  3Fh, 06h, 5Bh, 4Fh, 66h, 6Dh, 7Dh, 07h, 7Fh, 6Fh
  602.  
  603.  
  604.  
  605.  
  606. end
  607.  
  608. Markierten Text zitieren Antwort
  609. Re: Projekt Stoppuhr in 8051 Assembler
  610. Autor: norad (Gast)
  611. Datum: 25.06.2006 21:29
  612. @Clemens
  613. SETB P1.0
  614.  
  615. >  ;Taster an P1, um Port als Eingang zu haben
  616. >abfrage:    MOV a,p1
  617. >            JB  a.0,abfrage
  618.  
  619. Irgendwie unübersichtlich!
  620. Taster       EQU   28h     ;Bit Adressierbarer Bereich ab 25h (8 Bit)
  621.  
  622.  
  623.  
  624. Vorschlag!   MOV  25h,P1   ;Informationen von Prort 1 in 25h speichern
  625.              MOV  C,Taster ;Taster betätigt?
  626.              JC   abfrage  ;Ja!
  627.              ...
  628.  
  629. Markierten Text zitieren Antwort
  630. Re: Projekt Stoppuhr in 8051 Assembler
  631. Autor: Joe (Gast)
  632. Datum: 25.06.2006 22:29
  633. >>> Aber es bleibt dabei, heute schreibt niemand mehr in Assembler. Zu
  634. mindestens Keiner der der ernst genohmmen werden will. <<<
  635.  
  636. Oh Gott, sind die Meisten mittlerweile zu Blöd für Assembler, statt
  637. sinnvolle Hilfe zu geben, aber das kannst du ja nicht kannst ja nur C,
  638. dann so einen Blödsinn zu verzapfen, sorry mußte mal gesagt werden.
  639.  
  640. Bei mir sinds 10% C und 90% Assembler.
  641.  
  642. Sorry das ich nichts zum Thema sage aber das mußte raus.
  643.  
  644. @ Clemens, sorry für den Mißbrauch.
  645.  
  646. Markierten Text zitieren Antwort
  647. Re: Projekt Stoppuhr in 8051 Assembler
  648. Autor: Peter Dannegger (peda)
  649. Datum: 25.06.2006 22:41
  650. Dein Spaghetticode ist zwar angewachsen, aber trotzdem sieht da keiner
  651. durch.
  652.  
  653. Nochmal, es bringt nicht, planlos drauflos zu coden, da kommt immer nur
  654. Mist raus.
  655.  
  656.  
  657. Du brauchst erstmal einen Plan.
  658.  
  659. Also was soll wie erfolgen, wenn welche Tasten gedrückt wird, was soll
  660. wie dargestellt werden usw.
  661.  
  662. Was Du brauchst, ist ein Timerinterrupt, um:
  663. - eine genaue Zeitbasis zu haben
  664. - Die Anzeige zu multiplexen
  665. - Die Tasten zu entprellen
  666.  
  667.  
  668. Im Hauptprogramm erfolgt dann die eigentliche Ablaufsteuerung, nachdem
  669. Du Dir einen Plan gemacht hast, wie diese überhaupt aussehen soll.
  670.  
  671. Code kannst Du erst schreiben, nachdem Du weißt, was gemacht werden
  672. muß.
  673.  
  674.  
  675. Peter
  676.  
  677. Markierten Text zitieren Antwort
  678. Re: Projekt Stoppuhr in 8051 Assembler
  679. Autor: Stephan Henning (stephan-)
  680. Datum: 26.06.2006 08:24
  681. @Clemens,
  682.  
  683. das soll doch ne Stoppuhr werden ?? Oder ????
  684. Wie kannst Du es Dir dann leisten in der ISR ne komplette Ausgabe zu
  685. machen ??   SO NICHT !!!!!
  686. In der ISR: Timer neu laden INC Variable oder Flag setzen und raus
  687. !!!!
  688. Das wars ... mehr gehört da nicht rein falls Du Zehntel un Hunderstel
  689. messen willst. Die Wait Schleife würde ich in den 2 Timer packen.
  690. Allerdings muß die Priorität von Timer 1 höher sein !!! Oder Du mmußt
  691. dafür sorgen das Timer 2 den Timer 1 nicht unterbricht. Dann bringe
  692. alles mal etwas in Form. Habe jetzt nicht viel Zeit, bin auf Arbeit.
  693. Hast Du schon simuliert ???
  694.  
  695. @Oliver
  696. "PS.: Bei mir in der Firma & Kunden hat es sich immer weider
  697. rausgestellt das ein Prozessor zu klein/schwach war und er gewechselt
  698. werden musste. Wie geht den das in Assembler? "
  699.  
  700. Da fragt man sich doch wer die Planung gemacht hat ......
  701. Mitten im Projekt wird die MCU zu klein ?? Und kein Ersatz aus der
  702. gleichen Familie ??? AU MAN !!!!!...
  703.  
  704. Markierten Text zitieren Antwort
  705. Re: Projekt Stoppuhr in 8051 Assembler
  706. Autor: Peter Dannegger (peda)
  707. Datum: 26.06.2006 09:17
  708. "Da fragt man sich doch wer die Planung gemacht hat ......"
  709.  
  710.  
  711. Warscheinlich gar keiner.
  712.  
  713. Manchmal wird die Planung notgedrungen erst dann gemacht, wenn der
  714. Spaghetticode zu groß und zu undurchschaubar geworden ist.
  715.  
  716. Und oh Wunder, plötzlich paßt das Programm sogar in nen kleineren MC.
  717.  
  718.  
  719. Peter
  720.  
  721. Markierten Text zitieren Antwort
  722. Re: Projekt Stoppuhr in 8051 Assembler
  723. Autor: Clemens (Gast)
  724. Datum: 26.06.2006 16:38
  725. OK, also alle reden in diesem Thema davon aber ich selbst habe keine
  726. Ahnung: Was ist ein Timer Interrupt?
  727. Könnte mir jemand mal ein Beispiel geben?
  728.  
  729. Ich selbst habe wenig Ahnung von Interrupts und verstehe ehrlich gesagt
  730. die Interrupt Programmierung in meinem Programm nichteinmal (was u.a.
  731. auch dazu führt das bis jetzt noch kein gutes Programm dabei rauskam).
  732. Der Ablauf des Programms habe ich ja schoneinmal festgelegt, in einem
  733. Pap ( http://dbi-design.de/clemens/projekt/pap.jpg ).
  734. Ich weiß ja also was ich programmieren will, nur fehlt mir irgendwie
  735. das Verständnis dazu.
  736. Das Problem ist eben auch das ich ja mit Interrupts arbeiten muss
  737. (wurde mir so vorgegeben).
  738. Ich sollte wohl am besten mich ersteinmal in Interrupts einlesen.
  739. Kennt jemand von euch eine gute Beschreibung, Homepage, o.ä zum Thema
  740. Interrupts?
  741. Danke im Voraus!
  742.  
  743. Markierten Text zitieren Antwort
  744. Re: Projekt Stoppuhr in 8051 Assembler
  745. Autor: Stephan Henning (stephan-)
  746. Datum: 26.06.2006 17:04
  747. au Backe Clemens,,,
  748. sag mal verlangen die Lehrer heute unmögliches oder ist das "Lernen"
  749. zur Unsitte erklärt worden und deshalb unschicklich ???
  750. Bist Du der einzige von Euch der nix versteht oder alle ??
  751.  
  752. Schau mal hier, da steht alles über Interrupts für 8051.
  753.  
  754. http://www.goblack.de/desy/mc8051chip/datenblatt/i...
  755.  
  756. Markierten Text zitieren Antwort
  757. Re: Projekt Stoppuhr in 8051 Assembler
  758. Autor: Stephan Henning (stephan-)
  759. Datum: 26.06.2006 17:07
  760. @Peter,
  761. und was soll ich sagen, meistens haben solche Leute auch noch Jobs von
  762. denen wir nur träumen können :-(
  763. armes Deutschland...wo können wir nur noch ein par Terraflops
  764. herbekommen ???
  765.  
  766. Markierten Text zitieren Antwort
  767. Re: Projekt Stoppuhr in 8051 Assembler
  768. Autor: Peter Dannegger (peda)
  769. Datum: 26.06.2006 17:15
  770. Na der Plan sieht ja gar nicht so schlecht aus, daran kann man
  771. weiterarbeiten:
  772.  
  773. 1.
  774. Im allgemeinen möchte man eine Aktion beim Drücken, wie es scheint
  775. startest Du den Zähler aber erst beim Loslassen (Start = 1).
  776.  
  777. 2.
  778. Was passiert beim Speichern ?
  779. Wird der alte Wert überschrieben ?
  780.  
  781. 3.
  782. Nirgends wird der gespeicherte Wert angezeigt.
  783.  
  784. 4.
  785. Was wird überhaupt angezeigt, Du hast ja nur 4 Stellen.
  786.  
  787.  
  788.  
  789. Hier wird ein Interrupt angesprungen:
  790.  
  791. ;Einsprungadresse Interrupt-Serviceroutine für Timer 0
  792. org 000Bh
  793.       LJMP isrTimer0
  794.  
  795. Ist also wohl nicht von Dir, wenn Du das nicht erkannt hast.
  796.  
  797. Unterprogramme im Interrupt sind: naja.
  798. Aber die selben Unterprogramme im Interrupt und im Main sind oberpfui
  799. !
  800.  
  801. Du unterbrichst ein Programm mit sich selbst. Aufm PC gibts dafür
  802. knallhart nen Blue-Screen.
  803.  
  804.  
  805. Peter
  806.  
  807. Markierten Text zitieren Antwort
  808. Re: Projekt Stoppuhr in 8051 Assembler
  809. Autor: Karl heinz Buchegger (kbucheg)
  810. Datum: 26.06.2006 17:25
  811. Ich denke, dein Hauptproblem ist, dass du dich zu sehr
  812. verzettels indem du an 5 Baustellen gleichzeitig arbeitest.
  813. Weiters glaub ich, dass du das was dir vorgegeben wurde
  814. (den Code, nicht die Aufgabenstellung) zu sehr als
  815. Gesstzbuch ansiehst, dass unveränderbar ist. Meiner
  816. Ansicht nach solltest du den Code so wie er war studieren,
  817. rausfinden wie die einzelnen Teile funktioniert haben
  818. (zb der ganze Bereich der die eigentliche Uhr in 7 Registern
  819. realiert hat: Wie wird diese 'Uhr' um eine Einheit hochgezählt,
  820. wie funktioniert die Ausgabe auf die Anzeige), ev. mal ein
  821. bischen damit spielen und ihn verändern, und dann:
  822. fang neu an.
  823.  
  824. Als allererstes solltest du mal im Originalcode die ganzen
  825. Kommentare, ala:
  826.  
  827.       INC R1                   ; erhoehe Register 1
  828.       CJNE R1,#250d,weiter     ; Springe nach weiter wenn der
  829.                                ; Inhalt von R1 ungleich 250d ist
  830.       MOV  R1,#0d              ;Lade Register 1 mit dem Wert 0
  831.  
  832. rauwerfen. Diese Kommentare sind naemlich ein Musterbeispiel
  833. dafuer, wie man nicht kommentiert: Der Kommentar erzaehlt dir
  834. nichts, er wiederholt nur dass was ohnehin in der Anweisung
  835. auch steht.
  836.  
  837. Aber was ist R1? R1 enthaelt offensichtlich einen Sub-Sekunden
  838. Zaehler. Durch den Interrupt Mechanismus wird die Funktion eine
  839. bestimmte Anzahl mal in der Sekunde angesprungen. An einer
  840. anderen Stelle im Programm findet sich der Kommentar
  841.  
  842. ;Unterprogramm wait benötigt genau 4ms bei 12MHz
  843.  
  844. das deckt sich genau mit den 250 die da oben vorkommen.
  845. Wenn ein Durchlauf 4 ms dauert, dann ist nach genau 250
  846. durchläufen exakt 1 Sekunde vergangen. Das sollte
  847. man dokumentieren, zb so:
  848.  
  849.       INC R1                   ; erhoehe den 4ms Zaehler
  850.       CJNE R1,#250d,weiter     ; Wenn die Routine noch nicht 250
  851.                                ; mal aufgerufen wurde, dann gibt
  852.                                ; es nichts zu tun: -> weiter
  853.       MOV  R1,#0d              ; den 4ms Zaehler wieder auf 0 setzen
  854.  
  855.      INC R2                    ; und zur Sekunden-Einerstelle
  856.                                ; 1 dazzuzaehlen
  857.      CJNE R2,#10d,weiter       ; Gibt das einen Überlauf 9->10?
  858.                                ; Wenn nein, alles getan: -> weiter
  859.      MOV R2,#0d                ; Es gab einen Überlauf. d.h. die
  860.                                ; Einerstelle der Sekunden fängt wieder
  861.                                ; bei 0 an zu zählen ...
  862.      INC R3                    ; ... und bei den Zehnern der Sekunden
  863.                                ; gehst um 1 hoch
  864.      CJNE R3,#6d,weiter        ; Wenn hier noch nicht 6 (also 6*10
  865.                                ; Sekunden) zusammengekommen sind:
  866.                                ; nichts weiter zu tun: -> weiter
  867.  
  868.      ....                      ; wieder bei 0 Sekunden anfangen
  869.                                ; und bei dem Minuten Einer um
  870.                                ; 1 hochzählen
  871.                                ; Übertrag 9->10 bei den Einern?
  872.                                ; Zehner um 1 hochzählen,
  873.                                ; usw
  874.                                ; usw
  875.  
  876. Siehst du den Unterschied in der Qualitaet der Kommentare.
  877. Jetzt erzählt mir der Kommentar, was an dieser Stelle warum
  878. geschieht. Und zwar in meinen Worten. Das ein Sprung nach
  879. weiter erfolgt, wenn R2 den Wert 10 erreicht hat, das sehe ich
  880. auch im Quelltext. Die Frage ist nur: Warum macht man diesen
  881. Sprung, bzw. warum macht man ihn manchmal nicht? Was ist
  882. die Idee hinter diesem Sprung?
  883. Das sind Dinge die ein Kommentar beantworten muss, nicht die
  884. Klartext-Wiedergabe des Assembler-Befehls.
  885.  
  886. Und solange du diese Transformation der Kommentare nicht machst,
  887. wirst du auch nie verstehen, was in deinem Programm zur Zeit
  888. eigentlich vor sich geht und vor allen Dingen: was die Idee
  889. hinter diesem urspruenglichen Program war. Erst wenn du das
  890. komplett verstanden hast, weil du es studiert hast und von
  891. jeder Anweisung sagen kannst welchen Zweck sie hat (wiederum:
  892. Zweck im Sinne von: was passiert auf höherer Ebene. Ein INC R4
  893. hat natuerlich den 'Zweck' R4 hochzuzaehlen. Das meine ich
  894. nicht. Der Zweck ist die 'Einer der Minuten' hochzuzählen, weil
  895. eben 1 Minute vergangen ist) erst dann wirst du in der Lage sein,
  896. einen neuen Programmplan für deine Stoppuhr zu erstellen. Ein
  897. Plan der auch realistisch ist und umgesetzt werden kann.
  898.  
  899. Markierten Text zitieren Antwort
  900. Re: Projekt Stoppuhr in 8051 Assembler
  901. Autor: Clemens (Gast)
  902. Datum: 27.06.2006 17:02
  903. So, ich habe das ganze Programm nun (nach meinen Vorstellungen) mal
  904. sinnvoll überarbeitet.
  905. Ich denke das die Grundfunktion (die laufende Zeit) nun funktionieren
  906. sollte.
  907. Da ich das Programm dank der Hilfe von vielen hier mittlerweile nun
  908. endlich verstehe möchte ich nun die eigentlich wichtigen Funktionen
  909. einbauen.
  910. So soll das Programm ja auf Tastendruck gestartet, gestoppt, die
  911. aktuelle Zeit gespeichert und die Zeit resettet werden.
  912. Die Taster dazu liegen an Port 3 (wegen Interrupt). Diese abzufragen
  913. stellt auch kein Problem dar, das Problem besteht nur darin das ich
  914. nicht weiß was ich wie unterbrechen kann (z.B. für Start/Stopp).
  915. Es wäre natürlich gut den Interrupt Timer zu unterbrechen mit Stopp
  916. oder zu Starten mit Start aber wie könnte ich sowas bewerkstelligen.
  917. Starten wäre wohl das kleinere Problem, aber so zu Stoppen das die
  918. aktuelle Zeit auch stehenbleibt und weiter angezeigt wird.
  919.  
  920. Ich hab mir überlegt ob ich die Start und Stopp Funktion über ein
  921. Externes Interrupt laufen lassen soll (EX0 und EX1).
  922. Aber ich weiß nicht wie ich das dann mit dem unterbrechen und dem
  923. einspringen machen kann bzw. ob ich überhaupt mehrere Interrupts in
  924. einem Programm verwenden kann.
  925. Ich bräuchte da deswegen Ideen wie ich so etwas bewerkstelligen kann.
  926.  
  927. Das Resetten wäre wohl das einfachste, in dem ich einfach die Register
  928. alle 0 setze.
  929.  
  930. Danke im Voraus mal wieder für eure sehr hilfreiche Hilfe!
  931.  
  932. -----------------------------------------------------------
  933. Hier noch das aktuelle Programm:
  934.  
  935. $include (reg52.inc)
  936.  
  937. Starttaster    bit P3.2
  938. Stopptaster    bit P3.3
  939. Resettaster    bit P3.4
  940. Merkertaster   bit P3.5
  941.  
  942.  
  943. org 0000h
  944.   LJMP start
  945.  
  946.  
  947.  
  948.  
  949. ;Einsprungadresse Interrupt-Serviceroutine für Timer 0
  950. org 000Bh
  951.       LJMP isrTimer0
  952.  
  953.  
  954.  
  955. org 0100h
  956. start:  CALL initRegister  ;Register initialisieren
  957.   CALL initTimer0    ;Interrupt Timer initialisieren
  958. loop:  LJMP loop    ;Endlosschleife
  959.  
  960.  
  961. initRegister:
  962.       MOV  R0,#0        ;bestimmt welche der Anzeigen aktiv ist
  963.       MOV  R1,#0         ;Zähler von o bis 249 -->4ms*250 = 1 Sec
  964.  
  965.       MOV  R2,#0        ;für Segment rechts     Sekunden Einer
  966.       MOV  R3,#0         ;für Segment Mitte rechts   Sekunden Zehner
  967.       MOV  R4,#0         ;für Segment Mitte links   Minuten Einer
  968.       MOV  R5,#0         ;für Segment links     Minuten Zehner
  969.  
  970.       RET
  971.  
  972. initTimer0:
  973.  
  974.       SETB  ET0            ;Freigabe Timer0. Bit im Reg IE,
  975. Reg.-Adresse
  976.  
  977.       SETB   EA              ;Globale INT Freigabe. Bit im Reg IE
  978.  
  979.       MOV  TMOD,#00000001b    ;Timer0 konfiguieren, Modus1: 16bit
  980. Zaehler
  981.  
  982.       MOV  TL0,#060h        ;Timer0 vorladen
  983.  
  984.       MOV  TH0,#0F0h        ;65536 - 4000 = 61536 = F060h (4ms)
  985.  
  986.       SETB  TR0            ;Start Timer0
  987.  
  988.       RET
  989.  
  990.  
  991. ;Interrupt-Service-Routine für Timer0
  992. isrTimer0:
  993.  
  994.  
  995.       MOV  TL0,#060h        ;Timer0 erneut vorladen
  996.  
  997.       MOV  TH0,#0F0h        ;65536 - 4000 = 61536 = F060h (4ms)
  998.  
  999.       CALL  neueUhrzeit        ;neue Uhrzeit berechnen
  1000.  
  1001.       CALL  ausgabe          ;berechnete Uhrzeit ausgeben
  1002.  
  1003.       RETI                ;Ende der Interrupt-Service-Routine
  1004.  
  1005.  
  1006.  
  1007.  
  1008.  
  1009. neueUhrzeit:
  1010.  
  1011.         INC R1      ;erhöht den Zaehler
  1012.         CJNE R1,#250d,weiter    ;Wenn die Routine noch nicht 250 mal
  1013. aufgerufen wurden
  1014.         ;dann springe nach weiter, da nichts geschieht
  1015.         MOV  R1,#0d             ;den Zaehler wieder auf Null
  1016. zurücksetzen
  1017.  
  1018.  
  1019.         INC R2                ;Sekunden Einerstelle um Eins erhöhen
  1020.         CJNE R2,#10d,weiter  ;Entsteht dadurch kein Überlauf (9->10)
  1021. springe
  1022.         ;nach weiter
  1023.         MOV R2,#0d        ;Es gab einen Überlauf, dadurch muss die
  1024. Einerstelle
  1025.         ;zurückgesetzt werden
  1026.  
  1027.  
  1028.         INC R3             ;Die Zehnerstelle der Sekunden muss um Eins
  1029. erhöht werden
  1030.         CJNE R3,#6d,weiter      ;Wenn die Zehnerstelle noch nicht 6
  1031. anzeigt springe
  1032.         ;nach weiter
  1033.         MOV R3,#0d              ;Es gab einen Überlauf, dadurch muss die
  1034. Zehnerstelle
  1035.          ;zurückgesetzt werden
  1036.  
  1037.   INC R4                ;Die Minuten Einerstelle um Eins erhöhen
  1038.         CJNE R4,#10d,weiter     ;Entsteht dadurch kein Überlauf (9->10)
  1039. springe
  1040.         ;nach weiter
  1041.         MOV R4,#0d              ;Es gab einen Überlauf, dadurch muss die
  1042. Einerstelle
  1043.         ;zurückgesetzt werden
  1044.  
  1045.   INC R5                ;Die Minuten Zehnerstelle um Eins erhöhen
  1046.         CJNE R5,#6d,weiter      ;Entsteht dadurch kein Überlauf (5->6)
  1047. springe
  1048.         ;nach weiter
  1049.         MOV R2,#0d              ;Es gab einen Überlauf, dadurch muessen
  1050. Register 2 bis 5
  1051.   MOV R3,#0d    ;zurückgesetzt werden. Da die Uhr nicht mehr
  1052.   MOV R4,#0d    ;anzeigen kann
  1053.   MOV R5,#0d
  1054.  
  1055.  
  1056.  
  1057.  
  1058. ausgabe:  INC   R0    ;erhöht die Anzeigennummer
  1059.         CJNE  R0,#04,rechts  ;Ist der Wert ungleich 4 springe nach
  1060. rechts
  1061.         MOV  R0,#0    ;Setzt den Wert der Anzeigennummer zurück
  1062.  
  1063. rechts: CJNE  R0,#0,mire  ;Ist die Anzeigennummer ungleich 0 springe
  1064. nach mire
  1065.         MOV  A,R2    ;Schreibe den berechneten Uhrzeitwert in den Akku
  1066.         CALL  BCD7Seg    ;Ruft Werte für BCD7Seg Anzeige auf
  1067.         MOV  P1,A    ;Gibt den im Akku gespeicherten Wert auf P1 aus
  1068.         MOV  P2,#00001110b  ;gibt die Anzeigenposition auf P2 aus
  1069.  
  1070. mire:   CJNE  R0,#1,mili  ;Ist die Anzeigennummer ungleich 1 springe
  1071. nach mili
  1072.         MOV  A,R3    ;Schreibe den berechneten Uhrzeitwert in den Akku
  1073.         CALL  BCD7Seg    ;Ruft Werte für BCD7Seg Anzeige auf
  1074.         MOV  P1,A    ;Gibt den im Akku gespeicherten Wert auf P1 aus
  1075.         MOV  P2,#00001101b  ;gibt die Anzeigenposition auf P2 aus
  1076.  
  1077. mili:   CJNE  R0,#2,links  ;Ist die Anzeigennummer ungleich 2 springe
  1078. nach links
  1079.         MOV  A,R4    ;Schreibe den berechneten Uhrzeitwert in den Akku
  1080.         CALL  BCD7Seg    ;Ruft Werte für BCD7Seg Anzeige auf
  1081.         MOV  P1,A    ;Gibt den im Akku gespeicherten Wert auf P1 aus
  1082.         MOV  P2,#00001011b  ;gibt die Anzeigenposition auf P2 aus
  1083.  
  1084. links:   CJNE  R0,#3,m1    ;Ist die Anzeigennummer ungleich 3 springe
  1085. nach
  1086. m1
  1087.         MOV  A,R5    ;Schreibe den berechneten Uhrzeitwert in den Akku
  1088.         CALL  BCD7Seg    ;Ruft Werte für BCD7Seg Anzeige auf
  1089.         MOV  P1,A    ;Gibt den im Akku gespeicherten Wert auf P1 aus
  1090.         MOV  P2,#00000111b  ;gibt die Anzeigenposition auf P2 aus
  1091.  
  1092. m1:      RET      ;Rücksprung aus dem Unterprogramm
  1093.  
  1094.  
  1095. ; Wandelt vom BCD-Code in den 7-Segment-Code
  1096. BCD7Seg:  INC  A
  1097.       MOVC  A,@A+PC
  1098.       RET
  1099.       DB  3Fh, 06h, 5Bh, 4Fh, 66h, 6Dh, 7Dh, 07h, 7Fh, 6Fh
  1100.  
  1101.  
  1102.  
  1103.  
  1104. END
  1105.  
  1106. Markierten Text zitieren Antwort
  1107. Re: Projekt Stoppuhr in 8051 Assembler
  1108. Autor: Karl heinz Buchegger (kbucheg)
  1109. Datum: 27.06.2006 17:29
  1110. > So soll das Programm ja auf Tastendruck gestartet, gestoppt, die
  1111. > aktuelle Zeit gespeichert und die Zeit resettet werden.
  1112.  
  1113. Das ist schon mal falsch.
  1114. Dein Programm läuft die ganze Zeit. Du kannst es nicht starten,
  1115. stoppen oder was auch immer. Das Programm läuft bereits.
  1116.  
  1117. Was du willst ist den Zeitgeber starten und stoppen!
  1118. Der Zeitgeber ist in deinem Programm der Timer.
  1119. Soblad der Timer nicht mehr läuft steht auch deine Uhr.
  1120. Sobald du den Timer wieder laufen lasst, läuft auch deine
  1121. Uhr.
  1122.  
  1123. Das ist ein bischen so wie bei den altmodischen (schönen)
  1124. Pendeluhren. Die werden gestoppt indem man das Pendel stoppt.
  1125. In deinem Programm ist der Timer mit dem Pendel gleichzusetzen.
  1126.  
  1127. Nur gibt es in deinem Programm eine klitzekleine Eigenheit:
  1128. Mit dem Zeitgeber gekoppelt ist auch das Anzeigen der Uhrzeit.
  1129. Das muesste man entkoppeln, da ja die Anzeige auch weiterhin
  1130. gemacht werden soll, auch wenn der Zeitgeber selbst nicht läuft.
  1131. Das ist aber kein Problem, denn letztendlich läuft ja
  1132. dein Hauptprogramm irgendwann hier auf:
  1133.  
  1134. loop:  LJMP loop    ;Endlosschleife
  1135.  
  1136. und bleibt hier hängen. Alles was jetzt noch passiert ist,
  1137. dass in regelmässigen Zeitabstaenden die Timer-Interrupt Funktion
  1138. aufgerufen wird, die das 'Uhrwerk' weiterschaltet und die Anzeige
  1139. bedient. Und natürlich läuft das Hauptprogramm wie wild in
  1140. dieser Schleife weiter. Das eigentliche Hochzählen der Uhr
  1141. erfolgt, wie bereits gesagt ja in einem Interrupt. Es spricht
  1142. aber nichts dagegen, das Anzeigen der Uhrzeit genau in diese
  1143. Schleife zu verlagern ...
  1144.  
  1145. loop: call ausgabe
  1146.       LJMP loop
  1147.  
  1148. und dafür die Ausgabe aus dem Interrupt wegzulassen:
  1149.  
  1150. ;Interrupt-Service-Routine für Timer0
  1151. isrTimer0:
  1152.       MOV  TL0,#060h        ;Timer0 erneut vorladen
  1153.       MOV  TH0,#0F0h        ;65536 - 4000 = 61536 = F060h (4ms)
  1154.  
  1155.       CALL  neueUhrzeit        ;neue Uhrzeit berechnen
  1156.       RETI                ;Ende der Interrupt-Service-Routine
  1157.  
  1158. Siehst du. Jetzt zeigt dein Programm ständig die Uhrzeit
  1159. an, und durch starten bzw. stoppen des Timers, läuft die
  1160. Uhr oder sie läuft eben nicht.
  1161.  
  1162. (Ich muss jetzt ein bischen raten, da ich den 8051 nicht kenne)
  1163. dh. das hier
  1164.  
  1165.       SETB  ET0            ;Freigabe Timer0. Bit im Reg IE,
  1166.  
  1167. lässt die Uhr laufen. Während das hier
  1168.  
  1169.       CLRB  ET0
  1170.  
  1171. die Uhr wieder anhält.
  1172.  
  1173. Alles was du jetzt noch tun musst ist, die Schalter abfragen
  1174. und je nachdem welcher Schalter gedrückt wurde, entweder das
  1175. eine oder das andere ausführen.
  1176.  
  1177. Markierten Text zitieren Antwort
  1178. Re: Projekt Stoppuhr in 8051 Assembler
  1179. Autor: Clemens (Gast)
  1180. Datum: 27.06.2006 17:34
  1181. danke für die schnelle und gute Antwort ich werde es gleich testen!
  1182.  
  1183. Sollte das einwandfrei funktionieren muss ich mir nur noch was für den
  1184. "Merker" überlegen.
  1185.  
  1186. Markierten Text zitieren Antwort
  1187. Re: Projekt Stoppuhr in 8051 Assembler
  1188. Autor: Karl heinz Buchegger (kbucheg)
  1189. Datum: 27.06.2006 17:44
  1190. > Alles was du jetzt noch tun musst ist, die Schalter abfragen
  1191.  
  1192. Ich vergass:
  1193. Das Abfragen der Schalter kannst du natuerlich auch in
  1194. der Hauptschleife machen. Wenn du 2 verschiedene Schalter
  1195. für starten und stoppen nimmst, brauchst du das dann auch
  1196. nicht entprellen. Sobald der 'Start'-Schalter gedrückt wurde,
  1197. gibst du den Timer frei, sobald der 'Stop'-Schalter gedrückt
  1198. wurde, stoppst du den Timer wieder:
  1199.  
  1200.  
  1201. loop:   call  ausgabe   ; damit wir auch was sehen
  1202.  
  1203.         hole Zustand vom Schalter 'Start'
  1204.  
  1205.         ist er gedrückt?
  1206.  
  1207.           wenn ja: SETB ET0
  1208.  
  1209.         hole Zustand vom Schalter 'Stop'
  1210.  
  1211.         ist er gedrückt?
  1212.  
  1213.           wenn ja: CLRB ET0
  1214.  
  1215.         jmp loop
  1216.  
  1217.  
  1218. Die Details wie man an die Schalter rankommt, bzw. woran man
  1219. erkennt ob einer gedrückt ist, weis ich nicht. Das musst
  1220. du wissen. Aber vom Prinzip her müsste das schon so funktionieren.
  1221.  
  1222. In diese Schleife baust du dann auch noch eine 3.te Schalterabfrage
  1223. ein, die das Uhrwerk wieder auf 0 zurücksetzt. Da du mitlerweile
  1224. ja verstehst wie die Uhr funktioniert, sollte das kein grosses
  1225. Problem mehr sein: Einfach alle Register die das Uhrwerk bilden
  1226. auf 0 setzen.
  1227.  
  1228. Markierten Text zitieren Antwort
  1229. Re: Projekt Stoppuhr in 8051 Assembler
  1230. Autor: Clemens (Gast)
  1231. Datum: 27.06.2006 18:03
  1232. In der schnelle mal Programmiert:
  1233.  
  1234. --------------------
  1235. org 0100h
  1236. start:     JB Starttaster,SETB ET0  ;Startaster abfragen
  1237.      LJMP start        ;Endlosschleife
  1238.      CALL initRegister      ;Register initialisieren
  1239.      CALL initTimer0      ;Interrupt Timer initialisieren
  1240. loop:     CALL Ausgabe        ;berechnete Uhrzeit immer ausgeben
  1241.      JB Stopptaster,CLRB ET0  ;Stopptaster abfragen
  1242.      JB Resettaster,springer  :Resettaster abfragen
  1243.      LJMP loop        ;Endlosschleife
  1244. springer:  CALL initRegister      ;Register zurücksetzen
  1245. ------------------------------
  1246.  
  1247. Kann mir jemand bestätigen ob sowas funktionstüchtig wäre?
  1248. Ich hatte schoneinmal Probleme mit dem springen (also JB Befehl).
  1249.  
  1250. Markierten Text zitieren Antwort
  1251. Re: Projekt Stoppuhr in 8051 Assembler
  1252. Autor: Karl heinz Buchegger (kbucheg)
  1253. Datum: 27.06.2006 18:10
  1254. start:     JB Starttaster,SETB ET0  ;Startaster abfragen
  1255.  
  1256. das kann ich mir nicht vorstellen.
  1257. Wie alle Srungbefehle, wird JB eine Ziel haben wollen
  1258. zu dem es springt. SETB ET0 ist aber kein Ziel. SETB ET0
  1259. ist eine Anweisung!
  1260.  
  1261. Aber du kannst die Logik ja auch umdrehen. Springen wenn
  1262. der Taster nicht gedrückt ist:
  1263.  
  1264. loop:             call ausgabe
  1265.  
  1266.                   JNB Starttaster, Weiter_bei_Stop
  1267.                   SETB ET0
  1268.  
  1269. Weiter_bei_Stop:  JNB Stopptaster, Weiter_bei_Reset
  1270.                   CLRB ET0
  1271.  
  1272. Weiter_bei_Reset: JNB Resettaster, Weiter_bei_
  1273.                   CALL initRegister
  1274.  
  1275. Weiter_bei_:      jmp loop
  1276.  
  1277. Markierten Text zitieren Antwort
  1278. Re: Projekt Stoppuhr in 8051 Assembler
  1279. Autor: Karl heinz Buchegger (kbucheg)
  1280. Datum: 27.06.2006 18:16
  1281. > --------------------
  1282. > org 0100h
  1283. > start:     JB Starttaster,SETB ET0  ;Startaster abfragen
  1284. >      LJMP start        ;Endlosschleife
  1285.  
  1286. Warum willst du unbedingt, dass deine Stoppuhr nur
  1287. ein einziges mal zu gebrauchen ist, wenn du mit demselben
  1288. Aufwand auch eine Stoppuhr bauen kannst, die man starten,
  1289. stoppen, starten, stoppen, resetten, starten, stoppen
  1290. etc. kann? Und zwar in dieser oder jeder anderen beliebigen
  1291. Reihenfolge.
  1292.  
  1293. Ausserdem ist es keine sehr gute Idee einen Timer freizugeben
  1294. noch bevor man ihn initialisiert hat :-)
  1295.  
  1296. Markierten Text zitieren Antwort
  1297. Re: Projekt Stoppuhr in 8051 Assembler
  1298. Autor: Karl heinz Buchegger (kbucheg)
  1299. Datum: 27.06.2006 18:59
  1300. Du musst noch sehr viel genauer werden.
  1301. Durch einen Cut&Paste Fehler hast du dir dein Pgm
  1302. zerstört.
  1303.  
  1304. Wenn ich mir den Pgm-Teil 'ausgabe' anschaue,
  1305. denn sehe ich dort im wesentlichen 4 mal den
  1306. gleichen Abschnitt:
  1307.  
  1308. rechts: CJNE  R0,#0,mire  ;Ist die Anzeigennummer ungleich 0
  1309.                           ;springe nach mire
  1310.         MOV  A,R2    ;Schreibe den berechneten Uhrzeitwert in den Akku
  1311.         CALL  BCD7Seg    ;Ruft Werte für BCD7Seg Anzeige auf
  1312.         MOV  P1,A    ;Gibt den im Akku gespeicherten Wert auf P1 aus
  1313.         MOV  P2,#00001110b  ;gibt die Anzeigenposition auf P2 aus
  1314.  
  1315. lediglich das Register im
  1316.  
  1317.        MOV A,R2
  1318.  
  1319. und das Label als Sprungziel, wo es weiter geht variiert.
  1320. Das ist aber seltsam, eigentlich würde ich erwarten, daß es
  1321. einen Unterschied in der Ausgabe gibt, je nachdem auf welche
  1322. Stelle du ausgibst. Da ist aber keiner.
  1323. Jett scrolle ich mal hoch, ganz an den Anfang:
  1324. Und siehe da. In jedem der 4 Abschnitte wird ein anderer
  1325. Wert an P2 ausgegeben. Ganz so wie man es erwarten würde.
  1326. Denn irgendwo muss es ja einen Unterschied geben, sonst landen
  1327. ja alle Ausgaben immer an der LED-Anzeige.
  1328.  
  1329. Markierten Text zitieren Antwort
  1330. Re: Projekt Stoppuhr in 8051 Assembler
  1331. Autor: Karl heinz Buchegger (kbucheg)
  1332. Datum: 27.06.2006 19:01
  1333. > sonst landen ja alle Ausgaben immer an der LED-Anzeige.
  1334.  
  1335. da fehlt ein sinnentstellendes Wort:
  1336.  
  1337. sonst landen ja alle Ausgaben immer an derselben LED-Anzeige
  1338. und verteilen sich nicht auf die 4 vorhandenen.
  1339.  
  1340. Markierten Text zitieren Antwort
  1341. Re: Projekt Stoppuhr in 8051 Assembler
  1342. Autor: Clemens (Gast)
  1343. Datum: 27.06.2006 21:55
  1344. das verstehe ich nicht ganz:
  1345.  
  1346. MOV  P2,#00001110b
  1347.  
  1348. hier wird doch bestimmt auf welche der 4 Anzeigen der Wert angezeigt
  1349. werden soll?
  1350. Oder verstehe ich da irgendetwas falsch?
  1351.  
  1352. Markierten Text zitieren Antwort
  1353. Re: Projekt Stoppuhr in 8051 Assembler
  1354. Autor: Stephan Henning (stephan-)
  1355. Datum: 27.06.2006 22:01
  1356. @Karl Heinz,
  1357.  
  1358. woher Du Deine Ruhe nimmst und die Zeit..... Hut ab !!!!
  1359. Mir gefällt Deine Art die Sachen zu erklären, die für uns so
  1360. selbstvertsändlich sind.....
  1361.  
  1362. Habe ich mal beim "44780 zeigt nur Kästchen" Tread versucht..
  1363. 100 Einträge nur für den Init des LCD !!!
  1364. gab nur böse Haue von "Abgehobenen "..
  1365. als ich versucht habe es auf die Art
  1366. " MCU an Display...habe Daten"
  1367. zu erklären
  1368.  
  1369. Mach weiter so....
  1370.  
  1371.  
  1372.  
  1373. stephan Henning
  1374.  
  1375. Markierten Text zitieren Antwort
  1376. Re: Projekt Stoppuhr in 8051 Assembler
  1377. Autor: Karl Heinz (kbuchegg) (Moderator)
  1378. Datum: 27.06.2006 23:15
  1379. > das verstehe ich nicht ganz:
  1380. >
  1381. > MOV  P2,#00001110b
  1382. >
  1383. > hier wird doch bestimmt auf welche der 4 Anzeigen der Wert angezeigt
  1384. > werden soll?
  1385.  
  1386. Autsch. Kommanmdo retour. Ich hab mich verlesen.
  1387. War ein langer Tag, und heiss war's auch und ...
  1388.  
  1389. Tschuldigung. Mein Fehler
  1390.  
  1391. Markierten Text zitieren Antwort
  1392. Re: Projekt Stoppuhr in 8051 Assembler
  1393. Autor: Clemens (Gast)
  1394. Datum: 29.06.2006 12:14
  1395. Macht ja nix, Fehler sind Menschlich...
  1396.  
  1397. Ich konnte das Programm leider noch nicht testen, da die
  1398. Übertragungssoftware (Pony Prog) irgendwelche Fehler anzeigt (bezüglich
  1399. I/O Schnittstelle oder sowas in die Richtung).
  1400. Were das ganze jetzt aber mal bei mir zuhause ausprobieren...
  1401.  
  1402. Vorerst gehe ich aber mal davon aus, dass das Programm so funktioniert.
  1403. Was aber noch fehlt ist eben dieser Merker, welcher sich eine gestoppte
  1404. Uhrzeit merken soll.
  1405. Ich habe schon verschiedene Überlegungen angestellt, z.B.
  1406. - Wert in akku schreiben (ist aber wohl zu groß, oder?)
  1407. - Wert einem der beiden freistehenden Register (R6 und R7) zuweisen,
  1408. aber da bekomm ich ja auch nicht die 4 Zahlen rein
  1409. - Wert einfach an eine bestimmte Adresse schreiben, z.B. 060h
  1410.  
  1411. Alles ist aber nach meinen Erkenntnissen nicht möglich, deswegen
  1412. erbitte ich nun wiedereinmal eure Hilfe.
  1413. Nur eine Idee würde mich eventuell schon weiter bringen!
  1414.  
  1415. Danke im Voraus!
  1416.  
  1417. Markierten Text zitieren Antwort
  1418. Re: Projekt Stoppuhr in 8051 Assembler
  1419. Autor: Karl heinz Buchegger (kbucheg)
  1420. Datum: 29.06.2006 12:25
  1421. Na ja.
  1422. Zuerst mal musst du überlegen, dass du sowas wie
  1423. 'die Zeit' als eine Einheit ja gar nicht hast.
  1424. 'Die Zeit' ist verteilt auf (Moment, muss zaehlen gehen)
  1425. die Register R1 bis R5
  1426.  
  1427.    R1     der 4ms Zaehler
  1428.    R2     Einerstelle der Sekunden
  1429.    R3     Zehnerstelle der Sekunden
  1430.    R4     Einerstelle der Minuten
  1431.    R5     Zehnerstelle der Minuten
  1432.  
  1433.  
  1434. Wenn du also 'die Zeit' irgendwo zwischenspeichern möchtest,
  1435. dann wirst du halt die Inhalte dieser 5 Register irgendwo
  1436. sichern muessen. Wieso soll das nicht möglich sein, die Inhalte
  1437. dieser 5 Register im Speicher in 5 Bytes abzulegen?
  1438.  
  1439. Markierten Text zitieren Antwort
  1440. Re: Projekt Stoppuhr in 8051 Assembler
  1441. Autor: Stephan Henning (stephan-)
  1442. Datum: 29.06.2006 12:29
  1443. warum ist das nicht möglich ??? 4 dezimale Zahlen passen doch in 2 Bytes
  1444. rein. 2 Register oder 2 Speicherstellen.
  1445. 1 Byte besteht aus 2 Nibbles und mit einem Nibble kann man Zahlen von
  1446. 0-15 darstellen richtig ??
  1447. da wir aber dezimal nur bis 10 zählen nimmst Du ein Nibble und
  1448. dividierst es durch 15 (0Ah) und hast den dez. Wert.
  1449. Dann das 2. Nibble usw.
  1450.  
  1451. Markierten Text zitieren Antwort
  1452. Re: Projekt Stoppuhr in 8051 Assembler
  1453. Autor: Karl heinz Buchegger (kbucheg)
  1454. Datum: 29.06.2006 12:34
  1455. @stephan
  1456.  
  1457. Machs nicht unnötig kompliziert. Clemens schwimmt doch
  1458. sowieso schon hinten und vorne. Wenn du ihn jetzt auch
  1459. noch in Nibble-verarbeitung reinjagst ...
  1460. (Ich weiss das das alles in Wirklichkeit nicht kompliziert
  1461. ist. Nur: Wie erklärst du das jemanden der noch nicht mal
  1462. 5 Bytes irgendwo im Speicher ablegen und wieder laden
  1463. kann)
  1464.  
  1465. Markierten Text zitieren Antwort
  1466. Re: Projekt Stoppuhr in 8051 Assembler
  1467. Autor: Pieter (Gast)
  1468. Datum: 29.06.2006 12:53
  1469. moin moin,
  1470.  
  1471. @Stephan
  1472.  
  1473. >> da wir aber dezimal nur bis 10 zählen nimmst Du ein Nibble und
  1474. >> dividierst es durch 15 (0Ah) und hast den dez. Wert.
  1475.  
  1476. 2Zeile = 2Fehler, bitte nochmal.
  1477.  
  1478. @Clemens
  1479. Merker?
  1480. Machs wie mit einem Spickzettel in der Schule, da kommt doch auch das
  1481. rauf was Du Dir nicht merken kannst/willst.
  1482. Nimm also Speicherzellen z.B. ab 60H und lege da die Werte ab, welche
  1483. Du später noch gebrauchen tust. Vergleiche das mit dem, so wie Du es
  1484. manuell tun würdest.
  1485.  
  1486. Mit Gruß
  1487. Pieter
  1488.  
  1489. Markierten Text zitieren Antwort
  1490. Re: Projekt Stoppuhr in 8051 Assembler
  1491. Autor: Stephan Henning (stephan-)
  1492. Datum: 29.06.2006 13:36
  1493. natürlich zählen wir nur von 0 bis 9,
  1494.  
  1495. kommt davon wenn man auf Arbeit....
  1496.  
  1497. Markierten Text zitieren Antwort
  1498. Re: Projekt Stoppuhr in 8051 Assembler
  1499. Autor: Clemens (Gast)
  1500. Datum: 05.07.2006 15:50
  1501. So, mittlerweile bin ich fertig mit diesem Projekt und möchte mich bei
  1502. euch für eure Hilfe bedanken.
  1503. Weiter unten findet ihr den funktionierenden, getesteten Code.
  1504.  
  1505. Da ich immernoch einen Drang habe eine bessere Note zu erreichen, frage
  1506. ich mich ob es nicht möglich wäre statt den Minuten und den Sekunden,
  1507. die Sekunden und die Hundertstel auszugeben.
  1508. Wie wäre das mit meinem Programm realisierbar?
  1509. Habt ihr irgendwelche gute Vorschläge?
  1510.  
  1511. Für Antworten wie immer dankbar!
  1512.  
  1513.  
  1514. Gruß
  1515. Clemens
  1516.  
  1517. -----------------------------------------------
  1518. Aktuelles Programm (getestet!):
  1519.  
  1520.  
  1521. $include (reg52.inc)
  1522.  
  1523. Starttaster    bit P0.0
  1524. Stopptaster    bit P0.1
  1525. Resettaster    bit P0.2
  1526. Merkertaster   bit P0.3
  1527. Abruftaster    bit P0.4
  1528.  
  1529.  
  1530. org 0000h
  1531.  LJMP start
  1532.  
  1533.  
  1534.  
  1535.  
  1536. ;Einsprungadresse Interrupt-Serviceroutine für Timer 0
  1537. org 000Bh
  1538.      LJMP isrTimer0
  1539.  
  1540.  
  1541.  
  1542. org 0100h
  1543. start:            CALL initRegister  ;Register initialisieren
  1544.                CALL initTimer0    ;Interrupt Timer initialisieren
  1545.  
  1546. loop:            CALL ausgabe                  ;berechnete Werte
  1547. ausgeben
  1548.  
  1549.                   JB Starttaster, Weiter_bei_Stop      ;Abfrage des
  1550. Starttasters
  1551.                    SETB ET0                      ;Freigabe Timer 0
  1552.  
  1553. Weiter_bei_Stop:    JB Stopptaster, Weiter_bei_Merker    ;Abfrage des
  1554. Stopptasters
  1555.                      CLR ET0                      ;Zuruecksetzen des
  1556. Timers
  1557.  
  1558. Weiter_bei_Merker:  JB Merkertaster, Weiter_bei_Abruf    ;Abfrage des
  1559. Merkertasters
  1560.              MOV  061h,R0                  ;Schreibe die gestoppten
  1561. Werte
  1562.              MOV  062h,R1                          ;an Stellen im
  1563. Speicher
  1564.              MOV  063h,R2
  1565.              MOV  064h,R3
  1566.              MOV  065h,R4
  1567.              MOV  066h,R5
  1568.  
  1569. Weiter_bei_Abruf:    JB Abruftaster,Weiter_bei_Reset      ;Abfrage
  1570. Abfragetaster
  1571.              MOV  R0,061h                  ;gespeicherte Werte den
  1572.              MOV  R1,062h                          ;Registern zuweisen
  1573.              MOV  R2,063h
  1574.              MOV  R3,064h
  1575.              MOV  R4,065h
  1576.              MOV  R5,066h
  1577.  
  1578.              CALL ausgabe                  ;gespeicherte Werte ausgeben
  1579.  
  1580. Weiter_bei_Reset:   JB Resettaster, Weiter_bei_nichts    ;Abfrage
  1581. Resettaster
  1582.                     CALL initRegister               ;Register
  1583. zuruecksetzen
  1584. Weiter_bei_nichts:    LJMP loop                    ;Endlosschleife
  1585.  
  1586.  
  1587.  
  1588. initRegister:
  1589.      MOV  R0,#0          ;bestimmt welche der Anzeigen aktiv ist
  1590.      MOV  R1,#0           ;Zähler von o bis 249 -->4ms*250 = 1 Sec
  1591.  
  1592.      MOV  R2,#0          ;für Segment rechts     Sekunden Einer
  1593.      MOV  R3,#0           ;für Segment Mitte rechts   Sekunden Zehner
  1594.      MOV  R4,#0           ;für Segment Mitte links   Minuten Einer
  1595.      MOV  R5,#0           ;für Segment links     Minuten Zehner
  1596.  
  1597.      RET
  1598.  
  1599. initTimer0:
  1600.  
  1601.  
  1602.      SETB   EA                  ;Globale INT Freigabe. Bit im Reg IE
  1603.  
  1604.      MOV  TMOD,#00000001b      ;Timer0 konfiguieren, Modus1: 16bit
  1605. Zaehler
  1606.  
  1607.      MOV  TL0,#060h            ;Timer0 vorladen
  1608.  
  1609.      MOV  TH0,#0F0h            ;65536 - 4000 = 61536 = F060h (4ms)
  1610.  
  1611.      SETB  TR0                ;Start Timer0
  1612.  
  1613.      RET                ;Ruecksprung aus dem Unterprogramm
  1614.  
  1615.  
  1616. ;Interrupt-Service-Routine für Timer0
  1617. isrTimer0:
  1618.  
  1619.  
  1620.      MOV  TL0,#060h          ;Timer0 erneut vorladen
  1621.  
  1622.      MOV  TH0,#0F0h          ;65536 - 4000 = 61536 = F060h (4ms)
  1623.  
  1624.      CALL  neueUhrzeit       ;neue Uhrzeit berechnen
  1625.  
  1626.      RETI                    ;Ende der Interrupt-Service-Routine
  1627.  
  1628.  
  1629.  
  1630.  
  1631. neueUhrzeit:
  1632.  
  1633.        INC R1                ;erhöht den Zaehler
  1634.        CJNE R1,#250d,weiter      ;Wenn die Routine noch nicht 250 mal
  1635. aufgerufen wurden
  1636.                          ;dann springe nach weiter, da nichts geschieht
  1637.        MOV  R1,#0d               ;den Zaehler wieder auf Null
  1638. zurücksetzen
  1639.  
  1640.  
  1641.        INC R2                  ;Sekunden Einerstelle um Eins erhöhen
  1642.        CJNE R2,#10d,weiter      ;Entsteht dadurch kein Überlauf (9->10)
  1643. springe
  1644.                         ;nach weiter
  1645.        MOV R2,#0d              ;Es gab einen Überlauf, dadurch muss die
  1646. Einerstelle
  1647.                          ;zurückgesetzt werden
  1648.  
  1649.  
  1650.        INC R3                  ;Die Zehnerstelle der Sekunden muss um
  1651. Eins erhöht werden
  1652.        CJNE R3,#6d,weiter        ;Wenn die Zehnerstelle noch nicht 6
  1653. anzeigt springe
  1654.                          ;nach weiter
  1655.        MOV R3,#0d                ;Es gab einen Überlauf, dadurch muss
  1656. die Zehnerstelle
  1657.                         ;zurückgesetzt werden
  1658.  
  1659.        INC R4                 ;Die Minuten Einerstelle um Eins erhöhen
  1660.        CJNE R4,#10d,weiter       ;Entsteht dadurch kein Überlauf
  1661. (9->10) springe
  1662.                          ;nach weiter
  1663.        MOV R4,#0d                ;Es gab einen Überlauf, dadurch muss
  1664. die Einerstelle
  1665.                          ;zurückgesetzt werden
  1666.  
  1667.        INC R5                 ;Die Minuten Zehnerstelle um Eins erhöhen
  1668.        CJNE R5,#6d,weiter        ;Entsteht dadurch kein Überlauf (5->6)
  1669. springe
  1670.                          ;nach weiter
  1671.         MOV R2,#0d              ;Es gab einen Überlauf, dadurch muessen
  1672. Register 2 bis 5
  1673.        MOV R3,#0d            ;zurückgesetzt werden. Da die Uhr nicht
  1674. mehr
  1675.        MOV R4,#0d            ;anzeigen kann
  1676.        MOV R5,#0d
  1677.  
  1678. weiter:  RET              ;Ruecksprung aus dem Unterpogramm
  1679.  
  1680.  
  1681. ausgabe:  INC   R0          ;erhöht die Anzeigennummer
  1682.        CJNE  R0,#04,rechts    ;Ist der Wert ungleich 4 springe nach
  1683. rechts
  1684.        MOV  R0,#0          ;Setzt den Wert der Anzeigennummer zurück
  1685.  
  1686. rechts: CJNE  R0,#0,mire      ;Ist die Anzeigennummer ungleich 0 springe
  1687. nach mire
  1688.        MOV  A,R2          ;Schreibe den berechneten Uhrzeitwert in den
  1689. Akku
  1690.        CALL  BCD7Seg        ;Ruft Werte für BCD7Seg Anzeige auf
  1691.        MOV  P1,A          ;Gibt den im Akku gespeicherten Wert auf P1
  1692. aus
  1693.        MOV  P2,#00001110b    ;gibt die Anzeigenposition auf P2 aus
  1694.  
  1695. mire:   CJNE  R0,#1,mili      ;Ist die Anzeigennummer ungleich 1 springe
  1696. nach mili
  1697.        MOV  A,R3          ;Schreibe den berechneten Uhrzeitwert in den
  1698. Akku
  1699.        CALL  BCD7Seg        ;Ruft Werte für BCD7Seg Anzeige auf
  1700.        MOV  P1,A          ;Gibt den im Akku gespeicherten Wert auf P1
  1701. aus
  1702.        MOV  P2,#00001101b    ;gibt die Anzeigenposition auf P2 aus
  1703.  
  1704. mili:   CJNE  R0,#2,links    ;Ist die Anzeigennummer ungleich 2 springe
  1705. nach links
  1706.        MOV  A,R4          ;Schreibe den berechneten Uhrzeitwert in den
  1707. Akku
  1708.        CALL  BCD7Seg        ;Ruft Werte für BCD7Seg Anzeige auf
  1709.        MOV  P1,A          ;Gibt den im Akku gespeicherten Wert auf P1
  1710. aus
  1711.        MOV  P2,#00001011b    ;gibt die Anzeigenposition auf P2 aus
  1712.  
  1713. links:   CJNE  R0,#3,m1      ;Ist die Anzeigennummer ungleich 3 springe
  1714. nach m1
  1715.        MOV  A,R5          ;Schreibe den berechneten Uhrzeitwert in den
  1716. Akku
  1717.        CALL  BCD7Seg        ;Ruft Werte für BCD7Seg Anzeige auf
  1718.        MOV  P1,A          ;Gibt den im Akku gespeicherten Wert auf P1
  1719. aus
  1720.        MOV  P2,#00000111b    ;gibt die Anzeigenposition auf P2 aus
  1721.  
  1722. m1:      RET              ;Rücksprung aus dem Unterprogramm
  1723.  
  1724.  
  1725. ; Wandelt vom BCD-Code in den 7-Segment-Code
  1726. BCD7Seg:  INC  A
  1727.      MOVC  A,@A+PC
  1728.      RET
  1729.      DB  3Fh, 06h, 5Bh, 4Fh, 66h, 6Dh, 7Dh, 07h, 7Fh, 6Fh
  1730.  
  1731.  
  1732.  
  1733.  
  1734. END
  1735.  
  1736. Markierten Text zitieren Antwort
  1737. Re: Projekt Stoppuhr in 8051 Assembler
  1738. Autor: Karl heinz Buchegger (kbucheg)
  1739. Datum: 05.07.2006 16:01
  1740. > Da ich immernoch einen Drang habe eine bessere Note zu erreichen,
  1741. > frage ich mich ob es nicht möglich wäre statt den Minuten und den
  1742. > Sekunden, die Sekunden und die Hundertstel auszugeben.
  1743. > Wie wäre das mit meinem Programm realisierbar?
  1744.  
  1745. Natürlich.
  1746. Es ist aber an der Zeit, dass du selbst anfängst nachzudenken.
  1747. Die Änderungen sind trivial sobald du verstanden hast
  1748. was bei einer Uhr die Hunderstel/Sekunden anzeigt anders
  1749. ist als bei einer die Minuten/Sekunden anzeigt.
  1750.  
  1751. Hinweise:
  1752.  Wenn 59 Sekunden vergangen sind, was passiert dann?
  1753.  Muss dasselbe auch passieren wenn 59 Hunderstel Sekunden
  1754.  vergangen sind?
  1755.  
  1756. Markierten Text zitieren Antwort
  1757. Forenliste Threadliste Neuer Beitrag Suchen Anmelden Benutzerliste Bildergalerie Hilfe Login
  1758. Thread beobachten |   Seitenaufteilung abschalten
  1759. Antwort schreiben
  1760. Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
  1761. Wichtige Regeln - erst lesen, dann posten!
  1762. Groß- und Kleinschreibung verwenden
  1763. Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  1764. Formatierung (mehr Informationen...)
  1765. [c]C-Code[/c]
  1766. [avrasm]AVR-Assembler-Code[/avrasm]
  1767. [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  1768. [math]Formel in LaTeX-Syntax[/math]
  1769. [[Titel]] - Link zu Artikel
  1770. Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
  1771. "Adresse kopieren", und in den Text einfügen
  1772. Name:  
  1773.  
  1774. E-Mail (wird nicht angezeigt): 
  1775.  
  1776. Betreff:   
  1777. Re: Projekt Stoppuhr in 8051 Assembler
  1778.  
  1779. Dateianhang:    Choose file
  1780. Weitere Datei anhängen
  1781. Bitte das JPG-Format nur für Fotos und Scans verwenden!
  1782. Zeichnungen und Screenshots im PNG- oder
  1783. GIF-Format hochladen. Siehe Bildformate.
  1784. Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
  1785. Bitte hier nur auf die ursprüngliche Frage antworten,
  1786. für neue Fragen einen neuen Beitrag erstellen.
  1787. Text:
  1788.  
  1789.  
  1790. Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.
  1791. Vorschau  Absenden
  1792.  
  1793. Forenliste Threadliste Neuer Beitrag Suchen Anmelden Benutzerliste Bildergalerie Hilfe Login
  1794. Forenliste
  1795. Threadliste
  1796. Neuer Beitrag
  1797. Suchen
  1798. Benutzerliste
  1799. Bildergalerie
  1800. Hilfe
  1801. Anmelden
  1802. Login
  1803. Kontakt/Impressum – Nutzungsbedingungen
  1804. LADE...
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement