Het maken van een uurwerk via het programma MCU 8051 IDE

Dit topic is gesloten


ik zal het dan volledig oppernieuw doen

ORG 0h
LJMP start
ORG 30h
start: MOV SCON,#40h ; serieel kanaal van mode1 8-bit UART variabele baudrate instellen
MOV TMOD,#22h ; instellen timer1 als 8-bit auto reload voor baudrategenerator
ORL PCON,#80h ; baudrate verdubbelaar activeren
MOV TH1,#243 ; 4800 baudrate
MOV TL1,#243 ; 4800 baudrate
SETB TR1 ; baudrategenerator activeren

Deze code heb ik toch al nodig om mijn serieel poort te gebruiken

Gebruik zoals reeds gezegd code-tags/indentatie. Zo wordt het een onoverzichtelijke woordenbrij als de code lang wordt.
(dan heeft zelfs de meest welwillende programmeur geen overzicht meer...)

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

Onthou dat de microcontroller elke lijn, stap voor stap uitvoert.
En dit ook letterlijk doet.
Je vergeet een return naar je eerste lijn, dus je controller loopt vast op de laatste lijn.
De configuratie van de seriele poort en timers hoef je maar 1 keer uit te voeren. Maak een hoofdprogramma (genaamd bvb MAIN of kies een naam die je zelf wil zoals HOOFD) zoiets dus:

code:

ORG 0h
LJMP start
ORG 30h
start: MOV SCON,#40h ; serieel kanaal van mode1 8-bit UART variabele baudrate instellen
MOV TMOD,#22h ; instellen timer1 als 8-bit auto reload voor baudrategenerator
ORL PCON,#80h ; baudrate verdubbelaar activeren
MOV TH1,#243 ; 4800 baudrate
MOV TL1,#243 ; 4800 baudrate
SETB TR1 ; baudrategenerator activeren

MAIN: (voer hier uw programma in dat de leds op P0 stuurt enzo)

LJMP MAIN

Op 17 augustus 2016 14:38:20 schreef S-man:
kijk, ik ben altijd naar de les geweest. Daar snapte ik die oefeningen wel omdat ik hulp kon vragen aan de docent. Het is nu een moeilijke opgave dat ik niet direct kan oplossen, van wegens te weinig hulp en voorbeelden om het op te lossen.

Naar ik begrijp had de topicstarter van het vorige topic (Davidof) een hele hoop van de in deze oefening aanwezige deelproblemen al eens als losse opdracht in de les gehad. Je zou dus kunnen beginnen met de eerder door jou gemaakte opdrachten te verzamelen in plaats van het "volledig oppernieuw" te doen (maar in feite wederom een stukje code van Davidof te plakken).

If you want to succeed, double your failure rate.

Even alles leesbaar gemaakt; kan dat niet aanzien... :)

code:


        ORG 0h
        LJMP start
        ORG 30h

start:  MOV SCON,#40h        ;serieel kanaal van mode1 8-bit UART variabele baudrate instellen
        MOV TMOD,#22h        ;instellen timer1 als 8-bit auto reload voor baudrategenerator
        ORL PCON,#80h        ;baudrate verdubbelaar activeren
        MOV TH1,#243         ;4800 baudrate
        MOV TL1,#243         ;4800 baudrate
        SETB TR1             ;baudrategenerator activeren

MAIN: (voer hier uw programma in dat de leds op P0 stuurt enzo)

        LJMP MAIN
Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

Op 17 augustus 2016 15:01:12 schreef kohen:
Onthou dat de microcontroller elke lijn, stap voor stap uitvoert.
En dit ook letterlijk doet.
Je vergeet een return naar je eerste lijn, dus je controller loopt vast op de laatste lijn.
De configuratie van de seriele poort en timers hoef je maar 1 keer uit te voeren. Maak een hoofdprogramma (genaamd bvb MAIN of kies een naam die je zelf wil zoals HOOFD) zoiets dus:

code:

ORG 0h
LJMP start
ORG 30h
start: MOV SCON,#40h ; serieel kanaal van mode1 8-bit UART variabele baudrate instellen
MOV TMOD,#22h ; instellen timer1 als 8-bit auto reload voor baudrategenerator
ORL PCON,#80h ; baudrate verdubbelaar activeren
MOV TH1,#243 ; 4800 baudrate
MOV TL1,#243 ; 4800 baudrate
SETB TR1 ; baudrategenerator activeren

opdracht:  
MOV P0,#00000001b ; beginfase looplicht
        MOV R0,#0 ; register voor de seconden van de klok
        MOV R1,#0 ; register voor de minuten van de klok
        MOV R2,#0 ; register voor de uren van de klok

LJMP opdracht

dat zijn die instellingen voor die led, seconden, minuten en uren

Op deze manier gaat dit een lang topic worden S-man.

@Arco

Hoe typ je zo alles in kolommen ? Bij mij doet de TAB toets niet wat ik wil :)

Is wat lastig ja... (zou handig zijn als de tab toets bij code-tags zou werken)
Gelukkig hebben we de spatiebalk nog... ;)

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

moet ik eerst die instellingen van die klok doen of de beweging links en rechts invoeren bij de opdracht?

eerst de klok, want links of rechts hangt af van de klok

klok: CLR TR0 ; de timer0 wordt eerst gewist voor de programma begint
CLR TF0 ; wissen van de overflow vlag van timer0
MOV TH0,#0FFh ; startwaarde voor 200µs( 65535 - 200 = 65335 = FF37) FF bij de hoogste waarde
MOV TL0,#37h ; startwaarde voor 200µs( 65535 - 200 = 65335 = FF37) 37 bij de laagste waarde
SETB TR0 ; timer0 starten
SETB ET0 ; activeren interrupt timer0
SETB EA ; zet hoofdschakelaar 'gebruik interrupts' aan

MOV A, R1 ; de informatie van R1 wordt uitgegeven aan de accumulator
ANL A, #00000001b
JZ links ; sprong naar links
JNZ rechts ; sprong naar rechts

deze instellingen gebruiken of een andere?

Bekijk de aanpassingen die ik gedaan heb... lijn per lijn.

Kan je hier aan uit ?

code:

  
        ORG 0h
        LJMP start
        ORG 30h

start:  MOV SCON,#40h        ;serieel kanaal van mode1 8-bit UART variabele baudrate instellen
        MOV TMOD,#22h        ;instellen timer1 als 8-bit auto reload voor baudrategenerator
        ORL PCON,#80h        ;baudrate verdubbelaar activeren
        MOV TH1,#243         ;4800 baudrate
        MOV TL1,#243         ;4800 baudrate
        SETB TR1             ;baudrategenerator activeren
        MOV R1,#000H         ;seconden op 0 (hoef je maar 1x uit te voeren
        MOV R2,#000H         ;minuten op 0
        MOV R3,#000H         ;uren op 0
        MOV R4,#00000001B    ;R4 op 1 zetten, R4 wordt gebruikt voor het looplicht

;---------------------------------------------

MAIN:   LCALL KLOK

        LJMP MAIN

;---------------------------------------------

KLOK:   JNB TF0,KLOK         ;als TF0=0, spring naar klok
        CLR TF0
        MOV A,R1
        ANL A,#00000001B
        JZ EVEN              ;als bit0=0, dan is het een even getal, spring dan naar routine EVEN
        JNZ ONEVEN           ;anders spring naar ONEVEN
        RET

;---------------------------------------------

EVEN:   MOV A,R4
        RL A
        MOV R4,A
        MOV P0,A 
        RET

;---------------------------------------------

ONEVEN: MOV A,R4
        RR A
        MOV R4,A
        MOV P0,A 
        RET

;---------------------------------------------

oké, dit kan ik al volgen maar hoe zit het met deze code?
optellen:
INC R0
CJNE R0,#60d,weergave ; maximumwaarde = 60 seconden
MOV R0,#0
INC R1 ; verhogen van de minuten
CJNE R1,#60d,weergave ; maximumwaarde = 60 minuten
MOV R1,#0
INC R2 ; verhogen van de uren
CJNE R2,#24d,weergave ; maximumwaarde = 24 uren
MOV R2,#0

Moet ik die ook gebruiken of mag dat weg?

klopt, je moet je registers van de klok nog optellen

Aan jou om dit in te passen in mijn programma.

In mijn tijd was het examen microcontrollers in een lokaal met toezicht en had je 2 uur tijd om een bepaald programma te schrijven.

S-man, je hebt nog 30 minuten ;)

Op 17 augustus 2016 15:55:06 schreef kohen:
Bekijk de aanpassingen die ik gedaan heb... lijn per lijn.

Kan je hier aan uit ?

code:

  
        ORG 0h
        LJMP start
        ORG 30h

start:  MOV SCON,#40h        ;serieel kanaal van mode1 8-bit UART variabele baudrate instellen
        MOV TMOD,#22h        ;instellen timer1 als 8-bit auto reload voor baudrategenerator
        ORL PCON,#80h        ;baudrate verdubbelaar activeren
        MOV TH1,#243         ;4800 baudrate
        MOV TL1,#243         ;4800 baudrate
        SETB TR1             ;baudrategenerator activeren
        MOV R1,#000H         ;seconden op 0 (hoef je maar 1x uit te voeren
        MOV R2,#000H         ;minuten op 0
        MOV R3,#000H         ;uren op 0
        MOV R4,#00000001B    ;R4 op 1 zetten, R4 wordt gebruikt voor het looplicht

;---------------------------------------------

MAIN:   LCALL KLOK
        CALL optellen
        LJMP MAIN

;---------------------------------------------

KLOK:   JNB TF0,KLOK         ;als TF0=0, spring naar klok
        CLR TF0
        MOV A,R1
        ANL A,#00000001B
        JZ EVEN              ;als bit0=0, dan is het een even getal, spring dan naar routine EVEN
        JNZ ONEVEN           ;anders spring naar ONEVEN
        RET

;---------------------------------------------

EVEN:   MOV A,R4
        RL A
        MOV P0,A 
        RET

;---------------------------------------------

ONEVEN: MOV A,R4
        RR A
        MOV P0,A 
        RET

;---------------------------------------------
 ORG 0h
        LJMP start
        ORG 30h

start:  MOV SCON,#40h        ;serieel kanaal van mode1 8-bit UART variabele baudrate instellen
        MOV TMOD,#22h        ;instellen timer1 als 8-bit auto reload voor baudrategenerator
        ORL PCON,#80h        ;baudrate verdubbelaar activeren
        MOV TH1,#243         ;4800 baudrate
        MOV TL1,#243         ;4800 baudrate
        SETB TR1             ;baudrategenerator activeren
        MOV R1,#000H         ;seconden op 0 (hoef je maar 1x uit te voeren
        MOV R2,#000H         ;minuten op 0
        MOV R3,#000H         ;uren op 0
        MOV R4,#00000001B    ;R4 op 1 zetten, R4 wordt gebruikt voor het looplicht

;---------------------------------------------

MAIN:   LCALL KLOK

        LJMP MAIN

;---------------------------------------------

KLOK:   JNB TF0,KLOK         ;als TF0=0, spring naar klok
        CLR TF0
        MOV A,R1
        ANL A,#00000001B
        JZ EVEN              ;als bit0=0, dan is het een even getal, spring dan naar routine EVEN
        JNZ ONEVEN           ;anders spring naar ONEVEN
        RET

;---------------------------------------------

EVEN:   MOV A,R4
        RL A
        MOV P0,A 
        RET

;---------------------------------------------

ONEVEN: MOV A,R4
        RR A
        MOV P0,A 
        RET
,---------------------------------------------
optellen:
        INC R0
        CJNE R0,#60d,weergave ; maximumwaarde = 60 seconden 
        MOV R0,#0
        INC R1 ; verhogen van de minuten
        CJNE R1,#60d,weergave ; maximumwaarde = 60 minuten
        MOV R1,#0
        INC R2 ; verhogen van de uren
        CJNE R2,#24d,weergave ; maximumwaarde = 24 uren
        MOV R2,#0
        RET

Ik denk dat hij goed is

Ik weet niet of ik je nog verder moet helpen. De simpelste dingen vergeet je zoals:

in je routine optellen:, wordt er een paar keer gesprongen naar "weergave". Waar staat die ?

Vanboven staat R1, R2 en R3 voor sec, min en uren.
Jij gebruikt onderaan R0,R1 en R2.

[Bericht gewijzigd door kohen op 17 augustus 2016 16:52:35 (19%)]

Sorry, ik was ietsje te rap bezig om dat ik nog bezig zat met andere dingen.

weergave:
MOV P1,R1; seconden worden weergegeven op poort0
MOV P2,R2; minuten worden weergegeven op poort1
MOV P3,R3; uren worden weergegeven op poort2
RET

