mikrocontroller.net

Forum: Compiler & IDEs Tiny13 free running ADC will nicht wie ich will.


Autor: Kopfkratzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
stehe gerade voll auf dem Schlauch.
Das Programm soll einen Poti auslesen mit 8bit vertüten und dann je nach 
Wert in Sekunden eine PWM ausgeben.
Zwecks debugging ist die PWM nun erstmal draussen, statt dessen soll 
eine LED angehen was sie aber nicht will ...
Wo habe ich meinen Fehler (PB1 toggelt im Sekundentakt, Timer läuft 
also)?
Danke !
volatile uint8_t sekunden;
volatile uint8_t ADCWert;
//Timer-IRQ
ISR(TIM0_OVF_vect)
{
  static uint8_t tick;
  // 1,2 MHz / 256 = 4,687 => 5000 Durchgänge/s Prescaler 1024 => 5 Durchgänge/s
  // 1,2 MHz / 256 + Prescaler 256 => 20
  // 1,2 MHz / 256 + Prescaler 64 => 80
  // 1,2 MHz / 256 + Prescaler 8 => 640
  // 1,2 MHz / 256 + Prescaler 0 => 4700
  // 9,6 MHz => 36,6 ca. 37
  if(tick++ > 30)
  {
    sekunden++;
    tick=0;
    PORTB = PINB ^ ( 1 << PB1 );
  }
}

ISR(ADC_vect)
{
  ADCWert=ADCH;
}

void init(void)
{
  // Internal RC
  
  //PIN-Settings
  DDRB = 0; // Alles Eingänge
  //DDRB |= (1<<PB0); // PWm Ausgang
  DDRB |= (1<<PB1);
  DDRB |= (1<<PB3);//TESTAUSGÄNGE
  //PORTB|= (1<<PB3);//active low !
  
  //Timer0 Fast-PWM 50:50 Tast, Prescaler 1024
  TCCR0A = 0;
  TCCR0A = (1<<WGM00)|(1<<WGM01);//|(1<<COM0B1);//|(1<<COM0A0);
  TCCR0B = 0;
  TCCR0B = (1<<WGM02)|(1<<CS00)|(1<<CS02);
  OCR0A = 32;
  OCR0B = 16;
  TIMSK0 = 0;
  TIMSK0 = (1<<TOIE0);
  
  //ADC Free running, ADLAR=1 Mux=0 1,2MHz/8=150kHz
  ADCSRA = 0;
  ADCSRA = (1<<ADEN)|(1<<ADIE)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADATE)|(1<<ADSC);
  ADCSRB = 0;
  //ADCSRB =();
  ADMUX = 0;
  ADMUX = (1<<ADLAR);//|(1<<)|(1<<);
  DIDR0 = (1<<ADC0D)|(1<<ADC1D)|(1<<ADC2D); //PB5,PB2,PB4
  
  //IRQs
  sei();
}

int main(void)
{
  
  init();
  
  while(1)
  {

    
      if(sekunden < ADCWert)
      {
        DDRB &= ~(1<<PB3);//TESTAUSGÄNGE
      }
      else
      {
       DDRB |= (1<<PB3);//TESTAUSGÄNGE
       sekunden=0;
      }
    
  }
  

}

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich weiß ja nicht, welche Art von PWM du eigentlich erwartest, aber ich 
kann dir sagen, was du von dem Code zu erwarten hast, nämlich einen sehr 
kurzen (µs) High-Impuls gefolgt von einer langen ADC abhängigen 
Low-Periode.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kopfkratzer schrieb:
> Hallo,

>       if(sekunden < ADCWert)
>       {
>         DDRB &= ~(1<<PB3);//TESTAUSGÄNGE
>       }
>       else
>       {
>        DDRB |= (1<<PB3);//TESTAUSGÄNGE
>        sekunden=0;
>       }

Welchen Sinn erhoffst du dir davon, den Pin von Eingang auf Ausgang 
umzuschalten?

Autor: Kopfkratzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Uups, typisches Copy&Paste der falschen Zeile rotwerd
Allerdings bleibt die LED dauerhaft an, egal ob der Poti nun 0 Volt oder 
5 Volt hat ...
Im ADCH sollte doch 0 stehen bei 0 Volt oder habe ich da das mit dem 
ADLAR falsch verstanden ?
Danke !
int main(void)
{
  
  init();
  
  while(1)
  {

    
      if((sekunden < ADCWert)&&(ADCWert > 1))
      {
        PORTB &= ~(1<<PB3);//TESTAUSGÄNGE
      }
      else
      {
       PORTB |= (1<<PB3);//TESTAUSGÄNGE
       sekunden=0;
      }
    
  }
  

}

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was ich an deiner Stelle tun würde.

Ich würde mir hier
ISR(ADC_vect)

erst mal eine LED einschalten um zu sehen ob die ISR aufgerufen wird.

Als nächstes würde ich mir den Wert von ADCH ansehen. Notfalls direkt 
auf einen 8_Bit Port legen und mit dem Voltmeter die einzelnen Pins 
abklappern. Dann Poti verdrehen und nachsehen ob sich der Wert ändert.

Und erst dann, wenn ich sicher gehen kann, dass vom ADC auch tatsächlich 
Werte kommen, die irgendetwas mit der Potistellung zu tun haben, erst 
dann baue ich weiter und mache eine Auswertung mit diesem Wert.

Und meine erste Auswertung wäre

  ....


  while(1)
  {
    if( ADCWert < 127 )
      PORTB &= ~(1<<PB3);
    else
      PORTB |= (1<<PB3);
  }

und beim Drehen am Poti muss die LED irgendwo bei Potimittelstellung 
ein/aus gehen.

Zuviele Schritte auf einmal machen führt oft dazu, dass man über 
irgendeinen stolpert und nicht weiß, welcher es war.

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.