Forum: Mikrocontroller und Digitale Elektronik Vergleichsproblem mit LookupTable


von Tobias T. (Firma: TU Ilmenau) (tteichmann)


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!

von Stefan (Gast)


Lesenswert?

Da deine Tabelle im Programmspeicher liegt, musst Du mit speziellen 
Befehlen drauf zugreifen. 
http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html

von Dennis H. (c-logic) Benutzerseite


Lesenswert?


von Tobias T. (Firma: TU Ilmenau) (tteichmann)


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 :)

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


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.

von Tobias T. (Firma: TU Ilmenau) (tteichmann)


Lesenswert?

Ganz einfache Erklärung :)
Zuerst Testzwecke, bis das Programm läuft, später werden geeignete Werte 
zur Steuerung eines Motors eingesetzt.

Liebe Grüße!

: Bearbeitet durch User
von Tobias T. (Firma: TU Ilmenau) (tteichmann)


Lesenswert?

Problem gelöst!

avr gcc 4.7.2 eingebunden und "__flash" statt "PROGMEM" verwendet.
-> Standard C Programmierung auf im Flashspeicher des Controllers 
möglich.

Grüße!

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.