-         

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 23

Thema: AD-Wandler freilauf Fragen

  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    19.03.2005
    Ort
    Villach
    Alter
    26
    Beiträge
    995

    AD-Wandler freilauf Fragen

    Anzeige

    Hi,
    ich habe mit C angefangen und interesiiere mich jetzt für den AD-Wandler. ich will den Freilaufmodus verwenden da er glaub ich einfacher mitten im programm abzufragen ist. Aber meine Frage ist ob er im freilaufmodus die geschwindigkeit des ATmega16 verändert bzw. wie viel verändert.

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    11.11.2005
    Beiträge
    321
    der AVR läuft mit dem mhz-qurz weiter wie immer....

    es kommt darauf an, wie gut oder wie schlecht du proggen tust.

    ich glaube, du hast den freilaufmodus noch nicht richtig verstanden, schau mal ins datenblat vom AVR oder in der wiki-german.

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    19.03.2005
    Ort
    Villach
    Alter
    26
    Beiträge
    995
    Was ist die Wiki-german?

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Hallo Superhirn,
    der Freilaufmodus ist tatsächlich interessant, wenn du nur genau einen ADC-Kanal abfragen möchtest. Sobald du aber verschiedene Kanäle benötigst, musst du laut der AVR-Doku schon etwas aufpassen. (Seite 203 in der ATmega8-Doku, die beim ASURO dabei war)
    Wenn dein Hauptprogramm den ADC-Kanal über das Register ADMUX ändert, dann wird die aktuell laufende Wandlung noch weiter durchgeführt und erst danach wird der neu eingestellte Kanal 'freerunningmäßig' gewandelt.
    Da das Hauptprogramm aber nun den neuen ADC-Kanal erwartet, bekommst du nun trotzdem ersteinmal noch einen Wert zum vorher eingestellten ADC-Kanal.
    Falls du in deiner Hauptprogrammschleife ein Sleep hast, das länger als ZWEI Wandlerzeiten ist, kannst du direkt vor dem Sleep den ADC-Kanal wechseln, halt ein bisschen warten, und danach den Wert, der einfach in der ADC-Interruptfunktion in eine globale Variable geschrieben wurde, benutzen.
    Wenn du den Kanal NICHT wechselst, dann ist der Wert tatsächlich immer aktuell.
    Somit benötigst du den Sleep NUR dann, wenn du den ADC-Kanal wechseln willst.
    Der code könnte ungefähr so aussehen:
    Code:
    unsigned int global_adc_wert;
    
    main ()
    {
    char kanal_akt = 1;
    char kanal_neu = 1;
    unsigned int adc_wert;
    
       while (1)
       {
          // Hier muss Programmcode sein, der den neuen ADC-Kanal bestimmt.
          // Natürlich nur dann, wenn du es tatsächlich benötigst.
          // Vielleicht ja auch nur zum testen über irgendeine Taste
    
          if (kanal_akt != kanal_neu)
          {
             wechsel_den_Kanal_auf   kanal_neu;
             kanal_akt = kanal_neu;
             Sleep (100);  // Hier ein bisschen ausprobieren. DIe 100 habe ich nur geraten.
          }
    
          adc_wert = global_adc_wert; // global_adc_wert wird in der ADC-Interrupt-Funktion gefüllt.
          // Hier kanst du nun beliebig auf den ADC-Wert reagieren
          if (adc_wert > 100)
             Lampe an;
          else
             Lampe aus;
       }
    }
    P.S.: Eine Reaktion auf super_castle ist nie notwendig.
    Lieber Asuro programieren als arbeiten gehen.

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    11.11.2005
    Beiträge
    321
    man kann den freilaufmodus austricksen, bei mir laufen 7 verschiedene wandlungen (5 sharpsensoren und 2 radencoder). alle ergebnisse sind einwandfrei.

    das obige programm kann so nicht laufen...he...he...du hast das wichtigste vergessen. der adc(porta0) läuft immer wenn es los geht admux=0 gibt es nicht.

    castle

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    Hallo,
    was haltet Ihr davon, wenn Ihr den Kanal in der adcready Interrupt routine umschaltet?

    Gruß Sebastian

    @castle

    Anstatt blöde zumzulabbern, würde ich auch Deiner Stelle mal die Lösung sagen

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    11.11.2005
    Beiträge
    321
    zu umständlich......

    man kann winavr-c nur kennenlernen wenn man auch mal mit dem datenblatt arbeitet. es ist hier nicht alles erklärbar.

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    man kann winavr-c nur kennenlernen wenn man auch mal mit dem datenblatt arbeitet.
    Der Kandidat hat hiermit 100 Punkte gewonnen.
    Damit gege ich Dir zum erstem Mal recht, das ist war, darin sind schon viele Weisheiten verborgen...

    Gruß Sebastian

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    An die, die das Verstehen:
    Zitat Zitat von izaseba
    wenn Ihr den Kanal in der adcready Interrupt routine umschaltet?
    Wenn man der Doku traut, dann heißt es zum ADC-Wandler, dass die nächste Wandlung gestartet wird, sobald die aktuelle fertig ist. Dazu wird dann noch der Interrupt ausgelösst.
    Somit läuft die nächste Wandlung schon wenn wir in der Interrupt-Funktion angekommen sind. Es ist hier demnach schon zu spät, da wir den MUX ja hier erst nach dem Start der jetzt schon laufenden 'freerunning'-Wandlung umschalten können.

    Ich möchte keinesfalls ausschliessen, das ich da nichts verstehe. (Rechtlicher Hinweis)

    Vielleicht nochmal (vor allem für mich): Wir reden doch vom ATmega16?
    Die von mir angegeben Seite (203) kam vom ATmega8, da ich nur die CPU nutze, und entsprechend nur diese Doku habe.
    Ich kann mir aber nicht vorstellen, das der interne Ablauf im Kontroller komplett anders sein sollte. Aber man weiss ja nie.
    Deshalb hier die 'eventuell möglichen Kapitelüberschriften' die ich zu diesem Thema für relevant halte:
    ADC-Konverter (natürlich auf Englisch)
    Interrupt-System (klar, auch auf Englisch)

    @izaseba
    Die Idee ist nicht schlecht. Leider bin ich aber auf diese 'Falle' schon gestoßen und habe deshalb den 'freeruning'-Mode beim Asuro komplett aufgegeben. Mag sein, dass man es hinbekommt, aber ich verwalte alle anstehenden ADC-Kanal-Anforderungen nun komplett ohne den 'freerunner'. Mal sehen, wann ich es gelernt habe einen Thread aufzumachen um darüber zu berichten
    Lieber Asuro programieren als arbeiten gehen.

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    11.11.2005
    Beiträge
    321
    Damit gege ich Dir zum erstem Mal recht, ....

    brauchst du nicht, ich fühl mich auch so pudelwohl....

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •