www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit ADCs bei ATTINY 25


Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe ein kleines Problem mit nem ATTINY25 und dessen ADCs.

An ADC1 (PB2) ist ein Poti angeschlossen. Gemessen werden soll hier die 
Batteriespannung die durch das Poti Werte zwischen 0V und 5V erreichen 
kann (das Poti Dient als Spannungsteiler und zum Justieren! 
Batteriespannung = 18V) Der Batteriestand wird angezeigt mittels roter 
LED (an PB0) und grüner LED (an PB1).

An ADC3 (PB3) hängt ebenfalls ein Poti. Hier liegen ebenfalls Spannungen 
zwischen 0V und 5V (5V sind die gleichen wie Vcc vom ATTINY) an. 
Hierüber soll die Poti-Stellung ermittelt werden und in eine 
Software-PWM umgewandelt werden (noch nicht im Code!). Mit der PWM 
sollen mittels FET LED-Streifen gedimmt werden.

Jetzt habe ich das Problem das das Poti an ADC3 die Werte von ADC1 
beeinflusst. Das äußert sich so, dass ein verändern von dem Poti, 
welches zum dimmen der LED-Streifen gedacht ist bei einem Schwellwert 
auch die LEDs der Batterieanzeige beeinflusst! Trotzdem funktioniert das 
Auslesen bei ADC3 und er Schaltet die LEDs beim Schwellwert (hier im 
Programm 0x50) ein.

Aber NUR wenn ich im Code beide ADCs anspreche. Lese ich nur ADC1 (der 
komplette Code für ADC3 ist gelöscht) aus kann ich das Dimm-Poti an ADC3 
bewegen wie ich will nix passiert! Erst das ändern der Batteriespannung 
führt zum unschalten der LED von Rot auf Grün und umgekehrt. So wie es 
sein soll.

Die Schaltung selbst ist ok und ob der LED-Streifen Leuchtet oder nicht 
ändert nichts am Ergebniss... Also schließe ich die Last als Störfaktor 
auch aus. Es kann eigentlich nur noch an der Software liegen.

Ich würde euch bitten mal einen Block drüber zu werfen. Bitte nicht 
sagen "das hätte man auch anders/effizienter Lösen können" mir geht hier 
im Moment nur um den oben beschriebenen Fehler!

Das hier ist bisher nur Testcode. Der Rest kommt später!

.def temp = r16          ;Definiert Registernamen
.def counter = r17
.def battery = r18
.def PWM = r19
.def PWM_value = r20

rjmp skip_interrupts;0x0000
nop          ;0x0001
nop          ;0x0002
nop          ;0x0003
nop          ;0x0004
nop          ;0x0005
nop          ;0x0006
nop          ;0x0007
nop          ;0x0008
nop          ;0x0009
rjmp timer      ;0x000A wird später benötigt!
nop          ;0x000B
nop          ;0x000C
nop          ;0x000D
nop          ;0x000E

skip_interrupts:

ldi temp,0xD0
out SPL,temp

ldi temp,(1<<ACD)              ; Schaltet Analogen Comperator aus
out ACSR,temp


ldi temp,(1<<DDB0) | (1<<DDB1) | (1<<DDB4)   ; Konfiguriert PortB,0 PortB,1 und PortB,4 als Ausgang
out DDRB,temp
        
ldi temp,(1<<CS00) | (0<<CS01) | (1<<CS02)  ;\
out TCCR0B,temp                             ; |  
                                            ; |
ldi temp,(1<<OCIE0A)                        ; |
out TIMSK,temp                              ;  \
                                            ;   - Counter wird erst später benötigt!
ldi temp,0x9C   ; = 156 Dez                 ;  /
out OCR0A,temp                              ; |
                                            ; |
clr temp                                    ; |
out TCNT0,temp                              ;/

rjmp start                  ; überspringe Counter-Interrupt

timer:                    ;\
                          ; |
clr temp                  ;  \ Counter-Interrupt Routine
out TCNT0,temp            ;  / Wird erst später benötigt!
                          ; |
reti                      ;/

start:                    ; hier beginnt das eigentliche Programm

cli                       ; Interrupts deaktieren da noch nicht gebraucht!

;--------------------------------------------------------------------------------------------
;Software - PWM Routine
; 
; - ADC3 (1<<MUX0) | (1<<MUX1)
; - Voltage Reference = Vcc => (0<<REFS0) | (0<<REFS1)
; - ADC Left Adjust Result => (1<<ADLAR)
;--------------------------------------------------------------------------------------------

PWM_request:

  ldi temp,(1<<MUX0) | (1<<MUX1) | (1<<ADLAR)  ; konfiguriert ADC
  out ADMUX,temp
  ldi temp,(1<<ADEN) | (1<<ADSC)        ; Startet Single Conversation
  out ADCSRA,temp

  PWM_wait:                  ; Warteschleife bis ADC fertig ist

    in temp,ADCSRA
    andi temp,0x10
    cpi temp,0x10              ; Prüfe ob ADIF Bit = 1
    brne PWM_wait              ; wenn nein nochma, wenn ja weiter

    in PWM_value,ADCH            ; Lese High-Wert ins PWM_value Register

    ldi temp,(1<<ADIF)            ; Resette ADIF Bit
    out ADCSRA,temp

    cpi PWM_value,0x50            ; Nur Test!!!
    brsh LEDs_on              ; Wenn Wert gleich oder größer 0x50 schalte LEDs ein
                    
    cbi PortB,4                ; Ansonsten schalte LEDs aus wenn Wert kleiner 0x50

    rjmp end_PWM            

    LEDs_on:

      sbi PortB,4              ; hier werden LEDs eingeschaltet!

end_PWM:

;--------------------------------------------------------------------------------------------
;Batterieprüfung
;
; - ADC1 (1<<MUX0)
; - Voltage Reference = Vcc => (0<<REFS0) | (0<<REFS1)
; - ADC Left Adjust Result => (1<<ADLAR)
;--------------------------------------------------------------------------------------------

batterycheck:

  ldi temp,(1<<MUX0) | (1<<ADLAR)        ; konfiguriert ADC
  out ADMUX,temp
  ldi temp,(1<<ADEN) | (1<<ADSC)        ; startet Single Conversation
  out ADCSRA,temp

  wait_bat:                  ; Wartet bis ADC fertig

    in temp,ADCSRA
    andi temp,0x10
    cpi temp,0x10              ; Prüfe ob ADIF Bit = 1
    brne wait_bat              ; wenn nein nochmal ansonsten weiter

    in battery,ADCH              ; liest den HIGH-Wert ins battery Register ein

    ldi temp,(1<<ADIF)            ; Resettet ADIF-Bit
    out ADCSRA,temp

    cpi battery,0x50            ; Nur Testwert!
    brsh green                ; Wenn Wert gleich oder größer 0x50 dann grüne LED
    cpi battery,0x50
    brlo red                ; Wenn Wert kleiner gleich 0x50 dann rote LED
    rjmp end_bat

    red:                  ; Schaltet grüne LED aus und rote LED ein

      cbi PortB,1
      sbi PortB,0
      rjmp end_bat

    green:                  ; Schaltet rote LED aus und grüne LED ein

      sbi PortB,1
      cbi PortB,0

end_bat:

  rjmp start                  ; starte Programm neu!

Ich hoffe ihr könnt mir helfen, ich verzweifel hier langsam :-(

Autor: Klaus De lisson (kolisson)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mir würde sich ersteinmal die Frage stellen, wie hochohmig deine Potis
denn so sind, da es bei fehlerhafter Eingangsbeschaltung von ADC
zu gegenseitigen Beeinflussungen kommen kann.

Gruss Klaus

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Ich sehe keine Einstellungen für den ADC-Prescaler.

MfG Spess

Autor: Knut (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die erste Messung einer Wandlung liefert keine richtigen Werte.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>die erste Messung einer Wandlung liefert keine richtigen Werte.

Eine 'Wandlung' ist eine Messung. Wenn man deinen Satz darauf 
anwendet dürfte der ADC überhaupt keine richtigen Ergebnisse liefern.

Der erste gemessene Wert nach Ein-/Umstellung der 
Referenzspannungsquelle ist mit Vorsicht zu genießen. Ob das im 
Einzelfall überhaupt eine Rolle spielt, steht auf einem anderen Blatt.

MfG Spess

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@spess53:

Der Division Factor ist 2 da die Bits ADPS0, ADPS1 und ADPS2 jeweils 0 
sind. Er misst ja auch, das ist nicht das Problem die zum generellen 
laufen zu bekommen. Alleine für sich funktionieren die Wunderbar nur 
zusammen nicht!

@Klaus de lisson:

an ADC1 zur Messung der Batteriespannung hängt ein 100k Präzissionspoti 
zwischen der Batteriespannung ca. 18V und GND. Eingestellt ist es im 
Moment so das ich bei 20V Batteriespannung 5V am ADC1 habe. An ADC3 
hängt ein 10k Faderpoti. zwischen 5V und GND. Die 5V sind die gleichen 
vom Spannungsregler an denen auch der Atmel hängt.
Abgegriffen wird bei beiden Potis jeweils über den Mittelkontakt.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Er misst ja auch, das ist nicht das Problem die zum generellen
>laufen zu bekommen. Alleine für sich funktionieren die Wunderbar nur
>zusammen nicht!

Wenn du meinst.

MfG Spess

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich habe die Initialisierung der ADCs nochmal wie folgt verändert:

ADC1:
ldi temp,(1<<MUX0) | (1<<ADLAR)        ; konfiguriert ADC
out ADMUX,temp
ldi temp,(1<<ADEN) | (1<<ADSC)   | (0<<ADPS0) | (0<<ADPS1) | (0<<ADPS2)   ; startet Single Conversation
out ADCSRA,temp


ADC3:
ldi temp,(1<<MUX0) | (1<<MUX1) | (1<<ADLAR)  ; konfiguriert ADC
out ADMUX,temp
ldi temp,(1<<ADEN) | (1<<ADSC) | (0<<ADPS0) | (0<<ADPS1) | (0<<ADPS2)  ; Startet Single Conversation
out ADCSRA,temp

Also den Prescaler fest auf 2 gesetzt, das Ergebnis ist das gleiche wie 
zuvor. Oder meintest du er sollte höher gesetzt werden?!

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

> Oder meintest du er sollte höher gesetzt werden?!

Ja. Das Problem ist nicht die eigentliche Wandlung. Aber beim Umschalten 
der Kanäle muss auch der Sample&Hold-Kondensator umgeladen werden. Und 
das geht nicht unendlich schnell. Je kürzer die Zeit ist, um so mehr 
beeinflussen sich die Kanäle.

Du hast auch nicht die Frage
Beitrag "Re: Problem mit ADCs bei ATTINY 25"
beantwortet.

>| (0<<ADPS0) | (0<<ADPS1) | (0<<ADPS2)

Ist unsinnig:  X | 0 ist immer X

MfG Spess

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Du hast auch nicht die Frage
> Beitrag "Re: Problem mit ADCs bei ATTINY 25"
> beantwortet.
>
>>| (0<<ADPS0) | (0<<ADPS1) | (0<<ADPS2)
>
> Ist unsinnig:  X | 0 ist immer X
>
> MfG Spess

Hallo,

doch die Frage von Klaus de lisson habe ich heute morgen in meinem 
ersten Post beantowrtet.

Du hattest recht, mit Division Factor 8 läufts. Vielen Dank!

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.