Het maken van een uurwerk via het programma MCU 8051 IDE

Dit topic is gesloten

Arco

Special Member

De RET in LOOPLICHT kan weg. (de JZ EVEN ook trouwens)

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

1) Ik zit op dezelfde school, ook in Gent.
We mochten elkaar helpen. Dankzij S-man ben ik op dit forum terecht gekomen. Ik heb er wel eerst 2 dagen over gedaan om de opgave te kunnen begrijpen. De aparte delen lukten wel, maar alles combineren is wat moeilijk. Daarmee dat ik hiereven aan het spieken was
2) In verband met die seconde, we hebben een interrupt om de 200 microseconden = 0,2miliseconden, dus in principe zouden we de interrupt dan 5000 keer moeten doorlopen alvorens we een seconde hebben niet?
3) Omtrent het sturen via de seriële poort, de baudrate is nu al ingesteld, maar dat is toch nog niet voldoende? Enig idee waar ik op internet extra informatie hierover vindt? Mijn cursus staat op mijn macbook, maar die is gisteren gesneuveld door een lek in ons bad, mijn macbook stond de verdieping eronder, maar parket houdt precies niet direct water tegen. Dus het is niet echt mijn dagje vandaag, ben al blij dat de code er enigzins goed uitziet.

Groeten en alvast bedankt voor alle hulp.
T

Op 18 augustus 2016 23:19:34 schreef Arco:
De RET in LOOPLICHT kan weg. (de JZ EVEN ook trouwens)

De RET en JZ EVEN kunnen weg inderdaad, maar moeten niet perse toch?
Ik vindt het handiger om te volgen

Maar even een boekje dat al 20 jaar stof staat te verzamelen uit de kast getrokken:

http://www.marktplaza.nl/M54849338/1/1992-werken-met-microcontrollers-uit-de-mcs-51-familie-steeman-elektuur-2-54849338.jpg

Even zoeken wat dat JNB TF0,$ precies betekend.

Er staat letterlijk:

JNB bit,rel..............................Jump if Bit Not set

Functie: Konditionele sprong..........Uitwerking: (PC)<-(PC)+3
Bytes: 3..................................IF (bit)=0
Cycles: 2.................................THEN (PC)<-(PC)+rel

(puntjes staan ertussen voor de formatting. Het gaat fout met spaties. Zal wel kunnen maar weet niet hoe door mijn klunzigheid.)

Indien het aangegeven bit "0" wordt, wordt een relatieve sprong gemaakt door de programmacounter na met 3 te zijn opgehoogd nog eens extra met rel op te hogen. De test verandert het bitje zelf niet, ook worden er geen vlaggen beïnvloed.

Nu is dus de vraag welke waarde heeft dat bitje in jou programma. En wat wordt het doel van de sprong. Dus wat is de waarde van TFO. En dan wat is die $ bij jou? Het doel wordt dus de waarde van die $ + 3. De PC wordt n.l. automatisch al met drie opgehoogd omdat je code drie bytes lang is.

......

Ik zie dat je de $ al vervangen hebt door klok. Nu even in de geheugenplaatsen kijken of je bij een sprong inderdaad op de geheugenplaats die klok aanwijst terecht komt.

@ARCO... Ik begreep al van andere CO-ers dat het een compiler directive was. Maar bedankt anyway. ik wist het niet.

Arco

Special Member

Kan blijven staan. Maar ik haal overbodige code zoveel mogelijk weg. (wordt korter en overzichtelijker).
De RET kan nooit worden uitgevoerd en staat er dus voor spek en bonen.
En als je door de JNZ test heen 'valt', is het resultaat altijd even. (meer als even en oneven is er niet, dus die test is zinloos... ;) )

@Ex-fietser: '$' wordt bij compileren uitgerekend, dus dat klopt altijd...

