Forum: Mikrocontroller und Digitale Elektronik ADC-Input und Auswahlverfahren


von DerKatze (Gast)


Angehängte Dateien:

Lesenswert?

Hallo liebe Profis,

nun sitze ich seit Tagen an einem miniProjekt um Assembler zu lernen und 
genauer den Umgang mit Ein-/Ausgängen und dem ADC als Eingang.

Anbei sende ich den (zusammengebastelten) Quellcode.

Mein Problem:
Entweder bekomme ich keine Werte vom ADC in den r16/r17 oder dieses wird 
nicht sinnvoll ausgewertet.

Was passieren soll sollte klar sein:
Die LEDs (Grün  Gelb  Rot) sollen je nach stellung des Poti (an 
Port(Pin C0) aufleuchten.

Was tatsächlich passiert:
Das System startet und sofort ist Grün an, nach 1Sek (die eingestellte 
wait-time) wechselt es auf Rot und bleibt dort.
Umabhängig von Eingang C0.

Ja, ich bin vollkommen neu in ASM und habe bisher alles in VB oder C 
geschrieben. Dort sind mir alle Vorgänge klar, jedoch ist in ASM alles 
mit Registern und Co Neuland für mich.

Die Suche (google und hier) habe ich nun schon mehrfach genutzt und bin 
so auch zu meinem aktuellen SourceCode gekommen.

Wenn jemand bereit ist mir genauer zu erklären was ich falsch mache, 
wäre ich sehr sehr dankbar.
Bitte kommt mir nicht mit "Nutz die Suche" oder "Das findet man 
überall".
Wer Links hat, einfach Posten und über seine maßlose Überlegenheit 
freuen ;)

Besten Dank,
DerKatze =)

: Verschoben durch User
von Jobst M. (jobstens-de)


Lesenswert?

DerKatze schrieb:
> Was passieren soll sollte klar sein:
> Die LEDs (Grün  Gelb  Rot) sollen je nach stellung des Poti (an
> Port(Pin C0) aufleuchten.

Dann schmeiss doch mal alles Andere aus dem Code erst mal raus ...


Gruß

Jobst

von Stefan E. (sternst)


Lesenswert?

DerKatze schrieb:
> Entweder bekomme ich keine Werte vom ADC

Ich sehe nicht, dass überhaupt irgendwo eine Messung gestartet würde.

von Peter D. (peda)


Lesenswert?

DerKatze schrieb:
> Ja, ich bin vollkommen neu in ASM und habe bisher alles in VB oder C
> geschrieben. Dort sind mir alle Vorgänge klar, jedoch ist in ASM alles
> mit Registern und Co Neuland für mich.

Und warum willst Du dann unbedingt auf Assembler umsteigen?

C auf nem AVR ist nicht soo unterschiedlich.

Man hat kein OS und 1000 Tasks sondern nur eine Mainloop und man sollte 
nicht planlos mit Variablen um sich schmeißen, sondern überlegen, was 
man wirklich speichern muß. Und natürlich immer den kleinst möglichen 
Typ nehmen (uint8_t reicht oft).

Und Du solltest Dir erstmal eine Debugausgabe machen, z.B. über RS-232 
auf den PC. Nur mit ner LED ist sehr mühsam.

In C sähe das so aus:
1
#define STX_PORT PORTB
2
#define STX_PIN 0
3
#define BAUD 9600
4
5
void sputchar( uint8_t c )
6
{
7
  c = ~c;
8
  STX_PORT &= ~(1<<STX_BIT);            // start bit
9
  for( uint8_t i = 10; i; i-- ){        // 10 bits
10
    _delay_us( 1e6 / BAUD );            // bit duration
11
    if( c & 1 )
12
      STX_PORT &= ~(1<<STX_BIT);        // data bit 0
13
    else
14
      STX_PORT |= 1<<STX_BIT;           // data bit 1 or stop bit
15
    c >>= 1;
16
  }
17
}

Dann kannst Du Dir erstmal den ADC-Wert als Zahl ausgeben lassen.

von DerKatze (Gast)


Angehängte Dateien:

Lesenswert?

Hey xD xD...

ich muss mich entschuldigen xD

ich habe leider die völlig falsche Datei raufgeladen :(((

hier ist die Richtie =)


Trotzdem an alle 'Vielen Vielen Dank'!!!!


Eure Katz'

von spess53 (Gast)


Lesenswert?

Hi

>hier ist die Richtie =)

Und warum nicht als .asm?

MfG Spess

von spess53 (Gast)


Lesenswert?

Hi

Was soll '.include "AVR.H"? In Assembler benutzt man die m8def.inc. Und 
auch die Expessions vom Assembler, wie high, low ... .


>ldi r16,128  ;Vorteiler = ganz wichtig

Aber falsch. Sieh dir im Datenblatt an, wie das in ADCSRA eingestellt 
wird.

MfG Spess

von spess53 (Gast)


Lesenswert?

Hi

>  ldi  r16,0  ;hier kann auch direkt die 0 o.a. eingegeben werden
>  out  ADMUX,r16  ;Kanal auswählen

Und was ist an AREF?

>;Sollten nur 8 Bit = 256 Schritte notwendig sein, dann wie folgt:
>  ror  r17  ;xxxxxxxN  c=N
>  ror  r16  ;Nnnnnnnn  c=n
>  ror  r17  ;xxxxxxxx  c=N
>  ror  r16  ;NNnnnnnn  c=n

Kannst du dir sparen. Einfach ADLAR in ADMUX setzen und ADCH auslesen.

MfG Spess

von DerKatze (Gast)


Angehängte Dateien:

Lesenswert?

Hey =)

Danke schonmal!!!

Also ..

ich habe jetzt die 'm8def.inc' aktiviert und nun bringt das Programm 
folgenden Fehler:
Hinweis: Es wird die im Quelltext angegebene Sprache verwendet: 
Assembler
Hinweis: Es wurde folgender Dialekt ermittelt: atmel
Fehler: AVR Studio ist nicht installiert.
Verwenden Sie den GNU-Assembler oder installieren Sie AVR Studio.

die neue Datei habe ich (wieder als .txt da es nur als .s gespreichert 
wird / Sry dafür) angehängt und auch das DB des IC. (Andere wurden als 
.asm gespeichert; Versteh einer das Programm o,O)

Leider habe ich wirklich NULL Ahnung wie das mit den Registern geht und 
wie man diesen ADC überhaupt in Gang bekommt.
Wie schon gesagt, den Code habe ich zusammengebastelt und das aus vielen 
Quellen. Einfach (wie bei Google) Auf-Gut-Glück.

Wenn mir das jmd näher erläutern kann, bin ich extrem glücklich =)

