/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Sende en byte bit-by-bit?
Fra : Stefan Kristensen


Dato : 09-12-04 14:45

X-post til d.e.p.c og d.t.e
FUT: d.e.p.c

Hej NG.

Jeg bruger PICC Lite og MPLab til at programmere en PIC 12F675.
Den skal styre en uP der skal genere et videosignal. PIC'en skal sende nogle
otte-bit signaler på en port og sætte en anden port høj når de otte bits er
sendt. Hvordan får jeg hurtigst sendt de otte bits i en char på et enkelt
ben? Jeg går ud fra noget højre skift er løsningen, men ved ikke helt
præcist hvordan.
Følgende er hvad jeg er kommet frem til:

void send(char command){
// Wait for BUSY signal to go low
while(BUSY==1);

//** Her skal laves en lykke... Eller noget...
// Send data bits
CLOCK = 0; // Clock low level must be at least 700 nS
DATA = command;
CLOCK = 1; // Clock high level must be at least 700 nS
//** Her slutter løkken

// Command sent, send STB
STB = 1; // STB must be high for at least 1 uS
STB = 0;
}

mvh
Stefan



 
 
Stefan Kristensen (09-12-2004)
Kommentar
Fra : Stefan Kristensen


Dato : 09-12-04 14:50

> Den skal styre en uP der skal genere et videosignal. PIC'en skal sende
nogle
uP'en skal naturligvis generere et videosignal, ikke genere det



Kent Friis (09-12-2004)
Kommentar
Fra : Kent Friis


Dato : 09-12-04 17:03

Den Thu, 9 Dec 2004 14:50:03 +0100 skrev Stefan Kristensen:
>> Den skal styre en uP der skal genere et videosignal. PIC'en skal sende
> nogle
> uP'en skal naturligvis generere et videosignal, ikke genere det

Det andet er nok en del nemmere... Lidt hvid støj skulle kunne klare
det.

Mvh
Kent
--
Help test this great MMORPG game - http://www.eternal-lands.com/

Christian B. Andrese~ (09-12-2004)
Kommentar
Fra : Christian B. Andrese~


Dato : 09-12-04 15:39


"Stefan Kristensen" <jems@mad.dk> wrote in message
news:41b856f1$0$65938$14726298@news.sunsite.dk...
> X-post til d.e.p.c og d.t.e
> FUT: d.e.p.c
>
> Hej NG.
>
> Jeg bruger PICC Lite og MPLab til at programmere en PIC 12F675.
> Den skal styre en uP der skal genere et videosignal. PIC'en skal sende
nogle
> otte-bit signaler på en port og sætte en anden port høj når de otte bits
er
> sendt. Hvordan får jeg hurtigst sendt de otte bits i en char på et enkelt
> ben? Jeg går ud fra noget højre skift er løsningen, men ved ikke helt
> præcist hvordan.

Shift eller rotate ud i carry, set porten i følge carry bittet.


--
mvh/rg. Christian
I would have to ask the questioner. I haven't had a chance to ask
the questioners the question they've been questioning.
-- George W. Bush, Austin, Texas, Jan. 8, 2001



Carsten (09-12-2004)
Kommentar
Fra : Carsten


Dato : 09-12-04 17:00

On Thu, 9 Dec 2004 14:45:22 +0100, "Stefan Kristensen" <jems@mad.dk>
wrote:

>X-post til d.e.p.c og d.t.e
>FUT: d.e.p.c
>
>Hej NG.
>
>Jeg bruger PICC Lite og MPLab til at programmere en PIC 12F675.
>Den skal styre en uP der skal genere et videosignal. PIC'en skal sende nogle
>otte-bit signaler på en port og sætte en anden port høj når de otte bits er
>sendt. Hvordan får jeg hurtigst sendt de otte bits i en char på et enkelt
>ben? Jeg går ud fra noget højre skift er løsningen, men ved ikke helt
>præcist hvordan.
>Følgende er hvad jeg er kommet frem til:
>
>void send(char command){
> // Wait for BUSY signal to go low
> while(BUSY==1);
>
>//** Her skal laves en lykke... Eller noget...
> // Send data bits
> CLOCK = 0; // Clock low level must be at least 700 nS
> DATA = command;
> CLOCK = 1; // Clock high level must be at least 700 nS
>//** Her slutter løkken
>
> // Command sent, send STB
> STB = 1; // STB must be high for at least 1 uS
> STB = 0;
>}
>
>mvh
>Stefan
>

Hvad med :

void send(char command){
register unsigned char bit;

// Wait for BUSY signal to go low
while(BUSY==1);

for(bit=0;bit<8;bit++)
{
//** Her skal laves en lykke... Eller noget...
// Send data bits
CLOCK = 0; // Clock low level must be at least 700 nS
DATA = (command & (1<<bit));
CLOCK = 1; // Clock high level must be at least 700 nS
//** Her slutter løkken
}

Denne vil sende din byte ud med lsb først.

Hvis du skal bruge msb først så prøv
for(bit=8;bit<=0;--bit)


Carsten


Stefan Kristensen (09-12-2004)
Kommentar
Fra : Stefan Kristensen


Dato : 09-12-04 17:51

> >Den skal styre en uP der skal genere et videosignal. PIC'en skal sende
nogle
> >otte-bit signaler på en port
> Hvad med :
>
> void send(char command){
> register unsigned char bit;
>
> // Wait for BUSY signal to go low
> while(BUSY==1);
>
> for(bit=0;bit<8;bit++)
> {
> // Send data bits
> CLOCK = 0; // Clock low level must be at least 700 nS
> DATA = (command & (1<<bit));
> CLOCK = 1; // Clock high level must be at least 700 nS
> }
>
> Denne vil sende din byte ud med lsb først.
>
> Hvis du skal bruge msb først så prøv
> for(bit=8;bit<=0;--bit)
Det ligner jo lige det jeg mangler, men det virker ikke helt.
For det første er bit et reserveret or, men det kan jeg jo nemt klare
Nu får jeg en fejl, der siger: Can't generate code for this expression. Det
er linien med DATA = ... der fejler. De kommandoer, der blive sendt er
defineret med #define EnKommando 0x.. (og er naturligvus mindre end oxFF).
Hvad betyder register?

mvh
Stefan



Thomas Lykkeberg (09-12-2004)
Kommentar
Fra : Thomas Lykkeberg


Dato : 09-12-04 18:35

On Thu, 9 Dec 2004 17:50:38 +0100, "Stefan Kristensen" <jems@mad.dk>
wrote:

>> // Send data bits
>> CLOCK = 0; // Clock low level must be at least 700 nS
>> DATA = (command & (1<<bit));
>> CLOCK = 1; // Clock high level must be at least 700 nS
Hmmnaaee..

DATA = ((command & (1<<bit)) ? 1:0);

/Thomas
----
My e-mail is composed in the following manner:
<sirname>.<lastname>(a)privat(dot)dk

Stefan Kristensen (09-12-2004)
Kommentar
Fra : Stefan Kristensen


Dato : 09-12-04 18:48

> >> // Send data bits
> >> CLOCK = 0; // Clock low level must be at least 700 nS
> >> DATA = (command & (1<<bit));
> >> CLOCK = 1; // Clock high level must be at least 700 nS
> Hmmnaaee..
>
> DATA = ((command & (1<<bit)) ? 1:0);
Yup, det var det (Bortset fra at bit stadig er et reserveret ord)

Mange tak.

Stefan



Thomas Lykkeberg (09-12-2004)
Kommentar
Fra : Thomas Lykkeberg


Dato : 09-12-04 18:30

On Thu, 9 Dec 2004 14:45:22 +0100, "Stefan Kristensen" <jems@mad.dk>
wrote:

>Hej NG.
>
>Jeg bruger PICC Lite og MPLab til at programmere en PIC 12F675.
>Den skal styre en uP der skal genere et videosignal. PIC'en skal sende nogle
>otte-bit signaler på en port og sætte en anden port høj når de otte bits er
>sendt. Hvordan får jeg hurtigst sendt de otte bits i en char på et enkelt
>ben? Jeg går ud fra noget højre skift er løsningen, men ved ikke helt
>præcist hvordan.
Nu er det jo nok lidt OT, men here goes:

void SendCommand(char cmd)
{
int bit;
while(BUSY) {};

for(bit=0;bit<8:bit++)
{
waitns(700);
CLOCK=0;
if((cmd >> bit) & 0x01)
DATA=1;
else
DATA=0;
waitns(700);
CLOCK=1;
}

STB=1;
waitns(1000);
STB=2;
}

waitns() funktionen er taget med for at illustrere delays.. Disse
delays må du nok selv finde ud af hvordan du producerer.

Dette eksempel "clocker" LSB ud først. Hvis du vil have MSB skal du
blot ændre if() sætningen til:

if((cmd << bit) & 0x80)

så skulle den sende MSB først.

/Thomas
----
My e-mail is composed in the following manner:
<sirname>.<lastname>(a)privat(dot)dk

Søg
Reklame
Statistik
Spørgsmål : 177452
Tips : 31962
Nyheder : 719565
Indlæg : 6408137
Brugere : 218879

Månedens bedste
Årets bedste
Sidste års bedste