- 3D-Druck Einstieg und Tipps         
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
    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

  2. #2
    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

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    30.08.2013
    Beiträge
    9
    Akueller Status:

    Ich kann alles compilieren und passende dateien wurden erstellt.
    Doch nach überspielen des .hex file, reagiert der Atmega8 auf keinen Tastendruck der fernbediehnung.

    Kann es sein das die rc5.h nicht richtig eingebuden ist wenn sie nirgend im makefile erwähnt wird? Die andern beiden Dateien stehen drinn!
    Ich hab die rc5.h zwar im solution exporer und im selbigen ordner wie die .c dateien, jeddoch nichts im release ordner wo die fertig compilierten sachen stehen, bzw auch nichts im makefile von der .h zu sehen...

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523
    Kann es sein das die rc5.h nicht richtig eingebuden ist wenn sie nirgend im makefile erwähnt wird?
    Da in einem Headerfile kein Quellcode zum kompilieren steht, gibts auch kein Kompilat.

    Schließ mal ne LED am Port B an und in der INT0 ISR setzt du dann den Port auf Output. Wenn die LED nach einem Tastendruck leuchtet, dann funktionieren schon mal die Interrupts korrekt und der Fehler liegt wo anders.

    mfg

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    30.08.2013
    Beiträge
    9
    So ich habe im Interrupt "ISR(TIMER0_OVF_vect)" einen 10ms langen puls eingebaut.
    Dieser wird erfolgreich nach jedem Tastendruck auf den Ausgang gegeben!

    Ich habe diesen Puls auch einmal testweise in die If Anweisung in der Main gelegt und festgestellt, dass immer nur die If-Anweisung "WAHR" ist, das programm aber nie in "else" springt.

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523
    Code:
    #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; }
    Bei den ganzen if's wird geprüft, ob der Impuls falsch ist. Wenn alles korrekt ist wird die do-while ausgeführt. Prüfe da mal was angesprungen wird.

    EDIT: SCH****ß Formatierung -.-
    Die if-else abfragen in der INT0 ISR mit der darauffolgenden do-while-schleife

    mfg

  7. #7
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Was das timing anbelangt dürfte das Programm ziemlich heikel sein.
    Hab das mal auf meinem Pollin-Board aufgebaut und getestet. In der uart-Ausgabe springt der Cursor, zeigt aber nichts an.
    Ein anderes RC5-Programm läuft einwandfrei.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    30.08.2013
    Beiträge
    9
    So ich hab nun alle möglichkeiten durchgetestet und im Code dokumentiert, ich würde mich sehr freuen wenn du mir anhand dieser Information Näheres sagen könntest:

    Code:
    #if (RC5_INT == RC5_INT0)
    ISR(INT0_vect)
    #elif (RC5_INT == RC5_INT1)
    ISR(INT1_vect)
    #endif /* RC5_INT */
    {
    	
    	// Hier impuls sync mit tastendruck
    	 
    	code_t _code = code;
    	uint8_t _nint = nint;
    	
    	uint8_t tcnt0 = TCNT0;
    	TCNT0 = 0;
    	
    	if (0 == _nint)
    	{
    		
    		// Hier impulse mit erster fallender Flanke
    		 
    		/* INTx on both edges */
    		#if (RC5_INT == RC5_INT0)
    		
    		// Hier impulse mit erster fallender Flanke
    		
    		MCUCR = (MCUCR | (1 << ISC00)) & ~ (1 << ISC01);
    		#elif (RC5_INT == RC5_INT1)
    		
    		//Hier geht er nicht rein, wegen nutzung von INT0
    		
    		MCUCR = (MCUCR | (1 << ISC10)) & ~ (1 << ISC11);
    		#endif /* RC5_INT */
    		
    		TIFR = (1 << TOV0);
    		TIMSK |= (1 << TOIE0);
    		_code.w = 0;
    		
    		// Hier impulse mit erster fallender Flanke
    		
    	}
    	else
    	{
    		// Hier impulse mit erster steigender Flanke
    		
    		/* 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){
    			// Hier impulse mit erster steigender Flanke
    			
    		goto invalid;}
    		else if (tcnt0 > RC5_TICKS - RC5_DELTA){
    			// Hier geht er nicht rein!!
    			
    		n = 2;}
    		else if (tcnt0 > RC5_TICKS/2 + RC5_DELTA){
    			// Hier geht er nicht rein!!
    			
    		goto invalid;}
    		
    		/* store the just received 1 or 2 bits */
    		do
    		{ 
    			// Hier geht er nicht rein!!!
    			
    			_nbits++;
    			if (_nbits & 1)
    			{
    				_code.w <<= 1;
    				_code.b[0] |= _nint & 1;
    			}
    		}
    		while (--n);
    		
    		if (0)
    		{
    			// Hier geht er nicht rein!!
    			
    				 
    			invalid:
    			
    			/* disable INTx, run into Overflow0 */
    			#if (RC5_INT == RC5_INT0)
    			
    				// Hier geht er mit erster steigenden Flanke rein
    				
    			GICR &= ~(1 << INT0);
    			#elif (RC5_INT == RC5_INT1)
    			
    			GICR &= ~(1 << INT1);
    			#endif /* RC5_INT */
    			
    			// Hier geht er mit erster steigenden Flanke rein
    			
    			_nbits = 0;
    		}
    		
    		// Hier geht er mit erster steigenden Flanke rein
    		
    		nbits = _nbits;
    	}
    	
    	// Hier geht er mit erster fallenden Flanke rein
    	
    	code = _code;
    	nint = 1+_nint;
    }

Berechtigungen

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

Labornetzteil AliExpress