
Zitat von
oberallgeier
Hübsches Ratespiel der Art: ich verstecke den größten Teil meines geheimen Codes, bitte sucht den Fehler.
Sorry, ich habe gedacht es währe übersichtlicher, wenn ich nur das poste, was auch mit dem Timer zu tun hat. Den übrigen Teil habe ich zuvor schon getestet und der tut was er soll.
Übrigens, der Ton macht die Musik!
Und wie gesagt, den Timer habe ich in Bascom schon einmal erfolgreich umgesetzt, ich will zunächst mal, dass der Timer überhaupt erstmal läuft, die passende Geschwindigkeit kann ich dann hinterher immer noch einstellen. Darum geht es mir hier nicht.
Und hier noch mal der gesamte Code:
Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
void anzeige(int A1, int A2, int A3, int P);
volatile int second = 0;
volatile int minute = 0;
volatile int hour = 0;
int P = 0;
int main (void) {
//----------------------------------------------------
// Set up timer 1 to generate an interrupt every 1 ms
//----------------------------------------------------
TCCR1A = 0x00;
TCCR1B = (_BV(WGM12) | _BV(CS12));
OCR1A = 71;
TIMSK1 = _BV(OCIE1A);
DDRB = 0xff; // PortB als Ausgang
DDRC = 0b001111; // PortC.0 bis C.3 als Ausgang
while(1)
{
anzeige(hour,minute,second,0);
}
return 0;
}
/* Die Funkton Anzeige kümmert sich darum, die in A1, A2 und A3 abgelegten Zahlen auf
den Sechs 7-Segment Anzeigen dar zu stellen, P ist für die Sekunden Punkte zuständig */
void anzeige(int A1, int A2, int A3, int P)
{
PORTB = 0b000001;
PORTC = A1/10 ;
_delay_ms(3);
PORTB = 0b000010;
PORTC = A1%10 ;
_delay_ms(3);
PORTB = 0b000100;
PORTC = A2/10 ;
_delay_ms(3);
PORTB = 0b001000;
PORTC = A2%10 ;
_delay_ms(3);
PORTB = 0b010000;
PORTC = A3/10 ;
_delay_ms(3);
PORTB = 0b100000;
PORTC = A3%10 ;
_delay_ms(3);
}
ISR(TIMER1_COMPA_vect)
{
second++;
if (second>59) {
second=0;
minute++;
}
if (minute>59) {
minute=0;
hour++;
}
if (hour>23) {
hour =0;
}
}
Und der Controller wird über einen Quarz mit 16 Mhz versorgt
Lesezeichen