dit moet er nog bij en dan is hij af. ik hoop dat het nu in orde is.

Op 17 augustus 2016 16:25:29 schreef kohen:
In mijn tijd was het examen microcontrollers in een lokaal met toezicht en had je 2 uur tijd om een bepaald programma te schrijven.

Ja, dit soort "examens" lijken nergens op, iedereen kan die opdracht gemaakt krijgen zo.

Ik weet niet of ik je nog verder moet helpen. De simpelste dingen vergeet je

Ja ik was al afgehaakt, hij wacht gewoon net zo lang tot jij alles hebt gedaan.

If you want to succeed, double your failure rate.

sorry maat, ik ben nu bezig aan een super moeilijke vak. Ik zit nu letterlijk met 2 verschillende dingen bezig.

ORG 0h
LJMP start
ORG 30h

start: MOV SCON,#40h ;serieel kanaal van mode1 8-bit UART variabele baudrate instellen
MOV TMOD,#22h ;instellen timer1 als 8-bit auto reload voor baudrategenerator
ORL PCON,#80h ;baudrate verdubbelaar activeren
MOV TH1,#243 ;4800 baudrate
MOV TL1,#243 ;4800 baudrate
SETB TR1 ;baudrategenerator activeren
MOV R1,#000H ;seconden op 0 (hoef je maar 1x uit te voeren
MOV R2,#000H ;minuten op 0
MOV R3,#000H ;uren op 0
MOV P0,#00000001B ;P0 op 1 zetten, Po wordt gebruikt voor het looplicht

MAIN: LCALL KLOK

LJMP MAIN

KLOK: JNB TF0,KLOK ;als TF0=0, spring naar klok
CLR TF0
MOV A,R1
ANL A,#00000001B
JZ EVEN ;als bit0=0, dan is het een even getal, spring dan naar routine EVEN
JNZ ONEVEN ;anders spring naar ONEVEN
RET

EVEN: MOV A,P0
RL A
MOV P0,A
RET

ONEVEN: MOV A,P0
RR A
MOV P0,A
RET

optellen:
INC R1
CJNE R1,#60d,weergave ; maximumwaarde = 60 seconden
MOV R1,#0
INC R2 ; verhogen van de minuten
CJNE R2,#60d,weergave ; maximumwaarde = 60 minuten
MOV R2,#0
INC R3 ; verhogen van de uren
CJNE R3,#24d,weergave ; maximumwaarde = 24 uren
MOV R3,#0
RET
weergave:
MOV P1,R1; seconden worden weergegeven op poort0
MOV P2,R2; minuten worden weergegeven op poort1
MOV P3,R3; uren worden weergegeven op poort2
RET
END; einde van het progamma

Dit is mijn volledige opgave, ik weet alleen niet of dat het echt marcheer. Ik kan dat moeilijk zien op mijn simulatie

Iets zinnigs zal 't niet doen; de routines optellen() en weergave() worden nooit uitgevoerd zo...

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

Op 17 augustus 2016 17:50:12 schreef Arco:
Iets zinnigs zal 't niet doen; de routines optellen() en weergave() worden nooit uitgevoerd zo...

En waarom niet? Ik heb ze toch van doen om ze op te tellen

Op 17 augustus 2016 17:36:33 schreef Jochem:

[...]Ja ik was al afgehaakt, hij wacht gewoon net zo lang tot jij alles hebt gedaan.

Ik haak bij deze ook af. S-man als ik jou was, zou ik me concentreren op je andere herexamens. Dit wordt echt niets.

wacht even kohen, je helpt mij zo goed. En ik denk dat ik een fout in mijn programma gevonden heb. Ik zie dat ik mijn timer0 ben vergeten in te stellen.

KLOK:
CLR TR0 ; de timer0 wordt eerst gewist voor de programma begint
CLR TF0 ; wissen van de overflow vlag van timer0
MOV TH0,#0FFh ; startwaarde voor 200µs( 65535 - 200 = 65335 = FF37) FF bij de hoogste waarde
MOV TL0,#37h ; startwaarde voor 200µs( 65535 - 200 = 65335 = FF37) 37 bij de laagste waarde
SETB TR0 ; timer0 starten

dit moet nog zeker bij staan bij de klok?

Dit topic is gesloten