[Bericht gewijzigd door Arco op donderdag 18 augustus 2016 23:35:03 (11%)

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

Overleden

S-man is bijna bij zijn doel ;) niets begrepen en weinig gedaan, en toch een werkende code gekregen!

Wie de vraag stelt, zal met het antwoord moeten leren leven.

Op 18 augustus 2016 23:24:29 schreef Thomas993:
1) Ik zit op dezelfde school, ook in Gent.
We mochten elkaar helpen. Dankzij S-man ben ik op dit forum terecht gekomen. Ik heb er wel eerst 2 dagen over gedaan om de opgave te kunnen begrijpen. De aparte delen lukten wel, maar alles combineren is wat moeilijk. Daarmee dat ik hiereven aan het spieken was
2) In verband met die seconde, we hebben een interrupt om de 200 microseconden = 0,2miliseconden, dus in principe zouden we de interrupt dan 5000 keer moeten doorlopen alvorens we een seconde hebben niet?
3) Omtrent het sturen via de seriële poort, de baudrate is nu al ingesteld, maar dat is toch nog niet voldoende? Enig idee waar ik op internet extra informatie hierover vindt?

1)leuk om te horen dat je van Gent bent, ik woon tegen Mechelen
2)ja, je moet letterlijk 5000 keer die timer0 overflow gaan tellen
3)idd, je moet nog karakters sturen naar de seriele poort hé.
Dan heb je oa een ASCII tabel nodig en een manual, best specifiek van de controller die jullie op school gebruiken.
Ik had al eens gevraagd aan S-man, welke controller gebruiken jullie op school ? En zeg nu niet een 8051 zoals S-man deed, want dat zou me sterk verbazen.

@Thomas993: ik heb nog mijn bedenkingen over de waardes van TH0 en TL0. Al moeten we wel weten op welke klokfrequentie de uProc loopt en dit exact te kunnen bepalen. Veel zie je bij dit type uProc een 11.059 MHz kristal. Het is mij nog steeds niet duidelijk waar deze waarde vandaan komt.

Op 18 augustus 2016 23:43:01 schreef Shiptronic:
S-man is bijna bij zijn doel ;) niets begrepen en weinig gedaan, en toch een werkende code gekregen!

inderdaad, ach ja, ik denk dat Thomas wel op goede weg is.

Heb geen idee hoe dat eindexamen gaat verlopen... is er ook een mondelinge proef, of mogen ze hun source file gewoon afgeven en that's it ?

Arco

Special Member

11.059MHz heeft te maken met de opwekking van 'nette' baudrates voor de UART... ;)

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

Op 18 augustus 2016 23:50:18 schreef driessens_nl:
@Thomas993: ik heb nog mijn bedenkingen over de waardes van TH0 en TL0. Al moeten we wel weten op welke klokfrequentie de uProc loopt en dit exact te kunnen bepalen. Veel zie je bij dit type uProc een 11.059 MHz kristal. Het is mij nog steeds niet duidelijk waar deze waarde vandaan komt.

Ik gok op een 12MHz kristal en een :12 divider vóór de timer, waardoor de timer dus pulsen van 1µs binnenkrijgt :)

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?

Hint2:

@Thomas993: ik heb nog mijn bedenkingen over de waardes van TH0 en TL0. Al moeten we wel weten op welke klokfrequentie de uProc loopt en dit exact te kunnen bepalen. Veel zie je bij dit type uProc een 11.059 MHz kristal. Het is mij nog steeds niet duidelijk waar deze waarde vandaan komt.

Wat voor delers of counters bevinden zich standaard in de CPU en wat voor frequentie heb je nodig voor de gewenste baudrate?

Op 18 augustus 2016 23:53:33 schreef Arco:
11.059MHz heeft te maken met de opwekking van 'nette' baudrates voor de UART... ;)

Inderdaad Arco :)

Met een 12MHz kristal kan je ook een nauwkeurige baud rate van 4800 bps verkrijgen meen ik te begrijpen uit onderstaande tabel ? (is wel van een Atmel controller)

