Avatar billede gobbles Nybegynder
10. maj 2006 - 10:31 Der er 7 kommentarer og
1 løsning

fange 11 bit data og "formatere" disse?

Hej

Jeg søger egentligt lidt inspiration til at løse en udfordring...og tænkte der var masser af friske ideer herinde:)

Jeg er ved at lave en PS/2 tastatur driver til en microcontroller.
Det viser sig at keyboardet sender et clock signal og et data signal (ikke noget nyt der)..
Jeg har lavet et interrupt i min controller der læser data fra datalinien når clock'en går høj(lav...men for logikkens skyld skriver jeg høj)

De data gemmer jeg i et array, (bare et test program.)
Humlen er nu at keyboardet sender 11 bit.. 1 startbit, 8 data bit, et paritetsbit og et stopbit.
startbittet, paritetsbitten og stopbittet har jeg ikke så meget brug for.. det vigtigste er at få de 8 databit gemt i en variabel og det helst uden at bruge for mange udregninger og array manipulationer.. da dette foregår inde i et interrupt.

Så da jeg ved at interrupt-funktionen vil blive kaldt 11 gange i træk og bit nr. 2-9 er dataene hvordan får jeg dem samlet til en enkelt char.

Sproget er C..da controlleren ikke forstår andet.

Er der nogle kreative forslag vil jeg blive glad :)
Avatar billede oddi Nybegynder
10. maj 2006 - 10:59 #1
Hej

Du kan prøve at bruge bitwise operators f.eks:

char data;

data = (data_ps2 << 1); //fjern det første bit
data = (data_ps2 << 8); //De 8 data bit bliver sat i data variablen.

Det er et stykke tid siden jeg har haft med microcontroller at gøre, så jeg håber at jeg husker syntaksen korrekt, ellers kan du se her:

http://www.phim.unibe.ch/comp_doc/c_manual/C/CONCEPT/bitwise.html

mvh Oddi.
Avatar billede gobbles Nybegynder
10. maj 2006 - 11:34 #2
Hej Oddi og tak for forslag..

Det er jo et godt forslag.
Jeg har dog stadig problemet med at det er en "funktion" der køres 11 gange.. din løsning virker kun når jeg har alle 11 bit liggende i en variabel.. og det er der jeg gerne vil hen.

Håber du forstår hvad jeg, lidt kryptisk, mener.
Avatar billede driis Nybegynder
10. maj 2006 - 18:18 #3
Hav en tæller der fortæller dig hvor langt du er nået. Noget i retning af:

int n = 0;
short raw_ps2data = 0;

void ps2_interrupt()
{
  v = ps2; // værdi fra ps2 port
  raw_ps2data |= (v << n++);
  if ( n == 11 )
  {    ;// gør-noget-med-modtaget-data (læg i buffer)
      raw_ps2data = n = 0;
  }
}
Avatar billede gobbles Nybegynder
17. maj 2006 - 18:53 #4
Hej og undskyld den lange ventetid...røg lige i ferie og konfirmationer så projektet røg i baggrunden.. :)

Løsningen blev lidt en blanding af begge jeres forslag..

Løsningen blev denne... (forslag stadig velkomne :) )

#pragma interrupt
void isr_PORTD0(void)
{    SET_VECTOR(P0AD,isr_PORTD0);    //PORT D PIN 0 sættes som interrupt pin

    DI;
    switch(state)
    {
        case 0:
            state++;
            break;
        case 1:
        case 2:
        case 3:
        case 4:
        case 5:
        case 6:
        case 7:
        case 8:
            Data = PFIN;
            temp = Data & 0x01;
            temp += temp;
            state++;
            break;
        case 9:
            Data = PFIN;
            state++;
                        break;
        case 10:
            scan_ascii_decoder(temp);
                        state = 0;
            break;
               
    }
    EI;
}

Håber det er ok hvis i deler pointene..

Tak
Avatar billede driis Nybegynder
17. maj 2006 - 21:14 #5
Godt du kunne bruge det ;-)
Avatar billede driis Nybegynder
17. maj 2006 - 21:16 #6
... selvom din logik undrer mig lidt -
du sætter temp lig 0 eller 1 alt efter om data var 0 eller 1; og derefter lægger du temp til temp ?
Anyways, hvis det virker, er det jo fint.
Avatar billede gobbles Nybegynder
17. maj 2006 - 21:28 #7
Ja det er lidt sært, men en nødvendighed med denne microcontroller....Data er et internt register

Grunden til temp += temp er at hvis jeg shifter unsigned bit kan jeg risikere en fejl..

temp += temp  //hvis temp = 01 

0110
+
0110
=
1100

så shifter jeg på den måde istedet for >>
Avatar billede gobbles Nybegynder
17. maj 2006 - 21:30 #8
hov skulle være //hvis temp = 0110

og << istedet for >>

:)
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
Kurser inden for grundlæggende programmering

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