Het maken van een uurwerk via het programma MCU 8051 IDE

Dit topic is gesloten


Ik heb als taak deze opdracht gekregen,

Ontwerp van een klok met de aanduiding van uren en minuten. De tijdbasis wordt gevormd door timer0 die als 8-bit auto-reload timer geconfigureerd wordt, en die om de 200µs een interrupt genereert.
Elke seconde wordt de tijdsaanduiding in de vorm "uu:mm:ss" ook via de seriële poort naar de PC verstuurd. Baudrate=4800 baud.
Terwijl de tijd wordt weergegeven moet op poort0 (=ledbar) een lichteffect zichtbaar zijn. Tijdens de even minuten moet het een linkslopend looplicht zijn, terwijl het tijdens de oneven minuten een rechtslopend looplicht moet zijn.

Mijn probleem is nu dat ik enkel de leds kan simuleren en die gaan altijd naar rechts bij even en oneven getallen.

En ook wil ik het zelf proberen simuleren met de programma, maar ik kan enkel de leds simuleren en niet de aanduidingen van de uren, minuten en de seconden weergegeven in de LCD-display van 1x8

In de bijlage vindt je mijn code voor de programma MCU 8051 IDE. Als iemand mij wil helpen met dit probleem, ik ben die persoon eeuwig dankbaar

[Bericht gewijzigd door S-man op 16 augustus 2016 17:19:06 (10%)]

GJ_

Moderator

Ik dacht dat het helder was dat je echt zelf eerst wat moet doen en niet domweg komen vragen wat er mis is met de code die je hier van het forum geplukt hebt.
Ik bedoelde dat je eerst zelf wat zou doen en dan pas een nieuw topic openen.

Je hebt in het vorige topic al een heleboel tips gehad van Jochem en Fuzzbass, daar kun je wel even mee vooruit denk ik.

En als je daar mee klaar ben lees dan aub ook even de FAQ en de regels voor schoolvragen.

kijk, ik wil gewoon dat ik voor mijn vak van microcontrollers erdoor ben. dat is alles, ben nu bezig met een vriend van mij die ook die taak moet maken. Maar we kunnen het allebei de oplossing niet vinden.

Die opgave van die Davidof heeft ons wat geholpen met het moeilijker deel, want ik had al zelf de looplicht voor links en rechts gevonden.

het enige dat ik wil weten is hoe je die simulatie kunt uitvoeren met de nodigde componenten van de programma MCU 8051 IDE en ook of dat mijn code goed is. dat is alles

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 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
        
lus:   	MOV R4,#0 ; nog commentaar zetten

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
        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 

lus2:   JNB TF0,lus2 ; wachten tot vlag van timer0 omhoog gaat
        DJNZ R4,klok ; -1 bit als R4 is niet 0
        CALL optellen ; seconde bijtellen op klok
        LJMP lus ; volgende seconde afpassen
 
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,#24,weergave ; maximumwaarde = 24 uren
        MOV R2,#0
weergave:  
	MOV P1,R0; seconden worden weergegeven op poort0
        MOV P2,R1; minuten worden weergegeven op poort1 
        MOV P3,R2; uren worden weergegeven op poort2 
         
        RET; terugkeren naar het programma

rechts: MOV A,P0 ; de informatie van poort0 wordt uitgegeven op de accumulator
        RR A ; rotate right accu, de looplicht gaat naar rechts bewegen
        MOV P0,A ; de informatie van de accumulator wordt uitgegeven op poort0
        CALL lus2 ; oproepen van lus2
links:  MOV A,P0 ; de informatie van poort0 wordt uitgegeven op de accumulator
        RL A ; rotate left accu, de looplicht gaat naar links bewegen
        MOV P0,A ; de informatie van de accumulator wordt uitgegeven op poort0
        CALL lus2 ; oproepen van lus2
	
        RET; terugkeren naar het programma
        END; einde van het progamma

[Bericht gewijzigd door GJ_ op 16 augustus 2016 18:42:14 (0%)]

't is niet jouw code, maar die van Davidof... :). Ik dacht dat je er iets van moet opsteken.
Wat voor opleiding volg je dan, als je niets van microcontrollers en/of programmeren weet, maar toch een microcontroller schakeling moet maken?

Er is al een paar keer verteld: je moet die code in de simulator laden, en dan er doorheen stappen om te zien wat er gebeurt en waarom.

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

Golden Member

kijk eens goed naar waar je RET(urns) nodig hebt..
Verder JMP je vanuit een subroutine terug in de hoofdlus..

De code verdient inderdaad geen schoonheidsprijs. (geen enkele prijs eigenlijk... :) )
Het kan toevallig goed gaan. Op sommige plaatsen wordt van de ene in de andere sub gesprongen; dan wordt de return van die routine gebruikt om terug te keren...

De coe is zo zonder indentatie ook nog eens een onleesbare brij. (code tags gebruiken en commentaar netjes onder elkaar zetten op wat afstand)
Ik zou er zo ook moedeloos van worden...

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

ik heb geen simulator om aan te sluiten aan mijn laptop, ik kan enkel simuleren met die led-paneel van de programma. En voor die weergave van die uren, minuten en seconden? Gebruiken jullie een LCD-display van 1 x 8 voor die weergave?

Je hebt geen display nodig. Je kunt in de simulator zien welke waardes er in de port registers (P0,P1,...) staan en hoe die veranderen.

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

als ik mijn programma in stappen laat verlopen, dan komt hij vast te zitten op lijn 28; JNB TF0,lus2

En ook mijn poorten 1,2 en 3 blijven altijd op maximun staan, wat moet ik aanpassen aan mijn programma?

KGE

Golden Member

Je doet een voorwaardelijke JUMP naar 'links' of naar 'rechts', de ene routine heeft een RET aan het einde, de andere niet en loopt dan door in de volgende. Je doet een CALL naar lus2 die dan geen RET doet aan het eind maar een JUMP naar lus..

Simpel gezegd is het een zooitje, je stack zal helemaal vollopen en die is bij een 8051 niet erg groot :-)

Subroutines roep je aan met CALL en moet die aanroep op voorwaarde van iets gebeuren (links of rechts) dan spring je op de 'niet voorwaarde' over de CALL heen enz.

GJ_

Moderator

Op 16 augustus 2016 19:11:04 schreef S-man:...wat moet ik aanpassen aan mijn programma?

Dat is dus niet de bedoeling van de schoolvragen.
Je gaat alleen antwoorden krijgen die je in de richting van een oplossing duwen.

@KGE: laat je nog wel iets te leren over aub :-)

Beste GJ,

ik probeer het zelf ook hoor, ik ben al een ganse dag mee bezig voor die programma af te werken. Maar ik kom altijd op dezelfde fouten, mijn lichten die altijd naar links gaan en dat mijn waarden van poort1,2 en 3 altijd maximun zijn.

Ik heb alles geprobeerd, maar het wil echt niet lukken. Dus a.u.b, help mij gewoon met die opdracht

laat me raden, programma moet morgen af zijn?

afwerken voor de 21 augustus, dus ik kan alle hulp gebruiken

Laat mij dan diegene zijn die heel expliciet de vraag stelt die al enkele keren impliciet gesteld is;
Wat is je doel van dit topic? Wil je zelf het programma schrijven waarbij wij je in de goede richting helpen, of wil je dat wij jouw huiswerk doen?

Zo goed als het vroeger was, is het nooit geweest.
Lambiek

Special Member

Afwerken voor 21 augustus, dan ben je vrij laat begonnen zeker. In mijn ogen eigen schuld dus.

Als je haar maar goed zit, GROETEN LAMBIEK.

Ik heb in totaal 6 herexamens, ik ga nu mijn laatste dagen spenderen aan mijn een moeilijke vak. Dus ik alle hulp gebruiken. Wat moet ik doen om mijn opdracht goed te doen slagen?

Een 7e herexamen aanvragen?

Maar serieus wat verwacht je hier?
Dat we je je code ff op de mail gooien?
Of dat we je even leren programmeren in 4 dagen?

Verder ben je in mijn ogen nog niet eens begonnen aan je opdracht, enige wat je gedaan hebt is code van een ander gejat die je vervolgens niet gedebugd krijgt

Op 16 augustus 2016 21:44:06 schreef S-man:
Wat moet ik doen om mijn opdracht goed te doen slagen?

Een jaartje overdoen, en het dan eens zelf proberen.

Op 16 augustus 2016 21:44:06 schreef S-man:
Dus ik alle hulp gebruiken. Wat moet ik doen om mijn opdracht goed te doen slagen?

- De tips die hier gegeven worden lezen en opvolgen.
- De vragen die hier gesteld worden beantwoorden.
- Morgenochtend langs je docent om te vragen of hij je bij kan sturen.

Zo goed als het vroeger was, is het nooit geweest.

Kijk, ik ben er zelf begonnen aan die opgave,maar het wou niet lukken. Dan zag ik die oplossingvan die davidof. Ik test zijn programma uit, dat marcheert niet. Ik probeer het zelf, maar de fouten blijven zich herhalen. Ik vraag hulp aan jullie omdat ik het echt niet meer weet.

Wat krijg ik terug: commentaar dat ik niks gedaan heb.

Ik ben ook maar een studerende student die gewoon hulp vraagt wat de eventuele fouten zijn en hoe ik die kan oplossen in mijn programma.

Dus laat er iemand zijn met een goed hart en een goeie medeleven voor een student die gewoon hulp vraag. Dat hij mij gewoon helpt en zegt van, "kijk dat is fout, misschien wat uitleg geven waarom het fout is en eventueel de juiste oplossing geven.

Dat is het enig wat ik vraag, gewoon uitleg

Op 16 augustus 2016 22:29:56 schreef S-man:
Wat krijg ik terug: commentaar dat ik niks gedaan heb.

Je lijkt dan ook niks gedaan te hebben; er is niks dat er op wijst dat je meer gedaan hebt dan de code van davidof kopieren. Als je aan kan tonen dat je wél wat gedaan hebt, creeer je een stuk meer goodwill.

Ik ben ook maar een studerende student die gewoon hulp vraagt wat de eventuele fouten zijn en hoe ik die kan oplossen in mijn programma.

Dus laat er iemand zijn met een goed hart en een goeie medeleven voor een student die gewoon hulp vraag. Dat hij mij gewoon helpt en zegt van, "kijk dat is fout, misschien wat uitleg geven waarom het fout is en eventueel de juiste oplossing geven.

Dat is het enig wat ik vraag, gewoon uitleg

Uitleg heb je genoeg gehad, nu ben jij weer aan zet door wat met die uitleg te doen en de gestelde vragen te beantwoorden; we stellen die niet zomaar...

Zo goed als het vroeger was, is het nooit geweest.

Kijk, ik ben er zelf begonnen aan die opgave,maar het wou niet lukken.

Het zou je sieren als je die code van je eigen poging zou posten, en niet die van een ander...

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

Geef mij dan een voorbeeld van hoe de programma echt werk? Ik weet dat mijn code voor de beweging van links en rechts goed zijn en ook die van start. Als ik het in stappen laat verlopen dan komt hij altijd vast op lijn 28, daardoor blijft hij altijd links bewegen van mijn leds.

Geef mij dan een afbeelding van hoe de simulatie verloopt.

Op 16 augustus 2016 22:29:56 schreef S-man:
Dus laat er iemand zijn met een goed hart en een goeie medeleven voor een student die gewoon hulp vraag. Dat hij mij gewoon helpt en zegt van, "kijk dat is fout, misschien wat uitleg geven waarom het fout is en eventueel de juiste oplossing geven.

Lees het vorige topic en beantwoord mijn vragen. Ik ben bereid je stap voor stap richting de oplossing te sturen, maar jij lijkt alleen een pasklaar antwoord te willen horen. Dat ga je niet krijgen, want ik ga je huiswerk niet maken. Ik heb mijn diploma al.

- Wat is de output op P1, waar je de waarde van de seconden zou verwachten? Hoogt die netjes op?
- Wat is de output op P2, waar je de waarde van de minuten zou verwachten? Hoogt die netjes op na elke 60 seconden?

Je constateringen kloppen namelijk niet. De output op P1 (de secondes) gaan in het begin nog gewoon goed. De minuten op P2 gaan waarschijnlijk afhankelijk van de simulator nog eventjes wel of niet goed.

Dat het looplicht de verkeerde kant op gaat is niet je probleem. Dat is enkel een GEVOLG van de minuten die niet kloppen. Dat de minuten niet kloppen (en de secondes op een gegeven moment ook niet meer) is een gevolg van een ander probleem, van de manier waarop de flow van je code geprogrammeerd is. Omdat je het zelf niet hebt geprogrammeerd zie je die fout niet (terwijl iemand het al letterlijk heeft gezegd in dit topic).

Op 16 augustus 2016 22:29:56 schreef S-man:
Kijk, ik ben er zelf begonnen aan die opgave,maar het wou niet lukken. Dan zag ik die oplossingvan die davidof.

Het zou veel beter zijn als je je eigen (niet werkende) beginsel hier neerzet. Dat heb je zelf bedacht en daarmee kun je veel makkelijker volgen wat er gebeurt.

Een andere optie is verdergaan met de code van Davidof. Dan zou het mij helpen als jij stap voor stap beschrijft wat die code doet, gewoon elke regel assembly in je hoofd 'uitvoeren' en die stappen hier neerzetten. Dan kunnen wij precies aangeven waar je de fout in gaat en kun je het zelf ook begrijpen.

If you want to succeed, double your failure rate.

Dit topic is gesloten