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.
Emrullah Ünal schrieb: > Wenn es hilfreich ist, kann ich den Quellcode, was ich geschrieben habe > hier reinstellen. Bitte alles posten! auch Schaltplan.
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; } }
Emrullah Ünal schrieb: > Woran kann so ein Fehler liegen? Hardware oder Software? Möglich, ja. Die meisten Fehler werden allerdings von Sonstwer verursacht.
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.
void timer0_init() { TCCR0 |= (1<<CS01)|(1<<CS00); TCNT0 = 0; } Das hatte ich noch vergessen.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.