AtMega32: RC5 Code, komisches Verhalten

OP #2451176
Lesenswert?

Guten Abend,

ich habe seit ungefähr einer Woche mit dem Programmieren von 
Microcontrollern angefangen und will nun den MC fernbedienen.
Ich will den RC5 Code und einen TSOP31236 als IR-Empfänger
benutzen.


Damit ich praktische Erfahrung kriege, will ich keinen fertigen Code 
einfügen, sondern es selber schreiben bis es läuft. Ich habe 8 Leds an 
PORTB angeschlossen um die letzten 8 Bit des Codes anzuzeigen. Ich habe 
es auch einigermaßen geschafft den Code anzuzeigen nur ich habe einen 
Fehler drin, was ich ich mir nicht erklären kann, da hoffe ich einer von 
euch kann mir helfen.

Wenn ich zum Beispiel die 1 drücke, dann zeigt er mir 0000 0011 an. Also 
eigentlich eine 3. Aber wenn ich die die zwei drücke, dann zeigt er mir 
eine
0000 0101 an. Dann erkennt man also, eine 1 leuchtet zu viel und der 
Rest ist verschoben. Jetzt kommt das interessante an der Sache, nach 
einer Weile zeigt er mir alles richtig an, also bei 1 zeigt er mir 0000 
0001 an. Und nach einer Weile spinnt er wieder.

Woran kann so ein Fehler liegen? Hardware oder Software?

Ich benutze einen Atmega32 auf einem Breadboard und mit 4Mhz 
Quarzoszillator.

Wenn es hilfreich ist, kann ich den Quellcode, was ich geschrieben habe 
hier reinstellen.
OP #2451190
Lesenswert?

Infrarot_Sensor.c:

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "InfrarotSensor.h"

uint8_t volatile irCode_8 = 0; //Hier wird der Code gespeichert.

//Initialisiert einen globalen Interrupt
void sensor_init()
{
  PORTD &= ~(1<<PIND3);  //INT1 als Eingang
  PORTD &= ~(1<<PIND3);

  GICR |= (1<<INT1);
  MCUCR |= (1<<ISC11);  //fallende Flanke löst einen Interrupt aus 
(Ausgang des Empfängers ist invertiert)
}

int lese_aktuellen_bit()
{
  if((PIND & (1<<PIND3)))  //Bit ist 1
  {
    loop_until_bit_is_clear(PIND, 3);
    TCNT0 = 0;
    while(TCNT0 <= 56){}; //Warte 890us
    return 1;
  }
  else
  {
    loop_until_bit_is_set(PIND, 3); //Bit ist 0
    TCNT0 = 0;
    while(TCNT0 <= 56){}; //Warte 890us
    return 0;
  }

}

uint16_t code_verarbeiten()
{
  uint8_t temp_SREG;
  temp_SREG = SREG;
  cli();
  irCode_8 = 0x00;
  unsigned int counter;

  for (counter=1; counter<=14; counter++)
  {

    irCode_8 = (irCode_8<<1); //Code wird einmal nach links geshiffted
    if (lese_aktuellen_bit()==1)
    {
      irCode_8 |= 0x01;
    }

  }

  SREG = temp_SREG;
  return  irCode_8;
}


Infrarot_Entwicklung.c (main):

#include <avr/io.h>
#include <avr/interrupt.h>
#include "InfrarotSensor.h"

#define F_CPU 4000000UL


void timer0_init();
uint8_t volatile temp = 0x00;

ISR(INT1_vect)
{
  temp = code_verarbeiten();
}

int main(void)
{
  timer0_init();
  sensor_init();
  sei();

  DDRB = 0xFF;
  PORTB = 0x00;

    while(1)
    {
    PORTB = temp;
    }
}
Angehängte Dateien:

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