- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 28

Thema: RC5 Code von Roboternetz geht nicht

  1. #11
    Neuer Benutzer Öfters hier
    Registriert seit
    30.08.2013
    Beiträge
    9
    Anzeige

    Powerstation Test
    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?

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

  3. #13
    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

  4. #14
    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

  5. #15
    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...

  6. #16
    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

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

  8. #18
    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

  9. #19
    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

  10. #20
    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;
    }

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress