Forum: Compiler & IDEs Probleme ADC Tiny13


von DAU (Gast)


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 !
1
#ifndef MINIPEAK_H
2
#define MINIPEAK_H
3
4
#define CLK 1200000 // internal CLOCK
5
6
#define IST 1
7
#define SOLL 0
8
#define TIME 2
9
10
11
#include <avr/io.h>
12
#include <avr/interrupt.h>
13
#include <stdint.h>
14
#include <inttypes.h>
15
16
// IRQ-Vars
17
volatile uint8_t timertick_s;
18
volatile uint8_t ADCWert[3];//PB2|PB4|PB3
19
20
/*
21
ADC 3V 8bit => 0,012 V pro Bit => Timer 4 Minuten bei vollem Pegel = 256
22
*/
23
  
24
25
26
//prototypes
27
28
void init(void);
29
30
31
#endif
32
#include "minipeak.h"
33
#include <avr/io.h>
34
#include <avr/interrupt.h>
35
#include <stdint.h>
36
#include <inttypes.h>
37
38
39
//Timer-IRQ
40
ISR(TIM0_OVF_vect)
41
{
42
  static uint8_t tick;
43
  // 1,2 MHz / 256 = 4,687 => 5000 Durchgänge/s Prescaler 1024 => 5 Durchgänge/s
44
  // 1,2 MHz / 256 + Prescaler 256 => 20
45
  // 1,2 MHz / 256 + Prescaler 64 => 80
46
  // 1,2 MHz / 256 + Prescaler 8 => 640
47
  // 1,2 MHz / 256 + Prescaler 0 => 4700
48
  // 9,6 MHz => 36,6 ca. 37
49
  if(tick++ > 80)
50
  {
51
    timertick_s++;
52
    tick=0;
53
    //PORTB = PINB ^ ( 1 << PB1 );
54
  }
55
}
56
57
ISR(ADC_vect)
58
{
59
  /*
60
  Pro Kanal zwanzig mal wandeln und Wert zuweisen
61
  */
62
  static uint8_t debounce=0;
63
  static uint8_t enumerate=0;
64
//  static uint8_t test=0;
65
  
66
  if(debounce++ > 200)
67
  {
68
  
69
    ADCWert[enumerate]=ADCH;
70
  
71
    ADMUX=0;
72
    //ADMUX =  (1<<ADLAR)|(1<<MUX0);
73
  
74
  
75
    switch(enumerate)
76
    {
77
      case 0: ADMUX =  (1<<ADLAR)|(1<<MUX1);// PB4 abfragen
78
              enumerate = 1;
79
              //PORTB = PINB ^ ( 1 << PB1 );
80
      break;
81
      case 1: ADMUX =  (1<<ADLAR)|(1<<MUX1)|(1<<MUX0);// PB3 abfragen
82
              enumerate = 2;
83
              //PORTB = PINB ^ ( 1 << PB1 );
84
      break;
85
      case 2: ADMUX =  (1<<ADLAR)|(1<<MUX0);// PB2 abfragen 
86
              enumerate = 0;
87
              //PORTB = PINB ^ ( 1 << PB1 );
88
      break;
89
      default: ADMUX =  (1<<ADLAR)|(1<<MUX0);// PB2 default 
90
              enumerate = 0;
91
      break;
92
    }
93
  
94
    debounce = 0;
95
  }
96
}
97
98
void init(void)
99
{
100
  // Internal RC
101
  
102
  //PIN-Settings
103
  DDRB = 0; // Alles Eingänge
104
  DDRB |= (1<<PB0); // PWm Ausgang
105
  DDRB |= (1<<PB1); // Testausgang
106
  PORTB |= ( 1 << PB1 );
107
  PORTB |= ( 1 << PB0 );
108
  
109
  //Timer0 Fast-PWM 50:50 Tast, Prescaler 64
110
/*  TCCR0A = 0;
111
  TCCR0A = (1<<WGM00)|(1<<WGM01);
112
  TCCR0B = 0;
113
  TCCR0B = (1<<CS00)|(1<<CS01);
114
  OCR0A = 127;
115
  TIMSK0 = 0;
116
  */
117
  /*
118
  //Timer0 Fast-PWM 50:50 Tast, Prescaler 1024
119
  TCCR0A = 0;
120
  TCCR0A = (1<<WGM00)|(1<<WGM01);//|(1<<COM0B1);//|(1<<COM0A0);
121
  TCCR0B = 0;
122
  TCCR0B = (1<<WGM02)|(1<<CS00)|(1<<CS02);
123
  OCR0A = 32;
124
  OCR0B = 16;
125
  TIMSK0 = 0;
126
  //TIMSK0 = (1<<TOIE0);
127
  */
128
  
129
  //ADC Free running, ADLAR=1 Mux=0 1,2MHz/8=150kHz
130
  ADCSRA = 0;
131
  ADCSRA = (1<<ADEN)|(1<<ADIE)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADATE)|(1<<ADSC);
