Das Problem ist im übrigen noch nicht gelöst. Hier jetzt der gesamte
Code:
1 | #ifndef F_CPU
|
2 | #define F_CPU 16000000UL
|
3 | #endif
|
4 |
|
5 | #include <util/delay.h>
|
6 | #include <avr/interrupt.h>
|
7 | #include <avr/io.h>
|
8 |
|
9 |
|
10 | // ##########################
|
11 | // #### IO FUNCTIONS ####
|
12 | // ##########################
|
13 | void initIO()
|
14 | {
|
15 | //DAC = OUTPUT
|
16 | DDRD |= 0xF0; //Higher Nibble
|
17 | DDRB |= 0xF0; //Lower Nibble
|
18 |
|
19 | //LCD
|
20 | DDRA = 0xFF;
|
21 |
|
22 | //Keys = INPUT
|
23 | DDRB &= ~(_BV(2));
|
24 | PORTB |= _BV(PB2);
|
25 |
|
26 | DDRD &= ~(_BV(2) | _BV(3));
|
27 | PORTD |= _BV(PD2) | _BV(PD3);
|
28 | }
|
29 |
|
30 | void initExtInt()
|
31 | {
|
32 | //INT0, INT1, INT2 = falling edge
|
33 | MCUCR |= _BV(ISC11) | _BV(ISC01);
|
34 | MCUCSR &= ~(_BV(ISC2));
|
35 | GICR |= _BV(INT0) | _BV(INT1) | _BV(INT2);
|
36 | }
|
37 |
|
38 |
|
39 | // ########################
|
40 | // #### MAIN PROGRAM ####
|
41 | // ########################
|
42 |
|
43 | int main(void)
|
44 | {
|
45 | //initial values
|
46 | initIO();
|
47 | initExtInt();
|
48 |
|
49 | lcd_init(LCD_DISP_ON);
|
50 |
|
51 | sei();
|
52 |
|
53 | while(1)
|
54 | {
|
55 | PORTD = ((value[phase]) & 0xFC); //Higher Nibble
|
56 | PORTB = (((value[phase]) << 4)|0x04) ; //Lower Nibble
|
57 | }
|
58 |
|
59 | return 0;
|
60 | }
|
61 |
|
62 |
|
63 |
|
64 | // #################
|
65 | // #### ISR ####
|
66 | // #################
|
67 |
|
68 |
|
69 | ISR(INT0_vect)
|
70 | {
|
71 | PORTA ^= 0xFF;
|
72 | }
|
73 |
|
74 |
|
75 | ISR(INT1_vect)
|
76 | {
|
77 | PORTA ^= 0xFF;
|
78 | }
|
79 |
|
80 |
|
81 | ISR(INT2_vect)
|
82 | {
|
83 | PORTA ^= 0xFF;
|
84 | }
|
value ist ein char Array mit 100 elementen, das hab ich rausgeworfen,
weils zu groß war.
In der Main möchte ich das jeweilige Byte auf dem oberen Nibble des
Ports ausgeben ohne das untere zu verändern. Mache ich es mit POTD |=...
dann setze ich ja nur die 1er, nicht aber 0er. Deswegen diese kryptische
verundung bzw. Veroderung. sie hat nur den Zweck den Pullup nicht
auszuschalten.
An den besagten INTx sind jeztt Taster gegen Masse geschlossen. Drücke
ich jetzt int0, dann passiert an PORTA einmal kurz was, dann nie
wieder. genausp mit den anderen.
Was kann das bloß sein?