Hallo
als ich noch mit dem Asuro gespielt hatte, hab ich den in Assembler programmiert
Ich hab' mir den asuro ins Haus geholt, weil ich endlich mal in c einsteigen wollte. In Assembler ist halt alles was anspruchsvoller ist etwas zäh, da ist c als "Hochsprache" schon deutlich mächtiger. Außerdem kann man mit c auch recht nahe an der Maschine bleiben, wenn man weis, wie es geht. Mit Hilfe der tollen Tutorials auf deiner HP habe ich nun endlich auch die Timergeschichte kapiert und damit auch die nächste Hürde genommen:
Code:
#include <avr/io.h>
#include <avr/interrupt.h>
unsigned int timer_startwert=65536-7812; // 8MHz/1024=7812,5
int main(void)
{
DDRB=0; // nicht benoetigte Ports auf Eingang setzen
DDRC=0;
DDRD=(1 << PD2); //rote StatusLED haengt an PD2(= Port D, Bit2)
PORTD=0; // alles aus
/* Es folgt eine Verzögerung von ca. 1 Sekunde */
TCNT1=timer_startwert; // 16-Bit auf einmal laden?
TCCR1B |= 0b00000101; // Prescaller Timer1 auf 1024 setzen
while(!(TIFR & 0b00000100)); //Warten bis Überlauf Timer1
TCCR1B &= ~0b00000101; // Prescaller löschen bedeutet Timer1 stoppen
TIFR |= 0b00000100; // Flag setzen bedeutet Flag wieder löschen
while(1) PORTD=((PINC & (1<<PC4)) >> 2); // eine Taste schaltet StatusLED aus
return(0);
}
Das lief dann übrigens auf Anhieb, obwohl ich mir nicht sicher bin, ob das Laden eines 16Bit-Wertes nach TCNT1 legitim ist. Meine Optimierung steht übrigens auf "size" habe ich jetzt gesehen.
Gruß
mic
Lesezeichen