Forum: Mikrocontroller und Digitale Elektronik ADC Messung auf Platine


von Sebastian (Gast)


Lesenswert?

Hallo

Ich messe momentan eine Spannung auf einem STK 500 an PORT 0 und 1 An 
Port A

Diese Messung wird auf einem LCD Display dargestellt. Dies Funkioniert 
auf dem STK 500 bestens. Nun habe ich mir eine eigene Platine gebaut, um 
auf der die Spannung zu messen.
Das Problem, es funktioniert eigentlich alles außer die ACD Messsung?
ICh habe PORT0 und PORT1 abgeklemmt
Messe ich nun Zeigt mir mein Display immer 1024 und 1023 an?
Obwohl keine Spannung anliegt. Lege ich PORT0 oder PORT1 auf Ground/5V 
ändert sich nichts an der Messung...

Alles andere ,Ports ansteuerung usw geht!


Hat jemand eine Idee?

Gruß und besten Dank im Voraus

Sebastian

von Karl H. (kbuchegg)


Lesenswert?

Hast du AVcc angeschlossen?

von Sebastian (Gast)


Lesenswert?

ja AVcc liegen 4,92V an  Ground ist auch vorhanden


was mir aufgefallen ist?

warum liegen am stk 500 an miso mosi und sck 5V an dauerthaft 5V an
Gruß

von Karl H. (kbuchegg)


Lesenswert?

Sebastian schrieb:
> ja AVcc liegen 4,92V an  Ground ist auch vorhanden

Dann zeig deine Schaltung und dein Programm.




Immer diese Ratespiele. Bei mir gehts nicht, kann wer raten was ich 
wieder falsch gemacht habe? Du gehst ja auch selber zum Arzt, damit er 
sich die Sache mal ansehen kann.

von Sebastian (Gast)


Angehängte Dateien:

Lesenswert?

Hier mal nur die Grundform von von meinem Programm
SV2 ist für das Display


1
  void ADC_Init(void)
2
  {
3
  uint16_t result;
4
  ADMUX = (REFS0);      // interne Referenzspannung nutzen */(1<<REFS1)(1<<REFS1)|
5
  ADCSRA = (1<<ADPS1) | (1<<ADPS0);     // Frequenzvorteiler
6
  ADCSRA |= (1<<ADEN);                  // ADC aktivieren
7
  ADCSRA |= (1<<ADSC);                  // eine ADC-Wandlung
8
  while (ADCSRA & (1<<ADSC) );          // auf Abschluss der Konvertierung warten
9
  result = ADCW;
10
 }
11
12
  //Messung an Kanal 0
13
  uint16_t ADC_Read( uint8_t channel )
14
  {    
15
  ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F); // Kanal waehlen, ohne andere Bits zu beeinflußen
16
  ADCSRA |= (1<<ADSC);              // ADSc wird mit 1 gestartet
17
  while (ADCSRA & (1<<ADSC) )          // auf Abschluss der Konvertierung warten
18
  return ADCW;                   // ADC auslesen und zurückgeben
19
  }
20
  
21
  //Messung an Kanal 1
22
  uint16_t ADC_Read2( uint8_t channel )
23
  {
24
  ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F); // Kanal waehlen, ohne andere Bits zu beeinflußen
25
  ADCSRA |= (1<<ADSC);              // eine Wandlung "single conversion"
26
  while (ADCSRA & (1<<ADSC) )          // auf Abschluss der Konvertierung warten    
27
  return ADCW;                    // ADC auslesen und zurückgeben
28
  }
29
30
31
  lcd_init(LCD_DISP_ON_CURSOR);  // LCD Display intialisieren
32
  ADC_Init(); // ADC intialisieren
33
34
while(1)
35
  {  
36
    //Messung an Kanal PA4 Senor Horizontal 1
37
    lcd_clrscr();  // LCD Display reseten
38
    uint16_t adcval;
39
      adcval = ADC_Read(0);// Analogwert auslesen //ADC_Read_AVG ist mit Mittelwertbildung (0,5) kanal 0
40
        char buffer3[8];
41
    itoa(adcval,buffer3,10);  
42
    lcd_gotoxy( 4, 0);
43
    lcd_puts(buffer3);  
44
    
45
    uint16_t adcval2;
46
      adcval2 = ADC_Read(1); // Analogwert auslesen //ADC_Read_AVG ist mit Mittelwertbildung (0,5) kanal 0
47
        char buffer4[8];
48
    itoa(adcval2,buffer4,10);  
49
    lcd_gotoxy( 2, 1);
50
    lcd_puts(buffer4);  
51
52
}

von Karl H. (kbuchegg)


Lesenswert?

>   ADMUX = (REFS0);

  ADMUX = (1 << REFS0);


(weiterschau. War nur das erste was mir aufgefallen ist)

von Karl H. (kbuchegg)


Lesenswert?

Da ...
>
1
>   while (ADCSRA & (1<<ADSC) )          // auf Abschluss der Konvertierung warten
2
>  return ADCW;
3
>

... fehlt ein ;
1
   ...
2
   while (ADCSRA & (1<<ADSC) )          // auf Abschluss der Konvertierung warten
3
     ;
4
5
  return ADCW;

Warum änderst du die Funktionen aus dem Tutorial ab? Die funktionieren 
genau so, wie sie veröffentlicht wurden. Ok, die Referenzspannung musst 
du nach deinen Wünschen einstellen (und zwar korrekt), aber abgesehen 
davon gibt es keinen Grund am restlichen Code rumzupfuschen.

Auch:
WElchen Sinn hat es denn, wenn du die Funktion ADC_Read duplizierst? Die 
FUnktion ist so geschrieben, dass sie an Kanal 0 misst, wenn du sie mit

   adcval = ADC_Read( 0 );

aufrufst, und dass sie an Kanal 1 misst, wenn du sie mit

   adcval2 = ADC_Read( 1 );

aufrufst. Es gibt keinen Grund, die Funktion selber zu duplizieren! Du 
teilst mit dem Argument beim Aufruf der Funktion mit, welchen Kanal sie 
messen soll, und das macht die Funktion dann auch. Wer oder was braucht 
daher die Funktion ADC_Read2. Richtig. Die braucht keiner.

von Karl H. (kbuchegg)


Lesenswert?

Immerhin hast du nicht den Fehler gemacht an ARef eine Verbindung zu Vcc 
zu machen. Das ist gut.
Aber ein 100nF Kondensator nach Masse darf es an diesem Pin schon sein 
um mitzuhelfen die Referenzspannung zu stabilisieren.

von Sebastian (Gast)


Lesenswert?

ok ok .. warum meckert der compiler nicht?

vermutlich hab ich das semikolon vergessen

das ganz tut aber nichts zur sache und ich bekommt immer noch die 1024 
auf dem lcd angezeigt und weis nicht warum  ob5V oder Ground auf den PA0 
und PA1

von Sebastian (Gast)


Lesenswert?

wieso referenzspannung`?   Der Aref ist bei mir nicht angeschlossen
die werden mir doch intern gebeben?

von Karl H. (kbuchegg)


Lesenswert?

Sebastian schrieb:
> ok ok .. warum meckert der compiler nicht?

Weil es syntaktisch immer noch korrekt ist.

 "Die Birke streicht die Kreissparkasse über dem Sonnenaufgang."

ist laut Duden auch völlig korrekt.
Und trotzdem ein sinnloser Satz.

Deinen Compiler interessiert nur, ob du die Sprachregeln eingehalten 
hast. Ob das was dann raus kommt einen Sinn ergibt oder nicht, das 
interessiert ihn nicht. Das ist dein Bier.

> vermutlich hab ich das semikolon vergessen

Nicht vermutlich.
Ganz sicher.

Oder wo in deiner Anweisung
1
>   while (ADCSRA & (1<<ADSC) )          // auf Abschluss der Konvertierung warten

ist denn der Teil 'warten' zu finden?


> das ganz tut aber nichts zur sache
Na, wenn du meinst, dann eben nicht.

von Karl H. (kbuchegg)


Lesenswert?

Sebastian schrieb:
> wieso referenzspannung`?   Der Aref ist bei mir nicht angeschlossen
> die werden mir doch intern gebeben?

