Forum: Mikrocontroller und Digitale Elektronik analog digital wandler


von Christian D. (Gast)


Lesenswert?

habe ein myavr board mit analog digital wandler jedoch weis ich nicht
wie ich die input ports für den  a/d wandler festlege, oder wandelt der
alle anliegenden ports um?

von J. Ustiz (Gast)


Lesenswert?

rtfm

von Christian D. (Gast)


Lesenswert?

hm komm mit der manual nich weiter.....

von Sven F. (skfink)


Lesenswert?

schau mal im gcc artikel nach dem admux register

von johnny.m (Gast)


Lesenswert?

Hallo

Im Manual steht wirklich ALLES zum Thema drin. Weiß natürlich nicht,
WARUM Du mit dem Manual nicht weiterkommst. Ein gaaanz kleiner Tip:
Dem Register ADMUX ein wenig Aufmerksamkeit schenken. Und: die
benötigten Analog-Eingänge als Eingänge ohne Pull-Ups (tri-stated)
programmieren.

Gruß

Johnny

von Christian D. (Gast)


Lesenswert?

ich nehme mal an du meinst das hier:

Bit´s 3-0 - MUX3:0: Konverter-Kanal Wahl
Der Wert dieser Bits bestimmt welcher Eingang mit dem ADC verbunden
ist.

MUX 3 - 0 Eingabe
0000 ADC - Kanal 0
0001 ADC - Kanal 1
0010 ADC - Kanal 2
0011 ADC - Kanal 3
0100 ADC - Kanal 4
0101 ADC - Kanal 5
0111 ADC - Kanal 6
1000 ADC - Kanal 7
1001
1010
1011
1100
1101
1110
1111 1.23V (VBG)
  0 V (GND)

was ich daran nicht verstehe ist was die kanäle sind, und wie ich die
z.b. mit PortB Pin 1 verbinde, das der wert  eines sensor z.b. von
portb pin 1 von analog in digital umgewandelt wird

von johnny.m (Gast)


Lesenswert?

Die ADC-Eingänge liegen an Port A.

von Dennis Strehl (Gast)


Lesenswert?

