mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AD-Wandler + Portfunktionen bei Atmega8 verwenden


Autor: Philipp Putzer (putzer_philipp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Allerseits!

Ich habe gerade folgendes Problem: Ich will am Kanal 0 (PC0) des ADU 
eine Spannung einlesen. Soweit funktioniert das Ganze. Nur habe ich am 
PORTC, welchen auch der ADU verwendet, bei PC4 und PC5 zwei Relais, 
angesteuert mit zwei FET's, hängen.

Setze ich nun bei DDRC DDC4 und DDC5, also Relais als OUT, so bekomme 
ich vom Wandler total unsinnige Werte. Und das für mich seltsamste, die 
Spannung an PC0 steigt auf etwa 1,4V circa.

Kann ich eignetlich den ADU und die anderen freien I/O Pins in der 
selben Schaltung nutzen? Wenn nein, brauche ich nicht mehr lange 
Programmfehler suchen...im DB habe ich nichts treffendes gefunden

Vielen Dank!
Philipp

Autor: 2921 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PortC ? Scheint kein PC zu sein....

Autor: 2921 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die AD kanaele sollte unabhaengig sein. Welches sind den die anderen 
Funktionalitaeten am PortC ? Allenfalls bestehen Abhaengikeiten. zB muss 
ARef irgendwo sein.

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ARef und AVCC verbunden???

Autor: Philipp Putzer (putzer_philipp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also:

Avcc hängt mit einer Spule zu 10µH auf 5V, Aref ebenfalls, dazu noch ein 
100nF Ker.Kond auf Masse. Laut DB sind PC0 -> ADC0 PC1 -> ADC1 ... PC4 
-> ADC4/SDA PC5 -> ADC5/SCL

Die Relais schalten tadellos ein und aus; nur sobald es schaltet spinnt 
der ADC.

Werde nachher mal probieren das Gate vom FET vom µC zu trennen, schauen 
was dann passiert.

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Datenblatt S.202

4. If any ADC [3..0] port pins are used as digital outputs, it is 
essential that these do not switch while a conversion is in progress. 
However, using the Two-wire Interface (ADC4 and ADC5) will only affect 
the conversion on ADC4 and ADC5 and not the
other ADC channels.

Noch Fragen?

MfG Spess

Autor: Philipp Putzer (putzer_philipp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Wandlung mache ich in einem Unterprogramm.

Auszug aus dem Hauptprogramm, wo der ADU abgefragt wird:
...
if(takt==0)
{  takt=RELOAD;
   zeit_gesamt--;
   if(zeit_gesamt==0)
   {    cli();
        //PUMPE_AUS;
        //HEIZUNG_AUS;
  PORTC&=~(1<<PC4);
  PORTC&=~(1<<PC5);

  takt=RELOAD;
  hh_menue   = hh_read;
  mm_menue   = mm_read;
  ss_menue   = ss_read;
  zeit_gesamt = hh_menue*3600 + mm_menue*60 + ss_menue;
  startbit=0;
  lcd_cls();
  break;
    }

    temp_in = (int)(CONST_TEMP*ADU_ch(ANALOGIN_KANAL));   //Kanal 0

    if( (temp_in < aetztemp-HYSTERESE)&&bit_heiz==0)
    {  PORTC|=(1<<PC4);
        bit_heiz=1;
  //HEIZUNG_EIN;
    }
    if( (temp_in > aetztemp+HYSTERESE) &&bit_heiz==1)
    {  PORTC&=~(1<<PC4);
        bit_heiz=0;
  //HEIZUNG_AUS;
    }
...

Auszug aus dem UP zur Wandlung:

int ADU_ch(unsigned char mux)
{   char i;    //Indexvariable
    int result =0;  //Ergebnis

    ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1);  //Wandler
                                                   //einschalten,125kHz
    ADMUX = mux;                   //Gewünschter Kanal
    ADCSRA |= (1<<ADSC);      //Wandlung starten (single
                                                //step)
    while (ADCSRA & (1<<ADSC));      //Warten bis Wandlung
                                                //abgeschlossen
    for (i=0; i<4; i++)        //4 Wandlungen
    {  ADCSRA |= (1<<ADSC);      //Wandlung starten (single
                                                //step)
  while (ADCSRA & (1<<ADSC));          //Warten bis Wandlung
                                                //abgeschlossen
  result += ADCW;        //Ergebnisse aufsummieren
     }
     ADCSRA &= ~(1<<ADEN);      //Wandler wieder
                                                //ausschalten
     result /=4;        //Mittelwert
     return result;        //Rückgabewert
}

Habe auch schon versucht die Timer-Ints im UP zu deaktivieren und am 
Ende wieder zu aktivieren, hat aber nix gebracht.
Aber kaum kommentiere ich den Befehl zu setzten des DDRC aus, geht der 
Wandler normal, so wie er sollte!

So, jatzt gehe ich mal schnell die Gates trennen, schun wasser da sagt

grüße
philipp

Autor: Philipp Putzer (putzer_philipp)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
So, jetzt bin ich noch etwas ratloser.

Trenne ich die Gates vom µC, lasse aber den DDRC so, wie er sein sollte 
mit PC4 und 5 als OUT, so gehts.

Schalte ich nun irgendwann während der Programmlaufzeit das Gate an den 
gesetzten µC PC4 oder 5, dann geht die Spannung am Eingang des ADU 
aufwärts.

Kann es sein, dass ich vom Port zu viel Strom ziehe? dass er deswegen 
spinnt?
Anbei auch der Schaltplan, die Relais hängen aber nicht wie gezeichnet 
auf 5v sondern auf 12V

Hoffe mir kann jemand helfen, ich hab keine Idee mehr, warum das Zeug 
nicht funkt!

philipp

Autor: Rahul Der trollige (rahul)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du schon mal die Spannung an den Pins im beschalteten und im 
unbeschalteten Zustand gemessen?

Autor: Hubert Gschwandtner (huvogs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es kann sein das sich AREF verschiebt, deine GND-Leitung ungünstig liegt 
und sich dadurch das Potential verschiebt usw. Also von einem fixen 
GND-Punkt, vielleicht beim Spannungsregler, die Spannungen in beiden 
Fällen messsen.

Autor: Philipp Putzer (putzer_philipp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, habe gerade nochmals probiert, und kam zu folgendem Ergebniss:

Nehme ich 12V von einem externen Netzteil, um die Relais zu schalten, 
bleibt die Spannung am PC0 so wie sie soll.

Ursprünglich habe ich die Spannung, welche im Schaltplan mit 9V 
bezeichnet wurde als Schaltspannung fürs Relais hergenommen. Die habe 
ich gemessen, sie lag bei 13V. Die Relais brauchen 12V, also müsste das 
ja klappen

Der Trafo hat aber nur 6VA, ja ja im nachhinen hätti iach ihn auch auf 
20VA dimensioniert, desshalb wird warscheinlich die Spannung 
zusammensinken. Sinken, wohlgemerkt, weil das Teil hinter dem 
Gleichrichter im geschalteten Zustand immer noch 11,8V lieferte.

Jedenfalls werde ich jetzt sicher eine Trafo größerer Leistung und vor 
allem höherer Nennspannung einbauen; Lieber ein paar Watt an den 
Spannungsreglern verbraten, als den ganzen Tag soch dumme Fehler zu 
suchen!

So, vielen Dank nochmals an alle, jedenfalls weiß ich jetzt, dass ich 
den PORT und den ADC in der selben Schaltung verwenden kann. Ist ja 
immerhin auch was...

PS. Die Schaltung für die Konstanstromquelle ist nicht aktuell. Der 
317er hat eine Begrenzung, was den Einstell-Widerstand betrifft.

Grüße
Philipp

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.