Tiny26 und AD-Wandlung - ich verzweifle

Gast #1564742
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
#1564771
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.
#1564773
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.
Gast #1566150
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
Gast #1566209
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". ;-)
Gast #1566238
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
#1566315
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.

...
Gast #1566337
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren