Ich habe mir mithilfe der WaitForVsync - Funktion eine kleine Stopuhr gebastelt, einziges problem, auf eine Minute Geht sie ca 3 Sek nach. Kann mir irgendwer sagen wo ich den Fehler gemacht habe?
Code:
#include "mygba.h"
#include "gba.h"
MULTIBOOT
void WaitForVsync(void);
int main(void)
{
u16 tausendstel=0,sekunden=0,minuten=0,stunden=0;
u8 a_pressed=0;
u8 reset=0,zwzeit=0;
ham_Init();
ham_InitText(0);
ham_DrawText(0,0,"Stopuhr");
ham_DrawText(0,1,"Press A to Start");
ham_DrawText(0,2,"Press B to Stop");
ham_DrawText(0,3,"Press Select to Reset");
ham_DrawText(0,4,"Press R for Zwischenzeit");
ham_DrawText(5,6,"Stunden: 0 ",stunden);
ham_DrawText(5,7,"Minuten: 0 ",minuten);
ham_DrawText(5,8,"Sekunden: 0 ",sekunden);
ham_DrawText(5,9,"Tausendstel: 000",tausendstel);
ham_DrawText(5,12,"Zwischenzeit:");
ham_DrawText(5,13,"Stunden: 0 ",stunden);
ham_DrawText(5,14,"Minuten: 0 ",minuten);
ham_DrawText(5,15,"Sekunden: 0 ",sekunden);
ham_DrawText(5,16,"Tausendstel: 000",tausendstel);
while (1)
{
if(F_CTRLINPUT_A_PRESSED) a_pressed=1;
if(F_CTRLINPUT_B_PRESSED) a_pressed=0;
if(F_CTRLINPUT_SELECT_PRESSED) reset=1;
if(F_CTRLINPUT_R_PRESSED) zwzeit=1;
if(a_pressed==1)
{
WaitForVsync();
tausendstel+=16.7;
if (tausendstel>=1000)
{
sekunden+=1;
tausendstel=0;
/*ham_DrawText(5,9,"Tausendstel: ");*/
if (sekunden>=60)
{
minuten+=1;
sekunden=0;
/*ham_DrawText(5,8,"Sekunden: ");*/
if (minuten>=60)
{
stunden+=1;
minuten=0;
/*ham_DrawText(5,7,"Minuten: ");*/
}
}
}
}
if (reset==1)
{
stunden=0;
minuten=0;
sekunden=0;
tausendstel=0;
a_pressed=0;
reset=0;
ham_DrawText(5,6,"Stunden: 0 ",stunden);
ham_DrawText(5,7,"Minuten: 0 ",minuten);
ham_DrawText(5,8,"Sekunden: 0 ",sekunden);
ham_DrawText(5,9,"Tausendstel: 000",tausendstel);
ham_DrawText(5,13,"Stunden: 0 ",stunden);
ham_DrawText(5,14,"Minuten: 0 ",minuten);
ham_DrawText(5,15,"Sekunden: 0 ",sekunden);
ham_DrawText(5,16,"Tausendstel: 000",tausendstel);
}
if(zwzeit==1)
{
zwzeit=0;
ham_DrawText(5,12,"Zwischenzeit:");
ham_DrawText(5,13,"Stunden: %i",stunden);
ham_DrawText(5,14,"Minuten: %i",minuten);
ham_DrawText(5,15,"Sekunden: %i",sekunden);
ham_DrawText(5,16,"Tausendstel: %i",tausendstel);
}
ham_DrawText(5,6,"Stunden: %i",stunden);
ham_DrawText(5,7,"Minuten: %i",minuten);
ham_DrawText(5,8,"Sekunden: %i",sekunden);
ham_DrawText(5,9,"Tausendstel: %i",tausendstel);
}
while(1)
{
}
return 0;
}
void WaitForVsync(void)
{
while((volatile u16)REG_VCOUNT != 160);
}
/* END OF FILE */