132
  ADCSRB = 0;
133
  ADMUX =  (1<<ADLAR)|(1<<MUX0);//|(1<<MUX1);//PB2 Mux0~Mux1//PB4 ~Mux0 Mux1//PB3 Mux0Mux1
134
  DIDR0 = (1<<ADC0D)|(1<<ADC1D)|(1<<ADC2D)|(1<<ADC3D); //PB2,PB4,PB3
135
  
136
  //IRQs
137
  sei();
138
}
139
140
int main(void)
141
{
142
  //local Vars
143
  uint8_t timer = 0;
144
  
145
  init();
146
  
147
  while(1)
148
  {
149
  
150
  
151
  if(ADCWert[SOLL]<128)
152
  {
153
  //PORTB = PINB ^ ( 1 << PB1 );
154
    PORTB &= ~( 1 << PB0 );
155
  }
156
  else
157
    PORTB |= ( 1 << PB0 );
158
159
  
160
  if(ADCWert[IST]<128)
161
  {
162
  //PORTB = PINB ^ ( 1 << PB0 );
163
    PORTB &= ~( 1 << PB1 );
164
  }
165
  else
166
    PORTB |= ( 1 << PB1 );
167
  
168
  if(ADCWert[TIME]<128)
169
  {
170
  //PORTB = PINB ^ ( 1 << PB1 );
171
    PORTB &= ~( 1 << PB1 );
172
  }
173
  else
174
    PORTB |= ( 1 << PB1 );
175
  
176
  /*
177
    Wenn ADC-Soll < ADC-Ist  einschalten
178
    Wenn ADC-Time < 20 Timer-Aus
179
    Wenn ADC-Time > 20 Timer-Ein
180
    Wenn Timer-Ein für eingestellte Zeit einschalten
181
    /
182
183
    if(ADCWert[SOLL]<ADCWert[IST])
184
    {
185
      // wenn Timer aktiv Zeitmessung starten
186
      if(ADCWert[TIME]>20)
187
      {
188
        timertick_s = 0;
189
        TIMSK0 |= (1<<TOIE0);
190
        timer=1;
191
      }
192
      // anschalten
193
      TCCR0A |= (1<<COM0A1);
194
    }
195
    
196
    if(ADCWert[SOLL]>ADCWert[IST])
197
    {
198
      if(timer&&ADCWert[TIME]>timertick_s)
199
      {
200
        // solange Zeitvorgabe nicht erfüllt anschalten
201
        TCCR0A |= (1<<COM0A1);
202
      }
203
      else
204
      {
205
        // sonst alles aus
206
        timer = 0;
207
        TIMSK0 &= ~(1<<TOIE0);
208
        TCCR0A &= ~(1<<COM0A1);
209
      }
210
    }*/
211
  }
212
213
}

von Lord Z. (lordziu)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.