Schau mal ganz am Anfang des Datenblatts, da wird die Pinbelegung
gezeigt. Ein Port ist durchnummeriert von ADC0 - ADCn (je nachdem wie
viele ADC-Kanäle dein Controller hat. Beim AtMega48 ist es z.b. der
Port C. Das sind die einzigen Pins mit denen man analoge Spannungen
messen kann. Die Zuordnungen sollten selbsterklärend sein.

von johnny.m (Gast)


Lesenswert?

War auf dem myAVR-Board nicht ein Mega8 drauf? Dann sind die
ADC-Eingänge auf Port C!

von johnny.m (Gast)


Lesenswert?

Ach ja, wenn Du mit dem Manual nicht klarkommst: Auf dieser Seite gibts
ein Tutorial, in dem soweit ich mich erinnere auch über den ADC auch
was drinsteht. Vielleicht solltest Du Dir das mal durchlesen, bevor
Du hier fragst...

von Christian D. (Gast)


Lesenswert?

ok danke,

von Christian D. (Gast)


Lesenswert?

so habe nun ein programm geschrieben mit dem ich einen ntc auslesen
kann, mit dem analog digital wandler jedoch stimmt irgendwas mit den
messwerten nicht, was mache ich falsch?

.include  "AVR.H"

  rjmp  main

;Start, Power ON, Reset
main:  ldi  r16,hi8(RAMEND)
  out  SPH,r16
  ldi  r16,lo8(RAMEND)  ;Stack Initialisierung
  out  SPL,r16
  sbi  DDRB,0
  sbi  UCSRB,3  ;USR=UCSRB=0x0A TXEN=Bit3 TX aktivieren
  ldi  r16,3686400/(9600*16)-1  ;Baudrate 9600 einstellen
  out  UBRRL,r16

  ;ADMUX Einstellungen
  sbi  ADMUX,0b00000000  ;wähle PORTC Pin 0 als ADC Input
  sbi  ADMUX,0b00000000
  sbi  ADMUX,0b00000000
  sbi  ADMUX,0b00000000

  sbi  ADMUX,0b00000101  ;setze ADLAR
  sbi  ADMUX,0b00000001  ;setze REFSO
  sbi  ADMUX,0b00000001  ;setze REFS1

;-----------------------------------
  sei
;------------------------------------

mainloop:  wdr
  sbi  ADCSRA,0b00000111  ;Bit 7 - ADEN: ADC Ein
  sbi  ADCSRA,0b00000110  ;Bit 6 - ADSC: ADC starte Konvertierung

  rcall  adcready

  ldi  r16,'A'
  rcall  putChar
  ldi  r16,'V'
  rcall  putChar
  ldi  r16,'R'
  rcall  putChar
  ldi  r16,':'
  rcall  putChar
  ldi  r16,ADCL
  rcall  putChar
  ldi  r16,ADCH
  rcall  putChar

  cbi  ADCSRA,0b00000110  ;ADSC: ADC Beende Konvertierung
  cbi  ADCSRA,0b00000111  ;Bit 7 - ADEN: ADC Aus

  rjmp  mainloop

adcready:  sbis  ADCSRA,0b00000100  ;wenn ADC Konvertierung fertig >> 
LED
an und weitermachen
  rjmp  adcready
  ldi  r16,0b11111111  ;PORTB Alle Pins auf Ausgang
  out  DDRB,r16
  sbi  PORTB,1  ;PORTB Pin 1 ON (LED)
  ret

;----------------------------------------------------------------------- 
-
; UP: putChar, Zeichen per UART senden
; PE: r16, Zeichen
putChar:  sbis  UCSRA,5  ;USR Bit5 =  UDRC
  rjmp  putChar  ;warten, bis UDR bereit
  out  UDR,r16
  ret    ;zurück zum Hauptprogramm
;----------------------------------------------------------------------- 
-

von johnny.m (Gast)


Lesenswert?

Es muss heißen

in r16, ADCL
...
in r16, ADCH

ldi heißt load immediate. Der Assembler behandelt ADCx als Konstante,
was darin resultieren dürfte, dass jedes mal die Adresse der beiden
Register ausgegeben wird.

Gruß

Johnny

von johnny.m (Gast)


Lesenswert?

Ach übrigens: Warum schreibst Du die Bitnummern beim cbi- und beim
sbis-Befehl in Binärschreibweise? Macht eigentlich nur dann Sinn, wenn
Du ein Roboter bist, der nur 'Binär' spricht:-)
Spaß beiseite: Der AVRStudio-Assembler versteht auch 'Dezimal'. Also
der Übersichtlichkeit halber besser '7' anstatt '0b00000111'
schreiben. Beim sbi unten hast Du es doch so gemacht.
Außerdem: Warum löschst Du das ADSC-Bit? Das geschieht automatisch,
wenn die Wandlung abgeschlossen ist.
Fällt mir auch gerade auf: Wenn Du Bit 0 in ADMUX setzt, dann ist
PortC.1 der ausgewählte Kanal!!! Bitte lies Dir die Befehlsdefinitionen
genauer durch! Mit 'sbi ADMUX, 0b00000000' wird das Bit Nr. 0 in ADMUX
gesetzt! Außerdem reicht es, wenn Du eine Instruktion einmal machst.
Der µC ist sicher nicht so schwer von Begriff, dass Du ihm gleich
viermal sagen musst, dass er ein bestimmtes Bit setzen soll...

von Christian D. (Gast)


Lesenswert?

ok danke für die hilfe, hier der verbesserte quellcode:

.include  "AVR.H"

  rjmp  main

;Start, Power ON, Reset
main:  ldi  r16,hi8(RAMEND)
  out  SPH,r16
  ldi  r16,lo8(RAMEND)  ;Stack Initialisierung
  out  SPL,r16
  sbi  DDRB,0
  sbi  UCSRB,3  ;USR=UCSRB=0x0A TXEN=Bit3 TX aktivieren
  ldi  r16,3686400/(9600*16)-1  ;Baudrate 9600 einstellen
  out  UBRRL,r16

  ;ADMUX Einstellungen

  sbi    ADMUX,0b00000000    ;wähle PORTC Pin 1 als ADC Input
  sbi  ADMUX,0b00000101  ;setze ADLAR
  sbi  ADMUX,0b00000110  ;setze REFSO
  sbi  ADMUX,0b00000111  ;setze REFS1

;-----------------------------------
  sei
;------------------------------------

