Atmega16
AVR Studio 5
AVR Dragon
Hallo zusammen,
ich habe folgendes Problem:
Ich habe in C ein Progrämmchen geschrieben, das mir ein Lauflicht in
einer bestimmten Frequenz erzeugen soll. Soweit so gut. Ich habe die
Funktionalität des Codes so weit reduziert, dass ich nur die Register
setze und dann im loop (while(1)) nach Betätigung eines Schalters an
INT0 eine LED an PORTA rotieren lassen will.
Ich debugge über JTAG OnChip. Wenn ich Einzelschritte beim debuggen
ausführe, springt der Code nach betätigen des Schalters in die
Interruptroutine, die erste LED leuchtet auf und danach steht der gelbe
Ausführungspfeil wieder vor
Sieht mir nach nem Reset aus, aber warum???
Wenn ich ohne debugging den Chip einfach laufen lasse, blitzt beim
betätigen des Schalters die erste LED kurz auf, dann Reset.
Jemand ne Idee???
Code:
1 | #define F_CPU 1000000UL
|
2 |
|
3 | #include <avr/io.h>
|
4 | #include <avr/interrupt.h>
|
5 | #include <stdint.h>
|
6 | #include <stdlib.h>
|
7 |
|
8 | //####################### Variablen ################################
|
9 |
|
10 | struct Timer
|
11 | {
|
12 | volatile uint16_t NeededOverflows;
|
13 | volatile uint16_t OverflowCount;
|
14 | volatile uint8_t Frequencies[6];
|
15 | volatile uint8_t TimerIndex;
|
16 | volatile uint8_t Lauflicht;
|
17 | };
|
18 |
|
19 | struct Timer T0 = {.NeededOverflows=0,.OverflowCount=0,.Frequencies={4,7,6,2,9,7},.TimerIndex=0,.Lauflicht=1};
|
20 | struct Timer T1 = {.NeededOverflows=0,.OverflowCount=0,.Frequencies={7,9,3,5,11,8},.TimerIndex=1,.Lauflicht=1};
|
21 |
|
22 | //############################# Funktionen ##################################
|
23 |
|
24 | void SetConfigureRegisters(void)
|
25 | {
|
26 |
|
27 | GICR = (1<<INT0); //|(1<<INT1);
|
28 | MCUCR = (1<<ISC01); //Falling edge sense of INT0
|
29 | TCCR0 = (1<<CS00); //kein Prescale
|
30 | TCCR1B = (1<<CS10)|(1<<ICNC1); //|(0<<ICES1); // Noise Canceller aktiv, kein PreScale
|
31 | TIMSK = (1<<OCIE0)|(OCIE1A); //|(1<<TICIE1); // Interrupts akivieren, Capture
|
32 |
|
33 | }
|
34 |
|
35 | void SetPortDirectionRegisters(void)
|
36 | {
|
37 | DDRA = 0xFF;
|
38 | //DDRB = 0x02;
|
39 | //DDRC = 0x00;
|
40 | //DDRD = 0xFF;
|
41 | }
|
42 |
|
43 | void SetAllPortsToValue(int Value)
|
44 | {
|
45 | PORTA = Value;
|
46 | //PORTB = Value;
|
47 | //PORTC = Value;
|
48 | //PORTD = Value;
|
49 | }
|
50 |
|
51 | void SetPortA(void) {
|
52 |
|
53 | PORTA = ~T1.Lauflicht; // Untere 8 Bit auf PORT B ausgegeben
|
54 | T1.Lauflicht = T1.Lauflicht<<1; // Lauflicht um 1 Bit nach links weiterschieben
|
55 | if (T1.Lauflicht == 0) // Wenn Lauflicht durchgelaufen ist, dann wieder am Anfang beginnen
|
56 | T1.Lauflicht = 1;
|
57 | }
|
58 |
|
59 | //####################### Interrupts ###############################
|
60 |
|
61 |
|
62 | ISR(INT0_vect) {
|
63 |
|
64 | SetPortA();
|
65 | }
|
66 |
|
67 | //############################## Main-Funktion ####################################
|
68 |
|
69 | int main(void) {
|
70 |
|
71 | SetPortDirectionRegisters();
|
72 | SetAllPortsToValue(~0);
|
73 | SetConfigureRegisters(); //Initialisierung T1+0
|
74 |
|
75 | sei();
|
76 |
|
77 | while(1) {
|
78 |
|
79 | }
|
80 |
|
81 | return 0;
|
82 |
|
83 | }
|