Het maken van een uurwerk via het programma MCU 8051 IDE

Dit topic is gesloten

de 6800 (of later de hc11) vind ik ook heel prettig werken als risc cpu. Van de cisc cpu's vind ik de z80 heel fijn.

De architectuur van microchip vind ik ronduit vervelend.

Maar omdat in al die cpu's dezelde soort van commando's zitten die volgens de vanNeuman regels werken is het vrij makkelijk om de code van verschillende cpu's te lezen.

Volgens mij bestaan er n.l. ook totaal ander soort van cpu's. Hoe werken b.v transputers en neurale netwerken. Zat er geen neuraal netwerk in de kruisraket? En er hebben i.p.v binaire ook trinaire systemen bestaan. Maar die zijn geloof ik nooit verder dan het lab proto stadium gekomen. De analoge computers waren niet echt cpu's dacht ik

fred101

Golden Member

Een 1 bit computer, dat is gewoon een heel luxe transistor >:-)

Ik vind het wel goed dat er aandacht aan assembler wordt besteed. Ik denk dat je veel beter begrijpt wat een processor doet als je weet hoe hij op het laagste nivo, bijna hardwarematig werkt.

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

Special Member

Veel beseffen inderdaad niet wat er voor (ogenschijnlijk) simpele functies allemaal 'onder de motorkap' moet gebeuren... ;)
Bijvoorbeeld een aanroep van een functie als sin() laat je code bij een eenvoudige 8 bitter al gauw 1500 bytes groeien...

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

Oke, Ik had vandaag een redelijke drukke dag met redelijk wat persoonlijke shit. IK heb mijn nieuwe macbook pas sinds een uur of 2 en heb pas net al mijn bestanden kunnen overzetten (dus ook mijn oefeningen van in het jaar. Ik heb geprobeerd de echte seconde te realiseren door middel van de registers, maar ik zie blijkbaar iets over het hoofd. Aangezien we morgen moeten indienen, zie ik even het bos door de bomen niet meer. Ik heb nu binnen een kwartier een belangrijke vergadering van de scouts. Daarna probeer ik verder, moest er iemand in de tussentijd mijn fouten kunnen aanwijzen, alvast bedankt.

Opmerkingen.
1) Ik heb die echte seconde proberen te realiseren op dezelfde manier als de telling voor de seconden,minuten, en uren. Aangezien er pas geteld mag worden nadat de ene seconde voorbij is
2) We hebben het dit jaar inderdaad over interrupts gehad. Als ik even deze taak vergelijk de oefeningen, merk k dat er heel wat ontbreekt, zoals push PSW, Push acc, Pop acc, Pop psw. ik ben ff helemaal de kluts kwijt...

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 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 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,#000H		 ; register voor maxwaarde teller om seconde te bekomen (=100)
           MOV R5,#000H		 ; register voor maxwoorde teller om seconde te bekomen (=50)
           MOV P0,#00000001B     ;P0 op 1 zetten, Po wordt gebruikt voor het looplicht 

MAIN:      CALL KLOK
	   CALL seconde
          CALL optellen
           CALL weergave
           CALL looplicht
           LJMP MAIN

KLOK:	   
           JNB TF0,klok             ;als TF0=0, spring naar klok
           RET

LOOPLICHT: MOV A,R2
           ANL A,#00000001B
           JNZ ONEVEN            ;bit 0=1; spring naar ONEVEN

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

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

SECONDE:   INC R4 ; verhogen register waarde 50
	   CJNE R4,#100d,seconde_ret ; max waarde 99
	   MOV R4,0
	   INC R5; verhogen register waarde 50
	   CJNE R5,#50d,seconde_ret ; max waarde 49
           MOV R5, #0
seconde_ret: RET	   

optellen:  INC R1
           CJNE R1,#60d,optel_ret ;max.waarde = 59 seconden
           MOV R1,#0
           INC R2                 ;verhogen van de minuten
           CJNE R2,#60d,optel_ret ;max.waarde = 59 minuten
           MOV R2,#0
           INC R3                 ;verhogen van de uren
           CJNE R3,#24d,optel_ret ;maximumwaarde = 23 uren
           MOV R3,#0
optel_ret: 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  
Roches

Golden Member

Thomas,

Goed bezig...

Na de CALL SECONDE in MAIN, moet je nog controleren of de seconde voorbij is voordat je OPTELLEN aanroept...

Dit kun je doen door een extra waarde te pakken en die te zetten als de seconde voorbij is en dan bij optellen controleren of de waarde geset is, zoniet return anders optellen en waarde resetten....

Ik denk dat jij het wel gaat halen!!! SUCCES!!!

[Edit]
Wat je ook kunt doen is in optellen controleren of R4 en R5 "0" zijn, dan is de seconde ook voorbij.

Ik heb hier extra geen code in gezet, want dan wordt het weer appeltje eitje, en gepikt, voor S-MAN...

[Bericht gewijzigd door Roches op vrijdag 19 augustus 2016 21:32:00 (10%)

Domoticz en ESP8266, goede combo!!!

Het programma oogt niet mooi, maar je counter van 5000 gaat wel werken. Toch goed van je vind ik ook.

Je hebt over interrupts geleerd, en deze opdracht verlangt dit eigenlijk... maar, zoals eerder gezegd kan het ook zonder interrupts werken op deze manier.
Aangezien je morgen al moet inleveren zou ik interrupts dus even vergeten, anders kom je niet tot de aansturing van de seriele poort.

Mijn bemerkingen:

CLR TF0 <-- waarom doe je deze lijn weg ?

Op 18 augustus 2016 23:50:18 schreef driessens_nl:
@Thomas993: ik heb nog mijn bedenkingen over de waardes van TH0 en TL0.

Zoals driessens al eerder suggereerde, klopt de waarde TH0 niet.

De timer gaat namelijk tellen met TL0. TL0 begint van 037H, loopt op tot 0FFH,geeft dan een overflow (via TF0) en dan wordt TL0 terug herladen met de waarde van TH0. Dus die moet ook 037H zijn.

Persoonlijk zou ik bij start ook R4 en R5 op de juiste waarde zetten. Ik geloof dat die bij reset zoiezo op 000H komen te staan, maar toch...

Wat de seriele poort betreft: doe jij eerst maar een poging en post ze hier. Geen bang hebben om eraan te beginnen en denk lijn per lijn. Maak eventueel een flowchart op papier van wat er moet gebeuren.

Als ik je een hint mag geven: kijk wat Ex-fietser hier zei

Op 18 augustus 2016 23:55:37 schreef Ex-fietser:
Ascii tabel is altijd hetzelfde. Maakt niet uit voor het type controler. Hoofdletter A begint gewoon op 65d of 41# en dan doortellen. Niks geen tabel nodig In je geheugen zet je gewoon ergens de gewenste text in de vorm van deze getallen. En die bitbang je gewoon naar buiten. Of je gebruikt de uart.

De uart bespaart te veel werk(code) Je hoeft er alleen een byte in te gooien en de rest gaat vanzelf. Als de buffer leeg is gooi je er een nieuw byte in.

Hint: Hoe weet de cpu dat de buffer leeg is en wat moet er dan voor soort actie plaats gaan vinden?

En hier:

Op 19 augustus 2016 01:05:48 schreef Ex-fietser:
[...]

Je reserveert ergens 8 bytes in het geheugen en daar plaats je de zoals arco voorsteld uitgerekende codes in.

Dus voor 22 uur 15 minuten en 12 seconden staat er dan op de 8 geheugenplaatsen:

32#,32#,3A#,31#,35#,3A#,31#,32#

Als het moment gekomen is om de tijd te verturen dump je deze getallen 1 voor 1 in de zendbuffer van de uart.

Je moet dan op een of andere manier weten dat de zendbuffer leeg is. Je moet bijhouden welk byte je overgestuurd hebt en wat het volgende byte is. Je moet detecteren wanneer alles verstuurd is en wanneer je opnieuw moet beginnen met het eerste byte. Tegelijkertijd moet je alle zes de lokaties bijhouden zodat daar altijd de juiste tijd in staat.

En misschien dat een ascii tabel wel kan helpen om bovenstaand te begrijpen... jij stuurt de hex code door en op het scherm komt dan 1 karakter bvb 03AH = :

http://www.asciitable.com/index/asciifull.gif

Edit: een : moet 03AH zijn, ik was te snel sorry

Op 19 augustus 2016 21:16:47 schreef Roches:

Ik heb hier extra geen code in gezet, want dan wordt het weer appeltje eitje, en gepikt, voor S-MAN...

Hé kameraad,ik en Thomas zitten wel samen te werken voor die opdracht. We vergelijken wel samen en geven elkaar wat informatie en bedenkingen voor die klok

lol, ja dat komt na het begin van dit topic nog geloofwaardig over...
iedereen denkt hier hetzelfde, thomas doet al het werk, en jij lift mee

maarja, ergens vind ik het nog niet erg ook nog.
Thomas is over een paar jaar een gewaardeerd collega.
Terwijl jij elke paar jaar nieuw werk kunt gaan zoeken omdat je overal weggejaagd wordt omdat de mensen in het vak meteen zien dat je niks kunt

RAAF12

Golden Member

Das wel optimistisch, bij gebleken niet geschikt, binnen de proeftijd, tenzij ergens anders heel goed in en binnen het bedrijf bruikbaar.

Op 19 augustus 2016 21:49:44 schreef DK:
lol, ja dat komt na het begin van dit topic nog geloofwaardig over...
iedereen denkt hier hetzelfde, thomas doet al het werk, en jij lift mee

maarja, ergens vind ik het nog niet erg ook nog.
Thomas is over een paar jaar een gewaardeerd collega.
Terwijl jij elke paar jaar nieuw werk kunt gaan zoeken omdat je overal weggejaagd wordt omdat de mensen in het vak meteen zien dat je niks kunt

Zo bedenk ik dat een oude schoolkameraad van me, de opleiding secundair electronica succesvol heeft beeindigd en nu beenhouwer (slager :) )is.

