ATmega16 : Rotace bitů
Moderátor: Moderátoři
ATmega16 : Rotace bitů
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;
}
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 >>
PORTC = (unsigned char)(svetlo >> 16);
PORTD = (unsigned char)(svetlo >> 24);
_delay_ms (200);
}