Hallo Leute,
ich habe ein Problem. Ich bin noch recht neu, habe mich aber durch viele
Dokumente schon durchgearbeitet um es selbst zu lösen, komme aber nicht
weiter.
eHaJo Breakout board mit CPU: Atmega32U4 mit 16Mhz externem Quarz mit
Prescaler 8, daher 2Mhz Controller Takt. Spannungsversorgung durch USB.
Programmiert wird mittels Flip.
Auf einem Steckbrett befindet sich eine 4x3 Tastenmatrix, realisiert mit
einem 595er und 165er. An PortD habe ich 7 LED angeschlossen, um
Rückmeldungen zu haben und zu sehen, was/ob was passiert.
Mein erster Schritt war, mich mit dem 16 bit Timer1 vertraut zu machen.
Um zu sehen, ob etwas passiert, lasse ich PinD0 regelmäßig blinken,
durch Überlauf einer uint16_t Variablen.
Mit dem Timer im CTC möchte ich eine weitere LED blinken lassen. Das hat
anfänglich auch funktioniert. Aber dann ist mir etwas aufgefallen und
ich verstehe noch immer nicht, warum das so ist.
Wenn ich im Code den Teil mit dem uint16_t Variablen Überlauf
auskommentiere und die PinD0 nicht mehr getoggelt wird, scheint es, als
würde der Timer1 nie anlaufen, bzw, der Interrupt nie ausgelöst.
Ich weiß nicht warum, könnt Ihr mir da weiterhelfen.
Mein Projekt ist modular aufgebaut und hier der Code.
1 | #ifndef F_CPU
|
2 | #define F_CPU 2000000UL
|
3 | #endif
|
4 |
|
5 | #include <avr/io.h>
|
6 | #include <avr/interrupt.h>
|
7 | #include <stdbool.h>
|
8 | #include "Timer.h"
|
9 |
|
10 | #define ms_to_run 50 //Dauer des Timers in ms
|
11 |
|
12 | volatile bool timer_flag = false;
|
13 |
|
14 | void Timer_init(){
|
15 |
|
16 | //Initialissierung
|
17 | TCCR1A=0x00;
|
18 | TCCR1B=0x00; //Timer Reset und anhalten
|
19 |
|
20 |
|
21 | TCCR1B= (1<<WGM12)|(1<<CS11)|(1<<CS10); //CTC Modus und Prescaler 64
|
22 |
|
23 | OCR1A= ms_to_run*31.25;
|
24 |
|
25 | //Interrupt freischalten
|
26 | TIMSK1=(1<<OCIE1A); //Compare Match Counter A
|
27 |
|
28 | }
|
29 |
|
30 | //Der Overflow Interrupt Handler
|
31 |
|
32 | ISR (TIMER1_COMPA_vect)
|
33 | {
|
34 |
|
35 | timer_flag= true;
|
36 |
|
37 |
|
38 | }
|
1 | #ifndef F_CPU
|
2 | #define F_CPU 2000000UL
|
3 | #endif
|
4 |
|
5 |
|
6 |
|
7 | #include <avr/io.h>
|
8 | #include <avr/interrupt.h>
|
9 | #include <stdbool.h>
|
10 | #include "Timer.h"
|
11 |
|
12 |
|
13 |
|
14 | #define LEDPort PORTD
|
15 | #define LED_DDR DDRD
|
16 |
|
17 | extern bool timer_flag;
|
18 |
|
19 | uint16_t Anzahl=0;
|
20 |
|
21 |
|
22 | int main(void){
|
23 |
|
24 |
|
25 | LED_DDR=0xFF; //PortD als Ausgang für die LEDPort schalten
|
26 |
|
27 |
|
28 | Timer_init(); //Timer initialisieren
|
29 |
|
30 | sei();
|
31 |
|
32 |
|
33 | while (1)
|
34 | {
|
35 |
|
36 | //Anzahl++;
|
37 | //
|
38 | //if (Anzahl==0){
|
39 | //LEDPort^=(1<<PIND0);
|
40 | //
|
41 | //}
|
42 |
|
43 |
|
44 |
|
45 | if (timer_flag==true){
|
46 |
|
47 | LEDPort^= (1<<PIND7);
|
48 | timer_flag=false;
|
49 |
|
50 | }
|
51 | }
|
52 | }
|
Wenn der Teil direkt nach While auskommentiert ist, funktioniert das
Blinken nicht. Ist es nicht auskommentiert und PIND0 wird regelmäßig
getoggelt, läuft auch die Timer1 Geschichte.
Ich hoffe, ich habe es verständlich rübergebracht und es kann mir jemand
weiterhgelfen.
Schöne Tage und einen Guten Ruscth und eine super neues Jahr 2018
Gruß
Jens