Stap 7: Bouw van de oplossing; het laden van het programma.
Op dit moment zie je een heleboel dingen gaan door in het uitvoervenster onderaan, en als er Compilerfouten ziet u hier ook. Als u de code hebt ingevoerd, precies zoals ik heb in de laatste stap moeten u eventuele fouten niet. Alleen in geval zal ik kopieer en plak de code in zijn geheel rechtstreeks uit mijn bestand aan het einde van deze stap. Ik bedacht net dat ik ook bestanden kan uploaden zodat ik een zipbestand met alle bestanden van de ATMEL Studio opgenomen.
U moet op dit punt de draak verbinden met de USB-poort op uw computer.
In de 2e foto ziet op de rechterbovenhoek, u "ISP op AVR Dragon" hilighted. Klik hier om het omhoog een venster voor het configureren van de instellingen van het hulpprogramma net als wanneer we het instellen van de fuse-bits brengen. Maak die zeker AVR Dragon is geselecteerd, en de Internet-provider voor de interface, en check de ISP klok. Hieronder dat programmeren instellingen moet reeds hebben "wissen hele chip" geselecteerd en 'behoud EEPROM' ongecontroleerde. Macht van uw breadboard circuit, de kabel 6-pins lint van de draak, en we zijn goed om te gaan.
Nu om het programma naar de chip te laden. Klikt u op Tools >> apparaat programmering >> productie-bestand en vervolgens bladeren naar het bestand en het programma. Maar! Het is veel makkelijker om gewoon klik Debug >> starten zonder Debugging (3de pic.) Dit automatisch het programma gecompileerd en geladen naar de chip zonder een ander woord, zolang er geen compile-rerrors.
Dat is het! Als die goed werkten, moet u een functionerende chronograaf op een breadboard! U kunt spelen met het door het aanraken van 12VDC aan op de sensor-ingangen (de Transistorschakelingen; niet de invoer pinnen) met een jumper-draad. Ook spelen met de DIP-schakelaars en test de knop 'weergave afstand'. Als je eenmaal een aantal als uitgang, kunt u testen de DIP-schakelaars voor 'de selectie met eenheden van de uitgang' en controleer of de wiskunde.
Nu zou ook een goede tijd om ervoor te zorgen dat uw sensoren werken correct met het circuit. Ik ben ervan uitgaande dat niemand waarschijnlijk de zelfde sensoren die ik heb gebruikt zal, dus test jouwe nu voordat we gaan nadenken over de ETS van een permanente Raad... beter wijzigingen nu terwijl het circuit is vrij van soldeer.
Vervolgens hebben we een blik bij het creëren van de lay-out schema en karton met ExpressPCB...
CODE BEGINT ONDER DEZE LIJN ***
/*
* Speed_measurement.c
*
* Gemaakt: 9/15/2012 8:50:23 PM
* Auteur: Thomas L
*/
#define F_CPU 14.7456E6
#include < avr/io.h >
#include < util/delay.h >
#include < avr/interrupt.h >
/************************************************************************/
/ * verklaar globale variabelen * /
/************************************************************************/
unsigned int resultaat = 0;
int interruptcount = 0;
lang int tijd = 0;
lange int resetcount = 0;
int main(void)
{
DDRD = 0X00; PORTD ingang voor externe interrupts
DDRC = 0XDF; portc uitgang voor 7 segment multiplexing en 1 ingang voor weergave van de afstand
DDRB = 0XFF; portb uitgang fot 7 segmentgegevens in bcd
PORTD | = 0XFF; inschakelen van portd pull up weerstanden
(int0 en int1 vereisen externe pull up weerstanden of 1 interrupt zal worden geactiveerd op reset)
EICRA | = (1 << ISC11) | (1 << ISC01); externe interrupts configureren
EIMSK | = (1 << INT1) | (1 << INT0); //
TCCR1B | = (1 << CS12); ingesteld prescaling voor timer1 256
/************************************************************************/
/ * verklaar variabelen voor berekening en weergave * /
/************************************************************************/
unsigned int degenen = 0;
unsigned int tientallen = 0;
unsigned int honderden = 0;
unsigned int x = 0;
dubbele ticsfoot = 0;
dubbele fps = 0;
dubbele fph = 0;
dubbele mph = 0;
dubbele km/uur = 0;
dubbele mps = 0;
int afstand = 0;
Sei(); inschakelen van de wereldwijde interrupts
while(1)
{
/************************************************************************/
/ * krijg sensor afstand in de voeten van pind 0,1,4,5 * /
/************************************************************************/
int. distanceinput = (~ PIND & 0x33);
int. hibits = (distanceinput >> 2); krijgen pind bits 0,1 en 4,5 samen te zijn
int. lobits = (distanceinput & 0x03); de waarde van de afstand in BCD. bits 2,3 zijn de
afstand = (hibits + lobits); ext interrupt-pinnen is al in gebruik.
Als (afstand == 0) afstand = 16;
/************************************************************************/
/ * 'klaar' indicator LED * /
/************************************************************************/
Als (interruptcount == 0)
{
PORTC | = (1 << 3);
}
anders
{
PORTC & = (0 << 3);
}
/************************************************************************/
/ * berekeningen aan snelheid in 4 eenheden zoeken * /
/************************************************************************/
Als (interruptcount == 2) //only berekenen wanneer beide interrupts hebben plaatsgevonden
{
cli(); global interrupts uitschakelen
ticsfoot = (tijd / afstand); afstand is afstand tussen sensoren in voeten - ticsfoot is teller tics/voet
fps = (57600 / ticsfoot); 57600 is teller tics/sec (clk/prescaler cpu)
fph = (fps * 60 * 60);
mph = (fph / 5280);
km/uur = (mph * 1.609344);
MPS = (fps * 0.3048);
EIMSK | = (1 << INT1) | (1 << INT0); //
Sei(); opnieuw inschakelen interrupts van de externe en mondiale interrupts
}
/************************************************************************/
/ * Kies Uitvoeropties * /
/************************************************************************/
Als (! () PIND & (1 << PIND6)) & & (PIND & (1 << PIND7))) //choose voeten/sec
{
Round(fps);
resultaat = fps;
}
anders als (PIND & (1 << PIND6) & &! () PIND & (1 << PIND7))) //choose meter per seconde
{
Round(MPS);
resultaat = mps;
}
anders als (PIND & (1 << PIND6) & & (PIND & (1 << PIND7))) //choose km/hr
{
Round(kph);
resultaat = km/uur;
}
anders //default mijl/uur
{
Round(mph);
resultaat = mph;
}
Als (resultaat > = 999) resultaat = 999;
/************************************************************************/
/ * vertraging om te stoppen met meerdere "2de interrupt" triggers * /
/ * zonder te vertragen belangrijkste codeuitvoering * /
/************************************************************************/
resetcount ++;
Als ((resetcount > = 0x00FF) & & (interruptcount > = 2)) //resetcount bovengrens duurt, is afhankelijk
{//before reset. 0x00FF ca. 3 sec
interruptcount = 0;
resetcount = 0;
}
/************************************************************************/
/ * int resultaat weergeven op 3 cijfers 7 segment display * /
/ * vertraging geeft zeven Segmenttijd decoder te decoderen en weergeven van cijfers * /
/************************************************************************/
Als (! () PINC & (1 << PINC5))) //to afstand beeldscherminstelling tentoongesteld
{//only terwijl de knop is ingedrukt
resultaat = afstand;
}
anders
honderden = (resultaat / 100); krijg 100 's plaats cijfers
x = (resultaat % 100);
PORTB = (0x00|hundreds);
PORTC | = (1 << 2); cijfers schrijven
_delay_ms(1);
PORTC & = (0 << 2);
tientallen = (x / 10); Krijg 10 plaats cijfers
x = x % 10;
PORTB = (0x00|tens);
PORTC | = (1 << 1); cijfers schrijven
_delay_ms(1);
PORTC & = (0 << 1);
degenen = x; Get 1's plaats cijfers
PORTB = (0x00|ones);
PORTC | = (1 << 0); cijfers schrijven
_delay_ms(1);
PORTC & = (0 << 0);
}
}
/************************************************************************/
/ * sensor 1 interrupt * /
/************************************************************************/
ISR(INT0_vect)
{
Als (interruptcount == 0)
{
TCNT1 = 0X0000; teller op 0 instellen
interruptcount ++; Increment interrupt graaf
EIMSK & = (1 << INT1) | (0 << INT0); uitschakelen van INT0
}
else if (interruptcount == 1)
{
tijd = TCNT1; waarde van de teller van de opname
interruptcount ++; Increment interrupt graaf
}
anders resetcount = 0;
}
/************************************************************************/
/ * sensor 2 interrupt * /
/************************************************************************/
ISR(INT1_vect)
{
Als (interruptcount == 0)
{
TCNT1 = 0X0000; teller op 0 instellen
interruptcount ++; Increment interrupt graaf
EIMSK & = (0 << INT1) | (1 << INT0); INT1 uitschakelen
}
else if (interruptcount == 1)
{
tijd = TCNT1; waarde van de teller van de opname
interruptcount ++; Increment interrupt graaf
}
anders resetcount = 0;
}