Hallo zusammen! Will einen Reaktionstester mit einen Atmel 4051 bauen! Habe die Platine auch schon fertig. Habe aber probleme mit der Assembler programmierung. Ich hoffe ihr koennt mir da weiterhelfen! :) Die Ausgabe erfolgt auf 4 Sieben-Segment-Anzeigen. Desweiteren gibt es natuerlich einen Start, Stop und Reset Taster! Taktgeber ist ein Quarz! Der Taktgeber ist auf PIN "XTAL1" & "XTAL2". Die 4 Sieben-Segment-Anzeigen haben folgende PIN-Belegung: - Sekunden "P3.0" - 1/10 Sekunde "P3.1" - 1/100 Sekunde "P3.4" - 1/1000 Sekunde "P3.5" Die einzelnen Segmente der 7-Segment-Anzeigen von PIN "P1.1" bis "P1.7" Der Start-Taster auf PIN "P3.2/INT0", der Stop-Taster auf "P3.3/INT1" Reset natuerlich auf "RST" Nach 9.999 Sekunden soll die Anzeige auf -.--- umspringen. Und nach dem man Reset gedrueckt hat auf 0.000 ! Wenn Ihr weitere Details braucht meldet euch Ich habe mal ein wenig rumgebastelt (Habe auch Teile von einer Stoppuhr hineingebracht). Nun weiss ich nicht, in wie fern ich das Richtig gemacht habe. Wuerde mich ueber eure Beitraege sehr freuen! Vielen Dank im vorraus! Ramon Hier der Code: $include (reg52.inc) START-Taster bit P0.0 STOP-Taster bit P0.1 RESET-Taster bit P0.2 org 0000h LJMP start ;Einsprungadresse Interrupt-Serviceroutine für Timer 0 org 000Bh LJMP isrTimer0 org 0100h startabfrage: JB Starttaster,start ;Programm starten wenn Taster gedrückt LJMP startabfrage start: CALL initRegister CALL initTimer0 loop: JB Resettaster,springer springer: LJMP initRegister LJMP loop ;Endlosschleife initRegister: MOV R0,#0 ;bestimmt welche der Anzeigen aktiv ist MOV R1,#0 ;Zähler von o bis 249 -->4ms*250 = 1 Sec MOV R2,#0 ;Sekunden Einer MOV R3,#0 ;Sekunden Zehner MOV R4,#0 ;Sekunden Hundertstel MOV R5,#0 ;Sekunden Tausendstel RET initTimer0: SETB ET0 ;Freigabe Timer0. Bit im Reg IE, Reg.-Adresse A8h SETB EA ;Globale INT Freigabe. Bit im Reg IE MOV TMOD,#00000001b ;Timer0 konfiguieren, Modus1: 16bit Zaehler MOV TL0,#060h ;Timer0 vorladen MOV TH0,#0F0h ;65536 - 4000 = 61536 = F060h (4ms) SETB TR0 ;Start Timer0 RET ;Interrupt-Service-Routine für Timer0 isrTimer0: MOV TL0,#060h ;Timer0 erneut vorladen MOV TH0,#0F0h ;65536 - 4000 = 61536 = F060h (4ms) CALL neueUhrzeit ;neue Uhrzeit berechnen CALL ausgabe ;Ausgabe auf Anzeige RETI ;Ende der Interrupt-Service-Routine neueUhrzeit: INC R1 ;erhoehe Register 1 CJNE R1,#250d,weiter ;Springe nach weiter wenn der Inhalt von R1 ungleich 250d ist MOV R1,#0d ;Lade Register 1 mit dem Wert 0 INC R2 ;erhoehe Register 2 CJNE R2,#10d,weiter ;Springe nach weiter wenn der Inhalt von R2 ungleich 10d ist MOV R2,#0d ;Lade Register 2 mit dem Wert 0 INC R3 ;erhoehe Register 3 CJNE R3,#10d,weiter ;Springe nach weiter wenn der Inhalt von R3 ungleich 10d ist MOV R3,#0d ;Lade Register 3 mit dem Wert 0 INC R4 ;erhoehe Register 4 CJNE R4,#10d,weiter ;Springe nach weiter wenn der Inhalt von R4 ungleich 10d ist MOV R4,#0d ;Lade Register 4 mit dem Wert 0 INC R5 ;erhoehe Register 5 CJNE R5,#06d,weiter ;Springe nach weiter wenn der Inhalt von R5 ungleich 10d ist MOV R5,#0d ;Lade Register 5 mit dem Wert 0 LJMP weiter ;aufrufen von weiter weiter: RET ;Rücksprung aus dem Unterprogramm ausgabe: INC R0 CJNE R0,#04,rechts MOV R0,#0 sekunden: CJNE R0,#0,zehntel MOV A,R4 CALL BCD7Seg MOV P1,A MOV P2,#00001110b zehntel: CJNE R0,#1,hundertstel MOV A,R5 CALL BCD7Seg MOV P1,A MOV P2,#00001101b hundertstel: CJNE R0,#2,tausendstel MOV A,R6 CALL BCD7Seg MOV P1,A MOV P2,#00001011b tausendstel: CJNE R0,#3,return MOV A,R7 CALL BCD7Seg MOV P1,A MOV P2,#00000111b return: RET ; Wandelt vom BCD-Code in den 7-Segment-Code BCD7Seg: INC A MOVC A,@A+PC RET DB 3Fh, 06h, 5Bh, 4Fh, 66h, 6Dh, 7Dh, 07h, 7Fh, 6Fh END
@Ramon, also eine Vorstellung und etwas Grundwissen sollte man schon haben dafür. Einfach etwas zusammenkopieren bringt wenig und funzt äußerst selten. 1. mache Dir Gedanken über ein Grundtiming ( Wichtig ) Was soll wann passieren.... In der ISR berechnet man z.B.keine Zeit. Mann oder Frau incrmentiert, setzt ein Flag und gut. Das muß dann in der Main ausgewertet werden. zB. durch Abfrage auf Überläufe tec. 2. Dein Grundtiming sollte so gewählt sein das der Multiplextakt für die Anzeigen dabei "herausspringt" ( zB. ein Vielfaches ) 3. Das Grundtiming sollte auch die Tastenentperllung berücksichtigen 10 bis 20 ms reichen dafür Es reicht also nicht mit Copy und Paste zu "arbeiten". Stell ein Grundgerüst auf die Beine ( PAP ). Poste es hier und dann gehts Schritt für Schritt weiter. Für jemanden der programmieren kann ist das ein Wochenendprojekt. Ich denke bei Dir wirds deutlich länger dauern. Und ne Schaltung wäre ja auch nicht schlecht. Damit progrmmiert es sich besser... Gruß Stephan
Stephan Henning wrote: > In der ISR berechnet man z.B.keine Zeit. > Mann oder Frau incrmentiert, setzt ein Flag und gut. > Das muß dann in der Main ausgewertet werden. Kann man nicht so generell sagen. Hier werden ja nur Bytes incrementiert und verglichen, sind also nur wenige Zyklen. Was allerdings fehlschlägt, ist das "LJMP initRegister", gibt nen fetten Stack-Underflow. Wohin soll denn das "RET" hingehen ? Und die Abfrage der Tasten finde ich nirgends. Peter
@Peter, schrieb er doch, hat nur was von ner Stoppuhr gefunden und will damit was machen. Deswegen meinte ich ja Copy und Paste reicht dafür eben nicht.
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.