Hallo, Funktionsweise soll so sein das er 2 unterschiedliche werte mit einem Sollwert vergleichen soll mit dem internen Comparator. Mein Problem ist es das der Multiplexer einfach nicht das macht was er soll. Er soll die eingelesen Werte vom PORTbereich vom AD Wandler (PINC0, und PINC1) vergleichen mit dem vorgegebenen Sollwert der auf PIND6 steckt. Mein jetziger Quelltext sieht so aus. http://pastebin.com/GWEnNE0z
Das sieht für mich fischig aus: In zwei unmittelbar aufeinander folgenden C-Anweiungen den ADC-Eingang wechseln und darauf hoffen, dass die ISR in den paar Takten dazwischen den korrekten Vergleich macht? Das sei() würde ich vor die while-Schleife ziehen. Die Hexwerte bei der ADC Initialisierung habe ich nicht mit dem Datenblatt aufgeschlüsselt. Quellcode auf pastebin posten, damit man schlecht Copy&Pasten kann, finde ich doof, wo es doch hier den schönen Anhang und Codeformatierung gibt.
Ja erstmal danke für die Antwort, Aber siehe mein Name... ich bin blutiger Anfänger, und wurden in der Schule ziemllich ins Kalte Wasser geworfen. Unser Lehrer hat nicht mal mit der C Programmierung angefangen und wir sollen nun ein Projekt auf die Beine stellen, nach 2 Monaten einarbeiten... =( Ich werde mal die paar änderungen einbauen, ich hätte ja gerne noch NOP; Befehle eingebaut aber der Befehl funktioniert nicht
Als Starter bist du ganz gut dabei, da kommen andere mit deutlich weniger an! Viel Erfolg! Wenn du am ändern bist, überleg dir den Programmablauf. Wenn du die Tastenabfrage wie jetzt in den Analog Compare Interrupt packst führt das zu Einschränkungen: Die Tasten reagieren dann nur, wenn der Analog Compare Interrupt auch aufgerufen wird! So etwas wäre fast nur brauchbar, wenn es z.B. darum geht einen Alarm über den Analog Compare Interrupt zu entdecken und dann per Taste auszuschalten. Wenn es eine unabhängige Tastenbedienung werden soll (z.B. Batterietest o.ä.), nimmst du besser einen Timer Interrupt für die Tasten oder benutzt das Warteschleifenverfahren innerhalb while. Beides ist in Entprellung beschrieben.
Ja also das Projekt soll im weitesten Sinne ein "Rauchmelder" darstellen Der Interrupt soll eben der Alarm sein den man Quittieren kann inzwischen hab ich die nop befehle eingebaut und es funktioniert auch was mich nur sehr verwundert, ist das der Interrupt erst auslöst nach ca 2 sec nach überschreiten des Schwellwerts
Bevor man den falschen Quellcode examiniert: Ist der Quellcode oben noch aktuell oder bereits wie angekündigt verändert?
1 | /* ------------------------------------------------------------ |
2 | Titel : Projekt Rauchmelder |
3 | -------------------------------------------------------------- |
4 | Funktion : Pt100 und Photodiode überwachen |
5 | -------------------------------------------------------------- |
6 | Prozessor : ATmega8 |
7 | Taktfrequenz externer Quarz: 3,686411 MHz |
8 | Sprache : C |
9 | Datum : ©2010 |
10 | Version : 1.1 |
11 | ------------------------------------------------------------ */ |
12 | |
13 | #include <avr/io.h> |
14 | #include <util/delay.h> |
15 | #include <avr/interrupt.h> |
16 | |
17 | ISR (ANA_COMP_vect) // Interrupt Analog Comparator |
18 | { |
19 | PORTB |= 0x04; |
20 | while(bit_is_set (PINB,2)) |
21 | { |
22 | for(int x=0;x<=500;x++) |
23 | { |
24 | PORTB |= 0x02; |
25 | _delay_ms(2.5); |
26 | PORTB &=~ 0x02; |
27 | _delay_ms(2.5); |
28 | } |
29 | _delay_ms (200); |
30 | for(int y=0;y<=500;y++) |
31 | { |
32 | PORTB |= 0x02; |
33 | _delay_ms(3); |
34 | PORTB &=~ 0x02; |
35 | _delay_ms(3); |
36 | } |
37 | } |
38 | } |
39 | |
40 | void main (void) |
41 | { |
42 | DDRB = 0x03; |
43 | PORTB = 0x04; |
44 | PORTD = 0x00; |
45 | DDRD = 0x00; |
46 | ACSR = 0x0b; // Analog Comparator Status Register |
47 | SFIOR = 0x08; // Multiplexer ACME Bit 1 |
48 | ADCSRA&=~(1<<ADEN);//make sure ADC is OFF |
49 | |
50 | while (1) |
51 | { |
52 | PORTB = 0x01; |
53 | |
54 | _delay_ms(2500); |
55 | PORTB = 0x00; |
56 | _delay_ms(6000); |
57 | |
58 | |
59 | ADMUX = 0; // Wert PINC0 einlesen |
60 | asm ("nop"::); |
61 | asm ("nop"::); |
62 | asm ("nop"::); |
63 | asm ("nop"::); |
64 | |
65 | ADMUX = 1; // Wert PINC1 einlesen |
66 | sei (); |
67 | |
68 | } |
69 | } |
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.