mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ad_wandler an atmega 8


Autor: Bernhard F. (1atmel2)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hallo profis,

wollte einen einfachen ad-wandler programmieren, macht auch im studio 4 
wie ich will, aber nicht auf der platine von "roland walter".
led an portb0 pin 14, rechtes poti an adc3 pin 26.

wenn ich im simulator in adch verschiedene werte > 128 bzw <128 schreibe
und das adsc bit loesche, sieht es gut aus und er setzt auch portb, bit0
bzw loescht dasselbe.

kann jemand helfen?

Autor: Herr Mueller (herrmueller)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da die REFS1 REFS0 Bits beide 0 sind, ist eine externe Ref.Spannung am 
AREF-Pin gewählt. Falls Du da nichts angeschlossen hast, musst Du 
entweder die internen 2.54V oder VCC als Referenzspannung wählen.

zB:
    ldi temp, (1<<REFS1) | (1<<REFS0) | (0<<MUX3) |(0<<MUX2) | (1<<MUX1) 
| (1<<MUX0)  ; Kanal 3  int. ref Spannung 2,56V
    out ADMUX, temp
    ldi temp, (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0)
    out ADCSRA, temp


Gute Nacht.

Autor: Bernhard F. (1atmel2)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
erstmal danke an 'herrmüller',
jedoch funktioniert die schlatung immer noch nicht bzw hab ich was 
übersehen bzw falsch verstanden. anbei das modifizierte listing und ein 
bild des boards.

gruss bernhard.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>jedoch funktioniert die schlatung immer noch nicht bzw hab ich was
>übersehen bzw falsch verstanden.

Ja. Du musst die Einstellung für REFS1/REFS0 ändern.

MfG Spess

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Und der Teil, wo du dem ADC sagst, das er Messen soll fehlt auch.

Vielleicht solltest du mal überlegen, ob du dir nicht mal einen Monitor 
anzuschaffst, der etwas breiter als 480 Pixel ist. Dann kann muss der 
Code nicht so an der linken Seite kleben.

MfG Spess

