leip11
hoe hoger in de mast aan het werk, hoe mooier het uitzicht
ik heb hier een klein stukje van mijn code
int main (void){ //start programma
displayInit(20,2); //init
inputsInit();
timersInit();
sei();
int seconden=0; //variabele
int minuten=17;
int uren=20;
int x=0;
timersSet(1,1000,1); //seconden timer
displayBacklight(1);
while(1){ //start loop
while(x==0){
if(timersTriggered(1)){
seconden=seconden+1;
}
if(seconden==60){
seconden=0;
minuten=minuten+1;
}
if(minuten==0){
minuten=0;
uren=uren+1;
}
if(uren==24){
uren=0;
}
if(inputsGet(3)){
x=1;
while(inputsGet(3));
}
displayGotoXY(0,0);
fprintf(display, "tijd %2d:%2d:%2d ",uren,minuten,seconden);
displayGotoXY(0,1);
fprintf(display, "klok test ");
}nou werkt dit wel alleen op sommige momenten staan de eerste 3 letters van tijd te knipperen. hoe zou ik dit op kunnen lossen
free_electron
Silicon Member
Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM
wat je ziet is de refresh van de display.
zet je fprintf eens in het blok wat elke seconde updated.
if(timersTriggered(1)){
seconden=seconden+1;
displayGotoXY(0,0);
fprintf(display, "tijd %2d:%2d:%2d ",uren,minuten,seconden);
displayGotoXY(0,1);
fprintf(display, "klok test ");
}
...
[Bericht gewijzigd door free_electron op (30%)]
leip11
hoe hoger in de mast aan het werk, hoe mooier het uitzicht
@free en brecht,
als ik jullie aanwijzingen opvolg dan zie ik niks meer knipperen. maar ik mis nu wel de eerste 3 letter van tijd. dus daar kom ik ook niet echt verder mee.
RobHoi
42
Hoi,
Dat het display staat te knipperen komt waarschijnlijk omdat je de tijd iedere loop opnieuw naar het display stuurt. Beter is (zoals free_electron al opmerkt) de tijd uit de loop te halen, en het display maar een keer per seconde te updaten.
Als je het voorbeeld van free_electron letterlijk hebt overgenomen (dus zonder update van de minuten en uren) dan doen die het inderdaad niet meer. Onderstaand voorbeeld werkt misschien beter:
while(1)
{
//start lus
while (x == 0)
{
if (timersTriggered(1))
{
// 1 seconde is voorbij
seconden = seconden + 1;
if (seconden == 60)
{
seconden = 0;
minuten = minuten+1;
if (minuten == 60)
{
minuten = 0;
uren = uren + 1;
if (uren == 24)
{
uren = 0;
}
}
}
// Tijd wordt een keer per seconde geschreven
displayGotoXY(0,0);
fprintf(display, "tijd %2d:%2d:%2d ",uren,minuten,seconden);
displayGotoXY(0,1);
fprintf(display, "klok test ");
}
// Test of toets ingedrukt (?)
if (inputsGet(3))
{
x = 1;
// wacht tot toets losgelaten (?)
while(inputsGet(3));
}
}
}je had "if(minuten==0){ "staan in je code
dat moest 60 zijn.
Dit heeft RobHoi al gewijzigd, maar gewoon ter informatie 
Gr. rik
leip11
hoe hoger in de mast aan het werk, hoe mooier het uitzicht
dank voor alle antwoorden.
@rikkepic ik kwam daar al achter heb het gewijzigd
@robhoi,
ik heb het gedeelte van free overgenomen. maar de update van uren en minuten staat eronder.
functie van knop 3 is om dit moment om te switchen naar een andere while om de tijd in te kunnen stellen. dit werkt wel.
ik zal van de week effe jou code over nemen gaat nu niet lukken ivm met stage.
maar heb hem gisteravond vanaf 23 uur aangezet en vanochtend gekeken rond een uur of 7. hij loopt al 4 minuten achter.
kan dat aan de code liggen die ik geschreven heb of komt dat doordat de interrupt niet precies 1 seconden is?
RobHoi
42
Hoi,
Mogelijke foutoorzaken van het achterlopen kunnen zijn: onnauwkeurigheid van de oscillator, niet goed instellen van de timer (misschien net eentje tekort oid), ...
Wat doet timersTriggered(1)?
leip11
hoe hoger in de mast aan het werk, hoe mooier het uitzicht
hoi,
inmiddels achter het tijdsverschil gekomen. is het kristal wat een foutmarge heeft van +-1%. daarom loopt hij niet gelijk
timersTriggered(1) kijkt naar de eerste timer die ik hier gezet heb
timersSet(1,1000,1);
deze genereert een interrupt en daar kijkt deze naar.
dit is het boardje waar mee ik werk
http://yaab.nl/
dit boardje is ontwikkelt in samenwerking met mijn school en het bedrijf waar ik nu stage loop.
ze hebben zelf de libs zo geschreven dat het voor een beginner goed in C++ te programmeren is.
werkt zeer makkelijk en is zeer uitgebreid.
leip11
hoe hoger in de mast aan het werk, hoe mooier het uitzicht
nou werkt niet programma opzich redelijk. maar nu wil ik ook verder gaan met het maken van verschillende menus en dergelijke.
nu zit dat er in dit programma ook al in. maar als ik nu naar een andere menu(while) toe ga dan stop hier in deze code de tijd met lopen. nou is dat hier nog niet zo erg. maar als ik met iets anders zoiets wil doen waar dit gewoon in door moet gaan hoe zou ik dit dan op kunnen lossen.
ik weet dat een van de manieren is om die code in de zelfde loop te zetten. maar omdat nou elke keer te doen lijkt me krom en onhandig. er zal toch een betere manier voor zijn.
alvast bedankt