En daarmee bedoel ik hier niets verkeerds mee...ook niks verkeerd met het vak beenhouwer hé !
En chapeau dat hij die andere stap heeft durven zetten in zijn leven. Misschien een tip voor S-man.

Roches

Golden Member

Op 19 augustus 2016 21:43:10 schreef S-man:
[...]

Hé kameraad,ik en Thomas zitten wel samen te werken voor die opdracht. We vergelijken wel samen en geven elkaar wat informatie en bedenkingen voor die klok

Kijk... Je collega is nu bij de scouts, los jij het nu ff op dan, zonder hulp van Thomas....

Misschien dat je dan nog geloofwaardig wordt, ik betwijfel het...

Domoticz en ESP8266, goede combo!!!

Volop bezig. Dus nog een extra register met de weergave van uren, minuten en seconden met behulp van die ascii code.

rob040

Golden Member

Wat ik niet begrijp is dat je een examenopdracht in alle rust met collega studenten en vooral veel hulp via een forum mag maken.
Of gaat de examinator straks even surfen op het web en komt dan bij dit draadje uit?

Roches

Golden Member

Heb je het probleem met de secondes al aangepakt dan.... De weergave is van later belang....

Zoja, post je code...

Domoticz en ESP8266, goede combo!!!

Ik ben al terug van de vergadering en heb het probleem opgelost met de secondeteller dmv na te gaan of of de waarde van de registers 0 waren alvorens optellen opgeroept wordt.
Ik heb het getest en ik kan mooi meetellen, dus ik denk dat het wel inorde is ;)
Nu begin ik aan het serieel sturen. De code post ik in het volgende bericht hopelijk ;)
@Rob, ik vraag niet om de oefening te maken. Ik vraag waar mijn fouten zitten en raad om de oefening in het geheel tot een goed einde te brengen.

pic asm 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 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 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,#064H		 ; register voor maxwaarde teller om seconde te bekomen (=100)
           MOV R5,#032H		 ; register voor maxwoorde teller om seconde te bekomen (=50)
           MOV P0,#00000001B     ;P0 op 1 zetten, Po wordt gebruikt voor het looplicht 

MAIN:      CALL KLOK
	   CALL seconde

           CALL weergave
           CALL looplicht
           LJMP MAIN

KLOK:	   
           JNB TF0,klok             ;als TF0=0, spring naar klok
           CLR TF0
           RET

LOOPLICHT: MOV A,R2
           ANL A,#00000001B

           JNZ ONEVEN            ;bit 0=1; spring naar ONEVEN

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

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

SECONDE:   INC R4
	   CJNE R4,#100d,seconde_ret

	   MOV A,R4
	   INC R5
	   CJNE R5,#50d,seconde_ret

	   ANL A,R5
	   JNZ seconde
seconde_ret: RET	   

optellen:  INC R1
           CJNE R1,#60d,optel_ret ;max.waarde = 59 seconden
           MOV R1,#0

           INC R2                 ;verhogen van de minuten
           CJNE R2,#60d,optel_ret ;max.waarde = 59 minuten
           MOV R2,#0

           INC R3                 ;verhogen van de uren
           CJNE R3,#24d,optel_ret ;maximumwaarde = 23 uren
           MOV R3,#0

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

Op 19 augustus 2016 22:26:21 schreef rob040:
Wat ik niet begrijp is dat je een examenopdracht in alle rust met collega studenten en vooral veel hulp via een forum mag maken.
Of gaat de examinator straks even surfen op het web en komt dan bij dit draadje uit?

