ATtiny 84 ADC

Hallo zusammen,

seit längerem versuche ich mit dem ATtiny84 ein Poti auszulesen und den Wert mit einer Zahl multipliziert als Zeitverzögerung in delay() zu schreiben..

Mit dem Arduino war das kein Problem: einfach Potistellung über analogRead() in eine long-Variable und dann in delay() schreiben.

Beim ATtiny funktionierte das nicht.. :confused:
..
Einen Komparator konnte ich zumindest schon dank dieser Seite aufbauen:
https://www.marcelpost.com/wiki/index.php/ATtiny84_ADC

void initADC()
{
  /* this function initialises the ADC 

        ADC Notes
	
	Prescaler
	
	ADC Prescaler needs to be set so that the ADC input frequency is between 50 - 200kHz.
	
	Example prescaler values for various frequencies
	
	Clock   Available prescaler values
   ---------------------------------------
	 1 MHz   8 (125kHz), 16 (62.5kHz)
	 4 MHz   32 (125kHz), 64 (62.5kHz)
	 8 MHz   64 (125kHz), 128 (62.5kHz)
	16 MHz   128 (125kHz)

   below example set prescaler to 16 for mcu running at 1MHz


  */

   ADMUX =
            (0 << REFS1) |     // Sets ref. voltage to Vcc, bit 1   
            (0 << REFS0) |     // Sets ref. voltage to Vcc, bit 0
            (0 << MUX5)  |     // use ADC1 for input (PA1), MUX bit 5
            (0 << MUX4)  |     // use ADC1 for input (PA1), MUX bit 4
            (0 << MUX3)  |     // use ADC1 for input (PA1), MUX bit 3
            (0 << MUX2)  |     // use ADC1 for input (PA1), MUX bit 2
            (0 << MUX1)  |     // use ADC1 for input (PA1), MUX bit 1
            (1 << MUX0);       // use ADC1 for input (PA1), MUX bit 0

  ADCSRA = 
            (1 << ADEN)  |     // Enable ADC 
            (1 << ADPS2) |     // set prescaler to 16, bit 2 
            (0 << ADPS1) |     // set prescaler to 16, bit 1 
            (0 << ADPS0);      // set prescaler to 16, bit 0 
			
  ADCSRB = 
            (1 << ADLAR);      // left shift result (for 8-bit values)
	//        (0 << ADLAR);      // right shift result (for 10-bit values)
}


int main( void ) 
{
  
  initADC();

  while(1)
  {

    ADCSRA |= (1 << ADSC);         // start ADC measurement
    while (ADCSRA & (1 << ADSC) ); // wait till conversion complete 

    if (ADCH > 128)
    {
      // ADC input voltage is more than half of VCC

    } else {

      // ADC input voltage is less than half of VCC

    }

  }

  return 0;
}

Sobald ich versuche am Ende des Codes ein Blinklicht starten zu lassen

// ADC input voltage is less than half of VCC

digitalWrite(OUT,HIGH);
delay(1000);
digitalWrite(OUT,LOW);
delay(1000);
digitalWrite(OUT,HIGH);
delay(1000);
digitalWrite(OUT,LOW);

bleibt der Ausgang dauernd auf HIGH und die delay() Zeit läuft scheinbar nicht ab :confused:

Über Hilfe wäre ich sehr dankbar.. :wink:

Viele Grüße
Matthias

Das funktioniert auch mit einem ATtiny84.
Vor einiger Zeit hatte ich mal gelesen, der Pin sollte mit "A0" o.ä. definiert werden, jedoch nicht nur mit der Ziffer.
Getestet habe ich es allerdings nicht.

Wenn der 84 nen ADC hat geht das sicher. Ich hab das mit nem Tiny13 gemacht, Code aber gerade verschwunden :fearful:

Bei analogRead kommt leider nur eine bestimmte kHz Frequenz raus, unabhängig von der Potistellung.. da wird es denke ich nicht vernünftig eingelesen.

Der Tiny wird über den Arduino und Google Code programmiert.

Matze_121:
Bei analogRead kommt leider nur eine bestimmte kHz Frequenz raus

Mit Sicherheit nicht. Da kommt ein Spannungswert raus.

Gruß Tommy

Einen Komparator konnte ich zumindest schon dank dieser Seite aufbauen:

Und, was hindert dich jetzt daran den ADC auszulesen?

Matze_121:
Der Tiny wird über den Arduino und Google Code programmiert.

Was denn für einen Google Code ?
Üblicherweise wird der Arduino in der IDE mit C++ programmiert und nicht mit Google.

Und hast du meinen Post #1 gelesen ?

Tommy56:
Mit Sicherheit nicht. Da kommt ein Spannungswert raus.

Gruß Tommy

Siehe Anhang :confused:

HotSystems:
Was denn für einen Google Code ?
Üblicherweise wird der Arduino in der IDE mit C++ programmiert und nicht mit Google.

Und hast du meinen Post #1 gelesen ?

Ja habe ich ausprobiert, siehe Anhang Post #3

Und der Google Code ist eine Bibliothek, um den ATtiny mit der Arduino IDE programmieren zu können (Google Code Archive - Long-term storage for Google Code Project Hosting.)

Dachte das die Info evtl. relevant sein könnte .. :confused:

Matze_121:
Und der Google Code ist eine Bibliothek, um den ATtiny mit der Arduino IDE programmieren zu können (Google Code Archive - Long-term storage for Google Code Project Hosting.)

Dachte das die Info evtl. relevant sein könnte .. :confused:

Das ist dein Problem......Google Code kann alles sein, woher sollen wir wissen, was du meinst.

Ja habe ich ausprobiert, siehe Anhang Post #3

Meine ich nicht.
Habe ja nicht ohne Grund:

Einen Komparator konnte ich zumindest schon dank dieser Seite aufbauen:

zitiert.

Also klarer:
Ich meine den Komparator, den du da aus dem Internet geklaut hast.
Der funktioniert ja, sagst du...
(ich kann nicht testen)

Den umzubauen, dass er dir 10 Bit Werte liefert, ist trivial.
Warum machst du das nicht?

combie:
Meine ich nicht.
Habe ja nicht ohne Grund:zitiert.

Also klarer:
Ich meine den Komparator, den du da aus dem Internet geklaut hast.
Der funktioniert ja, sagst du...
(ich kann nicht testen)

Den umzubauen, dass er dir 10 Bit Werte liefert, ist trivial.
Warum machst du das nicht?

Moment, Moment.. Diese Antwort war an den User "HotSystems" gerichtet..

Und da würde ich jetzt nicht gleich von "klauen" sprechen....

Das Problem liegt ja nicht am Auslesen, sondern das das Programm nach einem delay den Zustand nicht mehr ändert

Das Problem liegt ja nicht am Auslesen, sondern das das Programm nach einem delay den Zustand nicht mehr ändert

Und, warum zeigst du das Programm nicht, welches seinen Zustand nicht mehr ändert?

Bedenke:
Auch für Genies ist es schwierig Fehler in Programmen zu finden, welche sie nicht vor sich haben.

Siehe meinen ersten Post.

Der Komparator mit Blinklicht :wink:

Hi

Ich bin jetzt nicht sonderlich sattelfest in C++ - aber Das ist kein Arduino-Code - was passiert, wenn main() beendet wird?
Durch return 0 wird die main verlassen.

Wo ist für Dich 'das Ende', wo Du die Blinkerei anhängst?

MfG

postmaster-ino:
Ich bin jetzt nicht sonderlich sattelfest in C++ - aber Das ist kein Arduino-Code - was passiert, wenn main() beendet wird?
Durch return 0 wird die main verlassen.

Ach, das kann man schon so tun...
Da main() vom Type int sein muss, ist auch ein return Pflicht.
Return 0 bedeutet Programmende, ohne Fehler.
Es ist allerdings üblich, dass die meist vor dem return vorhandene Endlosschleife nie verlassen wird.

Das kürzest mögliche Arduino Programm ist:

int main()
{
  //for(;;); 
  return 0;
}

Die eingebauten Sachen, wie millis() Serial und delay() funktionieren dann allerdings nicht mehr.
Denn die üblichen ISR werden nicht etabliert.
Dann: Arduino, ohne den Arduino Ballast.


Ja, das könnte natürlich sein....
Unser Matze_121 verzichtet auf setup() und loop(), und deshalb tuts sein delay() nicht mehr...

Naja, hätte er den fehlerhaften Code gezeigt, dann wäre mir das sofort aufgefallen(glaube ich)
Aber so...

#define OUT 0

void setup(){
  pinMode(OUT,OUTPUT);
  digitalWrite(OUT,LOW);

void initADC()
{
   ADMUX =
            (0 << REFS1) |     // Sets ref. voltage to Vcc, bit 1   
            (0 << REFS0) |     // Sets ref. voltage to Vcc, bit 0
            (0 << MUX5)  |     // use ADC1 for input (PA1), MUX bit 5
            (0 << MUX4)  |     // use ADC1 for input (PA1), MUX bit 4
            (0 << MUX3)  |     // use ADC1 for input (PA1), MUX bit 3
            (0 << MUX2)  |     // use ADC1 for input (PA1), MUX bit 2
            (0 << MUX1)  |     // use ADC1 for input (PA1), MUX bit 1
            (1 << MUX0);       // use ADC1 for input (PA1), MUX bit 0

  ADCSRA = 
            (1 << ADEN)  |     // Enable ADC 
            (0 << ADPS2) |     // set prescaler to 16, bit 2 
            (1 << ADPS1) |     // set prescaler to 16, bit 1 
            (1 << ADPS0);      // set prescaler to 16, bit 0 
      
  ADCSRB = 
            (1 << ADLAR);      // left shift result (for 8-bit values)
}


int main( void ) 
{
  
  initADC();

  while(1)
  {

    ADCSRA |= (1 << ADSC);         // start ADC measurement
    while (ADCSRA & (1 << ADSC) ); // wait till conversion complete 

    if (ADCH > 128)
    {
        digitalWrite(OUT,HIGH);
        delay(1000);
        digitalWrite(OUT,LOW);
        delay(1000);

    } else {

        digitalWrite(OUT,LOW);

    }

  }

  return 0;

combie:
Ach, das kann man schon so tun...
Da main() vom Type int sein muss, ist auch ein return Pflicht.
Return 0 bedeutet Programmende, ohne Fehler.
Es ist allerdings üblich, dass die meist vor dem return vorhandene Endlosschleife nie verlassen wird.

Das kürzest mögliche Arduino Programm ist:

int main()

{
 //for(;;);
 return 0;
}



Die eingebauten Sachen, wie millis() Serial und delay() funktionieren dann allerdings nicht mehr.
Denn die üblichen ISR werden nicht etabliert. 
Dann: Arduino, ohne den Arduino Ballast.

---------

Ja, das könnte natürlich sein....
Unser Matze_121 verzichtet auf setup() und loop(), und deshalb tuts sein delay() nicht mehr...

Naja, hätte er den fehlerhaften Code gezeigt, dann wäre mir das sofort aufgefallen(glaube ich)
Aber so...

Hört sich gut an, ich habe wie muss dann mein Code geändert werden?

Die main() weg machen.

Es funktioniert! Vielen Dank !!! :slight_smile: