Forum: Mikrocontroller und Digitale Elektronik AtMega32: RC5 Code, komisches Verhalten


von Emrullah Ü. (emru)


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.

von 1234 (Gast)


Lesenswert?

Emrullah Ünal schrieb:
> Wenn es hilfreich ist, kann ich den Quellcode, was ich geschrieben habe
> hier reinstellen.


Bitte alles posten!
auch Schaltplan.

von 1234 (Gast)


Lesenswert?

Achja meine Glaskugel geht zur Zeit nicht.

von Emrullah Ü. (emru)


Angehängte Dateien:

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;
    }
}

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Emrullah Ünal schrieb:
> Woran kann so ein Fehler liegen? Hardware oder Software?

Möglich, ja.

Die meisten Fehler werden allerdings von Sonstwer verursacht.

von 1234 (Gast)


Lesenswert?

Nicht alle VCC´s und GND´s angschlossen vom AVR.
Ist der Quarzoszilator richtig angeschlossen?

von Emrullah Ü. (emru)


Lesenswert?

1 Ground fehlt, ich schließe den auch kurz an. Was ist denn eigentlich 
AVCC?

Der Quarzoszillator funktioniert eigentlich ganz gut, ich hatte davor 
ein Programm geschrieben, der die Minuten zählt, dieser ging exatkt 
genau. Davor beim Internen gab es abweichungen.

von Emrullah Ü. (emru)


Lesenswert?

void timer0_init()
{
  TCCR0 |= (1<<CS01)|(1<<CS00);
  TCNT0 = 0;
}


Das hatte ich noch vergessen.

von Emrullah Ü. (emru)


Lesenswert?

Endlich habe ich es geschafft, es war ein kleiner Programmierfehler :)

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.