/ 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
AVR skrivning til et bit på port
Fra : Bjarne Hansen


Dato : 09-01-06 22:10

Hej NG

Jeg er lige begyndt at rode lidt med en avr uC, og mangler lige at få
knækket en nød. Så jeg håber en af jer kan hjælpe mig.

Da man ikke kan skrive til et enkelt bit på en port, er jeg ved at lave en
workaround på dette ved at skrive til en funktion som så klarer resten.

Jeg har defineret port og bit for et signal, og vil gerne kunne sende disse
til en funktion. Hvilken data type skal jeg angive i "OutPut" funktionen ?
Efter hvad jeg kan se i "io8515.h" filen er PORTB et alias for en 8 bit
register adr. og jeg regnede derfor med at jeg kunne bruge typen char, men
den gik ikke.

Håber i kan hjælpe, elle komme med en smart ide til hvordan man ellers
skriver til et enkelt bit af gangen.

Hilsen
Bjarne


Udsnit af koden
********************************
#define LED0_Port PORTB
#define LED0_Bit 5

#define LED1_Port PORTD
#define LED1_Bit 2

void OutPut ( ???? Port, char Bit, char Value )
{
if ( Value == 1 )
Port |= ( 0x01 << Bit );
else if ( Value == 0 )
Port &= ~( 0x01 << Bit );
}

int main ( void )
{
Init ();
OutPut ( LED0_Port, LED0_Bit, 1 );
}
************************************



 
 
Jesper Larsen (10-01-2006)
Kommentar
Fra : Jesper Larsen


Dato : 10-01-06 00:09

Bjarne Hansen wrote:
> Hej NG
>
> Jeg er lige begyndt at rode lidt med en avr uC, og mangler lige at få
> knækket en nød. Så jeg håber en af jer kan hjælpe mig.
>
> Da man ikke kan skrive til et enkelt bit på en port, er jeg ved at lave en
> workaround på dette ved at skrive til en funktion som så klarer resten.
>
> Jeg har defineret port og bit for et signal, og vil gerne kunne sende disse
> til en funktion. Hvilken data type skal jeg angive i "OutPut" funktionen ?
> Efter hvad jeg kan se i "io8515.h" filen er PORTB et alias for en 8 bit
> register adr. og jeg regnede derfor med at jeg kunne bruge typen char, men
> den gik ikke.
>
> Håber i kan hjælpe, elle komme med en smart ide til hvordan man ellers
> skriver til et enkelt bit af gangen.
>
> Hilsen
> Bjarne
>
>
> Udsnit af koden
> ********************************
> #define LED0_Port PORTB
> #define LED0_Bit 5
>
> #define LED1_Port PORTD
> #define LED1_Bit 2
>
> void OutPut ( ???? Port, char Bit, char Value )
> {
> if ( Value == 1 )
> Port |= ( 0x01 << Bit );
> else if ( Value == 0 )
> Port &= ~( 0x01 << Bit );
> }
>
> int main ( void )
> {
> Init ();
> OutPut ( LED0_Port, LED0_Bit, 1 );
> }
> ************************************
>
>

Du er nødt til at overføre adressen på portens output register. Altså:

void OutPut(char* Port, char Bit, Char Value)
{
if ( Value )
*Port |= ( 0x01 << Bit );
else
*Port &= ~( 0x01 << Bit );
}

int main(void)
{
Output(&LED0_Port, LED0_Bit, 1);
}

Men det er da en noget omstændig løsning. Hvorfor ikke bare skrive

LED0_Port |= (1<<LED0_Bit);

direkte i main()? Derved kan compileren også optimere det ned til en
enkelt instruktion...


--
Med venlig hilsen / Kind regards
Jesper Larsen
Dansk Forening for Rosport: www.roning.dk
Aarhus Studenter Roklub: www.asr.dk

Bjarne Hansen (11-01-2006)
Kommentar
Fra : Bjarne Hansen


Dato : 11-01-06 22:37

