PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Datei im ASURO etc.



jzd
17.08.2007, 15:57
Moin,
ich hab mal einige Fragen:
1.
Kann man im ASURO eigentlich Dateien anlegen?
Also ich meine mit fopen().
2.
Wenn man die Taste einer IR-Fernbedienung drückt,
so wird ja ein binäres Zeichen(oder?) gesendet.
Wäre es möglich mit SerRead() dieses zu Empfangen,
erst einmal festzustellen, um welches Zeichen es sich handelt
und dann entsprechend darauf zu reagieren?

Danke schonmal für Antworten.

Roboaktiv
17.08.2007, 16:13
Hallo,

zu 1: Tut mir leid dazu weiß ich nichts.

zu 2:Ich glaube, dass das nicht geht. Ich habe das mal mit einer Zimmerhubschrauber-Fernsteuerung versucht, aber dieses Terminal hat zumindest keine Binärzahlen emfangen. Vielleicht waren es ja Hexadizimalzahlen. Aber mit denen kenn ich mich auch nicht so gut aus.

Ich hoffe, dass dir das in irgendeiner Art weitergeholfen hat. Ansonsten kommt bald bestimmt ne bessere Antwort.

radbruch
17.08.2007, 17:26
Hallo

Das habe ich mal gemacht, so liest man die Daten ein:


unsigned int count, temp; // Zaehler, IR-Kommando
unsigned char daten[14], ir_status; // IR-datenspeicher, IR-Eingangsegel
temp=0;
while (PIND & (1 << PD0)) //warten auf die Flanke des Startbits
StatusLED(RED); // Alarmstufe ROT: ein Zeichen ist im Anflug
for (count=0; count<14; count++) { // im Gesammten warten wir auf 14 bits
Sleep(48); // Information einlesen nach 3/4 der Bitlaenge
ir_status=(PIND & (1 << PD0)); // Pegel Speichern
if (ir_status) daten[count]='1'; else daten[count]='0'; // und merken
if (ir_status) temp |= (1 << (13-count)); // das MSB(=mostsuefikantbit) zuerst
while (ir_status == (PIND & (1 << PD0))); // Bit gelesen, warten auf naechste Flanke
}
temp=temp/2 & 0xf; // Die Info steht in den Bits 1-4
StatusLED(YELLOW); // Daten gelesen
fahre(temp);

Und so fährt man damit:

void fahre(unsigned char kommando) {
/* asuro steuern.
Mit dem 10er-Block der Fernbedienung kann der asuro nun gesteuert werden:
Alle anderen Tasten stoppen den asuro
*/
switch (kommando) {
case 1: MotorDir(FWD,FWD); MotorSpeed(pow1,pow2); break;
case 2: MotorDir(FWD,FWD); MotorSpeed(pow2,pow2); break;
case 3: MotorDir(FWD,FWD); MotorSpeed(pow2,pow1); break;
case 4: MotorDir(BREAK,FWD); MotorSpeed(0,pow1); break;
case 5: MotorDir(BREAK,BREAK); MotorSpeed(0,0); break;
case 6: MotorDir(FWD,BREAK); MotorSpeed(pow1,0); break;
case 7: MotorDir(RWD,FWD); MotorSpeed(pow1,pow1); break;
case 8: MotorDir(RWD,RWD); MotorSpeed(pow1,pow1); break;
case 9: MotorDir(FWD,RWD); MotorSpeed(pow1,pow1); break;
default: MotorDir(BREAK,BREAK); MotorSpeed(0,0); break;
}
}


Das ist aus diesem Thread:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=287750#287750

Gruß

mic

jzd
17.08.2007, 17:29
danke, ich werds morgen mal ausprobieren.
weißt du zu 1. avtl was?

radbruch
17.08.2007, 17:37
Ups, sorry, habe ich überlesen:

zu 1.: nein, kann man nicht, denn der asuro hat keine Dateisystem.

mic

