[C] Keil 8051

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Dark_f
  • Registratie: Juli 2009
  • Laatst online: 06-12-2024
Hallo,

Ik ben vandaag beginnen programmeren met keil, ik heb een voorbeeld programma gedownload die een LCD kan aansturen.

In het begin van het programma staat er :

#define LCDPORT P2

P2 is dus de poort waar de LCD op aangesloten is. P2 bestaat dus uit 8 bits. Nu is mijn LCD anders aangesloten dan als de maker van het programma zijn LCD.

De aansluiting veranderen op mijn microcontroller is geen optie.
Normaal zou ik in het programma zelf de adressering juist maken maar de maakt gebruik van nibble's en pointers en daar kan ik niet mee werken.

Kan je op een bepaalde manier programmeren dat
LCDPORT^0 niet naar P2^0 verwijst maar naar P2^1 en zo verder ?

Acties:
  • 0 Henk 'm!

Verwijderd

Als je weet hoe P2 is gedefinieerd lijkt het me makkelijk om dit aan te passen? En is er geen P3, P4... gedefinieerd?

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Ik volg niet helemaal wat je bedoelt?

Het idee van de define is volgens mij juist om de poort waar de LCD op zit te kunnen veranderen.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

P2 staat ergens gedefiniëerd als een struct, als ik het me goed herinner. Da's gewoon een kwestie van je headers afstruinen om te kijken wáár dat gebeurt en vervolgens na te apen wat je daar ziet maar dan met de relevante poorten op jouw eigen register? :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Dark_f
  • Registratie: Juli 2009
  • Laatst online: 06-12-2024
P2 wordt zo gedefinieerd
Sfr ( P2 , 0xA0 )
P2 bestaat uit 8 bits, en in keil roep je die zo aan : P2^0, P2^1, ...

Het programma stuurt de verkeerde bits aan van P2.
Ik kan dit in het programma zelf niet veranderen omdat hij dit niet rechtstreeks doet.

Er is ook een P3 en P4 gedefinieerd.

Dus #define LCDPORT P2 neemt alle 8 bits letterlijk over, terwijl bit 2 van LCDPORT bit 7 van P2 moet veranderen en zo verder

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Bramrbe schreef op maandag 03 mei 2010 @ 17:14:
P2 wordt zo gedefinieerd
Sfr ( P2 , 0xA0 )
Daar staat niet meer dan "hee, je moet op 0xA0 in het special function register zijn als ik P2 nodig heb!". Met andere woorden: je hebt een pointer. ;) P2 is daarmee gewoon een 8-bits register. Als ik je goed begrijp heb je een soort van conversiefunctie nodig die de "foute" bits omschrijft naar jouw formaat of andersom.

Maar wat eigenlijk nog beter is: je merkt al dat de voorbeeldcode die je hebt niet goed werkt; waarom schrijf je dan niet zelf iets vergelijkbaars op basis van de documentatie of waarom zoek je niet voorbeeldcode waar je wél wat aan hebt?