Und was sagt das Datenblatt (sprich ATmel dazu)?
Die sagen, dass du als Mindestvorkehrung zumindest einen 100nF 
Kondensator nach Masse anschliessen sollst.

von Sebastian (Gast)


Lesenswert?

naja diesen kondensator hab ich mal drangehängt... geht aber weiterhin

naja mit deine warten anweisung.. versteht ich jezt gerade nicht so ganz

auf dem stk 500 schwanken ja die werte je nach anliegender spannung
und auf meinem board sinds nur 1024

von Karl H. (kbuchegg)


Lesenswert?

Sebastian schrieb:
> naja diesen kondensator hab ich mal drangehängt... geht aber weiterhin
>
> naja mit deine warten anweisung.. versteht ich jezt gerade nicht so ganz
>

du hast 2 Fehler


Den hier

>   ADMUX = (REFS0);
  ADMUX = (1 << REFS0);


und den hier

>   while (ADCSRA & (1<<ADSC) )          // auf Abschluss der
>  return ADCW;
>

   while (ADCSRA & (1<<ADSC) )          // auf Abschluss der
     ;

  return ADCW;



korrigiere BEIDE!

von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Sebastian schrieb:
>> wieso referenzspannung`?   Der Aref ist bei mir nicht angeschlossen
>> die werden mir doch intern gebeben?
>
> Und was sagt das Datenblatt (sprich ATmel dazu)?
> Die sagen, dass du als Mindestvorkehrung zumindest einen 100nF
> Kondensator nach Masse anschliessen sollst.

Lustig

Datenblatt Seite 217

REFS0 alleine gesetzt bedeutet "AVCC with external capacitor at AREF 
pin". :-)

von Ingo (Gast)


Lesenswert?

Mir ist etwas schleierhaft, wie ein 10Bit ADC, 1024(!) anzeigen kann...

von Sebastian (Gast)


Lesenswert?

ok ist geändert   hab die beiden pins jez mal in die luft gehängt,,, 
aber wieder diese scheis 1023...

von Sebastian (Gast)


Lesenswert?

ich korrigiere    nun gehts


war wohl dieser semikolon und deer Refs0


Danke  einwandfrei

von ADCX (Gast)


Lesenswert?

Laut Schaltplan nutzt du ADC2 und ADC3, nicht wie im Code  ADC0 und 
ADC1.
Evtl. lohnt es sich das zu überprüfen.

von Electronics'nStuff (Gast)


Lesenswert?

Ingo schrieb:
> Mir ist etwas schleierhaft, wie ein 10Bit ADC, 1024(!) anzeigen kann...

Der hat 10 + 1/1024 Bit.

von Sebastian (Gast)


Lesenswert?

hallo adcx


wie meinst du das?    die beiden PA 0 und P1 hab ich nur testweise jetzt 
angeschlossen..

von ADCX (Gast)


Lesenswert?

Wenn du an ADC0 mißt mußt du auch an ADC0 etwas anschließen, zumindest 
im Schaltplan sind ADC0 und ADC1 unbeschaltet.

von Karl H. (kbuchegg)


Lesenswert?

Sebastian schrieb:
> hallo adcx
>
>
> wie meinst du das?

Genau so wie er es geschrieben hat.

Da stehen wir nämlich drauf, wenn Schaltung und Programm nicht 
zusammenpassen, du mit Fehlern kämpfst und sich erst im Nachsatz 
rausstellt

>    die beiden PA 0 und P1 hab ich nur testweise jetzt
> angeschlossen..

dass das Board welches vor dir liegt, ganz anders verschaltet ist :-)

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.