Enerzijds, in een werkomgeving is het ook toegestaan om naar oplossingen te googlen. Of een forum voor je karretje te spannen. Dat een school zegt: Zo bereiden we je voor op de praktijk daar zit wat in.

Anderzijds, een school is er om bepaalde basisvaardigheden bij te brengen en te toetsen of dat gelukt is.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Roches

Golden Member

Dit gaat helemaal fout volgens mij....

Je springt bij JNZ naar seconde...

Ik weet ff niet wat de instructie ANL doet, maar je springt nergens naar optellen....

Terug naar de vorige code....

Vergeet dan niet die CLR TF0 weer op z'n plaats te zetten in KLOK

Dan, check in OPTELLEN of r4 en r5 "0" zijn... Dan mag je gaan optellen....

Daarna aan de weergave gaan werken...

[Bericht gewijzigd door Roches op vrijdag 19 augustus 2016 23:45:18 (20%)

Domoticz en ESP8266, goede combo!!!
Arco

Special Member

Wat zou die Seconde() functie moeten doen? Het is me niet duidelijk...

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

Golden Member

@rew en rob040,

De examinator zal vragen gaan stellen en dan valt er 1-tje door de mand.

Hulp vragen in een forum vindt ik helemaal niet verkeerd.

Maar dan moet wel blijken dat je er ook iets aan doet!!!

Bij de een is de school er in geslaagd om wat basisvaardigheden te voorzien, maar de ander heeft duidelijk geen interesse gehad in het vak en zat wat anders te doen.

Ik hoop alleen maar dat die examinator dit draadje allang gevonden heeft en van tevoren weet hoe de vork in de steel zit.

Ik heb op school nooit assembler of welke programmeertaal dan ook gehad, was het er in die tijd geweest had ik het waarschijnlijk gevolgd, alleen Pascal heb ik later via de LOI gevolgd. Daarvoor heb ik assembler zelf moeten leren en had met 17 jaar al een tekenprogramma in elkaar gezet voor een P2000,in basic was het eenvoudiger geweest maar langzamer en daarom heb ik het toen in assembler gedaan.
Het was verkrijgbaar via teletekstpagina's op een BBS. (Nostalgie)...
Dat ging toen nog met 1200/75 baud....
Dus deze jongens moeten het met de informatie die ze van school hebben, makkelijk in elkaar kunnen zetten.
Het is voor mij al 30 jaar geleden dat ik iets in assembler heb geprogrammeerd.

Domoticz en ESP8266, goede combo!!!
Roches

Golden Member

Op 19 augustus 2016 23:50:13 schreef Arco:
Wat zou die Seconde() functie moeten doen? Het is me niet duidelijk...

De interrupt komt iedere 200uS, dus de seconde-functie moet tot 5000 tellen om een seconde te overbruggen...

Domoticz en ESP8266, goede combo!!!
Arco

Special Member

Dat begrijp ik, maar wat een logical AND van R4 en R5 voor zin heeft ontgaat me... ;)

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

Golden Member

Daarom zei ik ook dat ze terug moesten naar de vorige code... Die klopt op dat gebied wel....

Nu weet ik ook wat ANL betekend, bedankt arco, nog nooit gebruikt....

Volgens mij is ANL een opcode die niet in de Z80 zit want ik kende hem niet.

Domoticz en ESP8266, goede combo!!!
Arco

Special Member

Ander probleem is dat R4 en R5 na het bereiken van 100 resp. 50 nooit meer op nul gezet worden en vrolijk verder tellen...
Bij initialisatie R4 en 5 op 0 zetten. De 'd' suffix voor decimale getallen slikken de meeste assemblers niet; gewoon weglaten.
TH0 en TL0 moeten wel beide op 0x37, anders klopt de timer niet. Kleine aanzet die wel werkt (anders wordt 't een topic in meerdere delen... :) :

code:


optellen:  INC R4
	   CJNE R4,#100,optel_ret
	   MOV R4, #0
	   INC R5
	   CJNE R5,#50,optel_ret
	   MOV R5, #0
 
           INC R1
           CJNE R1,#60,optel_ret ;max.waarde = 59 seconden
           MOV R1,#0
           INC R2                 ;verhogen van de minuten
           CJNE R2,#60,optel_ret ;max.waarde = 59 minuten
           MOV R2,#0
           INC R3                 ;verhogen van de uren
           CJNE R3,#24,optel_ret  ;maximumwaarde = 23 uren
           MOV R3,#0
optel_ret: RET
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Roches

Golden Member

Je hebt nu optellen en seconde gecombineerd, creatief en werkt ook....

Domoticz en ESP8266, goede combo!!!

Dit topic is gesloten