Arco

Special Member

Waarschijnlijk heeft men daarom voor 4800 baud gekozen.
Niet direct een waarde die in commerciele apparaten werd gebruikt (op een enkeling na), na 2400 is men overgestapt op 9600 baud...

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

Oke, voor vandaag is het genoeg geweest dat programeren.
Even rust, en eerst is nadenken hoe ik het serieël sturen tot een goed einde breng.
1) In verband met de seconde, ik moet dan nog een counter die telt met de interruptvlag van de timer. Die stel ik dan in met een maximum waarde van 4999. Die ounter czou dan, voor het optellen moeten komen, juist?
2) Deze oefening is een herexamen van het gedeelte labo microcontrollers. Het bestand moet voor een bepaalde datum doorgestuurd worden, met een verslag van hoe je het aangepakt hebt en moet dan nog eens mondeling verdedigt worden.
3) De microcontroller: 89C5131A-UM, 12kHz klokkristal
4) Ik heb volgende link gevonden in verband met het serieel sturen:
http://what-when-how.com/8051-microcontroller/8051-serial-port-program…
5) Het serieel versturen moet me wel lukken denk ik. Het enige wat ik me afvraag is vooral hoe ik het in de vorm van "uu:ss:mm" doorgestuurd krijg.
- zijn hiervoor ook nog steeds ascii codes nodig? Want ik zie in de examples (van die link) bijvoorbeeld gewoon MYDATA: DB "We Are Ready", staan.
- gewoon de Registers doorsturen is ook niet voldoende, want dan krijg je simpelweg de binaire codes doorgestuurd, ik zou ze decimaal moeten doorsturen met een dubbelpunt ertussen, de oplossing zou zijn om dan bv elk register apart om te zetten in decimaal, eerst register van de uren, dan een dubbelpunt, dan register van de minuten, dubbelpunt en register van de seconden doorsturen. Maar ik weet niet of dat echt is wat hij bedoeld.

Arco

Special Member

Simpelste is inderdaad de boel zo over te sturen.


(uren / 10) + 0x30
(uren mod 10) + 0x30
0x3A (= ":")
(minuten / 10) + 0x30
(minuten mod 10) + 0x30
0x3A (= ":")
(seconden / 10) + 0x30
(seconden mod 10) + 0x30

Dan wel met op een andere wijze, want MOD heb je niet op de 8051. Je kunt net zo lang '10' aftrekken tot het niet verder gaat. Je hebt dan tientallen en eenheden.

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

1) die 5000 counter kan je op verschillende manieren doen. Ik werk meestal met 2 registers, eentje met waarde 100 en één met waarde 50 in dit geval. En ja, vóór het optellen van je klok registers.
2) manier van aanpakken: de rubber duck methode uiteraard
3) ziet er een knappe microcontroller uit.
4) slaap hier eens over en kijk je oefeningen van tijdens het jaar eens na ?

Vraagje: hebben jullie over interrupts geleerd ?

Het enige wat ik me afvraag is vooral hoe ik het in de vorm van "uu:ss:mm" doorgestuurd krijg.

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#,48#,31#,35#,48#,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.

Het enige wat ik me afvraag is vooral hoe ik het in de vorm van "uu:ss:mm" doorgestuurd krijg.

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.

[Bericht gewijzigd door Ex-fietser op vrijdag 19 augustus 2016 01:11:12 (28%)

Op 18 augustus 2016 23:24:29 schreef Thomas993:
Enig idee waar ik op internet extra informatie hierover vindt?

In de datasheet van je Atmel controller:
http://www.atmel.com/Images/doc4136.pdf

En een hardware manual van Atmel:
http://www.atmel.com/images/doc4316.pdf

fred101

Golden Member

Heel kort half off topic vraagje: is assembler min of meer universeel, of is het per processor (of merk) echt totaal verschillend ?
Dit omdat men zelfs zonder te weten wat de processor is toch wist wat het programma moest doen.

[Bericht gewijzigd door fred101 op vrijdag 19 augustus 2016 10:10:37 (27%)

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

Ik ben geen expert, maar de controllers die ik en TS gebruik, zijn 8051 compatibel. Het mooie is dat ze dezelfde instructieset gebruiken als de oude 8051 controller van Intel.

http://www.atmel.com/products/microcontrollers/8051architecture/defaul…

Per processor specifiek, maar veel processoren gebruiken dezelfde, of een vergelijkbare core. Maar een 68000 heeft andere opcodes dan een 8051 en andere dan een PICmicro, etc.

Maar elke processor heeft de algemene dingen zoals een paar registerbewerkingen, jumps, conditional jumps, ALU commando's etcetera. Dus dan is het vrij makkelijk om dit soort 'school-code' mee te lezen.

If you want to succeed, double your failure rate.

Op 19 augustus 2016 09:54:20 schreef fred101:
Heel kort half off topic vraagje: is assembler min of meer universeel, of is het per processor (of merk) echt totaal verschillend ?

In theorie echt "totaal verschillend". Maar... het maken van een instructieset die goed werkt is lastig. Dat doet men niet graag nog een keer. Er wordt dus veel voortgeborduurd op wat er al is.
Dus in de jaren tachtig (70) was er 4004 -> 8008 -> 8080 -> 8086 -> 80186 -> 80286 -> 80386 -> pentium enz enz. Vanaf 8080 is er nog een aftakking "Z80". Deze familie (8086++ niet de Z80) wordt nog gebruik in PCs.
Ook begonnen jaren tachtig is de ARM familie. Kennelijk is V6 oud (debian weigerde om voor RPI een distributie te maken), V7 normaal, en V8 nieuw (met 64 bit extensies).
Ook heb je uit die tijd de 68000 familie. Behoudens speciale toepassingen (autos?) vrijwel niet meer gebruikt geloof ik.
Naast de 8080 heeft intel de 8051 architectuur gemaakt. Die is veel gebruikt en nauwelijks met uitbreidingen op de architectuur nog steeds in gebruik.
Uit die tijd ook HPPA, SPARC en ALPHA. Alleen sparc wordt nog serieus gebruikt geloof ik: die is open source geworden.
Latere families zijn dingen als PIC en AVR. Die dateren volgens mij uit de jaren negentig.
Daarnaast zijn er nog een hele zwik "kleine spelers" die zo nu en dan wat nieuws verzinnen. Omdat een eenvoudige CPU gewoon in een FPGA past, kan je voor een paar duizend euro aan grote FPGA ontwikkelbordjes prima een CPU ontwerpen, en dan kijken of je alles wel kan met je instructieset voordat je een echte chip laat maken. Denk aan de chips die altijd in die 433MHz afstandsbedieningen zitten. Of de ESP8266.

Als je "a prima vista" een stuk assembler moet lezen, is het belangrijk om uit te vinden of het taaltje source, destination gebruikt of andersom. Dus: mov r1, r2 kan betekenen dat R1 de waarde van R2 krijgt of andersom.

Maar, heb je eenmaal een keer met assembly gewerkt op een paar processoren, dan pak je een andere processor snel op. DAT is de reden dat dit vak op die school gegeven wordt. Niet omdat ze het belangrijk vinden dat de scholieren bekendheid krijgen met DEZE processor.

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

Special Member

De PIC was er eind jaren '70 al... :) (1977, toen nog van GI)
Van alle CPU's waar ik mee gewerkt heb, vind ik de 6800 nog steeds de meest prettige om mee te werken...

Er waren ook hele vreemde buitenbeentjes, als de 1-bits MC14500: https://en.wikipedia.org/wiki/Motorola_MC14500B

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

Dit topic is gesloten