[ Voor 3% gewijzigd door NMe op 03-05-2010 17:23 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Dark_f
  • Registratie: Juli 2009
  • Laatst online: 06-12-2024
Zelf beginnen schrijven van een LCD programma is te moeilijk voor mee te beginnen. Normaal wekte ik met bascom en daar kan ik ook mee werken... Nu de demo versie van bascom(2Kb limiet) voldoet niet meer en zal ik dus met keil moeten werken.

Ik heb lang gezocht naar een script voor een 4-bit LCD en dit zou moeten werken ondanks dit klein probleem.

Ik hoopte gewoon of er iemand is die meer ervaring heeft in C en weet hoe hij de 8 bits van LCDPORT kan verwijzen naar P2 op de juiste manier. Ik heb geen idee welke conversiefuncties er zijn of hoe ik dat met pointers moet doen.

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
P2 is dus gewoon gelijk aan 0xA0 en dat staat idd gelijk aan 1010 0000

LCDPORT verwijst dus gewoon naar dat address. Je zult dus moeten kijken wat er precies met die waarde gebeurt.

Kijk eens gewoon waar LCDPORT gebruikt word, en welke waardes er ingezet worden.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Dark_f
  • Registratie: Juli 2009
  • Laatst online: 06-12-2024
Zo wordt LCDPORT geschreven, geen idee hoe ik het kan vervangen, aangezien een nibble ? word weggeschreven

temp=a;
temp&=0xf0; // Mask Lower 4 Bits
LCDPORT&=0x0f; // Make No Affect on 0ther Port Pins
LCDPORT|=temp;

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Daar zul je het inderdaad moeten zoeken. Je zult eerst moeten uitzoeken welke bits je precies wil zetten. Wat die code effectief doet is de eerste 4 bits ( een Nibble is 4 bits ) clearen, en de laatste 4 bits gelijk maken aan de laatste 4 bits van a. Die bits kun je dus gaan veranderen naar wens

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Dark_f
  • Registratie: Juli 2009
  • Laatst online: 06-12-2024
Weet iemand wat een & voor = betekent, of een |=. Als ik dit weet kan ik mss zelf een oplossing vinden.

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
temp &= 0xf0
is hetzelfde als
temp = temp & 0xf0

Het is dus een binary AND en een assignment ineen. Hetzelfde geld voor |= alleen is dat een binary OR

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Bramrbe schreef op maandag 03 mei 2010 @ 17:46:
Zo wordt LCDPORT geschreven, geen idee hoe ik het kan vervangen, aangezien een nibble ? word weggeschreven

temp=a;
temp&=0xf0; // Mask Lower 4 Bits
LCDPORT&=0x0f; // Make No Affect on 0ther Port Pins
LCDPORT|=temp;
Weet je überhaupt iets van bitwise operaties zoals bitwise AND-en en OR-en (zoals in deze code gedaan wordt) en bit shiften?

Stel, LCDPORT bevat de waarde 10101010 (oftewel: 170). temp bevat de waarde 01010101 (oftewel 85).

Wat die code doet is dit: temp wordt vergeleken met 0xf0 (oftewel 11110000):
0 1 0 1 0 1 0 1
1 1 1 1 0 0 0 0 &
---------------------
0 1 0 1 0 0 0 0

Vervolgens wordt hetzelfde gedaan met LCDPORT en de waarde 0x0f (is 00001111 binair):
1 0 1 0 1 0 1 0
0 0 0 0 1 1 1 1 &
---------------------
0 0 0 0 1 0 1 0

Je hebt nu de waardes 01010000 en 00001010 respecitevelijk in temp en LCDPORT zitten. Vervolgens worden die ge-OR'd, oftewel bij elkaar opgeteld:
0 1 0 1 0 0 0 0
0 0 0 0 1 0 1 0 |
---------------------
0 1 0 1 1 0 1 0

Enige manipulatie met deze waardes zul je dus hier op dit niveau moeten doen. Als jij dus twee bits in je register wil omruilen, dan zul je dus bijvoorbeeld LCDPORT^6 en LCDPORT^7 om moeten wisselen met een standaard wissel m.b.v. een tijdelijke tussenvariabele.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Dark_f
  • Registratie: Juli 2009
  • Laatst online: 06-12-2024
Ik weet hoe AND en OR vergelijkingen werken ik ken enkel de syntax van C niet. Nu ik dat weet is het inderdaad maar een kwestie van verplaatsen en bijtellen. bedankt !

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Ik weet niet precies welke bits je wilt veranderen, maar de bit shift operators kunnen ook nog wel van pas komen. Met << en >> kun je bits naar links of rechts shiften.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 21:46

Matis

Rubber Rocket

Ik weet niet hoe je pin-out van je (micro)processor zich ten opzichte van zijn register verhoudt, maar is het niet eenvoudiger om de adressing van je P2 anders te leggen?

code:
1
sfr P2 = 0x80;    /* Port-2, address 80h */


Wat jij (misschien) wilt

code:
1
sfr P2 = 0x81;    /* Port-2, address 81h */

[ Voor 33% gewijzigd door Matis op 03-05-2010 18:32 ]

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Ik neem aan dat het een 8-bits port betreft, en hij de draden wel op die port heeft aangesloten, maar niet op dezelfde pins als waar de driver vanuit gaat, dan moet hij dus niet het adres aanpassen, maar de data die daar in geschreven word. En dat was zo te zien ook het probleem, aangezien hij de C bitwise operators niet kende

[ Voor 35% gewijzigd door Woy op 03-05-2010 18:54 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 22:59

Reptile209

- gers -

Bramrbe schreef op maandag 03 mei 2010 @ 18:14:
Ik weet hoe AND en OR vergelijkingen werken ik ken enkel de syntax van C niet. Nu ik dat weet is het inderdaad maar een kwestie van verplaatsen en bijtellen. bedankt !
Nou had je natuurlijk met wat stepwise-debugging prima zelf kunnen achterhalen wat er hier gebeurde, zeker omdat de concepten AND en OR je al bekend zijn. Dan pak je
C:
1
2
temp=a; 
temp&=0xf0; // Mask Lower 4 Bits

en kijk je wat voor en na het uitvoeren van de tweede regel in temp staat. Volgens mij hoef je geen wonderkind te zijn om dan uit te kunnen vogelen wat er gebeurt: even een paar verschillende a's proberen en dan zie je dat alles <8 nul wordt, en alles >=8 gelijk blijft.

Zo scherp als een voetbal!

Pagina: 1