Vergleichsproblem mit LookupTable

OP (Firma: TU Ilmenau) #3359769
Lesenswert?

Hey Leute - darf mich seit mittlerweile 2 Wochen in meinem Fachpraktikum 
mit C Programmierung von Mikrocontrollern beschäftigen und bin auf ein 
recht großes Problem gestoßen.

Programmiersystem ist ein Atmel STK 600 mit AtMega8535 Controller(läuft 
mit 1Mhz) und AVR Studio 4.

Ein ADC Wert soll

i) per PWM auf eine LED übertragen werden (Dimmen) -> klappt wunderbar
ii) mit einer LookUpTable verglichen werden, der Wert soll dann auf die 
LED (später Motor, derzeitige Werte nur zu Testzwecken) übertragen 
werden.

Problem: Der Vergleich mit der lookup funktioniert leider nicht richtig. 
Das Registerschreiben bzw Vergleichen klappt leider nicht 1a.

Leider habe ich in der Programmierung kaum Erfahrung und würde mich 
freuen, wenn mir jemand einen Tip geben könnte, woran der Vergleich 
scheitern könnte.
1
#include <avr/io.h>
2
#include <util/delay.h>
3
#include <inttypes.h>
4
#include <avr/interrupt.h>
5
#include <avr/pgmspace.h>
6
#include <inttypes.h>
7
#include <stdio.h>
8
#include <stdlib.h>
9
int i;
10
volatile uint8_t pec;
11
volatile uint8_t zwischenpec;
12

13
const uint8_t PROGMEM lookup[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255};
14

15
ISR(ADC_vect) 
16
{
17

18
    zwischenpec = ADCH;
19
    pec = lookup[zwischenpec];
20
    //PORTB = ADCH;    // Output ADCH to PORTB
21
    ADCSRA |= 1<<ADSC;  // Start Conversion
22
    
23
}
24

25

26

27
void InitPWM1()  { //Initiieren der PWM(8bitTimer2) und PD7 als Out schalten
28

29
TCCR2 |= (1<<WGM20) | (1<<COM21) | (1<<WGM21) | (1<<CS20);
30

31
DDRD |= (1<<PD7);
32

33
}
34

35
void InitPWM2()  { //Initiieren der PWM(8bitTimer0) und PB3 als Out schalten
36

37
TCCR0 |= (1<<WGM00) | (1<<COM01) | (1<<WGM01) | (1<<CS00);
38

39
DDRB |= (1<<PB3);
40

41
}
42

43
void SetPWMOutput1() // OutputCompareRegister2 mit ADCH-Wert setzen
44
{
45
  OCR2=ADCH;
46
}
47

48
void SetPWMOutput2() // OutputCompareRegister2 mit ADCH-Wert setzen
49
{
50
  
51
  OCR0=pec;
52
}
53

54

55
void Wait()
56
{
57
  _delay_loop_2(1000);
58

59
}
60

61
int main (void)
62
{
63

64
  DDRA = 0x00;    // A as input
65
  DDRD = 0xff;    // D as output(LEDs)
66
  PORTD= 0xff;    // D Lumis ausschalten
67
  DDRB = 0xff;    // B as output(LEDs)
68
  PORTB= 0xff;    // B Lumis ausschalten
69

70
  ADCSRA = 0x8b;    // Enable ADC + Interrupt feature, /8
71

72
  ADMUX = 0x20;    // Pin AREF, left adjusted, 8 unipolar channels, PA0
73

74
  sei();        // global interrupts
75
  ADCSRA |= 1<<ADSC;  // start conversion
76
  
77

78
  InitPWM1();     // Initiieren
79
  InitPWM2();      // Initiieren
80

81

82
  
83
  while(1){
84
  
85
    
86
    SetPWMOutput1();  // OCR2=ADCH; aufrufen
87
    SetPWMOutput2();  
88
        }}

Liebe Grüße!
OP (Firma: TU Ilmenau) #3359817
Lesenswert?

Oh,
das hört sich gut an. Ich werde das morgen direkt mal ausprobieren und 
versuchen...kannst du mir noch einen Tipp geben, welche Funktion die 
richtige wäre(tut mir Leid, mein Kopf raucht heute zu sehr).

Edit: Hab den 2ten Beitrag gerade erst gesehen - danke für die Tipps :)
Persönliche Seite #3359862
Lesenswert?

1
const uint8_t PROGMEM lookup[]={
2

3
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
4
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
5
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
6
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
7
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
8
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
9
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
10
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
11

12
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
13
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
14
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
15
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
16
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
17
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
18
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
19
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255};

Der Algorithmus, der so eine "lookuptable" benötigt, der würde mich 
wirklich interessieren.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren