PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RC5-Decoder für ATMega



Brands_Freund
22.04.2006, 15:30
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:
#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 typemain.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. ](*,)

SprinterSB
22.04.2006, 18:31
Hallo habe mal ein paar Fragen zum dem Artikel RC5-Decoder für ATMega im RN-Wissen (https://www.roboternetz.de/wissen/index.php/RC5-Decoder_f%C3%BCr_ATMega).

Haufen Holz...

[quote=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)



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


...und FIXME?
Das bedeutet, daß der Programmierer des Codes (in diesem Fall ich :oops:) 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.


main.c:50: warning: implicit declaration of function `itoa'
Es fehlt der Header, in dem itoa() deklariert wird (stdlib.h).

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 :evil: 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???

SprinterSB
22.04.2006, 19:29
Ok, ich hab RC5-Decoder für ATMega (https://www.roboternetz.de/wissen/index.php/RC5-Decoder_f%C3%BCr_ATMega) angepasst (char ersetzt durch signed char).

Sollte jetzt auch mit char-is-unsigned-Sonderlocken-C funktionieren \:D/

Finn112
07.09.2010, 17:49
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