Hallo zusammen ich habe ein riesen Problem und einige Fragen zu meinem Assembler Programm. Programmfunktion Uhr mit Überlauferkennung 1)Frage worin liegt der Unterschied zwischen den Befehelen mov a,xx und mov a,#xx was bewirkt dieses Raute Zeichen bei der Zuweisung ? diese Frage stelle ich nicht umsonst weil ich im Unterprogramm LCD_Zeitausgabe (s.u) keine LCD Ausgabe bekomme wenn die den Akkumulator mit mov a,#xx fülle folgendes wird dann auf dem Display gezeigt [124:125:126] und ohne dieses Rautezeichen bekomme ich das ewünschte Ergebnis. 2)Frage wenn ich meine Zeitvariablen mit anderen Werten initialisiere z.B. mov Minuten,#10 mov Stunden,#5 mov Sekunden,#1 startet die Uhr immer noch bei 00:00:00 wieso ? was muss ich machen um die mit den vorinitialisierten Werten die Uhr starten zu lassen ? 3)Frage wenn ich meinen Controllerboard resete dauert es ungefähr 5 Sek bis die Uhr anfängt loszulaufen wieso ? jedoch wenn ich nach dem init: [main: sjmp main] reinmache läuft die Uhr bei reset sofort los ! 4) Überlauferkennung funktioniert jetzt auch nicht mehr :-( include c51ed2.inc Extern Code initLCD,loeschen,loeschzeile1,loeschzeile2,textzeile1,textzeile2,cursorp os,cursoran,cursoraus Extern Code textaus,zifferaus,hexaus,dezaus,dualaus,dualaus1,dualaus2,charaus Extern Code definierezeichen,loeschzeile3,loeschzeile4,textzeile3,textzeile4 Stunden equ 07ch ; Variablen im Internen RAM anglegen direkt unter dem SFR Register Minuten equ 07dh ; Speicherbereich geht von 00h 007FH Sekunden equ 07Eh Zaehler equ 07Fh ; Konstanten definieren Takt equ 12000000 ; Systemtakt 12 Mhz. s.Datenblatt Perioden equ 12 ; 12 Perioden auf 6 Zyklen verteilt TMR_SEC equ Takt/Perioden ; benötigte Zeit um ein Befehl ausführen zu können Maschinenzyklus Nachladewert equ 15536 ; Timer Nachladewert Autoreload org 000h lcall initLCD ; LCD wird initialisiert lcall loeschen ; LCD Display wird gelöscht ljmp init org 001bh ; Einsprugsadresse für ISR Timer1 Überlauf push acc ; Akkumulator wird im Stack gesichert push psw ; Programm Status Word wird im Stack gesichert CLR TR1 ; Timer1 wird (TCON Register) abgeschalten um nachladen zu können s.u mov TH1,#High Nachladewert ; High Byte von Timer1 wird geladen mov TL1,#Low Nachladewert ; Low Byte von Timer1 wird geladen Setb TR1 ; Timer1 wird wieder gestartet da der Low und High Register nachgeladen wurde DJNZ Zaehler,Exit ; Springt zu Exit wenn der Zaehler ungleich 0 ist mov Zaehler,#20 ; Zaehler wird wieder nachgeladen da 1 Sekunden erreicht wurde Rechnung: 50000 Zaehlung = 0.05 Sekunden *20 = Sekunde ist inc Sekunden ; erhöht den Inhalt von Sekunden um Wert 1 mov a,#Sekunden ; kopiert den Inhalt von Sekunden in den Akkumulator CJNE a,#60,Exit ; vergleicht den Inhalt von von Akkumulator mit der Konstanten 60 und verzweigt bei ungleichheit mov Sekunden,#0 ; der Inhalt von Sekunden wird auf 0 gesetzt da 60 Sekunden vergangen sind inc Minuten ; erhöht den Inhalt von Minuten um den Wert 1 mov a,#Minuten ; kopiert den Inhalt von Minuten in den Akkumulator CJNE a,#60,Exit ; vergleicht den Inhalt von von Akkumulator mit der Konstanten 60 und verzweigt bei ungleichheit mov Minuten,#0 ; der Inhalt von Minuten wird auf 0 gesetzt da 60 Minute vergangen sind inc Stunden ; erhöht den Inhalt von Stunden um den Wert 1 da 60 Minuten vergangen sind mov a,#Stunden ; kopiert den Inhalt von Stunden in den Akkumulator CJNE a,#24,Exit ; vergleicht den Inhalt von Akkumulator mit der Konstante 24 und verzweigt bei ungleichheit mov Stunden,#0 ; setzt den Wert von Stunden 0, da 24 Stunden vergangen sind. Exit: call LCD_Zeitausgabe ; pop psw ; Programm Status Word wird wieder vom Stak hergestellt pop acc ; Akkumulator wird wieder vom Stack hergestellt reti ; Interrupt Service Routine wird wieder verlassen init: mov TH1,#High Nachladewert ; High Byte von Timer1 wird geladen mov TL1,#Low Nachladewert ; Low Byte von Timer1 wird geladen mov TMOD,#00010000b ; Timer 1 im Modus 1 {16 Bit Timer ohne Auto Reload wird aktiviert} Setb TR1 ; Timer1 wird aktiviert bzw. gestartet mov Stunden,#0 ; Variable Stunden im internen RAM wird initialisiert s.o mov Minuten,#0 ; Variable Minuten im internen RAM wird initialisiert s.o mov Sekunden,#0 ; Variable Sekungen im internen RAM wird initialisiert s.o mov Zaehler,#20 ; Variable Zaehler im internen RAM wird initialisiert s.o Setb ET1 ; Timer1 Überlauf wird aktiviert Setb EA ; Globale Freigabe für die Interrupts im IEN0 Interrupt Enable Register ;main: ;sjmp main LCD_Zeitausgabe: push acc push psw mov dptr,#text ; Datenpointer auf doppelpunkt mov a,#00 ; Akkumulator wird auf 1 gesetzt lcall cursorpos ; Cursorposition LCD wird auf 0 gesetzt mov a,Stunden ; in den Akkumulator wird der Inhalt von Stunden geschrieben lcall dezaus ; Stunden wird auf dem Display angezeigt mov a,#04 ; Akkumulator wird auf 5 gesetzt lcall cursorpos ; Cursorposition wird auf 05 lcall textaus ; Doppelpunkt wird eingefügt mov a,Minuten ; in den Akkumulator wird der Inhalt von Minute geschrieben lcall dezaus mov a,#9 ; Akkumulator wird auf 10 gesetzt lcall cursorpos lcall textaus ; doppelpunkt wird auf Position ausgegeben mov a,Sekunden ; in den Akkumulator wird der Inhalt von Sekunden geschrieben lcall dezaus ; Stunden wird auf dem Display angezeigt text: db ':',0 pop psw pop acc ret end.
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.