Hoi,

Ik heb een eenvoudig programmaatje geschreven voor de AT89C2051. Bij het compileren krijg ik fouten. De foutmelding wijst naar regel 90 met de SETB constructie.

-- code fragment --
MAIN: ;main program (on power up, program starts at this point)
ACALL INITIALIZE ;set up control registers
LOOP:
;INC P1 ;
MOV A,0B6H ;P3.6 ;
JNZ UIT ; jump
AAN:
;MOV C, P1.7 ;
SETB 097H; C ;
JMP VERDER
UIT:
CLR 097H ;
VERDER:
AJMP LOOP ;go to LOOP(jump back to point labeled LOOP)
.END ;end program
-- einde fragment --

SETB zou pinnetje 1.7 hoog moeten maken maar dat gaat dus niet goed. Enig idee wat hier niet goed gaat?

Nou spreek ik geen 8051.. Maar ff uit de losse pols...

Ik vind het vreemd dat je een SETB moet gebruiken om wat te setten en een CLR (zonder B) om wat te clearen. Den kdat daar wel ergens de truc zit...

Op 22 maart 2004 21:35:41 schreef rodemm:
SETB 097H;

SETB zou pinnetje 1.7 hoog moeten maken maar dat gaat dus niet goed. Enig idee wat hier niet goed gaat?

Ik ken ook de 8051 instructieset niet maar meestal moet je bij een set instructie het adres op geven van het register en vervolgens het bitnummer.

Jij hebt zo te zien alleen het register aangegeven, namelijk 097H, maar niet welk bit van dat register moet worden geset. Ik zou daar eens even beter naar kijken.

SETB is een booleaanse instructie om een bit hoog te maken, dus geen byte. Ik heb zowel als parameter het adres van het bitje in die poort (dus niet het begin van de poort), alswel de naam van de poort (dit kan men gebruiken had ik vernomen). Maar het wil dus niet goed compileren.

Op 23 maart 2004 02:07:00 schreef rodemm:
SETB is een booleaanse instructie om een bit hoog te maken, dus geen byte. Ik heb zowel als parameter het adres van het bitje in die poort (dus niet het begin van de poort), alswel de naam van de poort (dit kan men gebruiken had ik vernomen). Maar het wil dus niet goed compileren.

Wat is dan het adres volgens jouw van dat bitje en wat is de naam van die poort?

Misschien is het handig als je even exact aangeeft wat de compiler als error geeft. Daar kan je in de meeste gevallen wel uithalen wat de fout is.

Veeg dat nulletje weg van voor de 097h

Wordt dan 97h...

Anders werk je met een 12-bits adres ipv 8-bits.

de nul wordt er enkel voorgeplaatst als je eerste getal een letter is (a,b,c,d,e of f)

dus:

0B2h
en
2Bh

setb 97h
clr 97h

veel succes, assembler rules!!

Ik zal eens checken wat die 97h is in de SFR-tabel....

enne nog een opmerking....

Ik weet niet met welke compiler je werkt, maar puntkomma's worden in assembler niet gebruikt, tenzij je begeleidende text wil plaatsen...

Welke compiler gebruik je???

Ik zal je het adres doorgeven van een hééél leuk programmaatje dat je ook nog makkelijk kan kraken zodat je het altijd kan gebruiken?.

Je kan tevens alle SFR's simuleren, inputs/outputs simuleren, UART simuleren, er een matrix toetsenbord aanhangen, seriële EEprom, en dat zonder dat je hardwre nodig hebt....

zo zou het kunnen werken:

LOOP:

INC P1 ;verhoog de actuele waarde van P1
MOV A,#0B6H ;zet inhoud accu in P3.6? kan niet P3.6 is een bitadres!
JNZ UIT ;als accu !=0 spring naar UIT (wordt nooit 0!!)

AAN:
MOV C, P1.7 ;zet waarde bit P1.7 in carry-vlag
SETB 97H; ;maak P1.7 hoog
JMP VERDER

UIT:
CLR 97H ;wis P1.7

VERDER:
AJMP LOOP ;go to LOOP

Wat moet dit programma eigenlijk doen? In dit geval is het een gewone teller
Het kan veel eenvoudiger!!

Ook eens kijken in de datasheets wat ze zeggen over P3.6...
Dit is een harde verbinding naar de inwendige comparator, en kan je niet zomaar adresseren...
Toch niet met de code die jij ervoor schrijft.

de accu heeft 8-bits, terwijl P3.6 een 1-bits waarde vraagt (bit adresseerbaar)

eens diep in m'n geheugen gegraven: (en op 8052.com)

setb is een code voor een bit te setten in "bitmemory" (bits00 tot 7F)

Nou het werkt nu al hoor en de SETB instructie was overigens gewoon goed. Het lag denk ik aan de jump instrunctie die ik gebruikt had.