Schönen Guten Abend,
mich beschäftigt ein Problem, was ich nicht alleine lösen kann. Ich befasse mich gerade mit den Timern auf dem ATmega8.
Folgende Soft- und Hardware benutze ich:
AVR-Studio Version 4.16.628
PonyProg Version 2.07c Beta
Atmel Evaluations-Board Version 2.0.1 mit einem ATmega8 16PU. Mit einem externen Quarz (4000MHz) getaktet. Quarz ist an PIN XTAL1 und XTAL2 angeschlossen. Die Fuses sind entsprechend gesetzt.
Ich habe ein Programm geschrieben, um zu gucken,ob die Hardware richtig funktioniert. Mein Programm funktioniert auch. Es wird mit "delay_ms" eine LED zum Blinken gebracht. Die Lampe blinkt in der richtigen Taktung. Hier ist es:
Wenn das Programm funktioniert, schließe ich mal aus, dass die Fehlerursache des gleich folgenden Problems nicht an der Harware liegt?
Ich hab ein zweites Programm geschrieben/abgeguckt, wo ich den Timer1 ausprobiere im CTC-Modus. Das Programm funktioniert aber leider nicht richtig! Auf dem Evaluations-Board sind zwei LEDs. Die eine mach ich zu Testzwecken einfach nur an. Nachdem die erste LED an ist, soll die zweite LED dann nach einer bestimmten Zeit auch leuchten. Die zweite LED geht dann auch irgendwann an, aber die Zeit passt gar nicht (es dauert vieeel zu lang). Und ich frage mich, woran das wohl liegen mag?
Hier das zweite Programm:
Hab ich einen Denkfehler im Programm? Oder kann es an einer Einstellung in AVR-Studio bzw. PonyProg liegen? Aber dann würde das 1. Programm wohl auch nicht richtig funktionieren?
Für euer Mühe danke ich euch!
Grüße Sven
mich beschäftigt ein Problem, was ich nicht alleine lösen kann. Ich befasse mich gerade mit den Timern auf dem ATmega8.
Folgende Soft- und Hardware benutze ich:
AVR-Studio Version 4.16.628
PonyProg Version 2.07c Beta
Atmel Evaluations-Board Version 2.0.1 mit einem ATmega8 16PU. Mit einem externen Quarz (4000MHz) getaktet. Quarz ist an PIN XTAL1 und XTAL2 angeschlossen. Die Fuses sind entsprechend gesetzt.
Ich habe ein Programm geschrieben, um zu gucken,ob die Hardware richtig funktioniert. Mein Programm funktioniert auch. Es wird mit "delay_ms" eine LED zum Blinken gebracht. Die Lampe blinkt in der richtigen Taktung. Hier ist es:
Code:
#define F_CPU 4000000UL
#include <avr/io.h>
#include <util/delay.h>
int main (void)
{
DDRD |= (1<<DDD5); //setzt PD5 auf Ausgang. Hier ist LED2 angeschlossen.
while(1)
{
PORTD |= (1<<PD5); //schaltet Pin PD5 für 4sek an
_delay_ms(4000);
PORTD &=~ (1<<PD5); //schaltet Pin PD5 wieder für 2sek aus
_delay_ms(2000);
}
return 0;
}
Wenn das Programm funktioniert, schließe ich mal aus, dass die Fehlerursache des gleich folgenden Problems nicht an der Harware liegt?
Ich hab ein zweites Programm geschrieben/abgeguckt, wo ich den Timer1 ausprobiere im CTC-Modus. Das Programm funktioniert aber leider nicht richtig! Auf dem Evaluations-Board sind zwei LEDs. Die eine mach ich zu Testzwecken einfach nur an. Nachdem die erste LED an ist, soll die zweite LED dann nach einer bestimmten Zeit auch leuchten. Die zweite LED geht dann auch irgendwann an, aber die Zeit passt gar nicht (es dauert vieeel zu lang). Und ich frage mich, woran das wohl liegen mag?
Hier das zweite Programm:
Code:
//Vortest Uhr
#define F_CPU 4000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
int counter; //Zaehlvariable
int millisec;
int sec;
int min;
int std;
volatile uint8_t test = 0;
ISR(TIMER1_COMPA_vect) //Die Interruptroutine. Kein ";" dahinter sonst Fehlermeldung beim Compilieren!
// TIMER1_COMPA_vect ist der Interruptvektor.
{
test++; //zaehlt Variable um 1 hoch.
if(test==1000000) //nach 2sek sollte die zweite LED anfangen zu leuchten;macht sie aber nicht;es braucht viel länger als 2sek!
{
PORTD |= (1<<PD6);
}
}
int main (void)
{
// Timer 1 konfigurieren, Timer 1 kann CTC
TCCR1A = (1<<WGM12); // CTC Modus mit OCR1A
TCCR1B = (1<<CS11); // Prescaler 8
// ((4000000/8)/1000) = 500; um bis auf 500 hochzuzählen wird 1ms benötigt
OCR1A = 500-1; //warum -1 ???
// Compare Interrupt erlauben
TIMSK |= (1<<OCIE1A);
sei(); //einschalten der Interrupts. Setzt das Global Interrupt Enable Bit im Status Register.
while(1)
{
//Ausgabe
DDRD |= (1<<PD5) | (1<<PD6);
PORTD |= (1<<PD5); //zum Testen
}
return 0;
}
Hab ich einen Denkfehler im Programm? Oder kann es an einer Einstellung in AVR-Studio bzw. PonyProg liegen? Aber dann würde das 1. Programm wohl auch nicht richtig funktionieren?
Für euer Mühe danke ich euch!
Grüße Sven