-         

Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 36

Thema: rc5 daten senden mit winavr

  1. #1
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    20.06.2004
    Beiträge
    1.941

    rc5 daten senden mit winavr

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    hallo , ich möchte jetzt mit winavr daten über die ir-diode
    senden zum tsop1736. ich möchte das ganze in einem überschaubaren
    programm begreifen und umsetzen. bei den ir-daten sagt man , die müssen
    über eine frequenz (36khz beim tsop1736) moduliert werden.
    wird das frequensignal beim senden der daten quasi unterbrochen für die datensignale,
    oder müssen die datensignale von einem anderen pin mit an dem
    übertragungspin angeschlossen werden, so das 2x pins als eingang zur didode gehen,
    sozusagen die datensignale plus die frequezsignale. vielleicht hat einer eine gute idee wie man das machen kann. die programme die es gibt machen das nicht so plausibel.
    mfg pebisoft

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    23.05.2004
    Ort
    Untersöchering(Bayern,Alpenvorland)
    Alter
    30
    Beiträge
    215
    Also pepisoft wenn ich das richtig verstanden hab dann wird mittels PWM ein 36kHz Signal erzeugt und mit der Pulsweite(also wie lange low und high) kann man ein Signal/Befehl übertragen. Wenn das so richtig ist könnt ich schon mal bisschen Code dafür schreiben.
    Und wegen deim anderen Problem mit deim Compass. Geht die I2C-libary jetzt? Sie ist halt eigenltich in Assembler geschrieben, deswegen kann ich dazu nichts sagen. Wenn du willst kann ich hier aber I2C-Funktionen von mir hochladen, und du kannst die versuchen. Meine Funktionen sind hauptsächlich der Code aus dem Datenblatt (über I2C gibts einiges an C Code im Datenblatt) mit ein paar Änderungen.
    Gruß Muraad

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    20.06.2004
    Beiträge
    1.941
    hallo, das compassmodul cmps03 kann man mit dem programm von Hagen Reddmann
    im i2c-format und winavr-c auslesen. ich bekomme bei einer 0 bis 360-grad-drehung immer die zahl 0 bis 3600 als wert, also sehr genau.
    "http://www.mikrocontroller.net/forum/read-4-81256.html" dort steht das programm
    um ein i2ceeprom bis 24c512 mit winavr-c zu lesen und zu beschreiben oder das obige compassmodul. das ander programm machte schwierigkeiten beim konfigurieren. nimm das von hagen, kann ich nur empfehlen, ist auch gut lesbar mit einem kleinen verständlichen externen asm-anteil. den rc5-code habe ich noch nicht ganz verstanden.
    dank deiner informellen hilfe bin ich so gut vorangekommen.
    mfg pebisoft

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    20.06.2004
    Beiträge
    1.941
    hallo, die signale werden mit dem 36khz ausgegeben (aufmoduliert,
    weiss nicht was das heisst). besteht aus 14 bit. die gesamte signalzeit beträgt
    114ms, ein bit dauert 1,778ms. sendezeit also 1,778ms*14=25ms sowie
    anschliessend 89ms pause. alle bits werden bitphasencodiert gesendet, das
    heisst in der mitte der bitzeit wird der logische zustand gewechselt.
    ein low auf high bedeutet eine 0, ein wechsel von high auf low eine 1.
    ein zustand dauert dann 0,889us ist also dann 1778us für ein komplettes bit.

    mfg pebisoft

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.08.2004
    Ort
    Zwolle
    Alter
    61
    Beiträge
    531
    Hallo pebisoft,

    ich hab mahl geguck wie dass bei Asuro Roboter gemacht wird.


    PB3 --------R220OHM--------(+)IRDIODE(-)--------PD1

    An PB3 steht immer 36KHz und die daten kommen aus PD1.

    Wenn PD1 hoch ist wird kein IR-Signal ausgestrahlt.
    Denn
    - wenn PB3 hoch ist und PD1 hoch, lauft kein Strom.
    - wenn PB3 niedrich ist und PD1 hoch, lauft auch kein Strom weil die
    IRDIODE dann gesperrt ist.
    Wenn PD1 niedrich ist wird ein IR-Signal ausgestrahlt.

    Dass 36KHz signal an PB3 wird von einem timer erzeugt.
    Und PD1 ist die USART TX ausgang.

    gruss

    Henk

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    20.06.2004
    Beiträge
    1.941
    mich würde mal das zusammenspiel zwischen dem pb3 und pd1 interessieren. warum ist er am usart-anschluss tx, wie werden dort die datenbits erzeugt.
    mfg pebisoft

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.08.2004
    Ort
    Zwolle
    Alter
    61
    Beiträge
    531
    Das 36KHz signal PB3 ist immer anwesend.

    Die Asuro communiziert glaube ich nicht mit RC5 oder sonstiges sondern nur mit 'ubliche' serielle schnitstelle signalen. Da kann man z.B. 2400baud, 1 startbit, 8 datenbits, 1 stopbit anwenden. Startbit is 36KHz eingeschaltet (PD1 niedrich), 1-bit ist 36KHz eingeschaltet (PD1 niedrich) , 0-bit ist 36KHz ausgeschaltet (PD1 hoch)

    So kann mann einfach die USART benutzen und brauch mann nicht selber die richtige zeitablauf irgendwo zu programmieren.

    gruss
    Henk

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    23.05.2004
    Ort
    Untersöchering(Bayern,Alpenvorland)
    Alter
    30
    Beiträge
    215
    pepisoft ich weis nicht ob du schon bei www.mc-project.de warst aber da wird es ganz gut erklärt. Sind auch Beispielfunktionen dabei.
    Und nochmal zur erklärung:
    Es wird mit PWM(Timer0/Timer1) ein 36kHz Signal erzeugt. Ein anderer Timer wird dann in der rc5_send() Funktion so eingestellt das er den PWM Pin des ersten Timers für die gewünschte Zeit auf Ausgang schaltet.
    Wobei der zweite Timer so eingestellt werden sollte das er auch wieder 1micro sekunde für einen Tackt braucht, dadurch kann man die Zeit leicht mit unseren srf04 Funktionen messen.
    Ich finde es aber umständlich mit 2 Timern. Besser wäre es mit dem Timer IC 555 ein 36kHz Signal zu erzeugen, und vom ATmega aus, mit einem unwichtigen Timer, den Timer IC für die gewünschte Zeit anschalten. Hoffe man konnte es verstehen.
    Gruß Muraad

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    20.06.2004
    Beiträge
    1.941
    hallo muraad, dieses demo sendet 2 zahlen (10,20), es soll ja gemäss aussage 8 zahlen senden können. wie kann man es ändern, das es ein byte (8bit) sendet die man dann empfnagen kann. er hat dort 2x timecount in einem bereich von-bis abgefragt. wie weit geht eigentlich die von-bis abfrage wenn ich z.b. 8 byte abfragen kann und wie könnte man das nutzen für 8 bit.
    mfg pebisoft

    Code:
    /* IR-Routine:
    Es werden unterschiedlich lange Impulse gesendet und vom Empfänger ausgewertet.
    Exemplarisch werden 10 verschiedene Längen implementiert, wovon jeder dann als
    Befehl betrachtet werden kann. Dies ist zunächst die trivialste Variante, reicht
    aber für einfach Fernsteuerungen aus.
    Variation von pulse: 10 ... 20 ... 30 ...... 100*/
    
    #include <avr/io.h>
    #include <avr/signal.h>
    #include <avr/interrupt.h>
    #include <lcd.c>
    
    //#define send
    #define receive
    
    #ifdef send
    volatile unsigned char empty = 0;
    volatile unsigned char pulse = 0;
    
    SIGNAL (SIG_OVERFLOW0) {
    	if (pulse) {
    		DDRB |= (1<<PB1);
    		empty = 1;
    		pulse--;
    	}
    	if (!pulse) {
    		empty = 0;
    		DDRB &= ~(1<<PB1);
    	}
    }
    
    void ir_init_send (void) {
    	//36kHz Träger
    	TCCR1A = (1<<COM1A1) | (1<<COM1A0) | (1<<WGM11);
    	TCCR1B = (1<<WGM12) | (1<<WGM13) | (1<<CS10);
    	OCR1A = 111;
    	ICR1 = 222;
    	//Timer-Interrupt alle 2,048ms zur Signalerzeugung --> 1/(8MHz/256/64)
    	TCCR0 = (1<<CS01) | (1<<CS00);                  //Prescaler von 64
        TIMSK |= (1<<TOIE0);                            //Timer0 Overflow Interrupt aktivieren
    }
    
    void ir_send (unsigned char byte) {
    	//Senderoutine
    	if (!empty)
    		pulse = byte;
    }
    #endif
    
    #ifdef receive
    volatile unsigned short timecount = 0;
    volatile unsigned char empty = 0;
    volatile unsigned char rec_byte = 0;
    
    SIGNAL (SIG_OVERFLOW0) {
    	//-----<allgemein>-------
    	if (!(PINB & (1<<PB0))) {								//Low-Pegel = log. 1 am Sender
    		timecount++;
    		empty = 1;
    	}
    	else {
    		empty = 0;
    	}
    	if ((!empty) && (timecount)) {
    	//-----<Auswertung>------			//8fache Abtastung
    		if ((timecount > 70) && (timecount < 90)) {		//pulse war 10
    			rec_byte = 10;
    		}
    		if ((timecount > 150) && (timecount < 170)) {		//pulse war 20
    			rec_byte = 20;
    		}
    		timecount = 0;
    	}
    	
    }
    
    void ir_init_receive (void) {
    	//Abtastung realisieren
    	//Timer-Interrupt alle 0,256ms zum Signalempfang --> 1/(8MHz/256/8)
    	TCCR0 |= (1<<CS01);                             //Prescaler von 8
        TIMSK |= (1<<TOIE0);                            //Timer0 Overflow Interrupt aktivieren
    	lcd_init (LCD_DISP_ON);
    }
    
    unsigned char ir_receive (void) {
    	//Empfangsroutine
    	return rec_byte;
    }
    #endif
    
    
    int main (void) {
    	#ifdef send
    	ir_init_send ();
    	DDRC &= ~(1<<PC5);
    	#endif
    	#ifdef receive
    	ir_init_receive ();
    	#endif
    	sei ();
    	for (;;) {
    		#ifdef send
    		if (!(PINC & (1<<PC5))) {
    			delay (65000);				//Entprellung
    			ir_send (10);
    		}
    		if (!(PINC & (1<<PC4))) {
    			delay (65000);				//Entprellung
    			ir_send (20);
    		}
    		#endif
    		#ifdef receive
    		if (rec_byte) {
    			lcd_gotoxy (0,0);
    			if (rec_byte == 10)
    				lcd_puts ("10");
    			if (rec_byte == 20)
    				lcd_puts ("20");
    		}
    		#endif
    	}
    	return 0;
    }

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    23.05.2004
    Ort
    Untersöchering(Bayern,Alpenvorland)
    Alter
    30
    Beiträge
    215
    Mir ist auch nicht ganz klar wie er das timecount auswertet.
    Ich hab grad den Code abgeändert so das man Zahlen zwischen 1 und 255 hätte senden können, aber dann hab ich gelesen das die Frequenz des aufmodulierten Nutzsignals um einiges höher sein muss als 36kHz. Aber was heisst "um einiges höher", reicht 4,7 mal höher?
    Wenn ja post ich den Code, wenn nicht dann ist das garnicht so einfach.
    Aber muss es den gleich ein ganzen Byte zu versenden sein oder reichen dir nicht vielleicht so 50 Befehle die erkannt werden, das würde es wieder einfacher machen.
    Gruß Muraad

Seite 1 von 4 123 ... LetzteLetzte

Berechtigungen

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