mainloop:  wdr
  sbi  ADCSRA,0b00000111  ;Bit 7 - ADEN: ADC Ein
  sbi  ADCSRA,0b00000110  ;Bit 6 - ADSC: ADC starte Konvertierung

  rcall  adcready

  ldi  r16,'A'
  rcall  putChar
  ldi  r16,'V'
  rcall  putChar
  ldi  r16,'R'
  rcall  putChar
  ldi  r16,':'
  rcall  putChar
  in  r16,ADCL
  rcall  putChar
  in  r16,ADCH
  rcall  putChar

  rjmp  mainloop

adcready:  sbis  ADCSRA,0b00000100  ;wenn ADC Konvertierung fertig >> 
LED
an und weitermachen
  rjmp  adcready
  ldi  r16,0b11111111  ;PORTB Alle Pins auf Ausgang
  out  DDRB,r16
  sbi  PORTB,1  ;PORTB Pin 1 ON (LED)
  ret

;----------------------------------------------------------------------- 
-
; UP: putChar, Zeichen per UART senden
; PE: r16, Zeichen
putChar:  sbis  UCSRA,5  ;USR Bit5 =  UDRC
  rjmp  putChar  ;warten, bis UDR bereit
  out  UDR,r16
  ret    ;zurück zum Hauptprogramm
;----------------------------------------------------------------------- 
-

von johnny.m (Gast)


Lesenswert?

...Und? Funktionierts jetzt? Hast aber immer noch die üblen
Binärausdrücke bei sbi drin (außer ganz unten). Biste etwa doch ein
Roboter:-? Wenn Du das direkt in Dezimal schreibst, brauchste das nicht
im Kommentar zu machen...

Gruß

Johnny

von Karl H. (kbuchegg)


Lesenswert?

> sbi  ADMUX,0b00000101  ;setze ADLAR

Besser

  sbi  ADMUX, ( 1 << ADLAR )

Dann wird der Code selbsterklaerend und Du kannst Dir den
Kommentar sparen.

>  in  r16,ADCL
>  rcall  putChar
>  in  r16,ADCH
>  rcall  putChar

So wird das nichts. Du musst die Zahl die sich aus ADCL + ADCH
ergibt in eine textuelle Form bringen. Danach wird dieser
Text Zeichen fuer Zeichen uebertragen.

von Karl H. (kbuchegg)


Lesenswert?

> Du musst die Zahl die sich aus ADCL + ADCH
> ergibt in eine textuelle Form bringen

Studier mal:

http://www.mikrocontroller.net/forum/read-1-326598.html#326631

von andi (Gast)


Lesenswert?

Hallo,entschuldigt bitte dass ich den alten Thread wieder ausgrabe,
aber ich bin mit der googel-suchs auf das gestossen.
Mein Problem ist,ich will beim Attiny13 im ADMUX-Register,z.B. den bit 
für ADLAR,also Bit 5 Setzen.
Wie ich weiter oben im Thread am Quellcode sehe,wird dieser direkt im 
ADMUX-Register gesetzt,
also ohne den Umweg,z.B. ein anderes Register mit 5 zu Laden und über 
den out-Befehl dann ins ADMUX.
Komischerweise kann ich im AVR-Studio4 sogar gleich Schreiben: sbi 
ADMUX,ADLAR und es klappt.
Und noch komischer ist,dass das mit einem Umweg über ein vorheriges 
Register und mit out,ADMUX nicht klappt.
Ich bin am Verzweifeln und versteh die Welt langsam nicht mehr.
Kann mir jemand sagen warum das in diesen Fall so einfach geht und warum 
das so ist?
Bin noch einigermassen Neuling und würde mich echt über eine 
Hilfestellung Freuen,ich komm einfach im Moment nicht weiter.
grüsse andi

von andi (Gast)


Lesenswert?

-entschuldigung vielmals,nochmal ein kleiner Nachtrag um das Problem zu 
Verdeutlichen:
Um den Pinchange-Interrupt-enable bit im Gimsk zu Aktivieren kann man 
z.B.:
ldi r16,0b00100000 (32)
out GIMSK,r16
schreiben,also Bit 5 wird durch die Wertigkeit 32 über r16 Gesetzt.
Das klappt aber beim ADLAR nicht,obwohl es auch das Bit 5 ist.(wie PCIE)
Man kann das z.B. direkt oder mit sbi ADMUX,0b00000101 ,also 5 setzen.
? hier setzt meine Logik aus...

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.