mikrocontroller.net

Forum: Compiler & IDEs Probleme ADC Tiny13


Autor: DAU (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
werde gerade wahnsinnig weil ich den Fehler nicht finde.
Der Tiny13 soll drei Potis auslesen und entsprechend deren Stellung eine 
PWM ausgeben.
Nur wird aktuell einer bzw. ab und an auch der zweite Poti ausgelesen, 
PB2 bleibt immer "tot".
Ich habe jetzt die Potis getauscht, den Tiny13 getauscht und alles mit 
einem Multimeter durchgemessen am PB2 liegen immer 5Volt.
Nun meine Frage habe ich im Programm etwas falsch eingestellt oder ist 
mein STK200 defekt ?
Danke !
#ifndef MINIPEAK_H
#define MINIPEAK_H

#define CLK 1200000 // internal CLOCK

#define IST 1
#define SOLL 0
#define TIME 2


#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdint.h>
#include <inttypes.h>

// IRQ-Vars
volatile uint8_t timertick_s;
volatile uint8_t ADCWert[3];//PB2|PB4|PB3

/*
ADC 3V 8bit => 0,012 V pro Bit => Timer 4 Minuten bei vollem Pegel = 256
*/
  


//prototypes

void init(void);


#endif
#include "minipeak.h"
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdint.h>
#include <inttypes.h>


//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++ > 80)
  {
    timertick_s++;
    tick=0;
    //PORTB = PINB ^ ( 1 << PB1 );
  }
}

ISR(ADC_vect)
{
  /*
  Pro Kanal zwanzig mal wandeln und Wert zuweisen
  */
  static uint8_t debounce=0;
  static uint8_t enumerate=0;
//  static uint8_t test=0;
  
  if(debounce++ > 200)
  {
  
    ADCWert[enumerate]=ADCH;
  
    ADMUX=0;
    //ADMUX =  (1<<ADLAR)|(1<<MUX0);
  
  
    switch(enumerate)
    {
      case 0: ADMUX =  (1<<ADLAR)|(1<<MUX1);// PB4 abfragen
              enumerate = 1;
              //PORTB = PINB ^ ( 1 << PB1 );
      break;
      case 1: ADMUX =  (1<<ADLAR)|(1<<MUX1)|(1<<MUX0);// PB3 abfragen
              enumerate = 2;
              //PORTB = PINB ^ ( 1 << PB1 );
      break;
      case 2: ADMUX =  (1<<ADLAR)|(1<<MUX0);// PB2 abfragen 
              enumerate = 0;
              //PORTB = PINB ^ ( 1 << PB1 );
      break;
      default: ADMUX =  (1<<ADLAR)|(1<<MUX0);// PB2 default 
              enumerate = 0;
      break;
    }
  
    debounce = 0;
  }
}

void init(void)
{
  // Internal RC
  
  //PIN-Settings
  DDRB = 0; // Alles Eingänge
  DDRB |= (1<<PB0); // PWm Ausgang
  DDRB |= (1<<PB1); // Testausgang
  PORTB |= ( 1 << PB1 );
  PORTB |= ( 1 << PB0 );
  
  //Timer0 Fast-PWM 50:50 Tast, Prescaler 64
/*  TCCR0A = 0;
  TCCR0A = (1<<WGM00)|(1<<WGM01);
  TCCR0B = 0;
  TCCR0B = (1<<CS00)|(1<<CS01);
  OCR0A = 127;
  TIMSK0 = 0;
  */
  /*
  //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;
  ADMUX =  (1<<ADLAR)|(1<<MUX0);//|(1<<MUX1);//PB2 Mux0~Mux1//PB4 ~Mux0 Mux1//PB3 Mux0Mux1
  DIDR0 = (1<<ADC0D)|(1<<ADC1D)|(1<<ADC2D)|(1<<ADC3D); //PB2,PB4,PB3
  
  //IRQs
  sei();
}

int main(void)
{
  //local Vars
  uint8_t timer = 0;
  
  init();
  
  while(1)
  {
  
  
  if(ADCWert[SOLL]<128)
  {
  //PORTB = PINB ^ ( 1 << PB1 );
    PORTB &= ~( 1 << PB0 );
  }
  else
    PORTB |= ( 1 << PB0 );

  
  if(ADCWert[IST]<128)
  {
  //PORTB = PINB ^ ( 1 << PB0 );
    PORTB &= ~( 1 << PB1 );
  }
  else
    PORTB |= ( 1 << PB1 );
  
  if(ADCWert[TIME]<128)
  {
  //PORTB = PINB ^ ( 1 << PB1 );
    PORTB &= ~( 1 << PB1 );
  }
  else
    PORTB |= ( 1 << PB1 );
  
  /*
    Wenn ADC-Soll < ADC-Ist  einschalten
    Wenn ADC-Time < 20 Timer-Aus
    Wenn ADC-Time > 20 Timer-Ein
    Wenn Timer-Ein für eingestellte Zeit einschalten
    /

    if(ADCWert[SOLL]<ADCWert[IST])
    {
      // wenn Timer aktiv Zeitmessung starten
      if(ADCWert[TIME]>20)
      {
        timertick_s = 0;
        TIMSK0 |= (1<<TOIE0);
        timer=1;
      }
      // anschalten
      TCCR0A |= (1<<COM0A1);
    }
    
    if(ADCWert[SOLL]>ADCWert[IST])
    {
      if(timer&&ADCWert[TIME]>timertick_s)
      {
        // solange Zeitvorgabe nicht erfüllt anschalten
        TCCR0A |= (1<<COM0A1);
      }
      else
      {
        // sonst alles aus
        timer = 0;
        TIMSK0 &= ~(1<<TOIE0);
        TCCR0A &= ~(1<<COM0A1);
      }
    }*/
  }

}

Autor: Lord Ziu (lordziu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DAU schrieb:
> am PB2 liegen immer 5Volt

Das ist doch dein ADC-Eingang, denke ich.... Beschreib deine Erwartungen 
und was nicht geht bitte mal ein bisschen genauer. Nicht nur: Pin ist 
"tot".

Hab jetzt auf die Schnelle am Code nichts Falsches gefunden, obwohl ich 
auch kein Datenblatt zur Hand habe. Aber ich würde mal durchrechnen, ob 
deine ISR nicht zu lang ist. Prescaler 8 bei 13 ADC-Takten heißt, du 
hast nur 104 Takte Zeit in der ISR. Vielleicht bootet dein Controller ja 
ständig neu...

Aber wie gesagt, aus deiner Fehlerbeschreibung werd ich nicht schlau.

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.