-
        
+ Antworten
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 20

Thema: RC5 empfang klappt nicht

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    25.09.2004
    Beiträge
    471

    RC5 empfang klappt nicht

    Hallo

    Ich hab jetzt schon zig mal versucht einen Code zu schreiben um meinem ATMega128 mit 16Mhz den Empfang von RC5 Code beizubringen.
    Es gibt zwar einige Versionen auch im Internet, jedoch bringe ich diese auch nicht wirklich zum laufen.
    Früher wollte ich mal, dass der Empfang von RC5 einfach so nebensächlich abläuft, aber da ich das ja anscheinend nicht hin bekomme begnüge ich mich jetzt mal damit, dass er nur mal korrekt empfangen wird

    Aber vielleicht ist hier ja so ein Genie, dass mir das jetzt endlich mal beibringen kann [-o<

    Ich programmiere in CodeVision - ist zwar nicht AVRGCC, aber auch C

    hier mal der code:
    Code:
    #include <mega128.h>
    #include <stdlib.h>
    
    #include "uart.h";
    #include "command.h";
      
    unsigned long rc5_data = 0;
    unsigned char rc5_laenge = 14;
    unsigned int durchlauf = 0;
    unsigned int laenge = 0;
    unsigned char text[20];
    
    interrupt [TIM0_OVF] void timer0_ovf_isr(void)
    {
     	if(++durchlauf == 16)
     	{      
     		if(++laenge != rc5_laenge)
     		{
     			durchlauf = 0;
    			rc5_data << 1;
     		
     			if(PIND.0 == 0)
     			{
     	  			rc5_data |= 1;
     			}
     		}
     		else
     		{
     			itoa(rc5_data,text);
     			Send_Str(text);
     			TCCR0 = 0x00;
     		}
     	}
    }
    
    void main(void)
    {
    	PORTB=0x00;
    	DDRB=0xFF;
    
    	PORTD=0x00;
    	DDRD=0x00;	
    	
    	ASSR=0x00;
    	TCCR0=0x00;
    	TCNT0=0x00;
    	OCR0=0x00;
    
    	TIMSK=0x01;
    	ETIMSK=0x00;
    
    	#asm("sei")
       
    	init_uart();
    	
    	while (1)
       {
       	if(PIND.0 == 0)
       	{
       		TCCR0=0x02;
       	}
       };
    }
    das Ausgeben des Ergebnisses auf UART ist nebensächlich - ich möchte nur gern den RC5 Code korrekt empfangen können.

    Der TSOP hängt an PORT D Pin 0

    Wenn möglich die Lösung auch für den CodeVision Compiler.


    Hoffentlich kann mir jemand helfen. Danke im Vorraus.

    churchi

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    28.04.2004
    Ort
    Nähe Köln
    Alter
    50
    Beiträge
    247
    Hallo

    Schau dir mal den Code hier an. Habe den selbst schon im Einsatz gehabt.
    Läuft ohne Probeme der Code, ist aber am Anfang aber nicht ganz leicht zu verstehen.

    Ist aber nicht von mir !

    http://www.mikrocontroller.net/forum...74473.html#new

    Wenn du fragen hast, frage dann halt nochmal. So ganz so einfach, wie du es dir oben vorgestellt hast, ist es leider nicht.

    MFG
    Dieter

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    25.09.2004
    Beiträge
    471
    den Code hab ich auch schon vergeblich versucht einzubinden.
    Die Umwandlung von dem AVRGCC Code in CodeVision Code hab ich geschafft - das is auch nicht schwer...

    aber das mit dem umschreiben auf 16Mhz hat glaub ich nicht geklappt - auf jeden Fall kam nicht das Richtige raus...

    Churchi

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    28.04.2004
    Ort
    Nähe Köln
    Alter
    50
    Beiträge
    247
    Hallo

    Was hast du denn genau geändert ??
    Du solltest nur

    #define XTAL 16.00e6 //für 16 MHz einstellen

    und dann noch anstatt
    TCCR0 = 1<<CS02; //divide by 256

    für den Mega 128

    TCCR0 = (1<<CS02) | (1<<CS01) ; //divide by 256

    einstellen. Und natürlich deinen PIN oben einstellen.

    MFG
    Dieter

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    25.09.2004
    Beiträge
    471
    Ich habe den Code angepasst, jedoch wird alle 0,03ms ein timer0 interrupt ausgelöst - ist das schon richtig? (gemessen über AVR-Studio)

    laut den Einstellungen im TCCR0 müsste der Interrupt ja alle 4096us auftreten.

    Der 1. Interrupt wird auch wirklich nach den 4096us aufgerufen (laut AVR Studio) -- 4096us=(1/(16000000/256))*256
    Alle weiteren jedoch dann immer nach 0,03ms.

    Ich denke, dass der Ausdruck TCNT0 = -2; nicht das tut was er soll.
    Diese 0,03ms ließen sich nämlich daran erklären: 0,03ms=(1/(16000000/256))*2

    Das heißt der Ausdruck TCNT0 = -2; lässt den Zähler nicht bis 256 zählen bis der Interrupt auftritt, sondern nur 2 mal.

    Kann es sein, dass dies aufgrund der verschiedenen Compiler passiert?


    edit:
    da der Ausdruck TCNT0 = -2; nur bewirken soll, dass der Timer bis 512 zählen soll damit der Interrupt auftritt, habe ich jetzt einfach mal eine if Abfrage gemacht, die den Code erst beim 2. mal ausführt (if(++zaehler==....) - das währe dann das selbe als der Ausdruck TCNT0=-2; machen würde.

    Jetzt ist es aber so, dass er erst alle 4096us in den Programmteil kommt.
    Er sollte aber alle 1,78ms da rein kommen...

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    28.04.2004
    Ort
    Nähe Köln
    Alter
    50
    Beiträge
    247
    Hallo
    Der erste INT kommt nach 4096 µs das ist richtig, da der timer0 = 0 ist .

    Alle weiteren INT kommen nach 32 µs. Ist auch richtig. Da timer0 mit TCNT= -2 mit 254 gelden wird. Das macht er deshalb, damit er besser sehen kann, wie oft der INT kommt. TCNT0 ist ja nur eine 8 BIT Variable und -2 entspricht 0xFE. Also der INT kommt nach 256 * 2 = 512 Takten = 32 µs.

    Nach ändern deiner Frequenz und des Vorteiler auf 256 sollte das eigentlich laufen.

    MFG
    Dieter

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    25.09.2004
    Beiträge
    471
    ahsoo - dann stimmt der Kommentar bei TCNT0 = -2; gar nicht?
    Da steht ja: // 2 * 256 = 512 cycle...

    jedoch steht oben bei den defines:
    #define PULSE_MIN (uchar)(XTAL / 512 * RC5TIME * 0.4 + 0.5)
    da steht auch 512 drinnen??


    leider funktioniert das noch immer nicht.

    wie könnte ich jetzt herausfinden was der Fehler ist?
    Ich habe jetzt auch schon andere Philips Fernbedienungen zum ausprobieren, aber mit keiner funktioniert es.

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    28.04.2004
    Ort
    Nähe Köln
    Alter
    50
    Beiträge
    247
    Hallo

    Der Kommentar stimmt schon.

    TCNT0 = -2; // 2 * 256 = 512 cycle...

    In TCNT0 steht dann 254 drin. Nach 256 Takten erhöht sich TCNT0 auf 255. Nach weiteren 256 Takten erfolgt dann der Sprung von 255 --> 256 = 0 . Dann erfolgt der INT. Also 512 Takte !.

    ei mir klappt das auch nur mit einer einzigen alten Fernbedienung. War auch schon am grübeln. Oder bau dir einen kleinen RC5 Sender. Habe noch einen ganz einfachen Code für einen Tiny 12 da. Aber in GGC.

    MFG
    Dieter

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    25.09.2004
    Beiträge
    471
    hmm - ich dachte der TCNT0 erhöht sich bei jedem Takt?
    und wenn der TCNT0 auf 256=0 ist dann kommt der Interrupt?

    Bis jetzt bin ich davon ausgegangen, dass das mit jeder Philips Fernbedienung funktioniert. - da dem anscheinend doch nicht so ist, werd ich mir dann wohl oder übel erstmal noch einen RC5 Sender basteln müssen

    Könntest du mir den Code zukommen lassen?
    Denn ganz so einfach stelle ich mir das RC5 Senden nicht vor - immerhin muss da erst ein 38khz Signal erzeugt werden auf dem dann der RC5 Code aufmoduliert wird...

    Auf jeden Fall mal Danke für die Hilfe!

    churchi

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    28.04.2004
    Ort
    Nähe Köln
    Alter
    50
    Beiträge
    247
    Hallo

    Hier der Code mal. Ist aber eine reine Testversion, läft zwar, ist aber nicht schön gemacht. Die UART Routinen habe ich raus genommen.

    Timming mußt du vielleicht anpassen, asonsten ist der Code recht einfach gehalten.

    MFG
    Dieter
    Angehängte Dateien Angehängte Dateien

+ Antworten
Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Ja
  • Themen beantworten: Ja
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •