ATmega16 : Rotace bitů

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
showlee
Příspěvky: 116
Registrován: 13 bře 2010, 00:00

ATmega16 : Rotace bitů

#1 Příspěvek od showlee »

Ahoj

Mam na vsech pinech MCU zapojeny ledky.Chci aby mi ctyri rozvicene ledky rotovali stale dokola,Takovi had ktreprojede pres vsechny porty a kdyz bude zajzdet do konce zacne se obevovat na zacatku.
Napsal sem tento ktery mi pri odkrokovavani funguje dobre.Rotaci sleduju v simulatoru od AVR studia.Ovsem kdyz sleduju ledky v aplikaci tak se chovaji jinak.Pri prechod z PortuA na Port B mi ledky na portu A zmizej ve stavu 0xf0 a pak se zacnou postupne obevovat po jedny na portu B.Pak dou dobre a kdyz to dojede na konec ledky jakoby zajedou a pak se naraz obevi na zacatku.nevim si rady.Tady je kod:

#include <avr/io.h>
#include <util/delay.h>

//Konstanta spozdeni
#define TIME 200

int main ()
{
// inicializace mcu

DDRA |= 0xFF; // port A jako vystup
DDRB |= 0xFF; // port B jako vystup
DDRC |= 0xFF; // port C jako vystup
DDRD |= 0xFF; // port D jako vystup

// Pocatecni stav ledek

PORTA |= 0x0F;
PORTB |= 0x00;
PORTC |= 0x00;
PORTD |= 0x00;

//definice promenych
char Sreg; // Slouzi k ulozeni SREGu
char pom=1;//pomocna promena pro prikaz switch,urcuje s jakym portem se rotuje

// main loop
for(;Wink
{

Sreg=SREG;
_delay_ms (TIME);//spozdeni pro zobrazeni stavu ledek
SREG=Sreg;


switch (pom)
{

case (1):{
PORTA *=2; //posun
if (SREG & 0x02) ;// tady mi to detekuje zda posunujicise bity nevyjeli z rozsahu portu
else
{
PORTB *=2; //tady probiha presun bitu do nasledujiciho portu
PORTB |= 0x01;
if (PORTA==0) pom=2; //dokud se predchazejici port nevyprazdni,pak se promena zmeni a de se na dalsi port
}
};break;

case (2):{
PORTB *=2;
if (SREG & 0x02) ;
else
{
PORTC *=2;
PORTC |= 0x01;
if (PORTB==0) pom=3;
}
};break;


case (3):{
PORTC *=2;
if (SREG & 0x02) ;
else
{
PORTD *=2;
PORTD |= 0x01;
if (PORTC==0) pom=4;
}
};break;


case (4):{
PORTD *=2;
if (SREG & 0x02) ;
else
{
PORTA *=2;
PORTA |= 0x01;
if (PORTD==0) pom=1;
}
};break;

}


}
return 0;

}
Uživatelský avatar
showlee
Příspěvky: 116
Registrován: 13 bře 2010, 00:00

#2 Příspěvek od showlee »

Tak skusil sem jiny kod.Jednodussi.Pro jednu diodu mi take fungovalo.Ale jakmile dam vic diod(4).Tak pri prechodu z PORTA na PORTB to pri stavu PORTA==0xf0 skoci rovnou do stavu PORTB==1 a had pak postupne vylejza.Pri prechodu z PORTD do PORTA je to naopak.Had postupne zmizi a pak se na PORTA obevi rovnou celej(PORTA==0x0f) a rotuje si dal pak normalne.

unsigned long svetlo = 1; // 32 bit promenna

for(;;)
{
if(svetlo & 0x80000000)
{
// nejvyssi bit je 1 -> vysunuti 1 a na zacatek nova
svetlo <<= 1;
svetlo |= 1;
}
else
{
// nejvyssi bit je 0 -> jen posun
svetlo <<= 1;
}
PORTA = (unsigned char)svetlo;
PORTB = (unsigned char)(svetlo >> 8);
PORTC = (unsigned char)(svetlo >> 16);
PORTD = (unsigned char)(svetlo >> 24);
_delay_ms (200);
}
Uživatelský avatar
showlee
Příspěvky: 116
Registrován: 13 bře 2010, 00:00

#3 Příspěvek od showlee »

Skusil sem to rotovat pro dva bajty akorat.Promenou sem nechal 32bit.Mezi PORTA a PORTB se to chovalo stejne spatne.Mezi PORTB a PORTC se to chovalo stejne dobre dokonce to pekne rotovalo dokola.Da se z toho neco vydedukovat??
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“