Problem z rejestrem przesuwnym

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
kaliska5
Użytkownik
Posty: 348
Rejestracja: 01 maja 2008, 8:24
Lokalizacja: z nienacka
Kontakt:

Problem z rejestrem przesuwnym

Post autor: kaliska5 » 02 lip 2010, 11:08

Witam.Bawię się rejestrem przesuwnym i napotkałem problem. Wysyłam do rejestru dane, ale mam zamieniony najstarszy bit z najmłodszym (odwrotnie wsunięte dane).

Kod: Zaznacz cały

#include <avr/io.h>
#include <util/delay.h>
#define DS_PORT    PORTB
#define DS_PIN    0
#define ST_CP_PORT PORTB
#define ST_CP_PIN  1
#define SH_CP_PORT PORTB
#define SH_CP_PIN  2

#define DS_low()  DS_PORT&=~_BV(DS_PIN)
#define DS_high() DS_PORT|=_BV(DS_PIN)
#define ST_CP_low()  ST_CP_PORT&=~_BV(ST_CP_PIN)
#define ST_CP_high() ST_CP_PORT|=_BV(ST_CP_PIN)
#define SH_CP_low()  SH_CP_PORT&=~_BV(SH_CP_PIN)
#define SH_CP_high() SH_CP_PORT|=_BV(SH_CP_PIN) 

int a;
int dana=0b01101011;
int main()
{
DDRB  = 0b00000111;
PORTB = 0b00000000;

write(dana);
}
void write(dana)
{
for(a=0;a<8;a++)
{
PORTB = (dana & 0x01);      
dana>>=1; 
_delay_us(500);
SH_CP_low();
SH_CP_high();
_delay_us(500);

      

}	

ST_CP_high();
}

Kod: Zaznacz cały

PORTB = (dana & 0x80);      
dana<<=1; 
Pomimo zmiany tego fragmentu nic nie uzyskuje na wyjściach rejestru.Pozdrawiam.

Awatar użytkownika
Wesker
-
Posty: 27
Rejestracja: 01 lut 2006, 10:33
Lokalizacja: Leżajsk

Post autor: Wesker » 06 lip 2010, 16:44

W kodzie

Kod: Zaznacz cały

PORTB = (dana & 0x80);      
dana<<=1;
Będzie się zmieniał PORTB.7 a nie PORTB.0 jak we wcześniejszym kodzie. Do odwrócenia kolejności bitów możesz wykorzystać poniższą procedurę

Kod: Zaznacz cały

//********** USI_UART functions **********//

// Reverses the order of bits in a byte.
// I.e. MSB is swapped with LSB, etc.
unsigned char Bit_Reverse( unsigned char x )
{
    x = ((x >> 1) & 0x55) | ((x << 1) & 0xaa);
    x = ((x >> 2) & 0x33) | ((x << 2) & 0xcc);
    x = ((x >> 4) & 0x0f) | ((x << 4) & 0xf0);
    return x;    
}
pochodzącą z Application Note firmy Atmel: AVR307 - Half duplex UART using the USI Interface. Zmienna dana w twoim kodzie mogła by być unsigned char a w tej chwili ma 16 bitów.

kaliska5
Użytkownik
Posty: 348
Rejestracja: 01 maja 2008, 8:24
Lokalizacja: z nienacka
Kontakt:

Post autor: kaliska5 » 08 lip 2010, 7:50

Witam.Poradzilem sobie z tym problemem w ten sposob:

Kod: Zaznacz cały

PORTB= (dana & 128)/128;
		dana<<=1; 

ODPOWIEDZ