harry3
17.08.2007, 17:38
Zum Thema Fernsteuerung hab ich vor kurzem auch eine Frage gehabt. Die Asuro Lib 2.7rc3 bietet standardmäßig eine Funktion an, mit der man Fernsteurungssignale empfangen kann.
Diese funktionierte bei mir aber nicht - ich baute mir daraufhin meine eigene Funktion. So lernt man wenigstens was neues. Im Großen und Ganzen sieht sie eh recht ähnlich wie radbruchs Funktion aus.

Hier der Link zum Thema:
LINK (https://www.roboternetz.de/phpBB2/viewtopic.php?t=33174)


Zumindest über die stdio Funktionen ist es nicht möglich, direkt am Mikrocontroller Dateien zu speichern. Allerdings wäre es ja vielleicht möglich diese irgendwo direkt in den Flashspeicher zu legen!? AVR Gurus, wo seit ihr???

jzd
19.08.2007, 16:21
hm,
beide von euch vorgeschlagene Codes funktionieren bei mir nicht.
(Danke aber erstmal!)
Muss dann wohl an der Fernbedienung liegen.
Was ist überhaupt eine RC5 Fernbedienung?:)

Kann es eigentlich sein, dass die sprintf() Funktion auf dem ASURO nicht funktioniert?
Bei mir kommt bei

sprintf(string,"%f",float_zahl);
eine Compilerwarnung und vom ASURO bei der Ausgabe
mit SerPrint(string); nur ein '?'.

Dann noch eine eher unwichtige Frage:
Hat jemand von euch das Buch "Mehr Spaß mit ASURO Band I"?
Wenn ja, wieviele Stiftleisten, wievielpolig lagen bei der Platine bei?

harry3
19.08.2007, 17:29
Hier findest du eine Beschreibung des RC5 Codes:
http://www.sbprojects.com/knowledge/ir//rc5.htm

Zum Thema sprintf:
Die stdio.h hast du eh inkludiert???
"%f" erwartet den Datentyp double, nicht float.

Hier der Code wie er problemlos funktionieren sollte:


double float_zahl=3.1415;
char string[10]={'\0'};
sprintf(string,"%f",float_zahl);


Achte darauf, dass du den string-Array groß genug machst, damit du da ja genug freie Stellen hast.
Normalerweise lässt man sich einen String dynamisch mittels malloc erstellen, das ist bei Mikrocontrollern aber nicht gut, daher musst du bereits zur Compilezeit die Array-Größe angeben.

jzd
19.08.2007, 17:38
Das ist ja mal interessant mit dem double!
ich zitiere mal aus meinem C-Buch(erklärung zur Funktion printf()):


Wert Bedeutung
f Argument vom Typ float oder double[.....]

geht eigenltich noch weiter, steht aber im widerspruch zu deiner Aussage,
ih denke mal aber, dass deine Aussage hinkommt:), denn ich hatte
schon öfters das Problem. :(
stdio.h hab ich natürlich includiert. O:)

harry3
19.08.2007, 17:52
Du kannst natürlich auch float verwenden und dann nach double casten:
sprintf(string,"%f",(double)float_zahl);

Allerdings sollte man bei Mikrocontrollern so weit wie möglich auf Kommazahlen verzichten und stattdessen Ganzzahlen verwenden, diese sind für einen Computer viel leichter zu handeln.

jzd
19.08.2007, 18:31
ja gut, mit dem casten hätte ich evtl. auch gemacht, wenn ich gewusst hätte,
was da schief läuft :)

Kommazahl wollte ich deswegen verwende, weil ich die batteriespannung
von AURO ausgeben lassen wollte.
Ich hab dann aber einfach die floatzahl mit 1000 multipliziert, zu int gecastet
und dann ausgegeben und das ergebnis in milliVolt gehabt.

Aber microControler scheint ja ne ganz andere programmierung als
computer zu sein.
Muss ich mich wohl erst reinarbeiten und dran gewöhnen.
(leider ist halt auch heute noch aller Anfang schwer. =P~ )