Anbei: Eine super Sache, dieses Forum!!!

von spess53 (Gast)


Lesenswert?

Hi

>Verwenden Sie den GNU-Assembler oder installieren Sie AVR Studio.

Ich war von letzterem ausgegangen. Wenn du einen anderen Assembler 
benutzt musst du natürlich die passenden Dateien verwenden.

>Wie schon gesagt, den Code habe ich zusammengebastelt und das aus vielen
>Quellen. Einfach (wie bei Google) Auf-Gut-Glück.

Lass mal das Gurgeln. Als erstes lies das Datenblatt, lies das 
Datenblatt, lies das Datenblatt, ... .

>Leider habe ich wirklich NULL Ahnung wie das mit den Registern geht und
>wie man diesen ADC überhaupt in Gang bekommt.

Dann lies dir das

http://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC

mal durch.

MfG Spess

von DerKatze (Gast)


Angehängte Dateien:

Lesenswert?

sooo...

nochmals besten Dank.. vor allem an Spess =)

Ich habe mir deinen Link mal durchgelesen und das mit Verstand, danach 
war es soooo einfach xD .. 2min geschrieben schon lief alles perfekt =)

Anbei sende ich noch einmal den Code.

Geschrieben in myAVR Workpad plus DEMO (eine Software mit extremen 
Fehlern).

Ich habe auch Atmel Studio inzwischen, blicke da aber garnichts =(

Also dann, GUTE NACHT

Eure Katz'

von spess53 (Gast)


Lesenswert?

Hi

>Ich habe auch Atmel Studio inzwischen, blicke da aber garnichts =(

Für Assemblerprogrammierung ist das Atmel Studio unnötig. Da reicht das 
AVR Studio 4.19 vollkommen.

>Anbei sende ich noch einmal den Code.

>  ldi  r16,0b01100000  ;int. Ref  8-Bit only  Kanal C0

Mit
[avrasm]
  ldi r16,1<<REFS0|1<<ADLAR
[avrasm]
weiß man gleich, was gemeint ist.

>mainloop:  wdr

Hast du den Watchdog laufen? Wenn nicht ist das 'wdr' unnötig.

>  ;ADC Teil
>  sbi  ADCSRA,ADSC  ;AD Wandlung starten

Im Free Running Mode muss der ADC einmal mit ADSC gestartet werden. 
Also das Ganze vor mainloop

>  nop
>  nop

Wozu? Für eine Wandlung braucht der ADC bei deinem Prescaler 13*128 
Controllertakte. Was sollen da die zwei nops? Um das Ende einer Wandlung 
festzustellen kann man ADIF in ADCSRA auswerten oder gleich den ADC 
Complete-Interrupt benutzen.

>  in  r17,ADCL  ;Low-Byte unbedingt zuerst
>  in  r16,ADCH  ;High-Byte mit Daten in r16

Bei gesetztem ADLAR reicht es ADCH auszulesen.

>  cpi  r16,240
>  brsh  all  ;r16 >= 240

Kannst du auch gleich durch den Code von 'all' ersetzen.

MfG Spess

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.