Autor: Bernhard F. (1atmel2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo spess53,

laut datenblatt table74 habe ich beide optionen ohne erfolg probiert,

refs1=0 & refs0=1  avcc with external capacitor at aref pin

refs1=1 & refs0=1 internal 2.56 voltage ref

kondensator habe ich noch keinen dran, ich denke eine reaktion müsste 
auch ohne denselben erfolgen.

gruss bernhard.

Autor: Bernhard F. (1atmel2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo spess53,

ich denke das waere der code für die messung ?!?
wenn ich werte in das adch register schreibe und mit f11 durchtippe, 
funktioniert es auch.

zum monitor: hab leider nur ein altes laptop und mit einer kleineren 
auflösung habe ich probleme mit den augen.




sbic adcsra,adsc            ; warte bis adc fertig
rjmp warte        ; skip if bit in i/o is cleard
in r16,adch        ; lese ergebnis

mfg ernhard.

Autor: Bernhard F. (1atmel2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hall spess53,
habe das ganze jetzt mit bascom probiert, funktioniert wunderbar, hätte 
aber gerne was ähnliches in assembler. das ich noch am anfang meiner 
kariere muss ich nicht extra betonen. gibt es eine möglichkeit den code 
zu disamblieren um fehler zu erkennen ?

$regfile "m8def.dat"
$crystal = 3686400
Dim Ad As Word
Config Portb = Output
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc

Do

Ad = Getadc(0)

If Ad <= 340 Then
Portb.0 = 1 : Portb.1 = 0 : Portb.2 = 0
Elseif Ad > 340 And Ad <= 680 Then
Portb.0 = 0 : Portb.1 = 1 : Portb.2 = 0
Elseif Ad > 680 Then
Portb.0 = 0 : Portb.1 = 0 : Portb.2 = 1
End If
Loop

gruss bernhard.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Ohne ein 'sbi adcsra,adsc' zum Starten der Messung macht der ADC nichts

MfG Spess

Autor: Bernhard F. (1atmel2)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
lo,

vielen dank für deine geduld, hab das programm geändert, funktioniert
immer noch nicht schluchz.
warum funktioniert es im simulator, wenn ich das acsc-bit setze bzw 
lösche
und in das adch register werte reinschreibe ???

gruss bernhard.

Autor: Bernhard F. (1atmel2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
noch eine frage: muss das ddrc pc3(adc3) auf null (eingang) gesetzt 
werden?
mfg b

Autor: oldmax (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi
Leute, so wie dieses Programm geschrieben ist, blickt doch keiner durch. 
Versucht doch bitte etwas Struktur durch Absätze zu bekommen, das man 
das dann auch lesen kann. Hier mal ein paar Zeilen, die bei mir 
problemlos laufen.
;---------------------- Initialisieren Analogwandler ------------------ 1 * -------
;***********************************************************
;* die folgende Schreibweise ist nicht unbedingt mein Ding, aber die   *
;* Programmierer schwören darauf und weisen eine Zuweisung ala   *
;* 0bxxxxxxxx ab. Hinter REFSO,ADLAR, MUX2 und MUX0 stehen  *
;* konstante Werte, die die Bitstelle beschreiben. Ich bevorzuge     *
;* für mich einfach 0bxxxxxxxx                  *
;* Hier mal die Beschreibung der Bits im Steuerregister ADMUX     *
;*                    *
;* Bit 0- Bit 3  Kanal    Mux3 Mux2 Mux1 Mux0      *
;*        0     0    0    0  = Kanal 0    = Port C0  *
;*        0     0    0    1  = Kanal 1  = Port C1  *
;*        0     0    1    0  = Kanal 2  = Port C2  *
;*        0     0    1    1  = Kanal 3  = Port C3  *
;*        0     1    0    0  = Kanal 4  = Port C4  *
;*        0     1    0    1  = Kanal 5   = Port C5  *
;* Bit 4 n.belegt                *
;* Bit 5   Ausrichtung   0 = rechts (000000xx xxxxxxxx)     *
;*        1 = links (xxxxxxxx xx000000)    *
;* Bit 6 und 7 Auswahl Referenzspannung  Refs1  Refs0      *
;*          0      0  = externe Referenz    *
;*          0      1  = Interne Referenz AVCC  *
;*          1      0  = n.Benutzt      *
;*          1      1  = interne Referenz 2,56 V  *
;*                    *
;* und das Register mit den Bits             *
;*  Bit 0 = ADPS0  = Vorteiler 000 =2        *
;*  Bit 1 = ADPS1   = 001-111 = 2,4,8,16,32,64 und 128    *
;*  Bit 2 = ADPS2              *
;*  Bit 3 = ADIE =ADC Interrupt Enable 1 Interrupt bei ADIF  * 
;*  Bit 4 = ADIF =ADC Interrupt Flag   1 bei Ende Messung    *
;*  Bit 5 = ADFR =ADC Free Running  1 aut.Start nach Wandl.  *
;*  Bit 6 = ADSC =ADC Start Conversion 1 =Start Wandl.0=Ende  * 
;*  Bit 7 = ADEN =ADC Enable 1 = ADC ein        * 
;*                    *
;* Ergebnis 10 Bit steht in ADCH (High) und ADCL (Low)    *
;***********************************************************
Init_ADC:      ; Analogkanal initialisieren 
  ;LDI  a0, 0b01100000 ( so würd ich es schreiben...)

  ldi     a0, (1<<REFS0) | (1<<ADLAR)
  out     ADMUX, a0    
  ldi     a0, (1<<ADEN) | (1<<ADPS2) | (1<<ADPS0)   
  out     ADCSRA, a0
  
RET
;************************************************************

Soweit die Initialisierung. Nun das Lesen der Werte:
;------------ Potiwert erfassen ------------------
;****************************************************************
;* Für die Intervallzeit des Scheibenwischers wird mit einem  *
;* Analogeingang ein Potiwert eingelesen.        *
;****************************************************************
Read_Poti:  
  sbic      ADCSRA, ADSC  ; wenn der ADC fertig ist, wird dieses Bit gelöscht
  rjmp      End_Poti  
  in        Ablage, ADCL    ; immer zuerst LOW Byte lesen
  NOP
  in        Ablage, ADCH    ; danach das mittlerweile gesperrte High Byte
  STS  In_Analog, Ablage
  sbi  ADCSRA, ADSC    ; den ADC starten
End_Poti: 
      
RET
Auch wenn das noch nicht perfekt ist, doch so ein Aufbau ist natürlich 
besser zu lesen. Und das auch nach einem Jahr.
Gruß oldmax

Autor: Bernhard F. (1atmel2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mit diesem listing kann ich leider noch gar nichts anfangen. das 
datenblatt
kenne ich inzwischen, haette gerne gewusst wo der fehler liegt.


; ad wandler mit atmega 8

;.nolist
.include "m8def.inc"
.list


; led an portb, pb0 als ausgabe
; ddrb = 1

sbi ddrb,pb0

;port c3 auf eingang
cbi ddrc,pc3



;** herr müller kanal int ref spannung 2,56 v, adc0
ldi r16,(0<<refs1)|(1<<refs0)|(0<<mux3)|(0<<mux2)|(0<<mux1)|(0<<mux0)
out admux,r16

ldi r16,(1<<aden)|(1<<adfr)|(1<<adps2)|(1<<adps1)|(1<<adps0)
out adcsra,r16



convert:

sbi adcsra,adsc      ; start conversion
warte:
sbic adcsra,adsc    ; warte bis adc fertig
rjmp warte        ; skip if bit in i/o is cleard
in r16,adch        ; lese ergebnis




cpi r16,128
brlo convert_led_an

sbi portb,pb0
rjmp convert



convert_led_an:
cbi portb, pb0
rjmp convert

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

Bewertung
0 lesenswert
nicht lesenswert
Bernhard Fraunhofer schrieb:

> ldi r16,(1<<aden)|(1<<adfr)|(1<<adps2)|(1<<adps1)|(1<<adps0)
> out adcsra,r16

Du veränderst deine Konfigurationsbits schneller, als andere Leute ihre 
Unterwäsche.
Was hat auf einmal ADFR da drinnen zu suchen.
Selbst wenn die den Free Running MOdus benutzt, musst du die erste 
Messung immer noch händisch durch Setzen des ADSC starten.

> convert:
>
> sbi adcsra,adsc      ; start conversion
> warte:
> sbic adcsra,adsc    ; warte bis adc fertig

Das wirst du im Free Running Modus nicht erleben. Denn im Free Running 
ist der ADC NIEMALS fertig, weil sofort mit Abschluss einer Messung die 
nächste Messung beginnt.

> das datenblatt kenne ich inzwischen

vielleicht hilft dir das mehr:
http://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC

Und arbeite an deiner Formatierung!
Deine ist grauenhaft!
Alles an den linken Rand zu quetschen ist maximal der Versuch, 
Labelnamen im Text unergehen zu lassen.
Wenn eine einzelne Leerzeile nicht ausreicht, eine Blockstruktur zu 
erreichen, dann schaffen das mehrere Leerzeilen hintereinander auch 
nicht. Sie ziehen nur den Code in die Länge, bringen aber ansonsten 
genau 0 mehr an Übersicht.

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

Bewertung
0 lesenswert
nicht lesenswert
; ad wandler mit atmega 8

;.nolist
.include "m8def.inc"
.list

; led an portb, pb0 als ausgabe
; ddrb = 1
      sbi DDRB, PB0

;port c3 auf eingang
      cbi DDRC, PC3

      ldi r16, (0<<REFS0) | (1<<REFS1) | (1<<ADLAR) | 0   ; 0 .. ADC Kanal 0
      out ADMUX, r16

      ldi r16, (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0)
      out ADCSRA, r16

convert:
      sbi ADCSRA, ADSC      ; start conversion
warte:
      sbic ADCSRA, ADSC     ; ADC löscht ADSC wenn er fertig ist
      rjmp warte

      in r16, ADCH          ; wegen ADLAR reicht das High Byte

      cpi r16, 128          ; mindestens halbe Referenzspannung gemessen?
      brlo convert_led_an   ; Nein -> Sprung

      sbi PORTB, PB0        ; Ja -> Led aus
      rjmp convert          ; ab zur nächsten Messung

convert_led_an:
      cbi PORTB, PB0        ; Led ausschalten
      rjmp convert          ; ab zur nächsten Messung


Wenn du nur das ADCH Register benutzen willst, musst du ADLAR benutzen. 
Ansonsten kann ADCH nur die Werte 0, 1, 2 und 3 haben.

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

Bewertung
0 lesenswert
nicht lesenswert
Und wenn du das nächste mal einen LÖtkolben zur Hand nimmst, dann setz 
deine Kondensatoren tiefer! Die Beinchen werden dir bald abreissen. Ein 
paar mal unabsichtlich hin und her und schon sind sie durch. Oder du 
drückst unabsichtlich von oben auf einen der Kondensatoren und reißt 
damit von der Unterseite die Leiterbahn von der Platine weg.
Schieb sie rein, bis du sie nicht mehr weiter reinkriegst! Am besten 
soll das Gehäuse auf der Platine aufsitzen und der Kondi sich nicht mehr 
bewegen lassen.

Autor: oldmax (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Bernhard
Du scheinst etwas stur zu sein, was ich noch als geschmeichelt 
betrachte...
>mit diesem listing kann ich leider noch gar nichts anfangen.
Eigentlich wollte ich dir damit mitteilen, das es einmal die Möglichkeit 
gibt, Codezeilen auch als solche kenntlich zu machen und zum Anderen, 
das deine Schreibweise wie auch KHB feststellt, grauenhaft ist.
Es scheint dir aber völlig egal zu sein, wie deine Antworten erkennen 
lassen.
NA dann viel Spaß noch..... Ich für meinen Teil werd mich nicht durch 
solch unleserlichen Code kämpfen.
Gruß oldmax

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.