Roboaktiv
20.08.2007, 19:31
Halllo!
Ich hab noch was neues zum Thema Fernbedienung:

Also ich habe sämtliche Fernbedienungen, die bei mir noch so rumflogen über das Hyperterminal getestet
dann hab ich die Fernbedienung genommen, die am öfftesten den gleichen Buchstaben gesendet hat bzw. bei der ich am öfftesten die gleichen Büchstaben empfangen habe.
Dann habe ich diese Buchstaben in das Programm von Mr. Robot (Link: https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=32573&start=0 )(Danke nochmal) eingefügt (Da haben sich die Zeichen nen bisschen verändert. Weiß einer warum)
Anschließend habe ich den üblichen Programmdraufflashundvorherkompliemierteil durchgefüht. Den Asuro angemacht und wie blöd die vorher eingestelten Tasten der Fernbedienung gedrückt.
Und.......?
NIX war. Der ASURO hat sich nicht fortbewegt. Also geht das irgendwie nicht.

harry3
20.08.2007, 19:45
Halllo!
Ich hab noch was neues zum Thema Fernbedienung:

Also ich habe sämtliche Fernbedienungen, die bei mir noch so rumflogen über das Hyperterminal getestet
dann hab ich die Fernbedienung genommen, die am öfftesten den gleichen Buchstaben gesendet hat bzw. bei der ich am öfftesten die gleichen Büchstaben empfangen habe.
Dann habe ich diese Buchstaben in das Programm von Mr. Robot (Link: https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=32573&start=0 )(Danke nochmal) eingefügt (Da haben sich die Zeichen nen bisschen verändert. Weiß einer warum)
Anschließend habe ich den üblichen Programmdraufflashundvorherkompliemierteil durchgefüht. Den Asuro angemacht und wie blöd die vorher eingestelten Tasten der Fernbedienung gedrückt.
Und.......?
NIX war. Der ASURO hat sich nicht fortbewegt. Also geht das irgendwie nicht.

Sowohl Hyperterminal als auch die SerRead/Write Funktionen verwenden UART als "Sprache", während die Fernbedinungen RC5 verwenden.
Das ist wie wenn einer englisch und der andere deutsch spricht, keiner aber die andere Sprache kann. Hier und da versteht man vielleicht mal ein Wort oder glaubt es zu verstehen, aber wirklich kommunizieren kann man so nicht.
Gleich verhält es sich bei UART und RC5.

Verwende doch den Code den ich und radbruch gepostet haben, damit kann man problemlos RC5 lesen.

Ich hab am WE eine Funktion zum RC5 Code senden gebastelt, also kannst du mit Asuro jetzt auch den Fernseher steuern. Kann ich wenn ihr wollt hier mal posten.

radbruch
20.08.2007, 19:58
Hallo


Kann ich wenn ihr wollt hier mal posten.

Das wäre nett. Blöderweise können aber die wenigstens fernbedienbaren Geräte diesen verstehen. Besser wäre eine "Aufnahmefunktion" am asuro um ihm damit die Signale der Fernbedienung beizubringen. Dann könnte ich meinen unbeschäftigten asuro endlich zur Zapp-Maschine umfunktionieren. Er soll dann automatisch in (mit der Fernbedienung oder Transceiver) einstellbarer Geschwindigkeit zwischen ebenfalls einstellbaren Kanälen umschalten...

Gruß

mic

harry3
20.08.2007, 20:03
Die Funktionen einfach ins Programm einfügen.
Um z.B. auf Kanal 1 zu schalten, schreibe:
fkt_rc5_senden(1);
oder um raufzuschalten:
fkt_rc5_senden(RC5_RAUF);

Mit fkt_rc5_empfangen() wartest du solange bis ein IR Signal erkannt wurde. Falls es sichum ein RC5 Signal handelte, wird dieser Rückgabewert zurückgegeben, z.B. 1 wenn Taste 1 gedrückt wurde.



#define RC5_KOMMANDOBITS 6
#define RC5_LEER 0x3000
#define RC5_LAUTER 0x10
#define RC5_LEISER 0x11
#define RC5_RAUF 0x20
#define RC5_RUNTER 0x21

unsigned char fkt_rc5_empfangen(void)
{

unsigned char n=0,erg=0;

DDRD &= ~(1<<PD0);
PORTD|=(1<<PD0);


while(PIND & (1 << PD0));

Sleep(250);
Sleep(250);
Sleep(14);

for(n=0;n<RC5_KOMMANDOBITS;n++)
{
if(PIND & (1 << PD0))
erg |= 1<<(RC5_KOMMANDOBITS-n-1);

Sleep(64);
}

return erg;
}

void fkt_rc5_senden(unsigned char kommando)
{
unsigned char n=0;
unsigned int daten=0;
daten = RC5_LEER | kommando;

//Pin PD1 als Ausgang setzen und LED ausschalten.
DDRD |= (1<<PD1);
PORTD |= (1<<PD1);

//Daten senden
for(n=0;n<14;n++)
{
if(!( daten & (1<<(13-n)) ) )
PORTD &= ~(1<<PD1);
else
PORTD |= (1<<PD1);

Sleep(32);

if(( daten & (1<<(13-n)) ))
PORTD &= ~(1<<PD1);
else
PORTD |= (1<<PD1);

Sleep(32);

}

//LED ausschalten
PORTD |= (1<<PD1);

return;
}

Arexx-Henk
21.08.2007, 18:44
@jzd

>1.
>Kann man im ASURO eigentlich Dateien anlegen?
>Also ich meine mit fopen().

dass geht leider nicht aber man kann selber einige Funktionen darstellen um Daten ins Eeprom speicher teil zu schreiben oder zu lesen. Diesen Eeprom wird im algemeinen nicht oder ganz wenig benutzt von anwender.

Die Eeprom Speicher im Atmega is 512 Bytes gross und verliert nicht die Daten beim Spannugsausfall/ausschalten.

Mann braucht dafur nur die standard 'eeprom_read_byte' und 'eeprom_write_byte' Funktionen an zu wenden um einzelne bytes zu lesen oder zu schreiben.

Gruss,

Henk

jzd
21.08.2007, 19:41
Ok, danke.
Gibts dazu ne Dokumentation?

Zu RC5
anscheinend ist meine Fernbedienung keine RC5-Fernbedienung.Leider.
Auch kommen bei druck auf dieselben tasten unterschiedliche bits an.
und keine der bisher aufgelisteten programme hat funktioniert.

Macht das evtl. sinn sich eine rc5-fernbedienung bei ebay zu kaufen?
was meint ihr, in welchem preislichen rahmen sollte die dann liegen?

harry3
21.08.2007, 20:08
Besser wäre es wenn du die Signale deiner Fernsteuerung analysierst und dazu dann eine Funktion baust.

Frag einfach im 1/4ms Takt den IR Empfänger ab, und lass dir das Ergebnis danach mittels der IR Schnittstelle auf dem PC ausgeben.
Wenn du dir das dann in Excel ansiehst erkennst du sehr schön um welchen Code es sich dabei handelt.
Siehe auch: https://www.roboternetz.de/phpBB2/viewtopic.php?t=33141

Für eine alte RC5 Fernbedienung würde ich höchstens ein paar Euro hinlegen.

damaltor
26.08.2007, 14:20
die dokumentation zum eeprom ist im atmega-datenblatt zu finden.

er besteht aus 512 speicherzellen, nummeriert von 0 bis 511 (!!), und jede speicherzelle kann genau ein byte speichern.

das wäre also zB ein reines textfile mit 512 zeichen.

ich benutze den eeprom um anchrichten für das lcddisplay zu speichern, solche grundelgenden sachen wie "Hallo" und "Batterie OK" und sowas. damit spare ich ein paar bytes im flash.