Hallo, wij zijn Jeroen en Maxime
Wij maken voor een project op school een scorebord voor een voetbalwedstrijd, nu hebben wij een probleem met het maken van de clock voor dit scorebord, dit moet gebeuren met een microcontroller (8515).
Wij hebben de scoretellers al gemaakt en een basis clock maar we zitten een beetje block met het instellen van deze clock. Een gewone clock lukt, maar voor de clock in de eerste keer tot 45min te laten tellen en dan tot 90min lukt nog niet echt, we zien niet echt hoe we deze moeten instellen.. bijgevoegt in het bericht is ons programma voor de clock zoals we het nu hebben.
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
int i;
int j;
DDRA = 0x00;
DDRC = 0xFF;
i = 0x00;
j = 0x00;
PORTC = 0x00;
while(1)
{
if(PINA != 0x00)
{
delay_ms(500);
PORTC = 0x01;
delay_ms(500);
PORTC = 0x00;
i++;
if(i == 0x03)
{
j++;
i = 0x00;
}
if(j == 0x3C)
j = 0x00;
}
}
}TheBasher
Don't build anything you can't take apart
Ik zou meer met states werken, bijv een char waar je een getal inzet 1 = 1e helft, 2 = 2e helft. Zodra 45:00 is bereikt het getal 2 in de varaibele wegschrijven.
En als die variabele 2 is er 45:00 bij de tijd optellen.
Gatze
Congratulations on your purchase. To begin using your quantum computer, set the power switch to both off and on simultaneously
Ik heb met een klasgenoot in het verleden een scorebord gemaakt voor zijn voetbalclub. (kan de foto's jammer genoeg niet meer terug vinden.)Leuk projectje was dat. Dat was op basis van een attiny2313
Ik zie in je code dat je met delay's werkt voor de tijd referentie. Dit is meestal niet nauwkeurig, omdat je van de compiler afhankelijk bent. Ook zou er bijvoorbeeld een interrupt tussendoor komen die veel tijd kost.
Beter kun je een tijd referentie op basis van de interne hardware timer nemen. Als je een crystal als clock source gebruikt, zal dit nauwkeurig genoeg zijn voor jou toepassing. (Ik den dat de rc oscillator ook wel nauwkeurig genoeg is, maar dat kunnen jullie wel na rekenen.
voorbeeldje
#include <avr/interrupt.h>
#include <avr/io.h>
unsigned char minuten;
unsigned short honderdsten;
//elke 1/100 seconde
ISR(TIMER1_COMPA_vect)
{ TCNT1 = 0;
honderdsten++;
if(honderdsten == 6000)
{ minuten++;
honderdsten = 0;
//write minuten naar een display
}
}
int main(void)
{
DDRA = 0x00;
//elke 1/100 seconde timer compare interrupt
//16mhz kristal prescaler 8: (1/100)/(1/2 Mhz) = 20000
TCCR1B = (1 << CS11);
TIMSK = (1 << OCIE1A);
OCR1A = 20000;
//Als ik jullie code zie gebruik je PORTA als start
while(PINA == 0x00);
sei(); //interrupts enabelen
while(1)
{
//Hier kun je bijvoorbeeld code zetten dat als je op een knop drukt dat minuten gereset wordt, of op 45 wordt gezet.
}
return 0;
}Een schema zou ook handig zijn. Dan kunnen we hier zien wat je op de betreffende pinnen hebt aangesloten. (Heb je bijvoorbeeld ook knoppen ter beschikking voor de besturing van het geheel. Wat voor display's gebruik je. Zo zou je de klok met een druk op de knop naar 45 kunnen laten gaan. Dat hadden we bij ons scorebord)
[edit]de code heb ik getest in de simulator, daar lijkt het goed te werken.
@shizzle dizzle
Wij hebben momenteel nog geen schema aangezien we het nu nog maken in theorie, morgen (vrijdag) komt er iemand die met ons gaat overleggen welke schermen we het beste gebruiken voor het scorebord. Het programma dat jij net uitschreef ga ik zeker eens onder de loep nemen !
Dat ik best een crystal ga gebruiken heb ik ook al gehoord van andere klasgenoten. Het programma dat ik zelf toonde was eentje die geschreven was met behulp van onze vorige leraar, die spijtig genoeg alles niet echt optimaal uitlegde, hierdoor kregen we als resultaat een halfwerkende clock..
Als ik meer weet over de gebruikte componenten en hoe het gaat met het programma zal ik hier updates houden, het is namelijk nog redelijk moeilijk om iemand te vinden die genoeg weet over programmeren en die dan ook nog tijd/zin heeft om iemand anders te helpen die nog aan het leren is.
@theBasher
Dat is inderdaad de beste methode, een deel in het programma schrijven dat als ik 45:00 bereik er een waarde omgezet wordt naar status 1 bvb en dan pas gaat doortellen als ik een knop indruk die ervoor zorgt dat de timer door gaat met tellen, dan nog eens hetzelfde voor eventuele overtime.