Re: CTC Timer mit mega168
Zitat:
Zitat von phyro
... der Codeausschnitt ist wirklich nur ein Ausschnitt ...
Hübsches Ratespiel der Art: ich verstecke den größten Teil meines geheimen Codes, bitte sucht den Fehler.
Zitat:
Zitat von phyro
... Timer, der (genau) jede Sekunde die ISR ausführt ... Beispiel laufen bei mir nicht ... anderes Beispiel gefunden ...
Eine alte indische Programmiererweisheit lautet: selbst ist der Programmierer. Ne andere ist eher kryptisch: RTFM.
Zitat:
Zitat von phyro
... Timer, der (genau) jede Sekunde die ISR ausführt ... zusätzliche Infos: ... AT mega168 ...
Die Basis für einen genauen Timer ist der Quarztakt. Ohne dessen Wert zu kennen müsste ich zusammen mit der Bedeutung des "_BV" auch hier etwas raten. "TCCR1A = 0x00;" halte ich für ein eher unsinniges Codestück, da beim CTC mit OCR1A zumindest WGM01 gesetzt sein muss. Soweit ich mich an die Dokumentation erinnere.
Re: CTC Timer mit mega168
Zitat:
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
Re: CTC Timer mit mega168
Zitat:
Zitat von phyro
... Den übrigen Teil habe ich zuvor schon getestet und der tut was er soll ...
Zitat:
Zitat von phyro
oh sry, hatte noch ne Dreher im Programm, weil ich nachher noch was dran gemacht hatte ...
Zitat:
Zitat von phyro
... Übrigens, der Ton macht die Musik! ...