Hej Jesper

Tak for hjælpen.

Ideen med at gøre det via en funktion var at det var samme måde uanset om
men ville sette eller resette et port bit. Men jeg kan godt se din pointe
med optimeringen, så jeg tror jeg hopper på din vogn og dropper min
funktion.

Hilsen

Bjarne



Jesper Larsen (11-01-2006)
Kommentar
Fra : Jesper Larsen


Dato : 11-01-06 22:57

Bjarne Hansen wrote:
> Hej Jesper
>
> Tak for hjælpen.
>
> Ideen med at gøre det via en funktion var at det var samme måde uanset om
> men ville sette eller resette et port bit. Men jeg kan godt se din pointe
> med optimeringen, så jeg tror jeg hopper på din vogn og dropper min
> funktion.

Go' ide

Godt du kunne bruge det til noget.


--
Med venlig hilsen / Kind regards
Jesper Larsen
Dansk Forening for Rosport: www.roning.dk
Aarhus Studenter Roklub: www.asr.dk

Troels Thomsen (13-01-2006)
Kommentar
Fra : Troels Thomsen


Dato : 13-01-06 12:27

>> #define LED0_Port PORTB
>> #define LED0_Bit 5
>>
>> #define LED1_Port PORTD
>> #define LED1_Bit 2

> Men det er da en noget omstændig løsning. Hvorfor ikke bare skrive
> LED0_Port |= (1<<LED0_Bit);
> direkte i main()? Derved kan compileren også optimere det ned til en
> enkelt instruktion...
>

Yep,

#define LED0_ON LED0_Port |= (1<<LED0_Bit);
#define LED0_OFF LED0_Port &= ~(1<<LED0_Bit);
#define LED0_TOGGLE LED0_Port ^= (1<<LED0_Bit);
..... samme for LED1 , LED2 , LED3

desuden:
#define LED0_DATAPORT PORTBDD // (port b data direction , hvis nu det
hedder sådan)
..... samme for LED1 , LED2 , LED3

#define LED0_SETUP LED0_DATAPORT PORTBDD |= (1<<LED0_Bit);
..... samme for LED1 , LED2 , LED3


#define LEDS_SETUP LED0_SETUP;LED1_SETUP;LED2_SETUP;LED3_SETUP;
Denne kalder du så under startup

Nu begynder det et ligne et Hardware Abstraction Layer, Board Support
Package , kært barn har mange navne

De af dine supporterede targets der ikke har Led'er, kan jo blot definere
makroerne tomme ...

Udtænk en lignende struktur til dine inputs ...

tpt




Bjarne Hansen (13-01-2006)
Kommentar
Fra : Bjarne Hansen


Dato : 13-01-06 20:58

Hi

Smart, det gør det jo endnu nemmere

Tak

/Bjarne

> #define LED0_ON LED0_Port |= (1<<LED0_Bit);
> #define LED0_OFF LED0_Port &= ~(1<<LED0_Bit);
> #define LED0_TOGGLE LED0_Port ^= (1<<LED0_Bit);
> .... samme for LED1 , LED2 , LED3
>
> desuden:
> #define LED0_DATAPORT PORTBDD // (port b data direction , hvis nu det
> hedder sådan)
> .... samme for LED1 , LED2 , LED3
>
> #define LED0_SETUP LED0_DATAPORT PORTBDD |= (1<<LED0_Bit);
> .... samme for LED1 , LED2 , LED3
>
>
> #define LEDS_SETUP LED0_SETUP;LED1_SETUP;LED2_SETUP;LED3_SETUP;
> Denne kalder du så under startup
>
> Nu begynder det et ligne et Hardware Abstraction Layer, Board Support
> Package , kært barn har mange navne
>
> De af dine supporterede targets der ikke har Led'er, kan jo blot definere
> makroerne tomme ...
>
> Udtænk en lignende struktur til dine inputs ...
>
> tpt
>
>
>



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408914
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste