Forum: Mikrocontroller und Digitale Elektronik RC5_Code läuft nicht auf ATMega32


von Christian P. (deepbass)


Lesenswert?

Hallo Forumgemeinde,

ich habe mir die RC5 Software von Peter Dannegger
file:///S:/Studienarbeit_Paul/sonstiges/RC5_Code_by%20Peter_Dannegger/IN 
DEXG.HTM
ins Atmel Studio6.0 geladen. Nun möchte ich das diese mit meinem 
ATMega32 läuft. Leider komme ich garnicht dazu etwas zu testen weil der 
Kompiler nichteinmal anfängt. Es kommt folgende Meldung:

C:\Programme\Atmel\Atmel Studio 6.0\make\make.exe all
    make: *** No rule to make target `MAIN.o', needed by 
`RC5_by_Dannegger.elf'.  Stop.
  Done executing task "RunCompilerTask" -- FAILED.
Done building target "CoreBuild" in project "RC5_by_Dannegger.cproj" -- 
FAILED.
Done building project "RC5_by_Dannegger.cproj" -- FAILED.

Build FAILED.
========== Build: 0 succeeded or up-to-date, 1 failed, 0 skipped 
==========

Es gibt ja 3 Dateien: MAIN.C; MAIN.H und RC5.C

Ich gehe ja mal davon aus das ich MAIN.C kompelieren muss oder ? Ich 
finde es nur komisch das bei der MAIN.C nicht auf die Datei RC5 
verwiesen wird, woher soll das Programm wissen das es diese Datei gibt ? 
Es beinhaltet schließlich die Interrupt Routine...

OK... Problem vorerst gelöst, ich habe bei den #include Dateien 
natürlich den richtigen Pfad angeben müssen.

ABER mit dieser Fehlermeldung quäle ich mich auch schon eine Weile 
herum:

Error  5  attempt to use poisoned "SIG_OVERFLOW0"

Ist das das falsche Register, heist das beim ATMega32 anders ?

Viele Grüße

von Hubert G. (hubertg)


Lesenswert?

Christian P. schrieb:
> Error  5  attempt to use poisoned "SIG_OVERFLOW0"
>
> Ist das das falsche Register, heist das beim ATMega32 anders ?

Heißt anders
ISR(TIMER0_OVF_vect)

Du solltest mal in einem neuen avr-libc-user-manual nachsehen.

von Christian P. (deepbass)


Lesenswert?

Hallo Hubert,

danke erstmal für den Tipp. Kannst du mir denn ein gutes manual 
empfehlen ? Jetzt kommt zwar keine Fehlermeldung mehr aber wenn ich es 
kompiliere dann passiert leider trotzdem nichts wenn ich auf der 
Fernbedienung herumtippe :D Muss ich bei dem Code nochwas verändern ?? 
Ich habe bei der MAIN.c Datei noch folgende Zeilen verändert:

#define  xRC5_IN    PINA
#define  xRC5    PA0      // IR input low active

Somit kann ich den Ausgang des TSOP 31236 daran anschließen.

Viele Grüße

von Hubert G. (hubertg)


Lesenswert?

Ich arbeite immer noch mit AVR-Studio 4.19, da ist so ein Manual in der 
Hilfe dabei.

Der TSOP wie im Datenblatt angeschaltet sollte so funktionieren.

Den Code hatte ich vor einiger Zeit mal auf einem Mega8 getestet und hat 
funktioniert.
Schon mit einem Oszi geschaut ob aus dem TSOP wirklich was herauskommt?

von Christian P. (deepbass)


Angehängte Dateien:

Lesenswert?

Hallo Hubert,

im Dateianhang siehst du das da wirklich was rauskommt :) Ich denke so 
sollte das aussehen. Es ist auch ein RC5 Code das ist sicher. Aber ich 
denke ich muss diesen : TCNT0 Timer anders beim ATMega ansprechen. Das 
Register heist glaube ich anders aber ich schaue gleich im Datenblatt. 
Dann habe ich noch die PORTs entsprechend konfiguriert:

void init_Portpins (void)
{
  DDRB  = 0xFF;  // pull-ups default
  PORTB  = 0xFF;  // ouputs driven high
  DDRA  = 0x00;  // set as Input
  PORTA  = 0xFF;  // pull-ups active
}

Somit kann ich an PORTA dann den Ausgang vom TSOP anschließen. 
hoffentlich blinkt bald mal eine LED :D
Wie funktioniert das eigentlich mit der zweiten c. Datei. Ich meine da 
ist doch überhaupt kein Verweis zu der ISR woher weis das Programm das 
es das mit Compilieren muss ?

Gruß Christian

von Jonas B. (jibi)


Lesenswert?

steht im header file.

von Karl H. (kbuchegg)


Lesenswert?

Christian P. schrieb:

> Wie funktioniert das eigentlich mit der zweiten c. Datei. Ich meine da
> ist doch überhaupt kein Verweis zu der ISR woher weis das Programm das
> es das mit Compilieren muss ?

Indem du es mit zum Projekt hinzufügst.

Einfach mal über der Projekt-Dateiansicht die rechte Maustaste drücken. 
Da wird es wohl einen Menüpunkt 'Add existing File' oder so ähnlich 
geben. Das kann auch unterschiedlich sein, je nachdem über welchem Teil 
des Projektbaumes die Maus gerade steht. "Source Files" wäre ein guter 
Tipp, wenn man Source Files hinzufügen möchte.
(Wenn nicht, gibt es den sicher auch in irgendeinem der normalen Menüs - 
"Project" wäre ein guter Anfang.)

Verwende ebenfalls noch das 4-er Studio, daher bin ich beim 6-er ein 
wenig blank. Aber das Prinzip ist immer dasselbe. Das AVR-Studio macht 
die Projektverwaltung und als solches muss es wissen, welche Files zum 
Projekt gehören. Ergo muss man die zum Projekt hinzufügen.

Du kannst ja schliesslich 20-tausend C-Files auf einem Verzeichnis haben 
und trotzdem gehören nur 5 davon zu einem Projekt. Das kann aber die 
Projektverwaltung nicht von alleine wissen - daher muss man es ihr 
zeigen.

von Christian P. (deepbass)


Angehängte Dateien:

Lesenswert?

Ok das habe ich auch so gemacht,

und wenn ich dann also auf rechter Mausklick auf das Projekt gehe und 
auf Build Solution fügt er alles zusammen nachdem ich jede C. Datei 
einzeln kompiliert und auf Fehler geprüft habe ?

von Karl H. (kbuchegg)


Lesenswert?

Christian P. schrieb:
> Ok das habe ich auch so gemacht,
>
> und wenn ich dann also auf rechter Mausklick auf das Projekt gehe und
> auf Build Solution fügt er alles zusammen nachdem ich jede C. Datei
> einzeln kompiliert und auf Fehler geprüft habe ?

Du musst nicht 'jede' C-Datei einzeln händisch kompilieren. Dazu hat man 
ja eine Projektverwaltung, die sich um sowas kümmert. Man ruft einfach 
Build auf (oder drückt - ich denke auch im 6-er Studio ist das immer 
noch F7) und das Studio kümmert sich darum, dass alle notwendigen 
C-Files (daher muss es die auch kennen) kompiliert und gelinkt werden. 
Und wenn es Fehler gibt, dann werden die vom AVR-Studio zusammengefasst 
und dem geneigten Programmierer präsentiert. Der korrigiert sie und 
startet den nächsten Build, woraufhin nur noch die C-Files kompiliert 
werden, die dann auch tatsächlich neu gemacht werden müssen (weil der 
Programmierer Änderungen im File gemacht hat, oder weil es Änderungen 
über den Umweg eines Header Files gibt).

Wenn du das händisch machen müsstest, bräuchtest du ja keine 
Projektverwaltung. Da würde ein stink normaler Editor auch reichen. 
Wurde früher auch so gemacht, als noch jedes Byte Hauptspeicher mit Gold 
zu bezahlen war.

von Christian P. (deepbass)


Lesenswert?

