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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.