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.
Dit topic is gesloten
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.
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
Je hebt nu optellen en seconde gecombineerd, creatief en werkt ook....
Excuus, ik sloeg verschillende dingen door elkaar.
1) Ik heb het zo opgelost, werkt ook volgens mij
2) wat bedoel je met werken aan weergave?
ORG 0h
LJMP start
ORG 30h
pic asm code:
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,#2a43 ;4800 baudrate
MOV TL1,#243 ;4800 baudrate
SETB TR1 ;baudrategenerator activeren
MOV TH0,#037h ;startwaarde voor 200µs( 65535 - 200 = 65335 = FF37) FF bij de hoogste waarde
MOV TL0,#037h ;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 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 R4,0
INC R5
CJNE R5,#50d,seconde_ret
MOV R5,0
MOV A,#0
MOV A,R4
ADD A,R5
JZ optellen
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
In je laatste code staan wat rare dingen in je seconde() functie, die per toeval (meer geluk als wijsheid... ) wel werken.
Beter mijn voorbeeld nemen, da's ook nog uit te leggen hoe het werkt...
Ik deed het op die manier omdat me aangeraden werd op de registers op te tellen en dan te kijken of deze 0 waren. Maar is goed, wou gewoon zelf ook met iets uit de bus komen
Je "collega" gaf aan te werken aan de weergave met behulp van de ASCII-tabel, maar had nog niet gepost hoe het probleem met de secondes op te hebben gelost.
Gebruik de code van Arco en laat seconde helemaal weg, elegant genoeg omdat je dus optellen en seconde gecombineerd hebt en dat de code pas gaat optellen als de seconde voorbij is....
Ik was spuit11, wat Arco zegt, plus dat het ook sneller is...
Op die plaats in je seconde routine zijn R4 en R5 altijd nul. Het is dus wat zinloos om 0 + 0 op te tellen en te testen of dat 0 is...
Thomas, maak in je profiel ff je email zichtbaar, ik wil je ergens voor waarschuwen wat nu niet in dit topic thuis hoort...
Op 20 augustus 2016 01:04:04 schreef Roches:
Thomas, maak in je profiel ff je email zichtbaar, ik wil je ergens voor waarschuwen wat nu niet in dit topic thuis hoort...
Heb het even onzichtbaar gezet, is niet mijn gewoonte dus laat me weten als je mail hebt gestuurd dan zet ik 'm terug onzichtbaar.
In verband met de tabel voor de ASCII, voor elke seconde dus een aparte code?
Oh, dat gaat nog even duren.
Moet de output op P1,2,3 hex zijn, of mag 't ook BCD zijn? (dat maakt alles een stuk simpeler)
You've got mail...
Oke heb hem ontvangen Roches
Arco, in de opgave wordt er niets gezegd over de outputs van P1,P2,P3 dus ik denk dat BCD in principe geen probleem moet zijn.
Kleine wijziging in optellen():
code:
optellen: INC R1
MOV A, R1
DA A ;Decimal adjust
MOV R1, A
CJNE R1,#60h,optel_ret ;max.waarde = 59 seconden
MOV R1,#0
INC R2 ;verhogen van de minuten
MOV A, R2
DA A ;Decimal adjust
MOV R2, A
CJNE R2,#60h,optel_ret ;max.waarde = 59 minuten
MOV R2,#0
INC R3 ;verhogen van de uren
MOV A, R3
DA A ;Decimal adjust
MOV R3, A
CJNE R3,#24h,optel_ret ;maximumwaarde = 23 uren
MOV R3,#0
optel_ret: RET
In R1,2,3 staan nu al de 'hapklare' waardes voor serieel versturen...
Serieel versturen:
code:
MOV A, R1 ;seconden laden
SWAP A ;nibbles omruilen
ANL A, #0Fh ;msn eraf
ADD A, #30h ;30 hex optellen voor ascii
MOV SBUF, A ;versturen (tientallen)
txwait: JNB TI, txwait ;wachten tot versturen klaar is
CLR TI ;flag clearen
MOV A, R1 ;seconden laden
ANL A, #0Fh ;msn eraf
ADD A, #30h ;30 hex optellen voor ascii
MOV SBUF, A ;versturen (eenheden)
txwait2: JNB TI, txwait2 ;wachten tot versturen klaar is
CLR TI ;flag clearen
Dit herhalen voor minuten en uren...
1)Top!
2) in principe zou het serieel versturen zo als onderstaande code moeten lukken in formaat 'uu:mm:ss'?
( ;- - - - - - uren/minuten/seconden/dubbelpunt staat er gewoon om het overzichtelijk te houden)
3) Hoe kan ik testen of hij het juiste in formaat 'uu:mm:ss' stuur?
4) Het wordt al laat, bedankt voor de nachtelijke hulp, Ik kruip mijn bed. Morgen het eerste wat ik doe is de code uitproberen
pic asm code:
;- - - - - - uren
MOV A, R3 ;uren laden
SWAP A ;nibbles omruilen
ANL A, #0Fh ;msn eraf
ADD A, #30h ;30 hex optellen voor ascii
MOV SBUF, A ;versturen (tientallen)
txwait: JNB TI, txwait ;wachten tot versturen klaar is
CLR TI ;flag clearen
MOV A, R3 ;uren laden
ANL A, #0Fh ;msn eraf
ADD A, #30h ;30 hex optellen voor ascii
MOV SBUF, A ;versturen (eenheden)
txwait2: JNB TI, txwait2 ;wachten tot versturen klaar is
CLR TI ;flag clearen
;- - - - - - dubbelpunt
MOV A, #03Ah ;dubbelpunt laden
MOV SBUF, A ;versturen (tientallen)
txwait3: JNB TI, txwait3 ;wachten tot versturen klaar is
CLR TI ;flag clearen
;- - - - - - minuten
MOV A, R2 ;minuten laden
SWAP A ;nibbles omruilen
ANL A, #0Fh ;msn eraf
ADD A, #30h ;30 hex optellen voor ascii
MOV SBUF, A ;versturen (tientallen)
txwait4: JNB TI, txwait4 ;wachten tot versturen klaar is
CLR TI ;flag clearen
MOV A, R2 ;minuten laden
ANL A, #0Fh ;msn eraf
ADD A, #30h ;30 hex optellen voor ascii
MOV SBUF, A ;versturen (eenheden)
txwait5: JNB TI, txwait5 ;wachten tot versturen klaar is
CLR TI ;flag clearen
;- - - - - - dubbelpunt
MOV A, #03Ah ;dubbelpunt laden
MOV SBUF, A ;versturen (tientallen)
txwait6: JNB TI, txwait6 ;wachten tot versturen klaar is
CLR TI ;flag clearen
;- - - - - - seconden
MOV A, R1 ;seconden laden
SWAP A ;nibbles omruilen
ANL A, #0Fh ;msn eraf
ADD A, #30h ;30 hex optellen voor ascii
MOV SBUF, A ;versturen (tientallen)
txwait7: JNB TI, txwait7 ;wachten tot versturen klaar is
CLR TI ;flag clearen
MOV A, R1 ;seconden laden
ANL A, #0Fh ;msn eraf
ADD A, #30h ;30 hex optellen voor ascii
MOV SBUF, A ;versturen (eenheden)
txwait8: JNB TI, txwait8 ;wachten tot versturen klaar is
CLR TI ;flag clearen
Klopt zo te zien wel. De serieele waarde kun je controleren door het SBUF register te bekijken in de simulatie...
Erg nauwkeurig wordt de klok zo nooit (zonder interrupts), maar het gaat tenslotte om het principe, niet?
Iedere complete serieele tijd-transmit kost bijna 17mS, die komen er dus extra bij steeds.
Je kunt de boel wel wat tweaken door timer 0 met een wat kleinere waarde (dus hoger) te laden, bijv. #39h of #3Ah i.p.v. #37h...
Ik heb het eens uitgeprobeerd met onderstaande code.
bemerkingen:
1) geeft die decimal adjust geen probleem voor mijn looplicht?
2) Die sbuf register verandert na 1 seconde niet van waarde.
3) Denk je dat het op een half dagje nog mogelijk is om het met interrupts te doen?
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,#037h ;startwaarde voor 200µs( 65535 - 200 = 65335 = FF37) FF bij de hoogste waarde
MOV TL0,#037h ;startwaarde voor 200µs( 65535 - 200 = 65335 = FF37) 37 bij de laagste waarde
SETB TR0 ;timer0 starten
MOV R1,#000H ;seconden op 0
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 optellen
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
optellen: INC R1
MOV A, R1
DA A ;Decimal adjust
MOV R1, A
CJNE R1,#60h,optel_ret ;max.waarde = 59 seconden
MOV R1,#0
INC R2 ;verhogen van de minuten
MOV A, R2
DA A ;Decimal adjust
MOV R2, A
CJNE R2,#60h,optel_ret ;max.waarde = 59 minuten
MOV R2,#0
INC R3 ;verhogen van de uren
MOV A, R3
DA A ;Decimal adjust
MOV R3, A
CJNE R3,#24h,optel_ret ;maximumwaarde = 23 uren
MOV R3,#0
optel_ret: RET
weergave:;- - - - - - uren
MOV A, R3 ;uren laden
SWAP A ;nibbles omruilen
ANL A, #0Fh ;msn eraf
ADD A, #30h ;30 hex optellen voor ascii
MOV SBUF, A ;versturen (tientallen)
txwait: JNB TI, txwait ;wachten tot versturen klaar is
CLR TI ;flag clearen
MOV A, R3 ;uren laden
ANL A, #0Fh ;msn eraf
ADD A, #30h ;30 hex optellen voor ascii
MOV SBUF, A ;versturen (eenheden)
txwait2: JNB TI, txwait2 ;wachten tot versturen klaar is
CLR TI ;flag clearen
;- - - - - - dubbelpunt
MOV A, #03Ah ;dubbelpunt laden
MOV SBUF, A ;versturen (tientallen)
txwait3: JNB TI, txwait3 ;wachten tot versturen klaar is
CLR TI ;flag clearen
;- - - - - - minuten
MOV A, R2 ;minuten laden
SWAP A ;nibbles omruilen
ANL A, #0Fh ;msn eraf
ADD A, #30h ;30 hex optellen voor ascii
MOV SBUF, A ;versturen (tientallen)
txwait4: JNB TI, txwait4 ;wachten tot versturen klaar is
CLR TI ;flag clearen
MOV A, R2 ;minuten laden
ANL A, #0Fh ;msn eraf
ADD A, #30h ;30 hex optellen voor ascii
MOV SBUF, A ;versturen (eenheden)
txwait5: JNB TI, txwait5 ;wachten tot versturen klaar is
CLR TI ;flag clearen
;- - - - - - dubbelpunt
MOV A, #03Ah ;dubbelpunt laden
MOV SBUF, A ;versturen (tientallen)
txwait6: JNB TI, txwait6 ;wachten tot versturen klaar is
CLR TI ;flag clearen
;- - - - - - seconden
MOV A, R1 ;seconden laden
SWAP A ;nibbles omruilen
ANL A, #0Fh ;msn eraf
ADD A, #30h ;30 hex optellen voor ascii
MOV SBUF, A ;versturen (tientallen)
txwait7: JNB TI, txwait7 ;wachten tot versturen klaar is
CLR TI ;flag clearen
MOV A, R1 ;seconden laden
ANL A, #0Fh ;msn eraf
ADD A, #30h ;30 hex optellen voor ascii
MOV SBUF, A ;versturen (eenheden)
txwait8: JNB TI, txwait8 ;wachten tot versturen klaar is
CLR TI ;flag clearen
RET
Het deel met R4/5 was weggevallen, daardoor liep de boel veel te snel...
Met interrupts lijkt me wel wat kort dag. Ik neem aan dat je ook nog uit moet kunnen leggen hoe de boel werkt?... Zo werkt het in ieder geval:
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,#037h ;startwaarde voor 200µs( 65535 - 200 = 65335 = FF37) FF bij de hoogste waarde
MOV TL0,#037h ;startwaarde voor 200µs( 65535 - 200 = 65335 = FF37) 37 bij de laagste waarde
SETB TR0 ;timer0 starten
MOV R1,#000H ;seconden op 0
MOV P1,#0
MOV R2,#000H ;minuten op 0
MOV P2,#0
MOV R3,#000H ;uren op 0
MOV P3,#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 optellen
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
optellen: INC R4
CJNE R4,#100,optel_ret
MOV R4, #0
INC R5
CJNE R5,#50,optel_ret
MOV R5, #0
inc R1
MOV A, R1
DA A ;Decimal adjust
MOV R1, A
CJNE R1,#60h,weergave ;max.waarde = 59 seconden
MOV R1,#0
INC R2 ;verhogen van de minuten
MOV A, R2
DA A ;Decimal adjust
MOV R2, A
CJNE R2,#60h,weergave ;max.waarde = 59 minuten
MOV R2,#0
INC R3 ;verhogen van de uren
MOV A, R3
DA A ;Decimal adjust
MOV R3, A
CJNE R3,#24h,weergave ;maximumwaarde = 23 uren
MOV R3,#0
optel_ret: RET
weergave:;- - - - - - uren
MOV A, R3 ;uren laden
SWAP A ;nibbles omruilen
ANL A, #0Fh ;msn eraf
ADD A, #30h ;30 hex optellen voor ascii
MOV SBUF, A ;versturen (tientallen)
txwait: JNB TI, txwait ;wachten tot versturen klaar is
CLR TI ;flag clearen
MOV A, R3 ;uren laden
ANL A, #0Fh ;msn eraf
ADD A, #30h ;30 hex optellen voor ascii
MOV SBUF, A ;versturen (eenheden)
txwait2: JNB TI, txwait2 ;wachten tot versturen klaar is
CLR TI ;flag clearen
;- - - - - - dubbelpunt
MOV A, #03Ah ;dubbelpunt laden
MOV SBUF, A ;versturen (tientallen)
txwait3: JNB TI, txwait3 ;wachten tot versturen klaar is
CLR TI ;flag clearen
;- - - - - - minuten
MOV A, R2 ;minuten laden
SWAP A ;nibbles omruilen
ANL A, #0Fh ;msn eraf
ADD A, #30h ;30 hex optellen voor ascii
MOV SBUF, A ;versturen (tientallen)
txwait4: JNB TI, txwait4 ;wachten tot versturen klaar is
CLR TI ;flag clearen
MOV A, R2 ;minuten laden
ANL A, #0Fh ;msn eraf
ADD A, #30h ;30 hex optellen voor ascii
MOV SBUF, A ;versturen (eenheden)
txwait5: JNB TI, txwait5 ;wachten tot versturen klaar is
CLR TI ;flag clearen
;- - - - - - dubbelpunt
MOV A, #03Ah ;dubbelpunt laden
MOV SBUF, A ;versturen (tientallen)
txwait6: JNB TI, txwait6 ;wachten tot versturen klaar is
CLR TI ;flag clearen
;- - - - - - seconden
MOV A, R1 ;seconden laden
SWAP A ;nibbles omruilen
ANL A, #0Fh ;msn eraf
ADD A, #30h ;30 hex optellen voor ascii
MOV SBUF, A ;versturen (tientallen)
txwait7: JNB TI, txwait7 ;wachten tot versturen klaar is
CLR TI ;flag clearen
MOV A, R1 ;seconden laden
ANL A, #0Fh ;msn eraf
ADD A, #30h ;30 hex optellen voor ascii
MOV SBUF, A ;versturen (eenheden)
txwait8: JNB TI, txwait8 ;wachten tot versturen klaar is
CLR TI ;flag clearen
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
Oke, het looplicht werkt terug.
Maar even om te controleren, of de serïele sturing werkt.
Bij 3s, 160ms staat mijn SBUF register op op CA, SBUF T op 01, maar bij het paseren van de seconde zie ik niet direct iets veranderen.
Moderator
Thomas, ondanks dat je motivatie beter lijkt dan die van TS is en blijft het zijn topic, en dat ben je nu aan het kapen. En dat is dus echt niet de bedoeling.
We gaan verder met de problemen van S-man.
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
Lijkt me geoorloofd daar S-man dit zelf aangeeft.
Lijkt mij ook, temeer daar S-man ook al een tijdje onzichtbaar is.
(ik denk trouwens dat we dan ook nog niet veel verder als de startpost waren gekomen qua inhoud... )
In de Edsim51 simulator zie ik toch netjes 0x30,0x30,0x3A,0x30,0x30,0x3A,0x30,0x31 verschijnen in SBUF na een seconde. (SBUF tx register, er is ook een SBUF voor rx)
@ Arco, na een seconde krijg ik die waarde ook, maar na de 2 de seconde blijft die waarde van de 1ste seconde onveranderd in SBUF Tx
Bij mij krijg ik netjes 0x32 als laatst verstuurde byte na de 2e seconde. (en na 3 seconden 0x33, enz...)
Moderator
Ehh, het was geen vraag.
s-man is verdwenen van dit schoolvragen topic, een collega is in zijn plaats gekomen en s-man hoeft nu alleen nog maar het resultaat over te nemen.
Dit topic is gesloten