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
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
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...)
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:
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 MAINJochem
If you want to succeed, double your failure rate.
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).
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Even alles leesbaar gemaakt; kan dat niet aanzien... 
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 MAINOp 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: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
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Is wat lastig ja... (zou handig zijn als de tab toets bij code-tags zou werken)
Gelukkig hebben we de spatiebalk nog... 
moet ik eerst die instellingen van die klok doen of de beweging links en rechts invoeren bij de opdracht?
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 ?
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?
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 ?
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 (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.
Jochem
If you want to succeed, double your failure rate.
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.
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
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, 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?