Forum: Mikrocontroller und Digitale Elektronik AD - AVR


von Momo (Gast)


Lesenswert?

Hallo!
 Versuche verzweifelt meine AD Wandlung zum laufen zu bekommen, doch
irgendetwas klappt nicht!
möchte das beim überschreiten eines Schwellwertes ein Led
eingeschalten
und beim unterschreiten die Led ausgeschalten wird!
Doch das funktioniert nicht!
keine Ahnung warum!
AD Wandlung im singel conversion und interrupt mode



BSP

.include"tn15def.inc"

.org 0x000
rjmp RESET

.org 0x009
rjmp ADU


.def temp=r16
.def uni=r17
.def schwelle_1=r18
.def schwelle_2=r19

RESET:

ldi temp,0b00000011
out ddrb,temp

clr temp
out portb,temp

ldi temp,0b00100011
out admux,temp

ldi schwelle_1,0b01000000
ldi schwelle_2,0b10000000

ldi temp,0b11001111
out adcsr,temp

sei

mainloop:
rjmp mainloop





ADU:

IN uni,adcl
IN uni,adch

cp uni,schwelle_1

brsh setzen_1:

cbi portb,0

rjmp ende_1

setzen_1:

sbi portb,0

ende_1:



cp uni,schwelle_2

brsh setzen_2:

cbi portb,1

rjmp ende_2

setzen_2:

sbi portb,1

ende_2:

ldi temp,0b11001111
out adcsr,temp

reti

von Matthias H. (Gast)


Lesenswert?

da sind ja einige Sachen drin.

z.B.
IN uni,adcl
IN uni,adch

du überschreibst den Wert adcl in uni gleich wieder mit adch ohne etwas
damit gemacht zu haben. Und weil adch meines Wissens nie größer als 3
ist, weils ja nur die Bits 8 und 9 des 10bit-Wertes sind, wird er wohl
nie die Schwelle überschreiten.

von ...HanneS... (Gast)


Lesenswert?

Hi...

Nööö...
In ADMUX ist ja (wenn ich mich nicht irre) ADLAR gesetzt, somit wird
das Ergebnis linksbündig ausgegeben. In UNI landen dann schon die
oberen 8 Bit... Das Lesen der unteren 2 Bit kann man sich übrigens
sparen.

Ich sehe da eher Probleme bei der Auswertung.
Es wird auf beide Referenzwerte geprüft, aber bei jedem eine von zwei
Aktionen (LED an/aus) ausgelöst. Da kann es schon mal passieren, dass
sich beide Tests widersprechen. In jedem Test würde ich nur eine Aktion
ausführen,
- beim Überschreiten des Maxwertes die LED einschalten,
- beim Unterschreiten des Maxwertes nix tun,
- beim Überschreiten des Minwertes nix tun,
- beim Unterschreiten des Minwertes die LED ausschalten...

Haste das mal durch den Debugger (Simulator des AVR-Studio) gejagt?

Das gesamte Programm habe ich jetzt aber mangels übersichtlicher
Schreibweise (fehlende Einrückungen und Kommentare, keine Verwendung
symbolischer Bitnamen) nicht analysiert.

Guten Rutsch...
...HanneS...

von Momo (Gast)


Lesenswert?

Du hast mich falsch verstanden! Ich will zwei Schwellwerte prüfen! Das
Programm funktioniert am Simulator nur am Zielsystem läuft es nicht!
mfg momo

von ...HanneS... (Gast)


Lesenswert?

Jou, falsch verstanden, zwei LEDs, nicht richtig hingeschaut...

Dann such mal bei den Int-Vektoren.
Der Int-Vektor zu ADC-Complete ist nämlich nicht 9 sondern 8...

Guten Rutsch...
...HanneS...

von Momo (Gast)


Lesenswert?

Danke ...HanneS...!
Das wars! nur stellt sich die Frage wieso das progi am simulator
richtig gelaufen ist!

von ...HanneS... (Gast)


Lesenswert?

Tja, ich bin von dieser Schreibweise der Vektoren wieder weg, ich
schreibe jetzt wieder die komplette Vektortabelle und setze für alle
unbenutzten Vektoren RETI ein. Das ist zwar etwas mühsamer beim
Portieren auf andere AVRs, birgt aber weniger Fehlerquellen (durch
Irrtümer).

...

von Momo (Gast)


Lesenswert?

DAnke!
Duch Simulatorfrage ist noch immer nicht beantwortet

von ...HanneS... (Gast)


Lesenswert?

Durch deine Schreibweise der Int-Vektortabelle sind einige Zellen nicht
definiert. Es ist gut möglich, dass der Simulator da was Anderes
vermutet als in der Realität der Fall ist. Deshalb die andere
Schreibweise, da hat jede Flash-Zelle ihren fest definierten Inhalt.

...

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
Noch kein Account? Hier anmelden.