Het maken van een uurwerk via het programma MCU 8051 IDE

Dit topic is gesloten

Dus, van lijn 4 tot lijn 9 + lijn 43 tot lijn 58 is al juist. Dan ligt het probleem op lijn 11 tot 16 + lijn 23 tot 31 of ligt mijn fout op lijn 33 tot 42, bij het optellen of bij mijn klok of bij lus2

Het is voor behulpzame mensen heel lastig om met een paar lijnnummers jouw redeneringen te volgen.

In elk geval is het niet zo dat alle code op de door jou genoemde lijnnummers juist is.

@GJ_ hieronder: en het is ook precies hoe ik een compact stukje assembly (zoals hier) 'door stap' om te begrijpen wat er gebeurt. Jammer dat S-man dat niet gewoon ook doet, zoals gevraagd.

[Bericht gewijzigd door Jochem op woensdag 17 augustus 2016 09:38:18 (34%)

If you want to succeed, double your failure rate.
GJ_

Moderator

Op 17 augustus 2016 09:08:28 schreef Jochem:...gewoon elke regel assembly in je hoofd 'uitvoeren'...

Dat is bijna rubber duck debugging, de beste methode om fouten in je code te vinden. Een programmeur kan niet zonder.

code:


MOV P0,#00000001b
        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
moet ik hier mijn waarden aanpassen naar hogere waarden

lus:   	MOV R4,#0 ; nog commentaar zetten
als ik deze waarde verhoogt, dan onderbreek hij de simulatie

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 
Moet ik die links en rechts verwisselen?

lus2:   JNB TF0,lus2 ; wachten tot vlag van timer0 omhoog gaat (hier zit hij altijd vast als ik de stappen overloop)
        DJNZ R4,klok ; -1 bit als R4 is niet 0
        CALL optellen ; seconde bijtellen op klok
        LJMP lus ; volgende seconde afpassen
 
optellen: (deze code is toch goed?)
        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,#24,weergave ; maximumwaarde = 24 uren
        MOV R2,#0

[Bericht gewijzigd door GJ_ op woensdag 17 augustus 2016 09:53:18 (1%)

Het doet mij plezier om te zien dat assembly nog niet is uitgestorven ! Vandaar dat ik even wil reageren.

S-man: Heb je geleerd over interrupts ?

Wat me opvalt is dat je de TF0 vlag van timer0 'afvraagt' in je hoofdprogramma.

Edit: er wordt enkel gesprongen naar een interrupt indien je een aantal vlaggen hoog zet, zoals EA (of EAL) en ET0 voor Timer0

[Bericht gewijzigd door kohen op woensdag 17 augustus 2016 10:37:24 (21%)

dus als ik ET0 en EA gaat activeren, dan moet ik ze ook wissen en de status bewaren en ze laten verhogen. dat klopt toch al

ET0 en EA moet je gewoon 1 keer hoog zetten bij start van je programma.

ET0 staat voor enable timer0 interrupt
EA staat voor enable all interrupts

Als er nu een overflow is van timer0, dan gaat hij springen naar adres 000B, dus je moet ook een subprogrammaatje maken

code:

        ORG     0000H                   ;0000H
        LJMP    BEGIN

	ORG     000BH			;TIMER0
	LJMP	TIMR0       

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Dit is de timer0 interrupt routine.
;
TIMR0:	PUSH	ACC
	PUSH	PSW		;elke 100 microseconden is hier een irq

	
	DJNZ	DIV02,TIMEND
	MOV	DIV02,#002H
				;elke 200 microseconde komt men hier


	DJNZ	DIV200,TIMEND
	MOV	DIV200,#0C8H

					;hier komt men elke 40 milliseconde

	DJNZ	DIV25,TIMEND
	MOV	DIV25,#019H

	INC	SEC			;hier komt men elke seconde
	MOV	A,SEC
	CJNE	A,#03CH,TIMEND		;03CH=60d
	MOV	SEC,#000H
	
	INC	MIN
	MOV	A,MIN
	CJNE	A,#03CH,TIMEND		;03CH=60d
	MOV	MIN,#000H

	INC	UREN
	MOV	A,UREN
	CJNE	A,#018H,TIMEND		;18H = 024D
	MOV	UREN,#000H
	
TIMEND: POP     PSW
	POP	ACC
	RETI

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Welke microcontroller gebruik je op school ?

8051, dus ik moet ervoor zorgen dat mijn seconden, minuten en de uren apart benoemt. Wat betekent die TIMEND?

TIMEND is natuurlijk gewoon een label, heb je de lessen überhaupt bijgewoond?

De opdracht zegt dat de timer interrupts genereert, maar specificeert niet letterlijk dat je de vlag niet mag pollen in je main-loop. In elk geval is het probleem met je huidige programma niet gerelateerd aan het vlag-pollen, dat gaat op zich goed. Maar als je van je docent een interrupt-routine moet gebruiken, dan moet je de aanwijzingen van kohen volgen.

If you want to succeed, double your failure rate.

TIMEND is gewoon het einde van de interrupt routine. Er word naar gesprongen indien bvb seconden goed is (dus niet hoger dan 60 is)
De accu en psw bits worden bewaard via een PUSH naar stack in het begin en een POP (terug uit stack halen) aan het einde van het interrupt programmaatje.

Ik vind het raar dat je interrupts niet kent, of heb je dat nog niet geleerd op school ?

Edit: Jochem was me voor :)

Op 17 augustus 2016 11:53:17 schreef Jochem:
TIMEND is natuurlijk gewoon een label, heb je de lessen überhaupt bijgewoond?

De opdracht zegt dat de timer interrupts genereert, maar specificeert niet letterlijk dat je de vlag niet mag pollen in je main-loop. In elk geval is het probleem met je huidige programma niet gerelateerd aan het vlag-pollen, dat gaat op zich goed. Maar als je van je docent een interrupt-routine moet gebruiken, dan moet je de aanwijzingen van kohen volgen.

klopt Jochem, sorry S-man ik was te snel. Vergeet mijn interrupt verhaal en kijk in je programma de TF0 vlag na, zoals je doet in je code(of die van davidof?). Op deze manier moet je wel de TF0 vlag manueel op 0 zetten (nadat ze hoog is geworden)

Edit: in ieder geval is dat niet het enige probleem... ik zie bvb. nergens een karakter naar de seriele poort gestuurd worden.

Die seriële poort functionaliteit zit er natuurlijk nog geenszins in. Maar ik zou het stapje-voor-stapje aanpakken.

Het grootste probleem is momenteel dat hij uit z'n stack loopt. Aan S-man nu de taak om zich af te vragen: wat kunnen oorzaken zijn dat een stack overflowt? Welke mnemonics hebben bewerkingen op de stack als (bij-)effect?

Als je nou eens werkelijk die rubber duck debugging gaat doen, dan kom je vanzelf de betreffende statements tegen.

En als je die overflow oplost dan werkt de routine al prima in de simulator. Daarna kun je seriële communicatie toe gaan voegen.

If you want to succeed, double your failure rate.

ik heb geen rubber duck debugging, die seriële code is toch juist voor mijn opgave

welke seriële code ?

S-man: lees wat Jochem zegt hierboven of begin van nul. Maak eventueel een flow chart.

[Bericht gewijzigd door kohen op woensdag 17 augustus 2016 13:36:52 (69%)

Arco

Special Member

Het is me niet duidelijk hoe ze iemand een opdracht voor zo'n schakeling kunnen geven, terwijl die geen know-how van microcontrollers heeft...
Ik zou ook gewoon een nieuw programmaatje maken, is simpeler als die brakke code op te knappen.

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

Gehaald van http://www.rubberduckdebugging.com/

Step 1) Beg, borrow, steal, buy, fabricate or otherwise obtain a rubber duck (bathtub variety)

Step 2) Place rubber duck on desk and inform it you are just going to go over some code with it, if that's all right.

Step 3) Explain to the duck what your code is supposed to do, and then go into detail and explain your code line by line

Step 4) At some point you will tell the duck what you are doing next and then realise that that is not in fact what you are actually doing. The duck will sit there serenely, happy in the knowledge that it has helped you on your way.

Note: In a pinch a coworker might be able to substitute for the duck, however, it is often prefered to confide mistakes to the duck instead of your coworker.

Damn the torpedoes, full speed ahead!

Op 17 augustus 2016 13:44:24 schreef Arco:
Het is me niet duidelijk hoe ze iemand een opdracht voor zo'n schakeling kunnen geven, terwijl die geen know-how van microcontrollers heeft...

S-man is ofwel niet naar de les microcontrollers geweest ofwel was hij er lichamelijk aanwezig, maar snapte er de ballen van.
En het laatste geval is klote omdat je wel wil, maar je kan het niet.

Ik spreek uit ervaring. Ik snapte er niet veel van en haatte het vak zelfs.
Heb het jaar opnieuw moeten doen (niet enkel door het vak microcontrollers btw maar soit :) )

Op het einde van het jaar speelde ik ermee en sindsdien is microcontrollers zowat mijn hobby geworden.
S-man, laat je niet ontmoedigen. Vertel eens... het intrigeert me een beetje... hoe oud ben je, waar en wat studeer je ?

fred101

Golden Member

Ik wist niet dat dit een "officiele" manier was. Ik doe precies zoiets maar ik schrijf het op en het werkt meestal nog ook. Het ontstond door mail met een COer, meestal over reparatie of zelfbouw projecten waar we samen aan werkten. ik legde dan het probleem uit in mail en vaak wist ik voor het einde de oplossing zelf al.

TS, gewoon opnieuw schrijven ipv iets braks jatten en dan aanpassen in de hoop dat de leraar het niet doorheeft. Dat gaat meestal sneller. Ik ben geen held in programmeren maar een stuk software aanpassen vind ik nog veel moeilijker.

En als je dat doet maar het werkt niet zijn hier genoeg mensen die je willen helpen. En dan kun je zinvolle vragen stellen omdat je dan wel precies weet wat je programma doet of zou moeten doen.

En het klinkt misschien hard maar als je het zelf niet kunt dan is het jammer maar verdien je geen diploma. Examens zijn er om te bewijzen dat je genoeg nivo hebt. Dat is ook eerlijker naar medestudenten. Als jij zonder genoeg kennis er bij een bedrijf na je proeftijd wordt uit geknikkerd en later soliciteerd iemand met een zelfde diploma dan heb je het mogelijk ook voor hem verpest.

www.pa4tim.nl, www.schneiderelectronicsrepair.nl, Reparatie van meet- en calibratie apparatuur, ook maritieme en industriele PCBs
rob040

Golden Member

Op 17 augustus 2016 14:06:01 schreef kohen:
S-man is ofwel niet naar de les microcontrollers geweest ofwel was hij er lichamelijk aanwezig, maar snapte er de ballen van.
En het laatste geval is klote omdat je wel wil, maar je kan het niet.

Gezien het hoge aantal herexamens (6) was dat niet het enige vak waar iets misgegaan is...

Op 17 augustus 2016 14:06:01 schreef kohen:
S-man, laat je niet ontmoedigen. Vertel eens... het intrigeert me een beetje... hoe oud ben je, waar en wat studeer je ?

Als ik moet gokken: jaar of 20, Hogeschool Gent, Bachelor elektromechanica

If you want to succeed, double your failure rate.

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.

Dus stop er mee dat ik het niet waar ben om te slagen voor dit vak en help mij gewoon met mijn probleem.

Als je het zelf niet kan moet je de handdoek gooien. Iemand anders laten afrijden maakt jouw rijbewijs discutabel, maar is desastreus voor de verkeersveiligheid.

Damn the torpedoes, full speed ahead!

Ok S-man, schrijf gewoon een nieuw programma, zet het hier en je wordt zeker geholpen.

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.

Dus stop er mee dat ik het niet waar ben om te slagen voor dit vak en help mij gewoon met mijn probleem.

en daar zit het probleem. soms moet je echt eens zoeken achter een oplossing zonder direct te vragen waar het fout loopt. die fout maak je nu op school, en ga je in de toekomst nog maken (spreek uit ervaring).
ik heb tijdens mijn graduaat electronica ook gesukkeld met programmeren (in java) en we hadden natuurlijk het geluk dat er in de klas ene zat die deze taal enorm goed kende. dus bij t minste gewoon met onze code bij hem en hij toonde waar het fout was.
ik was op het einde ook niet geslaagd, want tijdens mijn examen stond ik er alleen voor.
ik heb zo hard geknoeid en gefoefeld op school dat ik tijdens mijn job dan ook de gehele electronica cursus opnieuw heb gehad in de opleiding, en in avondschool heb ik zelf mijn graduaat programmeur/analist erbij gehaald.

als het echt niet lukt, zit er niks anders op dan de opleiding te herbeginnen. gebeurd het nu niet en slaag je op wonder wijze in de opleiding, zal je in de komende jaren toch weer worstelen met deze cursus (tenzij je dit nooit meer hebt nu).

mijn tip: gooi dat programma ff aan kant. neem een nieuw document en begin van scratch. je hebt nog 6dagen, dus t moet nog lukken.
pak deel per deel iets aan.
bv schrijf een stuk code dat de leds naar links laat lopen.
schrijf een stuk waarbij ze naar rechts lopen.
schrijf een stuk waarbij de seconden lopen
....

schrijf dan een stuk waarbij je een handeling laat gebeuren (bv ledje branden) als het een even second is, en ledje uit als het oneven is.
pas erna vervang je dat 'ledje aan/uit' code door links of rechts lopen.
dus is gewoon algemene kennis en werking van programmeren. kan je helaas met die code niet helpen, aangezien het echt chinees lijkt voor mij (dat soort code zag ik al 10jaar niet meer en ga het nu echt niet meer leren. die tijd is voorbij voor mij. heb genoeg geleerd)

ik hou van werken ..., ik kan er uren naar kijken

Dit topic is gesloten