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.