- LiFePO4 Speicher Test         
Ergebnis 1 bis 4 von 4

Thema: RC5-Decoder für ATMega

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    16.10.2005
    Beiträge
    8

    RC5-Decoder für ATMega

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo habe mal ein paar Fragen zum dem Artikel RC5-Decoder für ATMega im RN-Wissen bzw auch nen kleines Problem. Ich verwende einen Mega8 mit 16Mhz. Wie angegeben und kann einen Hardware defekt ausschließen.
    Mein Ziel ist, bevor ich mein Bot steuern will, erstmal den Code über UART auf dem Rechner auszugeben. Benutze die Uart-Libary von Peter Fleury. Hat bereits in anderen Projekten super funktioniert. Hier meine Main.c:
    Code:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    
    #include "rc5.h"
    #include "uart.h"
    
    #ifndef F_CPU
    #define F_CPU 16000000UL
    #endif
    
    #define UART_BAUD_RATE      9600      
    
    
    int main (void)
    {
        char s[30];
    	DDRD = 0x00;
    	// der ensprechende INT-Port muss INPUT sein
    	// RC5 initialisieren, alle Adressen zulassen
    	rc5_init (RC5_ALL);
    
    	// Interrupts zulassen
    	sei();
    	// FIXME: ei2gentlich sollte es nicht nötig sein, das atomar zu machen
    	// Code atomar machen
    	uart_puts("Reddy");
    	uint8_t sreg = SREG;
    	cli();
    	// Gibt's was Neues?
    	if (-1 == rc5.flip)
    	{
    		// Nein, dann
    		// atomaren Block beenden	
    		SREG = sreg;
    		// ...und zurück (oder sonst was machen)
    		//return;
    	}
    	// Ja, dann code merken, und evtl. rc5.addr, falls man die nicht sowieso kennt
    	uint8_t code = rc5.code;
    	// und auf nächstes Zeichen warten
    	rc5.flip = -1;
    	
    	// atomaren Block beenden
    	SREG = sreg;
    	// code (evtl. addr) auswerten
    	
        itoa( code , s , 10);	
        uart_puts("Code:");
        uart_puts( s );
     }
    Jetzt zu meinen Fragen:
    • Enthält Code die Geräteadresse oder nur die Tastencode? Was macht SREG, was beduetet Atomar machen und FIXME?
    Außerdem folgende warnings
    • rc5.c:101: warning: comparison is always false due to limited range of data type
    • main.c:30: warning: comparison is always false due to limited range of data type
    • main.c:50: warning: implicit declaration of function `itoa'

    Habe da nen Bett vorm Kopf.Naja schonmal danke für Denkanstöße.

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802

    Re: RC5-Decoder für ATMega

    [quote="Brands_Freund"]Hallo habe mal ein paar Fragen zum dem Artikel RC5-Decoder für ATMega im RN-Wissen.

    Haufen Holz...

    Zitat Zitat von Brands_Freund
    Enthält Code die Geräteadresse oder nur die Tastencode?
    rc5 enthält alles, was zu RC5 gehört:
    rc5.addr = Adresse
    rc5.code = Tastencode
    rc5.flip = Flip-Bit (falls != -1)


    Zitat Zitat von Brands_Freund
    Was macht SREG, was beduetet Atomar machen...
    "Atomar" bedeutet, daß eine Code-Sequenz nicht von einer IRQ unterbrochen werden kann. Das ist oft nötig, um Datenintegrität zu waren, wenn ein Datum in einer ISR geändert werden kann.

    Im SREG wird u.a. gemerkt, ob IRQs global aktiviert sind. Zuständig dafür ist das I-Flag im SREG (siehe Doku deines µC). Mit cli() wird dieses auf 0 gesetzt (IRQs aus). Mit sei wird I=1. Nach dem atomaren Block will ich aber das I-Flag auf den vorherigen Wert setzen, weder explizit 1 noch 0. Daher merke ich SREG und schreibe es später zurück.

    Das mit dem I-Flag und SREG sollte eigentlich im Artikel erläutert sein...

    Zitat Zitat von Brands_Freund
    ...und FIXME?
    Das bedeutet, daß der Programmierer des Codes (in diesem Fall ich ) eine Anmerkung hinterlassen hat, daß ein Fehler beseitigt werden muss. In diesem Falls ist es kein Fehler, das Stück atomar zu machen. Ich denke aber, daß es ok ist, wenn dieses Codestück entgegen der vorliegenden Quelle unterbrechbar ist.

    Das FIXME bezieht sich also nicht auf die Korrektheit des Codes (das ist er) sondern auf dessen Effizienz. Atomisierung ist ein kleiner Overhead und erhöht natürlich die IRQ-Latenz aller IRQs.

    Zitat Zitat von Brands_Freund
    main.c:50: warning: implicit declaration of function `itoa'
    Es fehlt der Header, in dem itoa() deklariert wird (stdlib.h).
    Zitat Zitat von Brands_Freund
    main.c:30: warning: comparison is always false due to limited range of data type
    Das bezieht sich wohl auf den Vergleich (-1 == rc5.flip) ?
    *GRRR* char ist signed. Zumindest in C!

    Manche Makefile-Generatoren oder Spezialisten meinen, da was drehen zu müssen und char unsigned zu machen. Ein unsigned kann freilich niemals -1 sein!

    Wie soll man da funktionierende Programme schreiben, wenn sich niemand an Standards hält???
    Disclaimer: none. Sue me.

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Ok, ich hab RC5-Decoder für ATMega angepasst (char ersetzt durch signed char).

    Sollte jetzt auch mit char-is-unsigned-Sonderlocken-C funktionieren \/
    Disclaimer: none. Sue me.

  4. #4
    Hallo,
    ich greif mal nen altes Thema auf. (Uralt)
    Ist das Programm jetzt richtig und funktionsfähig?
    In den Diskussionen stehen auch Beiträge, wurden diese Fehler auch beseitigt, sodass ich nurnoch die Dateien runterladen muss und in mein Programm einbinden muss?

    Lg, Finn

Berechtigungen

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

Solar Speicher und Akkus Tests