tehe danke für die Erläuterung :)
Ich sehe mal zu das ich den Code zum Laufen kriege !

von Christian P. (deepbass)


Lesenswert?

Hallo,

Also ich kriege den Code nicht zum Laufen. Ich verwende den ATMega32 auf 
dem STK500 Bord, habe den PORTB mit den LEDs verbunden und versuche nun 
schon ewig das da was passiert... Hier mal der von mir leicht angepasste 
Code von Peter Dannegger:
Die MAIN.c
1
#include "My_RC5_MAIN.h"
2
3
4
int main(void)
5
{
6
  unsigned int i;
7
8
  TCCR0 = 1<<CS02;            
9
  /* divide by 256
10
  CS02: Clock select bits
11
  TCCR: Timer/Counter control register
12
  */
13
  
14
  
15
  TIMSK = 1<<TOIE0;            
16
  /* enable timer interrupt
17
  TIMSK: Timer Interrupt Mask Register
18
  */
19
  while(1)                // main loop
20
  {
21
    i= rc5_data;            // read two bytes from interrupt !
22
    rc5_data = 0;
23
  
24
    if(i)
25
    {
26
      DDRB = i;            //LED output
27
    }
28
  }  
29
}

Die Header Datei:
1
#include <avr/io.h>
2
#include <avr/iom32.h>
3
#include <avr/interrupt.h>
4
#include <avr/signal.h>
5
#include <stdlib.h>
6
7
8
#define xRC5_IN    PINA
9
#define xRC5    PA0      // IR input low active
10
11
#define XTAL    11.0592e6
12
//#define XTAL    7.3728e6
13
//#define XTAL    5e6
14
15
16
extern unsigned int rc5_data;  // store result

Und die ISR:
1
#include <avr/io.h>
2
#include <avr/iom32.h>
3
#include "My_RC5_MAIN.h"
4
5
#define RC5TIME      1.778e-3      // 1.778ms 
6
#define PULSE_MIN    (unsigned char)(XTAL / 512 * RC5TIME * 0.4 + 0.5)
7
#define PULSE_1_2    (unsigned char)(XTAL / 512 * RC5TIME * 0.8 + 0.5)
8
#define PULSE_MAX    (unsigned char)(XTAL / 512 * RC5TIME * 1.2 + 0.5)
9
10
unsigned char rc5_bit;            // bit value
11
unsigned char rc5_time;            // count bit time
12
unsigned char rc5_tmp;            // shift bits in
13
unsigned int rc5_data;            // store result
14
15
ISR(TIMER0_OVF_vect)
16
{
17
  unsigned int tmp = rc5_tmp;        // quick access
18
  
19
  TCNT0 = -2;                // 2* 256 = 512 cycle
20
  
21
  if (++rc5_time > PULSE_MAX)        // count pulse time
22
  {
23
    if(!(tmp & 0x4000) && tmp & 0x2000)  // only if 14 bits received
24
    rc5_data = tmp;
25
    tmp = 0;
26
  }
27
  
28
  if ((rc5_bit ^ xRC5_IN) & 1<<xRC5)    // change detect
29
  {
30
    rc5_bit = ~rc5_bit;          //--> 0x00 ->0xFF ->0x00
31
    
32
    if( rc5_time < PULSE_MIN)      // to short
33
    tmp = 0;
34
    
35
    if(!tmp || rc5_time > PULSE_1_2)    // start or long pulse time
36
    {
37
      if(!(tmp & 0x4000))          // not to many bits
38
      tmp <<=1;              // shift
39
      if(!(rc5_bit & 1<<xRC5))      //inverted bit
40
      tmp |= 1;              //insert new bit
41
      rc5_time = 0;            // count next pulse time
42
    }
43
  }
44
  rc5_tmp = tmp;
45
}

Vielleicht findet ja jemand den Fehler ich habe so oft drüber geschaut 
das ich den Wald vor lauter Bäumen nicht mehr erkenne. Das Signal des 
TSOP kommt über Pin PA0 rein.

Vielen Dank schonmal im Vorraus

Christian

von Karl H. (kbuchegg)


Lesenswert?

Christian P. schrieb:

>     if(i)
>     {
>       DDRB = i;            //LED output
>     }
>   }


Ähm.
Du schaltest den Port auf Output. Schön.
Und weiter?
Nur weil du einen Portpin auf Output schaltest, leuchtet dort ja noch 
keine LED.
1
int main(void)
2
{
3
  unsigned int i;
4
5
  DDRB = 0xFF;             // Port auf Ausgang stellen
6
7
  TCCR0 = 1<<CS02;            
8
  /* divide by 256
9
  CS02: Clock select bits
10
  TCCR: Timer/Counter control register
11
  */
12
  
13
  
14
  TIMSK = 1<<TOIE0;            
15
  /* enable timer interrupt
16
  TIMSK: Timer Interrupt Mask Register
17
  */
18
19
  while(1)                // main loop
20
  {
21
    i= rc5_data;            // read two bytes from interrupt !
22
    rc5_data = 0;
23
  
24
    if(i)
25
    {
26
      PORTB = i;            //LED output
27
    }
28
  }  
29
}

von Karl H. (kbuchegg)


Lesenswert?

Wie sieht es mit deinem Empfänger aus?
Brauchst du dort einen Pullup-Widerstand.

Hast du das schon mal probiert?

1
#include <avr/io.h>
2
3
4
int main()
5
{
6
  DDRB |= ( 1 << PB0 );    // LED
7
8
  DDRA &= ( 1 << PA0 );    // TSOP Eingang
9
  PORTA |= ( 1 << PA0 );   // Pullup ein
10
11
  while( 1 ) {
12
    if( PINA & ( 1<<PA0 ) )    // was sagt der TSOP?  0 oder 1
13
      PORTB |= ( 1 << PB0 );      // je nachdem: LED ein oder aus
14
    else
15
      PORTB &= ~( 1 << PB0 );
16
  }
17
}

mit deiner Fernbedienung auf den TSOP linsen und die LED an PA0 muss zu 
blinzeln anfangen. Eventuell die Polarität der Ausgabe an PORTB 
umdrehen, damit sie 'hell blinzelt' und nicht 'dunkel blinzelt'. 
Lichtblitze sieht man besser als wenn eine dauerleuchtende LED kurz 
ausgeht.

Solange das nicht funktioniert bedeutet das, das was in deiner Hardware 
faul ist.

Fang halt erst mal mit kleinen Brötchen an, ehe du aufs Ganze gehst.

von Karl H. (kbuchegg)


Lesenswert?

1
extern unsigned int rc5_data;  // store result

hat PeDa da das volatile vergessen, oder hast du es rausgenommen?

von Christian P. (deepbass)


Lesenswert?

Ich habe bereits folgenden Testcode erfolgreich getestet:
1
#include <avr/io.h>
2
#include <avr/iom32.h>
3
4
unsigned char LED[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
5
6
/*Define pull-ups and set outputs high*/
7
/*Define directions fpr port pins*/
8
void init_Portpins (void)
9
{
10
  DDRB  = 0xFF;  // pull-ups default 
11
  PORTB  = 0xFF;  // ouputs driven high
12
  DDRA  = 0x00;  // set as Input
13
  PORTA  = 0xFF;  // pull-ups active
14
}
15
16
void pause(long n)
17
{
18
  long i;
19
  for(i=0;i<n;i++)
20
  {
21
    ;
22
  }
23
}
24
25
int main(void)
26
{
27
  unsigned char k;
28
      
29
    init_Portpins();
30
31
  while(1)
32
    {
33
    if ((PINA & 0x01) == 0x00)
34
    {
35
      PORTB = 0x00;
36
    }
37
    else
38
    PORTB = 0xFF;
39
  }
40
}

Drücke ich nun bei meiner Fernbedienung eine beliebige Taste dann 
blinken alle acht LEDs gleichzeitig auf. Die Hardware scheint zu 
funktionieren es muss irgendwas anderes sein. Ich habe nochmals die 
Register kontrolliert ob die anders heißen oder so aber es sind genau 
die wie auch im Datenblatt...

von Karl H. (kbuchegg)


Lesenswert?

> #define XTAL    11.0592e6

und dein Mega läuft auch mit 11.0592 Mhz?

Sicher? Hast du es kontrolliert?

von Karl H. (kbuchegg)


Lesenswert?

>> Die Hardware scheint zu
>> funktionieren es muss irgendwas anderes sein.

>
1
> extern unsigned int rc5_data;  // store result
2
>
>
> hat PeDa da das volatile vergessen, oder hast du es rausgenommen?

Push Up

von Christian P. (deepbass)


Lesenswert?

Karl Heinz Buchegger schrieb im Beitrag:
> hat PeDa da das volatile vergessen, oder hast du es rausgenommen?

Ich habe in dieser Zeile nichts verändert, bis auf das PeDa dort die 
Abkürzung uint statt unsigned integer verwendet hat. Muss denn da eine 
volatile variable rein ?

von Karl H. (kbuchegg)


Lesenswert?

Christian P. schrieb:
> Karl Heinz Buchegger schrieb im Beitrag:
>> hat PeDa da das volatile vergessen, oder hast du es rausgenommen?
>
> Ich habe in dieser Zeile nichts verändert, bis auf das PeDa dort die
> Abkürzung uint statt unsigned integer verwendet hat. Muss denn da eine
> volatile variable rein ?


Ja, muss es

FAQ: Was hat es mit volatile auf sich

von Christian P. (deepbass)


Lesenswert?

Ok ja genau ich habe gerade was zu volatile gelesen habe ich nicht 
gewusst. Und was den Takt angeht, da hast du recht ich weis es nicht 
genau aber er läuft auf alle Fälle nicht bei der Eingestellten XTAL. Wie 
würdest du den Takt am einfachsten Messen ?
Mit einem INterrupt einen I/O Port an und ausschalten und mit Osszi 
messen ?

Viele Grüße

von Karl H. (kbuchegg)


Lesenswert?

Christian P. schrieb:
> Ok ja genau ich habe gerade was zu volatile gelesen habe ich nicht
> gewusst. Und was den Takt angeht, da hast du recht ich weis es nicht
> genau aber er läuft auf alle Fälle nicht bei der Eingestellten XTAL. Wie
> würdest du den Takt am einfachsten Messen ?


#define F_CPU 11059200

#include ...



  PORTB = 0xFF;

  while( 1 )
  {
    PORTB = 0x00;
    _delay_ms( 1000 );
    PORTB = 0xFF;
    _delay_ms( 1000 );
  }
}


entweder der _delay_ms liefert 1000ms, also 1 Sekunde, oder er liefert 
sie nicht. Aufs Hz genau ist es natürlich nicht. Aber darauf kommts ja 
auch nicht an, wenn die Alternativen 8Mhz oder 1Mhz lauten. Das eine ist 
fast 2/3, das andere 1/11. 0.6 Sekunden kannst du aber mit freiem Auge 
von 1 Sekunde unterscheiden.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Karl Heinz Buchegger schrieb:
> #define F_CPU 11059200
>
> #include ...
>
>
>
>   PORTB = 0xFF;

DDRB?

von Karl H. (kbuchegg)


Lesenswert?

Frank M. schrieb:
> Karl Heinz Buchegger schrieb:
>> #define F_CPU 11059200
>>
>> #include ...
>>
>>
>>
>>   PORTB = 0xFF;
>
> DDRB?


merci vielmals

von Christian P. (deepbass)


Lesenswert?

Ich habe dein Program gerade getestet.

In den Fusebits habe ich die Einstellung INTRCOSC_8MHZ_6CK_64MS gewählt, 
also auf 8 MHZ interner Takt. Wenn ich das Programm laufen lasse und für 
#define F_CPU 8000000 also meinen Eingestellten Takt eingebe dann 
blinken die LEDs im Sekundentakt. Bessergesagt mit einer kleinen 
Different bei einer Minute etwa eine Sekunde. Das sollte also OK sein.

Trotz der Änderung bin ich dem funktionieren des Codes mit Sicherheit 
näher gerückt aber immernoch nicht am Ziel :(
1
//define XTAL    11.0592e6
2
#define XTAL    8e6
3
//#define XTAL    5e6

Es passiert leider noch nichts an den LEDs.

von Karl H. (kbuchegg)


Lesenswert?

in deinem main fehlt ein

   sei();


deine Interrupts sind nicht freigegeben.

von Christian P. (deepbass)


Lesenswert?

ja und den Global Interrupt Disable cli() habe ich auch vergessen in der 
schleife.Es passiert immernoch nichts ich würde aber mal den aktuellen 
Code hochladen weil ja doch schon einiges verbessert wurde:

MAIN.c
1
#include "My_RC5_MAIN.h"
2
3
4
int main(void)
5
{
6
  unsigned int i;
7
8
  TCCR0 = 1<<CS02;            
9
  /* divide by 256
10
  CS02: Clock select bits
11
  TCCR: Timer/Counter control register
12
  */
13
  
14
  
15
  TIMSK = 1<<TOIE0;            
16
  /* enable timer interrupt
17
  TIMSK: Timer Interrupt Mask Register
18
  */
19
  
20
  sei();
21
  
22
  while(1)                // main loop
23
  {
24
    cli();
25
    
26
    i= rc5_data;            // read two bytes from interrupt !
27
    rc5_data = 0;
28
  
29
    if(i)
30
    {
31
      DDRB = i;            //LED output
32
    }
33
  }  
34
}

ISR:
1
#include <avr/io.h>
2
#include <avr/iom32.h>
3
#include "My_RC5_MAIN.h"
4
5
#define RC5TIME      1.778e-3      // 1.778ms 
6
#define PULSE_MIN    (unsigned char)(XTAL / 512 * RC5TIME * 0.4 + 0.5)
7
#define PULSE_1_2    (unsigned char)(XTAL / 512 * RC5TIME * 0.8 + 0.5)
8
#define PULSE_MAX    (unsigned char)(XTAL / 512 * RC5TIME * 1.2 + 0.5)
9
10
unsigned char rc5_bit;            // bit value
11
unsigned char rc5_time;            // count bit time
12
unsigned char rc5_tmp;            // shift bits in
13
unsigned int volatile rc5_data;            // store result
14
15
ISR(TIMER0_OVF_vect)
16
{
17
  unsigned int tmp = rc5_tmp;        // quick access
18
  
19
  TCNT0 = -2;                // 2* 256 = 512 cycle
20
  
21
  if (++rc5_time > PULSE_MAX)        // count pulse time
22
  {
23
    if(!(tmp & 0x4000) && tmp & 0x2000)  // only if 14 bits received
24
    rc5_data = tmp;
25
    tmp = 0;
26
  }
27
  
28
  if ((rc5_bit ^ xRC5_IN) & 1<<xRC5)    // change detect
29
  {
30
    rc5_bit = ~rc5_bit;          //--> 0x00 ->0xFF ->0x00
31
    
32
    if( rc5_time < PULSE_MIN)      // to short
33
    tmp = 0;
34
    
35
    if(!tmp || rc5_time > PULSE_1_2)    // start or long pulse time
36
    {
37
      if(!(tmp & 0x4000))          // not to many bits
38
      tmp <<=1;              // shift
39
      if(!(rc5_bit & 1<<xRC5))      //inverted bit
40
      tmp |= 1;              //insert new bit
41
      rc5_time = 0;            // count next pulse time
42
    }
43
  }
44
  rc5_tmp = tmp;
45
}

Header Datei
1
#include <avr/io.h>
2
#include <avr/iom32.h>
3
#include <avr/interrupt.h>
4
#include <avr/signal.h>
5
#include <stdlib.h>
6
7
8
#define xRC5_IN    PINA
9
#define xRC5    PA0      // IR input low active
10
11
//define XTAL    11.0592e6
12
#define XTAL    8e6
13
//#define XTAL    5e6
14
15
16
extern unsigned volatile int rc5_data;  // store result

von Christian P. (deepbass)


Lesenswert?

Christian P. schrieb:
> if(i)
>     {
>       DDRB = i;            //LED output
>     }

Ist das nicht das Falsche Register ? Das ist doch das Data Direction 
Register ich müsste wenn ich was an den LEDs ausgeben will doch vielmehr 
schrieben :

PORTB = i;

oder ?

von Karl H. (kbuchegg)


Lesenswert?

Christian P. schrieb:
> Christian P. schrieb:
>> if(i)
>>     {
>>       DDRB = i;            //LED output
>>     }
>
> Ist das nicht das Falsche Register ? Das ist doch das Data Direction
> Register ich müsste wenn ich was an den LEDs ausgeben will doch vielmehr
> schrieben :
>
> PORTB = i;
>
> oder ?


Na dann scroll mal hoch auf das Posting von 14:06

von Karl H. (kbuchegg)


Lesenswert?

> ich würde aber mal den aktuellen
Code hochladen weil ja doch schon einiges verbessert wurde:


Dürfte ich vorschlagen, dass du mal deine 8 Zeilen Code etwas intensiver 
studierst und korrigierst?


Die generelle Codestruktur ist
1
int main()
2
{
3
4
   Initialisierungen
5
6
7
   sei();
8
9
   while( 1 ) {
10
11
     Programmlogik
12
13
   }
14
}

Was muss alles initialisierst werden? Welche Hardware Komponenten hast 
du im Einsatz? Du benutzt
* den Timer
* einen Eingang
* einen (oder mehrere) Ausgänge für die LED

-------

* Was gibt es beim Timer zu tun?
* Was musst du beim Eingang machen? (Musst du überhaupt beim Eingang was 
machen? Der Default für Portpins ist immerhin Eingang)
* Was musst du bei den LED Ausgängen machen.


Auch wenn das fad ist, gehört es nichts desto trotz mit zum Programm 
dazu, ehe man sich der eigentlichen Programmlogik widmet, die in deinem 
Fall ziemlich trivial ist. Fehler in der Initialisierung, vergessene 
Komponenten rächen sich durch seltsame bzw. überhaupt nicht 
funktionierende Teile.

von Karl H. (kbuchegg)


Lesenswert?

1
  while(1)                // main loop
2
  {
3
    cli();
4
    
5
    i= rc5_data;            // read two bytes from interrupt !
6
    rc5_data = 0;
7
  
8
    if(i)
9
    {
10
      DDRB = i;            //LED output
11
    }
12
  }  
13
}

und wenn du die Interrupts mittels cli() sperrst, dann musst du sie 
mittels sei() auch irgendwann danach wieder mal freigeben. Sonst kommt 
nun mal kein Interrupt durch und deine ISR wird auch nie aufgerufen.

von Hubert G. (hubertg)


Angehängte Dateien:

Lesenswert?

Das sollte der gleiche Code wie deiner sein, nur etwas anders 
formatiert. Mit UART und LCD-Ausgabe. Wenn du kein LCD anschließt ist es 
egal.
Eingabe-Pin und LED-Ausgabe musst du eventuell anpassen.

von Hubert G. (hubertg)


Lesenswert?

Noch vergessen, Takt ist 7,3728MHz

von Christian P. (deepbass)


Lesenswert?

Hallo,

nach einigen Testprogrammen was das Auslösen von Interrupts usw. 
anbelangt habe ich auf Grundlage von Huberts Code eine funktionierende 
Lösung gefunden. Eines der trivialsten Fehler von mir war, das beim 
STK500 die LEDs invertiert anzusprechen sind also z.b muss ich schreiben 
: PORTB = ~i;

Somit werden die Tastencodes über die LEDs korrekt angezeigt.

Danke vielmals für eure schnelle Hilfe. Karl Heinz, ich bin deinem Tipp 
gefolgt und habe es auch als sehr hilfreich gefunden das eine gewisse 
Ordnung in einem Programm gut ist selbst zum eigenen Verständnis, 
vorallem aber wenn man sich dann auf die Fehlersuche begibt.

Viele Grüße Christian

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.