- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 10 von 28

Thema: RC5 Code von Roboternetz geht nicht

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter-Spezialist Avatar von steveLB
    Registriert seit
    24.10.2005
    Beiträge
    481
    Hast du mal gelesen was der Code macht? Hast ihn grob versteanden ?

    wegen : " SeveLB hat oben geschrieben das ich den Pin PD2 noch als eingang setzten muss, doch im Original Thread steht " der INT port wird nicht als IN gesetzt" jetzt bin ich verwirrt."

    Es steht doch :" /* der ensprechende INT-Port muss INPUT sein */ " wenn du mal den ersten Link, zum Artikel nimmst.
    Also setzte den auch auf Input. Und wenn du wieder mal verwirrt bist, dann probiere beide Möglichkeiten aus .

    in der Klammer von :
    if (-1 == rc5.flip)
    { .. }
    kommt nichts rein, es bleibt nur der eine Kommentar (" // Nein, dann mach irgendwas (oder nix)") drinnen.
    danach kommt die Klammer der
    else {.. } ,
    hier wird der Tastendruck ausgewertet. Aber wie ? Ganz einfach es wird in der Variablen "addr" die Adresse und in der Variablen " code" der RC5 Code reingeschrieben, mehr nicht, alles andere passiert von alleine im Interrupt. Also in code ist jetzt der code der Taste gespeichert die du gedrückt hast.
    Somit musst du hier so was machen:
    if(code == 33)
    { ... // was getan werden soll beim druck der Taste mit dem Code 33 }

    33 und 32 sind entweder Volume up/ down oder Channel up/down auf einer Fernbedienung mit RC5.
    [X] <-- Nail here for new Monitor

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    30.08.2013
    Beiträge
    9
    Ich habe jedenfall den code der Main funktion verstanden. Mir ist auch klar das in die If klammer eigentlich nichts reinkommt und man in else den code auswerten kann.
    Das Problem ist nur es Funktioniert nicht. Und ich habe alles erdenkliche ausprobiert, schon bevor ich hier gepostet habe

    Also ich habe jetzt mal versucht das so schier wie möglich zu gestalten, würde mich sehr freuen wenn jemand die zeit finden könnte mal drüber zu gucken ob ich einen fehler drinn habe, denn ich weiß beim besten willen nicht mehr was es sein könnte (sitze schon seit 2 Tagen daran)

    Ich musste in der RC5.c noch SIGNAL (SIG_OVERFLOW0) in ISR(TIMER0_OVF_vect) außerdem
    SIGNAL (SIG_INTERRUPT0) in ISR(INT0_vect) und SIGNAL (SIG_INTERRUPT1) in ISR(INT0_vect) umwandeln- damit der compiler nicht mehr meckert ( habe nachgelesen das die befehle veraltet waren)

    application.c :

    Code:
    #define F_CPU 16000000UL
       
    #include <util/delay.h>
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <stdint.h>
    #include "rc5.h"			
    
    
    int main(void)
    {	//Eingangsport Init
    	DDRB = 0b11111111;
    	
    	
    	DDRD &= ~(1<<PD2);	// eingang fuer TSOP-DATA
    	//PORTD |= (1<<PD2); // Pull Up
    	
    
        /* der ensprechende INT-Port muss INPUT sein */
        /* RC5 initialisieren, alle Adressen zulassen */
        rc5_init (RC5_ALL);
    
        /* Interrupts zulassen */
        sei();
    
        while(1)
        {
            /* Gibt's was Neues? */
               if (-1 == rc5.flip)
               {
                  /* Nein, dann mach irgendwas (oder nix) */
    			 
               }
               else
               {
                  /* Ja, dann rc5.code merken und evtl. rc5.addr */
                  /* falls man die braucht und nicht sowieso schon kennt */
                  /*code = rc5.code;
                  addr = rc5.addr;*/
    
                uint8_t code = rc5.code;
                uint8_t addr = rc5.addr;
    
    
                //Reaktion auf Tastendruck
    			
    					
    				 PORTB = 0b11111111;
    				 _delay_ms(10);
    				  PORTB = 0b00000000;
    				 _delay_ms(10);
    				 PORTB = 0b11111111;
    				 _delay_ms(10);
    				
    			
    				 /* und auf naechstes Zeichen warten */
    				rc5.flip = -1;
          
    				/* code (evtl. addr) auswerten */
    			
               }
        }
        return 0;
    }
    rc5.h:
    Code:
    #ifndef _RC5_H_
    #define _RC5_H_
    
    #include <inttypes.h>
    
    #define RC5_INT0 0
    #define RC5_INT1 1
    
    #define RC5_ALL 0xff
    
    typedef struct
    {
    	uint8_t code;
    	uint8_t addr;
    	volatile signed char flip;
    } rc5_t;
    
    extern rc5_t rc5;
    extern void rc5_init (uint8_t addr);
    
    #endif /* _RC5_H_ */ [/c]
    rc5.c:
    Code:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include "rc5.h"
    
    #define F_CPU 16000000UL
    
    #ifndef RC5_INT
    #define RC5_INT      RC5_INT0
    #endif  /* RC5_INT */
    
    #ifndef RC5_PRESCALE
    #define RC5_PRESCALE 1024
    #endif  /* RC5_PRESCALE */
    
    /* ******************************************************************************** */
    
    rc5_t rc5;
    
    /* ******************************************************************************** */
    
    #ifndef F_CPU
    #error Please define F_CPU
    #endif /* !F_CPU */
    
    /* µs for a whole bit of RC5 (first & second part) */
    #define RC5_BIT_US   (64*27)
    
    #define RC5_TICKS \
    ((uint8_t) ((uint32_t) (F_CPU / 1000 * RC5_BIT_US / 1000 / RC5_PRESCALE)))
    
    #define RC5_DELTA \
    (RC5_TICKS / 6)
    
    typedef union
    {
    	uint16_t w;
    	uint8_t  b[2];
    } code_t;
    
    static code_t code;
    static uint8_t rc5_addr;
    
    /* Number of Bits received so far */
    /* Number of Interrupts occured so far */
    static uint8_t nbits;
    static uint8_t nint;
    
    /* ******************************************************************************** */
    
    void rc5_init (uint8_t addr)
    {
    	nint  = 0;
    	nbits = 0;
    	rc5.flip = -1;
    	
    	rc5_addr = addr;
    	
    	#if (RC5_PRESCALE==1024)
    	TCCR0 = (1 << CS02) | (1 << CS00);
    	#elif   (RC5_PRESCALE==256)
    	TCCR0 = (1 << CS02);
    	#elif   (RC5_PRESCALE==64)
    	TCCR0 = (1 << CS01) | (1 << CS00);
    	#else
    	#error This RC5_PRESCALE is not supported
    	#endif /* RC5_PRESCALE */
    	
    	/* INTx on falling edge */
    	/* clear pending INTx */
    	/* enable INTx interrupt */
    	#if (RC5_INT == RC5_INT0)
    	MCUCR = (MCUCR | (1 << ISC01)) & ~ (1 << ISC00);
    	GIFR = (1 << INTF0);
    	GICR |= (1 << INT0);
    	#elif (RC5_INT == RC5_INT1)
    	MCUCR = (MCUCR | (1 << ISC11)) & ~ (1 << ISC10);
    	GIFR = (1 << INTF1);
    	GICR |= (1 << INT1);
    	#else
    	#error please define RC5_INT
    	#endif /* RC5_INT */
    }
    
    /* ******************************************************************************** */
    
    ISR(TIMER0_OVF_vect)
    {
    	TIMSK &= ~(1 << TOIE0);
    	
    	uint8_t _nbits = nbits;
    	code_t _code = code;
    	
    	if (26 == _nbits)
    	{
    		_nbits++;
    		_code.w <<= 1;
    	}
    	
    	if (27 == _nbits
    	&& _code.b[1] >= 0x30 /* AGC == 3 */
    	&& 0 > rc5.flip)
    	{
    		uint8_t _rc5_code;
    		uint8_t _rc5_addr;
    		/* we do the bit manipulation stuff by hand, because of code size */
    		_rc5_code = _code.b[0] & 0x3f; /* 0b00111111 : #0..#5 */
    		_code.w <<= 2;
    		_rc5_addr = _code.b[1] & 0x1f; /* 0b00011111 : #6..#10 */
    		
    		if (rc5_addr & 0x80
    		|| rc5_addr == _rc5_addr)
    		{
    			rc5.code = _rc5_code;
    			rc5.addr = _rc5_addr;
    			signed char flip = 0;
    			if (_code.b[1] & 0x20) /* 0b00100000 : #11 */
    			flip = 1;
    			rc5.flip = flip;
    		}
    	}
    	
    	nint = 0;
    	nbits = 0;
    	
    	/* INTx on falling edge */
    	/* clear pending INTx */
    	/* enable INTx interrupt */
    	#if (RC5_INT == RC5_INT0)
    	MCUCR = (MCUCR | (1 << ISC01)) & ~ (1 << ISC00);
    	GIFR = (1 << INTF0);
    	GICR |= (1 << INT0);
    	#elif (RC5_INT == RC5_INT1)
    	MCUCR = (MCUCR | (1 << ISC11)) & ~ (1 << ISC10);
    	GIFR = (1 << INTF1);
    	GICR |= (1 << INT1);
    	#endif
    }
    
    /* ******************************************************************************** */
    
    #if (RC5_INT == RC5_INT0)
    ISR(INT0_vect)
    #elif (RC5_INT == RC5_INT1)
    ISR(INT1_vect)
    #endif /* RC5_INT */
    {
    	code_t _code = code;
    	uint8_t _nint = nint;
    	
    	uint8_t tcnt0 = TCNT0;
    	TCNT0 = 0;
    	
    	if (0 == _nint)
    	{
    		/* INTx on both edges */
    		#if (RC5_INT == RC5_INT0)
    		MCUCR = (MCUCR | (1 << ISC00)) & ~ (1 << ISC01);
    		#elif (RC5_INT == RC5_INT1)
    		MCUCR = (MCUCR | (1 << ISC10)) & ~ (1 << ISC11);
    		#endif /* RC5_INT */
    		
    		TIFR = (1 << TOV0);
    		TIMSK |= (1 << TOIE0);
    		_code.w = 0;
    	}
    	else
    	{
    		/* Number of bits of the just elapsed period */
    		uint8_t n = 1;
    		
    		/* Bits received so far */
    		uint8_t _nbits = nbits;
    		
    		/* is TCNT0 close to RC5_TICKS or RC5_TICKS/2 ? */
    		if (tcnt0 > RC5_TICKS + RC5_DELTA)
    		goto invalid;
    		else if (tcnt0 < RC5_TICKS/2 - RC5_DELTA)
    		goto invalid;
    		else if (tcnt0 > RC5_TICKS - RC5_DELTA)
    		n = 2;
    		else if (tcnt0 > RC5_TICKS/2 + RC5_DELTA)
    		goto invalid;
    		
    		/* store the just received 1 or 2 bits */
    		do
    		{
    			_nbits++;
    			if (_nbits & 1)
    			{
    				_code.w <<= 1;
    				_code.b[0] |= _nint & 1;
    			}
    		}
    		while (--n);
    		
    		if (0)
    		{
    			invalid:
    			
    			/* disable INTx, run into Overflow0 */
    			#if (RC5_INT == RC5_INT0)
    			GICR &= ~(1 << INT0);
    			#elif (RC5_INT == RC5_INT1)
    			GICR &= ~(1 << INT1);
    			#endif /* RC5_INT */
    
    			_nbits = 0;
    		}
    		
    		nbits = _nbits;
    	}
    
    	code = _code;
    	nint = 1+_nint;
    }
    Ich habe auch via If anweisung versucht den code 12 (PWR Taste) abzufragen.. klappt auch nicht.
    Was allerding funktioniert ist wenn ich den Port INT0 (PD2) einfach auf LOW abfrage, dann bekomme ich Flanken angezeigt auf dem Oscilloscope beim Tastendruck.
    Geändert von wolf7272 (31.08.2013 um 12:27 Uhr)

  3. #3
    Erfahrener Benutzer Roboter-Spezialist Avatar von steveLB
    Registriert seit
    24.10.2005
    Beiträge
    481
    Der Code scheint ok zu sein. ich benutzte aber SIGNAL und include

    // Für alte avr-gcc Versionen
    #ifndef SIGNAL
    #include <avr/signal.h>
    #endif // SIGNAL

    Die Schaltung selber könnte es noch sein, oder falls du ein makefile z.B. bei Programmer Notepad [Win avr] benutzt, das du hier dein rc5.c nicht eingefügt hast
    # List C source files here. (C dependencies are automatically generated.)
    SRC = $(TARGET).c lcd.c rc5.c

    was ich noch gesehen habe in deiner obigen rc5.h steht

    #endif /* _RC5_H_ */ [/c]

    was soll das [/c] ?
    Geändert von steveLB (31.08.2013 um 14:29 Uhr)
    [X] <-- Nail here for new Monitor

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    30.08.2013
    Beiträge
    9
    das "// Für alte avr-gcc Versionen
    #ifndef SIGNAL
    #include <avr/signal.h>
    #endif // SIGNAL"
    habe ich herausgenommen weils ja nichtmehr benötigt wird.

    und das "[/c]" stammt aus dem forum post und gehört nich zum code

    Ich arbeite mit dem Atmel Studio der neusten generation, dachte das makefile wird automatisch generiert-sieht auch so aus als währen die Datein geliste im makefile.
    Oder muss ich etwa doch noch deine "source file" deklaration mit reinnehmen? Wenn ja in die makefile oder makedept?

  5. #5
    Erfahrener Benutzer Roboter-Spezialist Avatar von steveLB
    Registriert seit
    24.10.2005
    Beiträge
    481
    hm, ich benutzte AVR studio nur zum überspielen der hex. Ich hab das AVR Studiu nicht mehr benutzt weil ich damals probleme hatte andere .c und .h datein mit einzubinden, ich glaub sogar mit der rc5 wenn ich mich recht erinnere, seit dem benutz ich nur noch programmers notepad win avr.
    Kurzzeitig habe ich es gelöst indem ich alles aus der rc5 .c und .h in die main copiert und angepasst habe.

    Villeicht hast du auch kein rechtsklick auf "Source Files " gemacht und "add existing sourcefiles" ausgewählt, um das rc5.c einzufügen.

    Lies auch mal folgende Beiträge:
    http://www.mikrocontroller.net/topic/263951
    http://www.mikrocontroller.net/topic/137661
    http://www.mikrocontroller.net/artic...e_ich_damit.3F
    [X] <-- Nail here for new Monitor

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    30.08.2013
    Beiträge
    9
    Ich denke eingebunden habe ich die dateien richtig. Es werden auch im debugg ordner makefile / rc5.o und GccApllication.o und natürlich die GccApllication.hex erzeugt.
    Allerdings wenn ich mir die Grafik auf der seite deines letzten Links angucke, glaube ich das da eine *.a datei fehlt? Muss von der rc5.h eine rc5.a datei durchs compilieren erstellt werden?

    Und ob ich noch etwas ins makefile eintrage muss ist mir auch unschlüssig. habe diesbezüglich 2 dateien:

    makefile:

    Code:
    ################################################################################
    # Automatically-generated file. Do not edit!
    ################################################################################
    
    SHELL := cmd.exe
    RM := rm -rf
    
    USER_OBJS :=
    
    LIBS := 
    PROJ := 
    
    O_SRCS := 
    C_SRCS := 
    S_SRCS := 
    S_UPPER_SRCS := 
    OBJ_SRCS := 
    ASM_SRCS := 
    PREPROCESSING_SRCS := 
    OBJS := 
    OBJS_AS_ARGS := 
    C_DEPS := 
    C_DEPS_AS_ARGS := 
    EXECUTABLES := 
    OUTPUT_FILE_PATH :=
    OUTPUT_FILE_PATH_AS_ARGS :=
    AVR_APP_PATH :=$$$AVR_APP_PATH$$$
    QUOTE := "
    ADDITIONAL_DEPENDENCIES:=
    OUTPUT_FILE_DEP:=
    LIB_DEP:=
    
    # Every subdirectory with source files must be described here
    SUBDIRS := 
    
    
    # Add inputs and outputs from these tool invocations to the build variables 
    C_SRCS +=  \
    ../GccApplication2.c \
    ../rc5.c
    
    
    PREPROCESSING_SRCS += 
    
    
    ASM_SRCS += 
    
    
    OBJS +=  \
    GccApplication2.o \
    rc5.o
    
    OBJS_AS_ARGS +=  \
    GccApplication2.o \
    rc5.o
    
    C_DEPS +=  \
    GccApplication2.d \
    rc5.d
    
    C_DEPS_AS_ARGS +=  \
    GccApplication2.d \
    rc5.d
    
    OUTPUT_FILE_PATH +=GccApplication2.elf
    
    OUTPUT_FILE_PATH_AS_ARGS +=GccApplication2.elf
    
    ADDITIONAL_DEPENDENCIES:=
    
    OUTPUT_FILE_DEP:= ./makedep.mk
    
    LIB_DEP+= 
    
    # AVR32/GNU C Compiler
    
    
    
    
    
    ./%.o: .././%.c
    	@echo Building file: $<
    	@echo Invoking: AVR/GNU C Compiler : 3.4.2
    	$(QUOTE)D:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.2.1002\avr8-gnu-toolchain\bin\avr-gcc.exe$(QUOTE)  -funsigned-char -funsigned-bitfields -DDEBUG  -O1 -ffunction-sections -fdata-sections -fpack-struct -fshort-enums -g2 -Wall -mmcu=atmega8 -c -std=gnu99 -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)"   -o "$@" "$<"
    	@echo Finished building: $<
    	
    
    
    
    # AVR32/GNU Preprocessing Assembler
    
    
    
    # AVR32/GNU Assembler
    
    
    
    
    ifneq ($(MAKECMDGOALS),clean)
    ifneq ($(strip $(C_DEPS)),)
    -include $(C_DEPS)
    endif
    endif
    
    # Add inputs and outputs from these tool invocations to the build variables 
    
    # All Target
    all: $(OUTPUT_FILE_PATH) $(ADDITIONAL_DEPENDENCIES)
    
    $(OUTPUT_FILE_PATH): $(OBJS) $(USER_OBJS) $(OUTPUT_FILE_DEP) $(LIB_DEP)
    	@echo Building target: $@
    	@echo Invoking: AVR/GNU Linker : 3.4.2
    	$(QUOTE)D:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.2.1002\avr8-gnu-toolchain\bin\avr-gcc.exe$(QUOTE) -o$(OUTPUT_FILE_PATH_AS_ARGS) $(OBJS_AS_ARGS) $(USER_OBJS) $(LIBS) -Wl,-Map="GccApplication2.map" -Wl,--start-group -Wl,-lm  -Wl,--end-group -Wl,--gc-sections -mmcu=atmega8 
    	@echo Finished building target: $@
    	"D:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.2.1002\avr8-gnu-toolchain\bin\avr-objcopy.exe" -O ihex -R .eeprom -R .fuse -R .lock -R .signature  "GccApplication2.elf" "GccApplication2.hex"
    	"D:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.2.1002\avr8-gnu-toolchain\bin\avr-objcopy.exe" -j .eeprom  --set-section-flags=.eeprom=alloc,load --change-section-lma .eeprom=0  --no-change-warnings -O ihex "GccApplication2.elf" "GccApplication2.eep" || exit 0
    	"D:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.2.1002\avr8-gnu-toolchain\bin\avr-objdump.exe" -h -S "GccApplication2.elf" > "GccApplication2.lss"
    	"D:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.2.1002\avr8-gnu-toolchain\bin\avr-objcopy.exe" -O srec -R .eeprom -R .fuse -R .lock -R .signature  "GccApplication2.elf" "GccApplication2.srec"
    	"D:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.2.1002\avr8-gnu-toolchain\bin\avr-size.exe" "GccApplication2.elf"
    	
    	
    
    
    
    
    
    # Other Targets
    clean:
    	-$(RM) $(OBJS_AS_ARGS) $(EXECUTABLES)  
    	-$(RM) $(C_DEPS_AS_ARGS)   
    	rm -rf "GccApplication2.elf" "GccApplication2.a" "GccApplication2.hex" "GccApplication2.lss" "GccApplication2.eep" "GccApplication2.map" "GccApplication2.srec"
    und eine makedep.mk mit folgendem inhalt:

    Code:
    ################################################################################
    # Automatically-generated file. Do not edit or delete the file
    ################################################################################
    
    GccApplication2.c
    
    rc5.c

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523
    Der Code scheint ok zu sein. ich benutzte aber SIGNAL und include

    // Für alte avr-gcc Versionen
    #ifndef SIGNAL
    #include <avr/signal.h>
    #endif // SIGNAL
    Das hat man nicht grundlos entfernt. Dieses Signal war unpassend von der Namensgebung und andere Compiler verwenden auch ISR. Dadurch ergibt sich bessere portabilität. Also Signal bitte nicht mehr nutzen!!

    dachte das makefile wird automatisch generiert-sieht auch so aus als währen die Datein geliste im makefile.
    Wird auch automatisch erstellt. An den Dateien nichts ändern!! Dadurch machst du es nur noch schlimmer!


    Wie siehts denn aktuell aus? Kurzes Update, da die letzten Posts doch etwas wirr waren.

    mfg

Berechtigungen

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

12V Akku bauen