Forum: Mikrocontroller und Digitale Elektronik Status LED RED Blinking: VTarget or Aref short circuited.


von Claude (Gast)


Lesenswert?

Hallo,
 kann jemand mir Bitte  helfen!!!
Ich habe folgendes Program geschrieben zur Wandlung des Signals ( Analog 
zur Digital),der Compiler meldet kein Fehler aber nachdem das Program 
compiliert ist, dann fängt der Status LED RED zu blinken an. Ich weiss 
absolut nicht woran das Problem liegt. Bitte Hilfe.  Hier ist nochmal ma 
Code. Ich benutze ein STK 600 und uC: Atmega 2560.  STK


MFG
Claude
1
 #include <avr/io.h>
2
//#include <avr/delay.h>
3
4
     
5
  /* ADC_Initialisieren */
6
7
 void ADC_Init(void)
8
  {  
9
    uint16_t  result;
10
 
11
    ADMUX = (1<<REFS1) | (1<<REFS0);       //  interne Referenzspannung nutzen
12
    ADCSRA = (1<<ADPS2) | (1<<ADPS0);     //  Frequenzvorteiler 32
13
    ADCSRA |= (1<< ADEN);                 //  ADC aktivieren
14
    ADCSRA |= (1<<ADSC);                  //  Start der  ADC_Wandlung, wenn ADC_Wandlung fertig dann ADSC auf 0 setzen.
15
 
16
    while ( ADCSRA & (1<<ADSC) ) {}      // auf Abschluss der Konvertierung warten
17
      
18
    result = ADCW ;                     // ADCW ( wo die gemessene Werte gespeichern sind) muss einmal gelesen werden sonst wird Ergebnis der nächste Wandlung nicht übernommen.Zum erstmal wird ADC verworfen
19
  }
20
21
   
22
   
23
   /* ADC Einselmessung */
24
   
25
  uint16_t ADC_Read(uint16_t channel)
26
   {
27
   ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);    // Channel waehlen ohne andere Bits zu Beeinflussen
28
     ADCSRA |= (1<<ADSC);                           //  Start der  ADC_Wandlung, wenn ADC_Wandlung fertig dann ADSC auf 0 setzen.
29
    
30
   while ( ADCSRA & (1<<ADSC) ) {}               // auf Abschluss der Konvertierung warten
31
     return ADCW;                                  // ADC  auslesen aus dem Register ADCW und zurückgeben
32
   }  
33
   
34
 
35
 
36
 /* Beispielaufrufe*/   
37
   
38
 int main(void)
39
 
40
{  DDRA = 0xff;
41
   uint16_t adcval;
42
   ADC_Init();
43
   
44
     while(1)
45
      { adcval = ADC_Read(0);  // Kanal 0
46
    PORTA = adcval;
47
  //  _delay_ms(1000);
48
      //mach was mit adcval code à suivre       
49
      }
50
}

von spess53 (Gast)


Lesenswert?

Hi

>dann fängt der Status LED RED zu blinken an.

Vielleicht dadurch:

If the AVR's internal voltage reference is used, the AREF0/AREF1 jumper 
must be removed.

MfG Spess

von spess53 (Gast)


Lesenswert?

Hi

Noch was:

>    PORTA = adcval;

16-Bit-Wert auf 8-Bit-Port?

MfG Spess

von Claude (Gast)


Lesenswert?

Hi,
Es klappt immer noch nicht. Kann Jemand bitte mir sagen was diese 
Anweisung:    ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F)  Bedeutet. 
wie gesagt ich lese das Tutorial gerade und im Code habe ich das nicht 
verstanden.


MFG
Claude

von Karl H. (kbuchegg)


Lesenswert?

Claude schrieb:
> Hi,
> Es klappt immer noch nicht. Kann Jemand bitte mir sagen was diese
> Anweisung:    ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F)  Bedeutet.
> wie gesagt ich lese das Tutorial gerade und im Code habe ich das nicht
> verstanden.

OK. Ich gebe zu, dass das mglw. etwas dicht geschrieben ist. Wenn man 
allerdings seine Bitmaniplationen im Hinterkopf hat und die auch 
beherrscht, ist es eigentlich ganz einfach
1
               
2
   Code                    Beispielwert(binär)           was passiert
3
  -----------------------------------------------------------------------
4
   ADMUX                   10101010                      nimm den Inhalt von ADMUX
5
6
   0x1F                    00011111                      1F
7
   ~(0x1F)                 11100000                      alle Bits umdrehen
8
9
   ADMUX&~(0x1F)           10101010                      die beiden UND verknüpfen
10
                         & 11100000                      Effektiv löscht das im Ergebnis
11
                           --------                      alle Bits, die in 0x1F auf 1
12
                           10100000                      standen (und nach dem Bitdrehen
13
                                                         auf 0 stehen)

Einschub: Warum will man diese Bits auf 0 setzen?
Antwort: Weil dort die Channelwerte kodiert sind. Mit dem nachfolgenden 
(Oder) kann man BIts nur von 0 auf 1 ändern, also stellt man sicher, 
dass erst mal die interessanten Bits auf 0 gezwungen werden. Was ja ganz 
offensichtlich auch funktioniert. Die untersten 5 Bits (dort wo die 
Kanalwerte rein kommen) sind alle 0, obwohl sie im ADMUX von ganz oben 
das noch nicht waren. Die restlichen 3 Bits haben sich nicht verändert 
und sind immer noch so wie sie ursprünglich in ADMUX waren.
1
   channel                 00000011                      zb Kanal 3
2
   0x1F                    00011111                      1F
3
4
   channel & 0x1F          00000011                      die Kanalnummer mit
5
                         & 00011111                      einer Maske behandeln
6
                           --------                      sodass auf jeden Fall
7
                           00000011                      die obersten 3 Bits auf
8
                                                         0 gesetzt werden.
9
                                                         Einfach nur eine Vorsichtsmassnahme
10
11
12
   ... | ....              10100000                      der aufbereitet ADMUX Wert
13
                         | 00000011                      die neue Kanal Nummer
14
                           --------
15
                           10100011
und das Ergebnis ist ein Byte, welches die obersten 3 Bits aus dem 
ursrpünglichen ADMUX übernommen hat und dessen untersten 5 Bits aus der 
neuen Kanal Angabe kommen.


         ADMUX                  channel
        76543210                76543210   (Bitnummer)
        abcdefgh                ABCDEFGH
        | |                        |   |
        +-+                        +---+
         |                           |
         +------------+  +-----------+
                      |  |
                      v  v
                     +-++---+
                     | ||   |
                     76543210
                     abcDEFGH
                       ADMUX

Zusammengefasst: ADMUX so manipulieren, dass die Kanalnummer, UND NUR 
DIE KANALNUMMER, gegen eine neue ausgetauscht wird. Alle anderen Bits 
bleiben so, wie sie in ADMUX auch vorher schon waren.

von Claude (Gast)


Lesenswert?

Vielen Dank Heinz für die Ausführliche Erklärung

MFG
Claude

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.