Forum: Mikrocontroller und Digitale Elektronik Tiny26 und AD-Wandlung - ich verzweifle


von Michael Scherner (Gast)


Lesenswert?

Hallo Forengemeinde!

Ich verzweifle gerade an einem eigentlich recht einfachen Quelltext, der 
im Controller einfach nicht das macht, was er soll!

Ich möchte einfach die Batteriespannung meines Systems messen und 
abhängig von der Höhe Ausgänge ein- bzw. ausschalten.
Wenn ich das im Simulator probiere funktioniert es auch, aber wenn ichs 
auf den Controller übertrage dann nicht.
Es scheint mir, als wäre mit der Initialisierung des ADC was nicht in 
Ordnung - aber was?



.include  "C:\Programme\Atmel\AVR 
Tools\AvrAssembler2\Appnotes\tn26def.inc"


ldi  r16,  ramend
out  SP,  r16

;Ein-/Ausgänge definieren
ldi  r16,  255
out  DDRB,  r16      ;PortB als Ausgang
sbi  DDRA,  7      ;PortA, Bit 7 als Ausgang
sbi  DDRA,  2      ;PortA, Bit 2 als Ausgang

;_____________________________________Definitionen

.def  temp    =  r16
.def  T      =  r17
.def  U_BATTL    =  r18
.def  U_BATTH    =  r19


.equ  LEDs    =  PortB
.equ  rot      =  3

;______________________________________Initialisierung

;ADC initialisieren
ldi  temp,  0b00100000
out  ADMUX,  temp
ldi  temp,  0b01010000
out  ADCSR,  temp
sbi  ADCSR,  ADEN


;______________________________________Hauptprogramm

rcall  Leuchte_einschalten
;rcall  Pause_1s

Start:

sbi    ADCSR,  ADSC
wait_for_ADC:
sbic  ADCSR,  ADSC
rjmp  wait_for_ADC
in    U_BATTL,  ADCL
in    U_BATTH,  ADCH
nop

cpi    U_BattH,  92
brlo  Unter1_8V
nop

cpi    U_BattH,  97
brlo  Unter1_9V
nop

cpi    U_BattH,  107
brlo  Unter2_1V
nop

cpi    U_BattH,  112
brlo  Unter2_2V
nop

;rcall  Leuchte_einschalten
rjmp  fertig




Unter1_8V:
cbi    PortA,  7
cbi    PortB,  6
cbi    PortB,  5
cbi    PortB,  4
sbi    PortB,  3
sbi    PortB,  2
cbi    PortB,  1
cbi    PortB,  0
rjmp  fertig

Unter1_9V:
cbi    PortA,  7
cbi    PortB,  6
cbi    PortB,  5
sbi    PortB,  4
sbi    PortB,  3
sbi    PortB,  2
sbi    PortB,  1
cbi    PortB,  0
rjmp  fertig

Unter2_1V:
cbi    PortA,  7
cbi    PortB,  6
sbi    PortB,  5
sbi    PortB,  4
sbi    PortB,  3
sbi    PortB,  2
sbi    PortB,  1
sbi    PortB,  0
rjmp  fertig

Unter2_2V:
cbi    PortA,  7
sbi    PortB,  6
sbi    PortB,  5
sbi    PortB,  4
sbi    PortB,  3
sbi    PortB,  2
sbi    PortB,  1
sbi    PortB,  0
rjmp  fertig

fertig:
;rcall  Pause_100ms
rjmp  Start








;_____________________________________Unterprogramme


Pause_1ms:
;1ms bei 1MHz Frequenz
push  temp
ldi    temp,  199
Pause_1ms_weiter:
dec    temp
cpi    temp,  0
breq  Pause_1ms_Ende
rjmp  Pause_1ms_weiter
Pause_1ms_Ende:
pop  temp
nop
ret

Pause_10ms:
rcall  Pause_1ms
rcall  Pause_1ms
rcall  Pause_1ms
rcall  Pause_1ms
rcall  Pause_1ms
rcall  Pause_1ms
rcall  Pause_1ms
rcall  Pause_1ms
rcall  Pause_1ms
rcall  Pause_1ms
ret

Pause_100ms:
rcall  Pause_10ms
rcall  Pause_10ms
rcall  Pause_10ms
rcall  Pause_10ms
rcall  Pause_10ms
rcall  Pause_10ms
rcall  Pause_10ms
rcall  Pause_10ms
rcall  Pause_10ms
rcall  Pause_10ms
ret

Pause_1s:
rcall  Pause_100ms
rcall  Pause_100ms
rcall  Pause_100ms
rcall  Pause_100ms
rcall  Pause_100ms
rcall  Pause_100ms
rcall  Pause_100ms
rcall  Pause_100ms
rcall  Pause_100ms
rcall  Pause_100ms
ret

;Leuchte einschalten
Leuchte_einschalten:
ldi  r16  ,  255
out  PortB,  r16      ;Leuchte einschalten
sbi  PortA,  7      ;Leuchte einschalten
ret


;Leuchte ausschalten
Leuchte_ausschalten:
ldi  r16  ,  0
out  PortB,  r16      ;Leuchte einschalten
cbi  PortA,  7      ;Leuchte einschalten



Schon jetzt besten Dank und viele Grüße

Michael

von Karl H. (kbuchegg)


Lesenswert?

Michael Scherner schrieb:

> Wenn ich das im Simulator probiere funktioniert es auch, aber wenn ichs
> auf den Controller übertrage dann nicht.

Spitzen Fehlerbeschreibung.
Da weiß man gleich worauf man sein Augenmerk richten soll :-)

> Es scheint mir, als wäre mit der Initialisierung des ADC was nicht in
> Ordnung - aber was?

Woraus schliesst du das?


> ;ADC initialisieren
> ldi  temp,  0b00100000
> out  ADMUX,  temp
> ldi  temp,  0b01010000
> out  ADCSR,  temp

Ne. Das tu ich mir jetzt nicht an, wieder mal bei Atmel das Datenblatt 
zum Prozessor zu suchen um rauszufinden, was du da alles aktivierst.

von Karl H. (kbuchegg)


Lesenswert?

Ich würde mir hier

sbi    ADCSR,  ADSC
wait_for_ADC:
sbic  ADCSR,  ADSC
rjmp  wait_for_ADC
in    U_BATTL,  ADCL
in    U_BATTH,  ADCH
nop

ganz einfach mal den eingelesenen Wert in U_BATTH plain vanilla, so wie 
er ist, auf einen Port rauslegen und dann mit dem Multimeter (oder ein 
paar LED) dekodieren, was der ADC überhaupt gemessen hat.

von Karl H. (kbuchegg)


Lesenswert?

Unter2_1V:
cbi    PortA,  7
cbi    PortB,  6
sbi    PortB,  5
sbi    PortB,  4
sbi    PortB,  3
sbi    PortB,  2
sbi    PortB,  1
sbi    PortB,  0
rjmp  fertig


noch komplizierter und fehlerträchtiger konntest du das nicht schreiben? 
:-)

von Michael Scherner (Gast)


Lesenswert?

Hallo nochmal!

Zunächst ein großes Dankeschön für deine Hilfe!

Hab den Fehler gefunden! Software war OK... aber ich hab die Schaltung 
mit Krokodilklemmen ans Netzteil angeschlossen und die hatten so nen 
hohen Übergangswiderstand, dass da folglich auch ne Menge Spannung 
abfiel...


Nunja, so kanns gehen ;-)

Wie gesagt: vielen Dank!


Gruß

Michael

von bix (Gast)


Lesenswert?

Michael Scherner schrieb:
> Pause_1s:
> rcall  Pause_100ms
> rcall  Pause_100ms
> rcall  Pause_100ms
> rcall  Pause_100ms
> rcall  Pause_100ms
> rcall  Pause_100ms
> rcall  Pause_100ms
> rcall  Pause_100ms
> rcall  Pause_100ms
> rcall  Pause_100ms
> ret

Ein kleiner Tipp:
folgendes kleine BASIC-Programm erzeugt Dir ein Unterprogramm für eine 
Minute warten:

print "Pause_1min:"
for i=1 to 60
 print "rcall Pause_1s"
next i
print "ret"

Das Ergebnis musst Du nur kopieren und in Deinen Quelltext einfügen.

lol.

Das "Quell" in Quelltext kommt übrigens von "quellen". ;-)

von spess53 (Gast)


Lesenswert?

Hi

>Das Ergebnis musst Du nur kopieren und in Deinen Quelltext einfügen.

Weder das eine noch das andere ist für sinnvolle µC-Programmierung 
sinnvoll. Oder mal anders herum: Was würdest du zu einem PC-Programm 
sagen, das bei jedem Tastendruck den Rechner erst mal für eine Sekunde 
total blockiert.

MfG Spess

von Hannes L. (hannes)


Lesenswert?

> Weder das eine noch das andere ist für sinnvolle µC-Programmierung
> sinnvoll.

Zumal man für solch lange Verzögerungen einen Timer bemüht. Dies hat 
noch den Nebeneffekt, dass der MC in der Wartezeit andere Jobs erledigen 
kann.

Dies ist aber hier schon so oft angesprochen worden, dass ich da langsam 
keine Lust mehr drauf habe.

...

von spess53 (Gast)


Lesenswert?

Hi

>Dies ist aber hier schon so oft angesprochen worden, dass ich da langsam
>keine Lust mehr drauf habe.

Kann ich nachvollziehen. Wer so etwas empfiehlt gehört an eine virtuelle 
Wand gestellt werden und mit virtuellen Wattebällchen beworfen werden 
oder wenigsten ein Bit vom jedem Byte auf das er zugreift sollte 
schreibgeschützt sein.

MfG Spess

von Hannes L. (hannes)


Lesenswert?

Genau...

...

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.