www.mikrocontroller.net

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


Autor: Michael Scherner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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? 
:-)

Autor: Michael Scherner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: bix (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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". ;-)

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau...

...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.