Forum: Mikrocontroller und Digitale Elektronik LED Logarithmisch Dimmen


von Bernd (Gast)


Lesenswert?

Hallo zusammen,
ich versuche jetzt schon länger eine LED logarithmisch zu dimmen. Leider 
klappt das nicht so wie ich es mir vorstelle!

Hier mein Code (für einen Atmega8):


#include <avr/io.h>
#define F_CPU 8000000
#include <util/delay.h>
#include <avr/pgmspace.h>


unsigned char test=0;

const uint8_t pwm_value[256] PROGMEM =
{   1,   1,   1,   1,   1,   1,   1,   1,
  1,   2,   2,   2,   2,   2,   2,   2,
  2,   2,   2,   2,   2,   2,   2,   2,
  2,   3,   3,   3,   3,   3,   3,   3,
  3,   3,   3,   3,   3,   3,   3,   3,
  3,   3,   4,   4,   4,   4,   4,   4,
  4,   4,   4,   4,   4,   4,   4,   5,
  5,   5,   5,   5,   5,   5,   5,   5,
  5,   6,   6,   6,   6,   6,   6,   6,
  6,   7,   7,   7,   7,   7,   7,   7,
  8,   8,   8,   8,   8,   8,   9,   9,
  9,   9,   9,   9,  10,  10,  10,  10,
  10,  11,  11,  11,  11,  11,  12,  12,
  12,  12,  13,  13,  13,  13,  14,  14,
  14,  15,  15,  15,  16,  16,  16,  16,
  17,  17,  17,  18,  18,  19,  19,  19,
  20,  20,  21,  21,  21,  22,  22,  23,
  23,  24,  24,  25,  25,  26,  26,  27,
  27,  28,  28,  29,  29,  30,  31,  31,
  32,  33,  33,  34,  35,  35,  36,  37,
  37,  38,  39,  40,  40,  41,  42,  43,
  44,  45,  46,  47,  48,  48,  49,  50,
  51,  53,  54,  55,  56,  57,  58,  59,
  60,  62,  63,  64,  65,  67,  68,  69,
  71,  72,  74,  75,  77,  78,  80,  82,
  83,  85,  87,  88,  90,  92,  94,  96,
  98, 100, 102, 104, 106, 108, 110, 112,
  115, 117, 119, 122, 124, 127, 129, 132,
  134, 137, 140, 143, 146, 149, 152, 155,
  158, 161, 164, 168, 171, 174, 178, 182,
  185, 189, 193, 197, 201, 205, 209, 213,
  217, 222, 226, 231, 235, 240, 245, 255 };




int main(void)
{
  DDRB=(1<<PB1);                                // PWM-Ausgang
  TCCR1B=  (0<<CS12)  | (0<<CS11)  | (1<<CS10) | (1<<WGM12) | 
(0<<WGM13);    // Timer1 Prescl: 1
  TCCR1A= (1<<WGM10) | (0<<WGM11) | (1<<COM1A1) | (0<<COM1A0);        // 
Fast-PWM 8-bit aktivieren; Clear on Compare Match



  while(1)
    {

      OCR1A=pwm_value[test];

      test++;
      _delay_ms(100);
    }

}




Nun zu meinem Problem:
wenn ich irgend einen beliebigen Wert anstelle von "test" eintrage gibt 
die LED die gewünsche Helligkeit wieder (also z.B. 
OCR1A=pwm_value[128]).

Wenn ich das Programm wie oben gezeigt ablaufen lasse blinkt aber die 
LED wie wild in allen verschiedenen Helligkeiten.

habe auch schon versucht es folgendermaßen zu probieren:

test=128;
OCR1A=pwm_value[test];

Selbst dann gibt die LED für die verschiedensten Werte nur quatsch aus.
Kann mir jemand sagen wo der Fehler liegt??

Gruß Bernd

von Peter II (Gast)


Lesenswert?

wenn ich mich nicht irre man man den Flash so nicht lesen
1
  OCR1A=pwm_value[test];

http://www.nongnu.org/avr-libc/user-manual/pgmspace.html

von S. R. (svenska)


Lesenswert?

Entscheide dich. Entweder, du hast einen modernen Compiler mit __flash, 
oder du nutzt PROGMEM mit den passenden Zugriffsfunktionen (pgm_read_x 
und so).

von Falk B. (falk)


Lesenswert?

OCR1A=pgm_read_byte(&pwm_value[test]);

von Bernd (Gast)


Lesenswert?

Falk B. schrieb:
> OCR1A=pgm_read_byte(&pwm_value[test]);

Mensch Falk, vielen Dank! Kaum macht mans richtig schon funktionierts!

@svenska: das mit dem PROGMEM hab ich aus einer Anleitung aus dem Netz, 
hab zuvor noch nie damit gearbeitet! Wusste nicht, dass es da heute 
schon alternativen gibt!

von Falk B. (falk)


Lesenswert?

@ Bernd (Gast)

>hab zuvor noch nie damit gearbeitet! Wusste nicht, dass es da heute
>schon alternativen gibt!

Auch wenn "Mutti" uns seit 10 Jahren was von Alternativlosigkeit 
vorschwafelt. ES GIBT IMMER ALTERNATIVEN!

https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Flash_mit_PROGMEM_und_pgm_read

https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Flash_mit_flash_und_Embedded-C

P S Sorry, aber das musste jetzt sein.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Bernd schrieb:
> const uint8_t pwm_value[256] PROGMEM =

const __flash uint8_t pwm_value[256] =

Und avr/pgmspace.h brauchst du auch nicht mehr.

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.