Hallo,ich habe dieses Teil am Interrupt nicht verstanden if(zaehler<255
zaehler=0x00;.....) normalerweise,wenn zaehler>255 sein muss,oder?Das
program soll ein Lösung für eine Aufgabe sein! (Atmega 2560)
2) Ich musste alle nicht benötigten Komponenten des Mikrocontrollers
Deaktivieren.Dafür habe die IDLE Mode gewählt ist ok?
3)Ich habe nicht verstanden wie die Ocr1a berechnet ist.Normalerweise
die Formel ist.Ocr1a =(0.5 sec * (fcpu/Prescaler))-1) das ist für led
von 1Hz.
Ich danke euch!
#include<avr/io.h>
#include<avr/interrupt.h>
#include<avr/sleep.h>
#define F_CPU 16 000 000UL
#define TICKS ((uint16_t) 15624)
// globalle Variable
volatile uint8_t zaehler;
// Prototyp
void init_timer1_ctc(void);
void init_timer1_ctc(void){
TCCR1B |=(1<<WGM12)|(1<<CS12); // CTC- MOdus + Prescaler(1024)
TIMSK1 |=(1<<OCIE1A); // interrupt aktivieren,wenn der Vergleichwert
erreicht ist
OCR1A=TICKS; // Vergleichwert laden
}
ISR(TIMER1_COMPA_vect)
{
++zaehler; // PORTA inkrementiern
if(zaehler<255)
zaehler=0x00; // löschen bei Überlauf
PORTD^=(1<<PD0);// LED EIN BZW AUS
}
int main (void){
DDRA =0xFF; // PortA als Ausgang
DDRD |=(1<<PIN0);// PD0 Output PD1 Input
PORTD |= (1<<PD1); // Pull-Up setzn
// Timer1 Konfiguration
init_timer1_ctc();
set_sleep_mode(SLEEP_MODE_IDLE);
sleep_mode();
sei();
while(1)
{
if(PIND & !(1<<PD1)){
zaehler = 0x00; // Taster drücken Zaehler auf null
}
PORTA=zaehler; //Binärzahl auszgeben
}
}
Armin Patick schrieb: > if(zaehler<255 > zaehler=0x00;.....) So bleibt der Zähler immer auf 0 da immer <255.
1 | TCCR1B |=(1<<WGM12)|(1<<CS12); // CTC- MOdus + Prescaler(1024) |
Hier ist der Prescaler auf /256 gestellt. Deine konkrete Frage habe ich allerdings nicht verstanden.
Hallo! 1)Wenn der Zähler =0x00 immer auf 0 bleibt dann PORTA auch ,weil PORTA=zaehler; .Und Laut Aufgabestellung(unten) muss Port A die Zahl der Taktzyklen als Binärzahl auszugeben.Deswegen dachte ich ,dass der Zähler >255 sein muss.Ist das nicht richtig? 2) Ich habe die OCR1A MIT 256 berechnt aber ich bin nicht auf 15625 gekommen!wie geht das denn! Aufgabe: Programmieren Sie eine Anwendung, die am Port C.1 eine LED mit einer Frequenz von 1 Hz ansteuert. Zusätzlich ist am Port A die Zahl der Taktzyklen als Binärzahl auszugeben. Bei einem Überlauf des Zählers soll die Zählung wieder bei Null beginnen. 1) Realisieren Sie das oben beschriebene Projekt mit einem Softwaretimer! Überprüfen Sie die Genauigkeit Ihrer Taktfrequenz am Oszilloskop. 2) Modifizieren Sie Ihr Lösung für Aufgabe 1) und stellen Sie das Programm so um, daß die Zeitmessung mit einem Hardwaretimer und Interrupts erfolgt! 3) Ergänzen Sie Ihre Lösung für Aufgabe 2) um eine Resetfunktion, die beim Drücken eines Tasters den Zähler auf Null zurück setzt!
Armin Patick schrieb: > #define F_CPU 16 000 000UL Das sieht zwar hübsch aus, besser ist aber
1 | #define F_CPU 16000000UL
|
Vielleicht auch so:
1 | #define F_CPU 16.0 // CPU clock in MHz |
Float-Wert, rechnen tut damit der Preprozessor, z.B. Timervoreinstellung, Baudrate, das belastet dann nicht den Code und die Laufzeit mit Float-Rechnungen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.