www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Was ist hier falsch??


Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Im nachfolgenden Stück Code muß irgendwas faul sein.
Er soll einen Spannungswert ADwandeln, dann soll der Wert im Timer
verglichen werden.
Der Timer ist so eingestellt, daß er fast genau eine Sekunde braucht,
um maximal 255bit zu zählen.
Proz: Attiny26, Takt extern 4Mhz

uint16_t SpannungWandeln(uint8_t a)            // Funktion zum 
AD-Wandeln der
Verzögerungsspannung
{
  int i;                        // Initialisieren
  uint16_t result = 0;                 // evtl. Inhalte löschen
  ADCSR = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1);
               // Frequenzvorteiler
         // setzen auf 64 und ADC aktivieren
  ADMUX = a;                                       // Kanal waehlen 
(MUX0,
also PA0, ist ausgewählt)
  ADMUX |= (1<<REFS0) | (0<<REFS1);                 // AREF festlegen 
(PA3)


    /* Eigentliche Messung - Mittelwert aus 5 aufeinanderfolgenden
Wandlungen */

  for(i=0;i<5;i++)
  {
    ADCSR |= (1<<ADSC);                      // eine Wandlung "single
conversion"
    while(!(ADCSR & (1<<ADIF)));             // auf Abschluss der
Konvertierung warten (ADIF-bit)
    result += ADC;                  // Wandlungsergebnisse aufaddieren
    ADCSR |= (1<<ADIF);      // ADIF löschen
  }
  ADCSR &= ~(1<<ADEN);                       // ADC deaktivieren

  result /= 5;                               // Summe durch 5 teilen =
arithm. Mittelwert

  OCR1C = result;              // Ergebnis in das Vergleichsregister von 
Timer
1 schreiben
  result= 0;
        // Ergebnis-Register zurücksetzen
  ADCSR = 0x00;                // Kontroll- und Statusregister des ADC
zurücksetzen
  ADMUX = 0x00;                // Multiplexer zurücksetzen
  return a;
}
 //------------------------------------------------------------------

void VergleichswertPruefen(void)            // Funktion zur Erzeugung 
der
Verzögerungszeit

{
  int i;                  // Laufvariable definieren

  for (i=1;i<=30;i++)                // Schleife festlegen für max. 
Verzögerung
von 30S
  {
    do  // führe aus:
    {

     TCCR1A = 0x00;                // Initialisieren
     TCCR1B = 0x8F;            // Timer starten mit Vorteiler von 16384, 
ohne
OC1-Aktionen
    }while (!(TIFR & (1<<OCF1A)));        // solange, wie kein 
Compare-Match
eintritt

    if(TIFR == 0x40)              // Bedingung stellen: wenn 
Compare-Match,
dann...
    {
      TCCR1B = 0x00;                // Timer stoppen und rücksetzen
      TIFR = (1<<OCF1A);              // Compare-match-Bit zwangsweise 
löschen
    }
  }
}

Gruß,
Andreas

P.S. µC bleibt nicht hängen oder so, er verzögert nur nicht! Egal
welche Spannung ich an PA0 anlege (max.5V, über Poti), keine Reaktion.

Autor: Quark (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Andreas,
wenn Dein Quellcode auch bei anderen so unglücklich umbricht, wäre
es vieleicht besser, den Code sauber formatiert (wie er wohl auch war)
als Anhang (.txt) mit zu senden. Dann kann er viel besser gelesen
werden, und alle haben lust, Dir zu helfen.
Grüße
Quark

Autor: Andreas (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
im Anhang...

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach 'i' mal 'volatile'...
{
    volatile int i;

    /* ... */

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Patrick: Habe ich geändert.
Ohne große Wirkung!

Die Routinen scheint der Proz ja zu durchlaufen, ansonsten käme ich ja
nicht bis zum Hauptprogramm, daß ohne Mucken läuft!

Drehe ich an dem Poti, ändert sich nichts an der Zeitverzögerung.
Nach ca. 1s bin ich im Hauptprogramm!

Ich schaue mir nochmal das Unterprogramm "Vergleichswert.." an.

Auch ändere ich mal die Schleifendurchläufe.

Gruß,
Andreas

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so...

"Schleifendurchlauf-Anzahl" mal richtig hochgesetzt (3000).
Ändert nichts!

Ich glube, der Timer funzt nicht! Jetzt prüfe ich mal die
Grundeinstellungen hierzu!

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.