Hallo,
ja entschuldigt bitte, dass ich nur die Hälfte des codes gepostet habe.
Nun kommt doch alles anders:
Als ich der Bitte nachkommen wollte, den ganzen code hier einzustellen,
ist mir aufgefallen, dass der code in SiSy nicht 100% dem in AtmelStudio
entsprach.
Hier der code, wie ich ihn in SiSy nutze:
1 | #define F_CPU 3686400
|
2 | #include <avr\io.h>
|
3 | #include <avr\interrupt.h>
|
4 |
|
5 | volatile uint8_t sec, min, hour;
|
6 |
|
7 | ISR(TIMER1_COMPA_vect)
|
8 | {
|
9 | sec++;
|
10 | PORTB ^= (1<<PB0);
|
11 | if (sec > 5)
|
12 | {
|
13 | min++;
|
14 | sec = 0;
|
15 | PORTB ^= (1<<PB1);
|
16 | }
|
17 | if (min > 59)
|
18 | {
|
19 | min = 0;
|
20 | hour++;
|
21 | }
|
22 | if (hour>23)
|
23 | hour = 0;
|
24 |
|
25 | }
|
26 |
|
27 |
|
28 | ISR(ADC_vect)
|
29 | {
|
30 | // Beginn der Ereignisbehandlung
|
31 | uint16_t wert=ADC; // Einlesen des Analogwertes Low+High-Teil
|
32 | }
|
33 |
|
34 |
|
35 | void init()
|
36 | {
|
37 |
|
38 | DDRB=0b00000011; // Ports initialisieren
|
39 | TCCR1B=0x03; // Teiler 1/64
|
40 | TCCR1B|=0x08; // Zählen bis Vergleichswert
|
41 | OCR1A=57600; // Vergleichswert speichern
|
42 | TIMSK|=0x10; // Interrupt bei Vergleichswert
|
43 | ADMUX=0x40; // Port, Referenzspannung und Auflösung
|
44 | ADCSRA=0xED; // Modus, Interrupt und Start
|
45 |
|
46 | sei();
|
47 | }
|
48 |
|
49 |
|
50 | int main()
|
51 | {
|
52 |
|
53 | init();
|
54 | while (1)
|
55 | {
|
56 |
|
57 | }
|
58 | }
|
Hier ist noch eine zusätliche, eigentlich unnütze ISR(ADC_vect), da ich
keinen ADC initialisert habe. Um hier ein Minimalbesipiel zu posten,
habe ich also diese ISR im Code gelöscht. Das Resultat war, dass nun
auch das Programm in SiSy nicht mehr läuft. (???)
Wenn ich die Zeilen
1 | ISR(ADC_vect)
|
2 | {
|
3 | // Beginn der Ereignisbehandlung
|
4 | uint16_t wert=ADC; // Einlesen des Analogwertes Low+High-Teil
|
5 | }
|
auch in den code im AtmelStudio einfüge, funktioniert das Hochzählen der
globalen Variablen auch.
Das ist einerseits erfreulich, dass ein und derselbe code in
unterschiedlichen Entwicklungsumgebungen zum selben Ergebnis führt, ABER
was hat der funktionierende Programablauf mit der überflüssigen Routine
1 | ISR(ADC_vect)
|
2 | {
|
3 | // Beginn der Ereignisbehandlung
|
4 | uint16_t wert=ADC; // Einlesen des Analogwertes Low+High-Teil
|
5 | }
|
zu tun?
Mache ich bei der Interruptbehandlung grundlegend etwas falsch?
Vielen dank für Eure Hilfe und ich entschuldige mich für die gestifftete
Verwirrung
André