Avatar billede _et Praktikant
16. marts 2006 - 12:24 Der er 6 kommentarer og
1 løsning

Problem med at læse port ( microcontroller )

Jeg leger med en arm PLC2119

Jeg har problemer med at læse indput fra en kontakt.

Kan en vise mig hvordan det burde gøres.
Hvis du  ikke kender typen af MC vil jeg gerne høre forslag aligevel.

Her er et eksempel jeg selv har prøvet at lave, men det virker ikke rigtigt.

int main (void)
{
    IO1DIR = 0xff000000;
    while(1)
    {
        if ((IO1PIN & 0x00ffffff) >= 0x00000000)
            IO1SET = 0xff000000;
        else
            IO1CLR = 0xff000000;
    };
    return 0;
}
Hvad er der galt.?
Avatar billede dunderfjert Nybegynder
16. marts 2006 - 15:51 #1
jeg har aldrig leget med den der. Men kender C til microcontrollere ret godt.

Dit "return 0;" virker forkert der er ikke noget at returnere siden det ikke er en funktion du har lavet.
Den skal blive i while løkken. main returnere aldrig.
Derfor må det hedde:
void main (void)

Du vil udmaske en bestemt port pin i if'en ikke ?

Hvis så hvorfor bruges der så 0x00ffffff og ikke 0b00111111 ?

Men igen jeg kender ikke din controller og de er jo ikke ens ;o) men har den 32 port pins ?
Avatar billede _et Praktikant
16. marts 2006 - 22:26 #2
jeg ville normalt også lave min main som en void, men min compiler laver en advarsel, hvis jeg laver main void, og for ikke at se på den hele tiden, laver jeg den int. Det har jo ingen betydning, da jeg jo aldrig retunerer

Det med masken, er fordi det er en 32 bit port

Hvis vi ser bort fra ovennævnte, vil du så ikke mene det ser korrekt ud?
Avatar billede dunderfjert Nybegynder
17. marts 2006 - 08:40 #3
Ok. du har så valgt 8bit som udgang og du sætte dem H el. L afhængig af input på ALLE de andre pin's! De skal jo så være høje alle sammen på samme tid.
Er det meningen ?

Du skal egentlig blot udmaske det bit kontakten er hængt op på.
Det med >=0x00000000 er ikke nødvendig, if'en er sand hvis bare port resultatet er 0x00ffffff.
Avatar billede dunderfjert Nybegynder
17. marts 2006 - 08:56 #4
Kom lige til at tænke på: Hvis man nu kan håbe/regne med at alle portpin står H og du kun trækker 1 low så må man kunne gøre det sår'n:
int main (void)
{
    IO1DIR = 0xff000000;
    while(1)
    {
        if ((IO1PIN & 0x00ffffff) < 0x00ffffff)
            IO1SET = 0xff000000;
        else
            IO1CLR = 0xff000000;
    };
    return 0;
}
Avatar billede _et Praktikant
17. marts 2006 - 12:55 #5
Jeg har fået det til at virke, det var i udmaskningen problemet lå.

Jeg and'er men 0x00ffffff, men det er kun en bit jeg skal maske på, så da jeg ændrede det til 0x00010000 så virkede det. som den var før ville den altid være true.

men jeg takker for hjælpen, kom med et svar.
Avatar billede dunderfjert Nybegynder
17. marts 2006 - 13:20 #6
Behold bare pointene selv.
Avatar billede _et Praktikant
19. marts 2006 - 17:44 #7
takker - god jul :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester