PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Das erste Mal ein richtiges Programm sehen



ActiveRobo
12.03.2012, 16:31
Hi,

Ich bin neu und verstehe so gut wie garnichts von programmieren, aber ich lerne es gerade. Da ist mir die Idee gekommen einmal nachzufragen ob einer von euch so nett sein könnte und mir mal eines seiner Programme anschauen lässt, damit ich eigene Anregungen finde. :) (Ihr könnt auch Stellen, die ihr nicht zeigen wollt, löschen) :)

Ich möchte Anregungen finden um einmal selber was zu programmieren und ihn mal wirklich fahren zu lassen. (Ausser geradeaus und im Bogen) :)
Gibt es eigentlich, so eine Art Befehlsliste, die ich mir mal ansehen könnte? Und wie kann ich ihn nur eine gewissen Distanz fahren lassen?

Danke schon im Vorraus :)

PICture
12.03.2012, 16:49
Hallo!

Zum Anschauen von ausprobierten Assemblerprogrammen (ASM) besonders im Codeschnipsel und Hilfsmittel: http://www.rn-wissen.de/index.php/PIC_Assembler . ;)

ActiveRobo
12.03.2012, 16:55
Das erklärt vieles :) Trotzdem würde ich gerne mal ein Programm sehen das schon fertig ist. (Nicht um es zu kopieren, sondern wegen Anregungen :)) Und mit welchen Programmen programmiert ihr eigentlich? Auch mit "Programmers Notepad"? Eine Datei die ich mir in Programmers Notepad anschauen kann oder auch mit einen anderen, aber halt das ich Eindrücke bekomme, wie das Ganze aussieht. :) Versteht ihr? :)

Kampi
12.03.2012, 17:36
Ich programmiere mit AVR Studio, Bascom und PSoC Designer.
Das Programm an sich ist meistens als einfache Textdatei gespeichert. So kannst du es auch mit anderen Programmen öffnen (z.B. PN).
Als halb fertiges Programm hab ich das hier (Bascom):


'Mikrocontroller
$regfile = "m32def.dat"
$crystal = 16000000

'Stacks
$hwstack = 200
$swstack = 200
$framesize = 400

'UART konfigurieren
$baud = 19200

'SPI konfigurieren
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Noss = 1 , Clockrate = 16
Spiinit

'Unterprogramme
Declare Sub Read_register(byval Adress As Byte )
Declare Sub Write_register(byval Adress As Byte , Byval Daten As Byte)
Declare Sub Bitmodify(byval Reg_add As Byte , Byval Reg_mask As Byte , Byval Reg_val As Byte)
Declare Sub Write_tx
Declare Sub Register
Declare Sub Mcp2515_init
Declare Sub Send_can

'Befehle
Const Spi_read = &H03
Const Spi_write = &H02
Const Spi_reset = &HC0
Const Spi_rts0 = &H81
Const Spi_bitmodify = &H05

'Registeradressen
Const Cnf1 = &H2A
Const Cnf2 = &H29
Const Cnf3 = &H28
Const Canctrl = &H0F
Const Caninte = &H2B
Const Txb0ctrl = &H30 'Transmit Buffer 0 Control Register
Const Txb0sidh = &H31 'Transmit Buffer 0 Std Identifier High
Const Txb0sidl = &H32 'Transmit Buffer 0 Std Identifier Low
Const Txb0eid8 = &H33 'Transmit Buffer 0 Ext Identifier High
Const Txb0eid0 = &H34 'Transmit Buffer 0 Ext Identifier Low
Const Txb0dlc = &H35 'Transmit Buffer 0 Data Length Code
Const Txb0d0 = &H36 'Transmit Buffer 0 Data Byte 0
Const Txb0d1 = &H37 'Transmit Buffer 0 Data Byte 1
Const Txb0d2 = &H38 'Transmit Buffer 0 Data Byte 2
Const Txb0d3 = &H39 'Transmit Buffer 0 Data Byte 3
Const Txb0d4 = &H3A 'Transmit Buffer 0 Data Byte 4
Const Txb0d5 = &H3B 'Transmit Buffer 0 Data Byte 5
Const Txb0d6 = &H3C 'Transmit Buffer 0 Data Byte 6
Const Txb0d7 = &H3D 'Transmit Buffer 0 Data Byte 7
Const Rxm0sidh = &H20 'Receive Buffer 0 Std Identifier High
Const Rxm0sidl = &H21 'Receive Buffer 0 Std Identifier Low
Const Rxm0eid8 = &H22 'Receive Buffer 0 Ext Identifier High
Const Rxm0eid0 = &H23 'Receive Buffer 0 Ext Identifier low
Const Rxm1sidh = &BH24 'Receive Buffer 1 Std Identifier High
Const Rxm1sidl = &H25 'Receive Buffer 1 Std Identifier Low
Const Rxm1eid8 = &H26 'Receive Buffer 1 Ext Identifier High
Const Rxm1eid0 = &H27 'Receive Buffer 1 Ext Identifier low
Const Rxb0ctrl = &H60
Const Rxb1ctrl = &H70

'I/O Einstellungen
Config Portb.4 = Output

'Namen vergeben
Cs Alias Portb.4

'Variablen
Dim Canin As Byte

'Interrupts aktivieren
Enable Interrupts

'Chipselect auf High setzen
Set Cs
Wait 1

'MCP2515 initialisieren
Call Mcp2515_init

'Hauptprogramm
Do

Call Write_tx 'Zu übertragende Daten setzen
Call Send_can 'Senden auslösen
Call Register
'Register auslesen
Waitms 100

Loop
End



'Unterprogramme
'-------------------------------------------------------------------------------------------------------------------

Sub Read_register(byval Adress As Byte )

Reset Cs 'Chipselect auf Low ziehen
Spdr = Spi_read 'Inhalt von "SPI_Read" im Datenregister speichern 'Read Instruction (0000 0011) senden
Spiout Spdr , 1
Spiout Adress , 1
Spiin Canin , 1 'Registerinhalt einlesen
Set Cs 'Chipselect auf High ziehen
End Sub

'-------------------------------------------------------------------------------------------------------------------

Sub Write_register(byval Adress As Byte , Byval Daten As Byte)

Reset Cs 'Chipselect auf Low ziehen
Spdr = Spi_write 'Inhalt von "SPI-Write" ins SPI_Data_Register schieben
Do 'Schleife bis SPI Interrupt Flag gesetzt wurde, also bis
Loop Until Spsr.spif = 1 'die Übertragung abgeschlossen ist

Spdr = Adress
Do
Loop Until Spsr.spif = 1

Spdr = Daten
Do
Loop Until Spsr.spif = 1
Set Cs 'Chipselect auf High ziehen
End Sub

'-------------------------------------------------------------------------------------------------------------------

Sub Mcp2515_init

Reset Cs

'MCP2515 reseten
Spdr = Spi_reset
Do
Loop Until Spsr.spif = 1
Waitms 10
Set Cs '10ms warten, da sonst das Auslesen von CNF1
'nicht richtig erfolgen kann
'Control Register beschreiben
Write_register Canctrl , &H8F 'Device in Configuration Mode versetzen, OSC-Pin
'aktivieren, Fclk = F / 8 einstellen
'Interrupts einstellen
Write_register Caninte , &H04 'Transmit Buffer 0 Interrupt aktivieren

'TX-Konfiguration
Bitmodify Txb0ctrl , &H03 , &H03

'Bittiming einstellen
Write_register Cnf1 , &H03 'Baudrate einstellen
Write_register Cnf2 , &HA0 'Phasensegmenteinstellungen
Write_register Cnf3 , &H02

'Rx Buffer einstellen
Write_register Rxb0ctrl , &H60
Write_register Rxb1ctrl , &H60
Write_register Rxm0sidh , 0 ' Empfängeradressen auf 0, Filter aus
Write_register Rxm0sidl , 0
Write_register Rxm0eid8 , 0
Write_register Rxm0eid0 , 0
Write_register Rxm1sidh , 0
Write_register Rxm1sidl , 0
Write_register Rxm1eid8 , 0
Write_register Rxm1eid0 , 0

'CAN-Controller in den "Normal Mode" versetzen
Bitmodify Canctrl , &HE0 , &H0

'Priorität einstellen
Write_register Txb0ctrl , &H03 'Highest Message Priority für Transmit Buffer 0

'Message Identifier einstellen
Write_register Txb0sidh , &H00
Write_register Txb0sidl , &H03

End Sub

'-------------------------------------------------------------------------------------------------------------------

Sub Bitmodify(reg_add , Reg_mask , Reg_val)

Reset Cs
Spdr = Spi_bitmodify
Do
Loop Until Spsr.spif = 1
Waitms 2
Spdr = Reg_add
Do
Loop Until Spsr.spif = 1
Spdr = Reg_mask
Do
Loop Until Spsr.spif = 1
Spdr = Reg_val
Do
Loop Until Spsr.spif = 1
Set Cs

End Sub

'-------------------------------------------------------------------------------------------------------------------

Sub Send_can

Reset Cs
Spdr = Spi_rts0 'Übertragung auslösen
Do
Loop Until Spsr.spif = 1
Set Cs

End Sub

'-------------------------------------------------------------------------------------------------------------------

Sub Register

'Terminalausgabe
Print "Registereinstellungen:"
Read_register Cnf1
Print "Registerinhalt CNF1: " ; Canin
Read_register Cnf2
Print "Registerinhalt CNF2: " ; Canin
Read_register Cnf3
Print "Registerinhalt CNF3: " ; Canin
Read_register Canctrl
Print "Registerinhalt CAN Control: " ; Canin
Read_register Txb0ctrl
Print "Registerinhalt TXB0 Control: " ; Canin
Read_register Txb0sidl
Print "Registerinhalt TXB0 Identifier Low: " ; Canin
Read_register Txb0sidh
Print "Registerinhalt TXB0 Identifier High: " ; Canin
Read_register Txb0dlc
Print "Registerinhalt TXB0 Data Lenght: " ; Canin
Read_register Caninte
Print "Registerinhalt CAN Interrupt Enable: " ; Canin
Print "----------------------------------------------------------"

End Sub

'-------------------------------------------------------------------------------------------------------------------

Sub Write_tx

Write_register Txb0sidh , &H55 'Empfängeradresse setzen
Write_register Txb0sidl , &H55 'Empfängeradresse setzen
Write_register Txb0dlc , &H04 'Paketlänge festlegen
Write_register Txb0d0 , &HFF 'Zu übertragende Daten setzen
Write_register Txb0d1 , &HFF 'Zu übertragende Daten setzen

End Sub

'-------------------------------------------------------------------------------------------------------------------


Und hier nochmal eins in C für Cypress Chips:


//----------------------------------------------------------------------------
// C main line
//----------------------------------------------------------------------------

#include <m8c.h> // Part specific Constants and Macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules

char Button = 0x00;

void I2C_Init(void);

void main(void)
{
M8C_EnableGInt;
CSD_Start();
CSD_InitializeBaselines();
CSD_SetDefaultFingerThresholds();

EzI2Cs_SetRamBuffer(1, 1, (char *)&Button);

I2C_Init();

while (1)
{
CSD_ScanAllSensors();
CSD_UpdateAllBaselines();

// Sensor 1
if(CSD_bIsSensorActive(0))
{
PRT2DR |= 0x01;
Button = 0x01;
}
else
{
PRT2DR &= ~0x01;
}

// Sensor 2
if(CSD_bIsSensorActive(1))
{
PRT2DR |= 0x02;
Button = 0x02;
}
else
{
PRT2DR &= ~0x02;
}

// Sensor 3
if(CSD_bIsSensorActive(2))
{
PRT2DR |= 0x04;
Button = 0x03;
}
else
{
PRT2DR &= ~0x04;
}

// Sensor 4
if(CSD_bIsSensorActive(3))
{
PRT2DR |= 0x08;
Button = 0x04;
}
else
{
PRT2DR &= ~0x08;
}
}
}

void I2C_Init(void)
{
EzI2Cs_Start(); // I²C Modul starten
EzI2Cs_EnableInt(); // I²C Interrupts aktivieren
}


Eine Befehlsliste für z.B. den Asuro hast du hier:

https://www.roboternetz.de/community/threads/39033-Befehlsübersicht-RP6-und-Asuro

Für Bascom hast du eine hier:

http://avrhelp.mcselec.com/index.html

und für C hilft dir Google :)

ActiveRobo
12.03.2012, 17:44
Danke :) und die Bücher: Mehr Spaß mit Suro 1+2 helfen mir bei der weiteren programmierung. Oder? :)

Kampi
12.03.2012, 18:18
Ja sollten sie eigentlich tun :)

ActiveRobo
12.03.2012, 18:29
Und hier nochmal eins in C für Cypress Chips:


//----------------------------------------------------------------------------
// C main line
//----------------------------------------------------------------------------

#include <m8c.h> // Part specific Constants and Macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules

char Button = 0x00;

void I2C_Init(void);

void main(void)
{
M8C_EnableGInt;
CSD_Start();
CSD_InitializeBaselines();
CSD_SetDefaultFingerThresholds();

EzI2Cs_SetRamBuffer(1, 1, (char *)&Button);

I2C_Init();

while (1)
{
CSD_ScanAllSensors();
CSD_UpdateAllBaselines();

// Sensor 1
if(CSD_bIsSensorActive(0))
{
PRT2DR |= 0x01;
Button = 0x01;
}
else
{
PRT2DR &= ~0x01;
}

// Sensor 2
if(CSD_bIsSensorActive(1))
{
PRT2DR |= 0x02;
Button = 0x02;
}
else
{
PRT2DR &= ~0x02;
}

// Sensor 3
if(CSD_bIsSensorActive(2))
{
PRT2DR |= 0x04;
Button = 0x03;
}
else
{
PRT2DR &= ~0x04;
}

// Sensor 4
if(CSD_bIsSensorActive(3))
{
PRT2DR |= 0x08;
Button = 0x04;
}
else
{
PRT2DR &= ~0x08;
}
}
}

void I2C_Init(void)
{
EzI2Cs_Start(); // I²C Modul starten
EzI2Cs_EnableInt(); // I²C Interrupts aktivieren
}




Und wofür war das gedacht? Was hast du da geschrieben? :)

Thomas E.
12.03.2012, 18:46
Als vielleicht kleine Anregung ein Querverweis zu einer aktuellen Diskussion:
https://www.roboternetz.de/community/threads/57086-Eine-RGB-Led-und-ein-AtTiny13

Kampi
12.03.2012, 18:51
Das Programm ist für diese Platine:

http://img24.imageshack.us/img24/2617/dscf0182gu.jpg (http://imageshack.us/photo/my-images/24/dscf0182gu.jpg/)

Das Programm fragt die 4 Cap-Sense Taster ab (die 8-eckigen Felder mit den Zahlen 1-4) und schaltet dann ne LED an und speichert eine Variable in nem RAM-Buffer, da der Chip nebenbei ein I²C Slave ist.
Nichts wildes eigentlich ;)
Wollte nur mal 4 Cap-Sense Taster für andere Projekte verwenden.

oberallgeier
12.03.2012, 18:51
... Anregungen finden um ... ihn mal wirklich fahren zu lassen. (Ausser geradeaus und im Bogen) ...Wenn Du uns verrätst wer "er" ist könnte Dir vermutlich mal jemand ein Stückchen Code für Deinen Roboter senden. Ich vermute ja, dass Du irgendeinen Bausatz zusammengestellt hast (steht ja weiter unten "... Suro ..." -also vermutlich ein asuro). Ausserdem solltest Du schreiben welche Programmiersprache Du möchtest und was für einen Controller (wenn überhaupt) Du verwendest. Die Befehlsliste in Assembler steht im Datenblatt der meisten Controller, die Befehlsliste für C in einem C-Lehrbuch. Und wenn es wirklich um den asuro gehen sollte, dann empfehle ich Dir die BAU- UND BEDIENUNGSANLEITUNG (klick hier) (http://www.arexx.com/downloads/asuro/asuro_manual_de.pdf) von dem Teilchen. Ab Seite 56 steht da einiges zu asuros Programmiersprache - die heißt C. Die BAU- UND BEDIENUNGSANLEITUNG ist übrigens dazu gemacht, dass sie VOR der Montage gelesen wird.

ActiveRobo
12.03.2012, 20:51
"Er" ist der asuro ARX-03 und ich programmiere in C und ich habe die Anleitung gelesen nur da ich so gut wie garnichts von programmieren verstehe, ist manches für mich nicht logisch.

@Kampi

Das sieht wirlklich gut aus. Funktioniert es schon und wenn ja hast du ein video oder ein bild dazu? :D

Kampi
12.03.2012, 21:17
So hier hast du ein paar Fotos:
Bild 1:
http://img834.imageshack.us/img834/2304/bild1td.jpg (http://imageshack.us/photo/my-images/834/bild1td.jpg/)

Bild 2:
http://img542.imageshack.us/img542/3275/bild2h.jpg (http://imageshack.us/photo/my-images/542/bild2h.jpg/)

Bild 3:
http://img820.imageshack.us/img820/6008/bild3pnf.jpg (http://imageshack.us/photo/my-images/820/bild3pnf.jpg/)

Die anderen drei Module haben zwar ne Software drauf aber es ist weder nen LCD angeschlossen noch ein SPI Device und auch kein USB Device.

ActiveRobo
12.03.2012, 21:19
Sieht gut aus :)

Kampi
12.03.2012, 21:22
Ja ist ein kleines Board womit ich gelegentlich bisl rumexperimentiere. Hab das Board von einem Arbeitskollegen bekommen, der es auf einem Cypress Seminar bekommen hat :D
Das Board war vor 2 Jahren mein Einstieg in die Mixed Signal Arrays von Cypress und vor allem in C :D
Ist halt nur nicht ganz so verbreitet wie die Atmel Sachen. Zu den Dingern findest du nur Infos in Englisch und musst halt auch viel die Application Notes von Cypress wälzen.
Aber dafür hast du mit den Chips richtig viele Möglichkeiten ;)

Btw...der Link von Thomas E. ist auch recht interessant. Da geht es u.a. um die Optimierung eines Programmes und es ist echt erstaunlich wieviel Platz man damit machen kann ;)

ActiveRobo
12.03.2012, 21:55
Schau dir das mal an und sag was du davon hältst: https://www.roboternetz.de/community/threads/29656-240x128-T6963-LCD-mit-Touch-an-ATMega128

:)

Kampi
12.03.2012, 21:58
Das hab ich letztens schon gefunden und ich hab mir auch gleich mal den Link von dem Shop gespeichert, weil ich das auch mal machen wollte (wenn meine Uhr und mein CAN-Bus erstmal fertig sind).
Vorallem weil das Display nur 18€ kostet :)
Aber ich hab im Moment eh genug zu tun ;) das hat noch bischen Zeit aber ansonsten ist das eine tolle Sache.

ActiveRobo
13.03.2012, 15:54
Hat einer von euch vl. etwas für die Taster? :)

ActiveRobo
13.03.2012, 20:13
Ne Frage wie kann ich bei der Sleep Funktion mehr als 255 haben? den wenn ich mehr als 255 eingebe kommt eine Meldung das die Zahl zu groß sei. :) Und wo kann ich Bascom kaufen oder downloaden? möchte das auch ausprobieren :)

ePyx
13.03.2012, 20:33
So eventuell :



for ( int time = 0; time < 255; time++)
sleep ( 255 );

Kampi
13.03.2012, 21:45
Bascom kannst du hier downloaden:
http://www.mcselec.com/index.php?option=com_docman&task=cat_view&gid=99&Itemid=54

ActiveRobo
14.03.2012, 16:09
@ePyx

Wofür ist diese Zeile? Und ich meine wie kann ich einen größeren Wert eingeben ohne das, das Programm meint der Zahlenwert sei zu groß. :)

@Kampi

Mein Vater meint wenn ich die "Sleep" - Funktion in eine Schleife setze das es genauso gehen könnte.

ePyx
14.03.2012, 16:17
@ePyx

Wofür ist diese Zeile? Und ich meine wie kann ich einen größeren Wert eingeben ohne das, das Programm meint der Zahlenwert sei zu groß. :)


Das ist eine Schleife in C. Wenn du das als Funktion verpackst und den Endwert variable gestaltest, hast du das gewünschte Ergebnis.



void sleep_gross ( uint16_t wert )
{
uint16_t time;
for ( time = 0; time < wert; time++)
Sleep ( 1 );
}


Damit wären auch Werte bis 2^16-1 möglich.

ActiveRobo
14.03.2012, 16:23
Das heißt wenn ich void vor den Klammern schreibe und dann für die variable 255 nehme oder so dann wartet er länger. kannst du vl. ein bereits einen wert einfügung? :) danke :)

ePyx
14.03.2012, 16:28
"void" heißt soviel wie "wertfrei". Das heißt es wird kein Wert von der Funktion zurückgegeben.

Ich versteh deine Frage nicht, von daher kann ich dir auch keine Antwort geben. So etwas wie Syntax gibt es auch in der deutschen Sprache. Heißt Rechtschreibung.

Kampi
14.03.2012, 16:29
@

@Kampi

Mein Vater meint wenn ich die "Sleep" - Funktion in eine Schleife setze das es genauso gehen könnte.

Was meinst du?

ActiveRobo
14.03.2012, 16:39
@Kampi

Ich meine das was mir ePyx vorgeschlagen hat eine Schleife. :)

@ePyx

Ich muss es so einbauen, dass es Sinn ergibt, oder? :)

ePyx
14.03.2012, 16:44
Ich muss es so einbauen, dass es Sinn ergibt, oder?

Ist die Frage, was du vor hast. Unter der Voraussetzung das du einen C-Compiler verwendest, kannst du die Funktion einfach kopieren und fertig.
Anstatt Sleep ( wert ) rufst du dann sleep_gross ( wert ) auf. Ist vollkommen Schnuppe. Erst wenn Wert >= 255 macht Sleep keinen Sinn mehr, da Wertebereich überschritten.

Dann macht sleep_gross mehr Sinn.

ActiveRobo
14.03.2012, 18:42
Ich meine das ich den Wertbereich vergrößern kann oder durch eine schleife verlängern kann. :)

Kampi
14.03.2012, 18:44
Du verlängerst den durch die Schleife.
Da du einen 16-Bit Wert in die Funktion rein übergibst und mit diesem Wert dann eine For-Schleife aufgerufen wird kannst du mit diesem Befehl bis zu 65536x den Befehl Sleep(1) wiederholen.

ePyx
14.03.2012, 18:52
Du kannst natürlich auch uint16_t gegen uint32_t tauschen. Das sind dann 2^32-1 Durchläufe. Aber so etwas macht keinen Sinn mehr.

ActiveRobo
14.03.2012, 19:13
Und der Wert gibt dann an, wie oft er wiederholen soll, oder? :)
Wie soll ich das dann einbauen? Einfach kopieren und in die Klammern einbauen?
Ich mein so:

#include "asuro.h"

? auch int main(void) ?

oder wie?

Kampi
14.03.2012, 19:18
Genau.
Mit:




for ( time = 0; time < wert; time++)

wird eine For-Schleife erzeugt die den Schleifeninhalt solange wiederholt wie die Bedingung "time < wert" wahr ist. Und durch "time++" wird gesagt das der Wert "time" bei jedem Schleifendurchlauf um 1 erhöht werden soll. Und durch "time = 0" wird gesagt das die Schleife bei 0 anfangen soll zu zählen.

ActiveRobo
14.03.2012, 19:24
Das heißt ich muss einfach nur for ( time = Wert; time < wert; time++) einfügen, oder? :)

radbruch
14.03.2012, 19:27
Hallo

Sleep() berechnet beim asuro seine Wartezeiten mit der 72kHz-Frequenz des Timer 2. Deshalb dauert Sleep(72) eine 1/1000 Sekunde bzw. eine Millisekunde:


#include "asuro.h"

unsigned int i;

int main(void)
{
Init();
while(1)
{
for(i=0; i<1000; i++) Sleep(72); // 1 Sekunde
StatusLED(YELLOW);

for(i=0; i<500; i++) Sleep(72); // 1/2 Sekunde
StatusLED(RED);

for(i=0; i<500; i++) Sleep(72);
StatusLED(OFF);

for(i=0; i<1000; i++) Sleep(72);
StatusLED(GREEN);
}
return 0;
}(ungetestet)

Die aktuelleren Libs verwenden 36kHz, hier dauert dann Sleep(36) 1ms.

Gruß

mic

ActiveRobo
14.03.2012, 19:36
Dein Programm funktioniert :) aber was ist mit der Schleife die oben beschrieben ist? :)

ePyx
14.03.2012, 19:38
Was soll damit sein ? Kannst sie verwenden, vergessen....etc.

radbruch
14.03.2012, 19:47
Ausdrucken und archivieren?

ActiveRobo
14.03.2012, 19:49
@radbruch

Du hast die schleife verwendet oder?

@ePyx

Wie muss ich die schleife dann einbauen? So wie radbruch?

ePyx
14.03.2012, 19:51
ja hat er.



for(i=0; i<1000; i++) Sleep(72);
StatusLED(GREEN);


Ist wohl eine Schleife. Wenn 72 einer Millisekunde entspricht und 1000*1 Millisekunde gewartet wird. Kommen eine Sekunde raus. Also ist die sind anscheinend alle LEDs für eine Sekunde aus bis die Schleife durch ist. Dann geht die grüne an.

radbruch
14.03.2012, 19:56
Noch eine Variante mit einer neuen Funktion Sleep_ms():


#include "asuro.h"

void Sleep_ms(unsigned int dauer) // dauer ist Wartezeit in Millisekunden
{
unsigned int i;

i=dauer;
if(i) while(i--) Sleep(72);
}

int main(void)
{
Init();
while(1)
{
Sleep_ms(1000); // 1 Sekunde
StatusLED(YELLOW);

Sleep_ms(500); // 1/2 Sekunde
StatusLED(RED);

Sleep_ms(500);
StatusLED(OFF);

Sleep_ms(1000);
StatusLED(GREEN);
}
return 0;
}Nach Init() leuchtet die StatusLED grün...

ActiveRobo
15.03.2012, 15:54
Hi, :)

Sorry das ich noch eine Frage habe, aber ich verstehe das mit der Odometrie nicht ganz. Mit ihr kann man doch den Asuro eine gewisse Strecke fahren lassen, oder? Und kann ich das mal in einer Funktion sehen, Danke :)

ePyx
15.03.2012, 16:32
Ich hab zwar keinen Asuro, aber ich glaube es gibt genügend Beispiele für das Teil. Sicherlich auch für die Odometrie. Die Odometrie wird eigentlich weniger eingesetzt um eine bestimmte Strecke zurückzulegen, sondern um Hindernisse zu erkennen, diesen auszuweichen oder davor anzuhalten.

ActiveRobo
15.03.2012, 18:02
Ist die Odometrie nicht hinten das schwarz weiße Rädchen, das mittels der dioden (glaub ich :)) zählt und dann dadurch eine gewisse strecke fahren kann. Hab ich unrecht? :)

ePyx
15.03.2012, 19:30
Das ist ein Encoder. Der zählt die Ticks, die du pro Umdrehung machst. Darüber kann man die zurückgelegte Strecke ermitteln.

ActiveRobo
15.03.2012, 19:39
Ja, aber kann ich damit auch schon vorher eine bestimmte Strecke bestimmen z.B.: er soll 1000 Steps machen (oder so :)) und dann führt er sie aus :)

ePyx
15.03.2012, 19:46
Ja sicher. Musst die Gleichung ja nur nach einer anderen Größe umstellen. Hat aber nichts mit der Odometrie zu tun.

ActiveRobo
15.03.2012, 19:55
Was ist dann die Odometrie?

ePyx
15.03.2012, 20:04
Kannst auch das Wiki (http://rn-wissen.de/index.php/Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Ro boter_zu_finden) bemühen.

ActiveRobo
15.03.2012, 20:05
mach ich :)

Das heißt die 2 Dioden vorne, die zur Linie entlang fahren dienen, sind gleichzeitig auch die Dioden um gegenstände zu erkennen. Irre ich mich? :)

ActiveRobo
22.03.2012, 18:57
Hallo? darf ich auch eine Antwort bekommen, oder nicht? :)

Kampi
22.03.2012, 19:05
Hallo? darf ich auch eine Antwort bekommen, oder nicht? :)

Nein das ist ein Liniensensor kein Hindernisssensor :D

ActiveRobo
23.03.2012, 18:34
Und was meint dann ePyx wenn er sagt das die hinteren 2 räder, mit den schwarz weißen streufen, zum erkennen von hindernissen sein soll. Das ist unlogisch für mich, denn 2 räder die hinten sind können nicht sehen was vorne passiert.

5Volt-Junkie
23.03.2012, 19:04
Du hast den ePyx falsch verstanden. Man kann mit verschiedenen IR-Sensoren die Odometrie, Linienverfolgung und Hinderniserkennung.

Beispiele
CNY70 einer Linie folgen oder Odometrie nach Reflektionsprinzip
CNY37 Gabellichtschranke für Odometrie
Sharp GP 2 Y0A 02 YK Distanzmessung/Hinderniserkennung

ActiveRobo
19.05.2012, 18:21
Ich weiß das hab ich sachon oft gefragt aber hat einer von euch netterweise ein getestetes programm für die Taster des Asuros?

und nochetwas. Ich weiß nicht warum, aber aus irgendeinem Grund will er die Funktion BRAKE nicht compilieren. Hat einer eine Idee. Hier was er mir hinschreibt:

C:\ASURO_src'\ASURO_src\FirstTry>make all
set -e; avr-gcc -MM -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=asuro.lst asuro.c \
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > asuro.d; \
[ -s asuro.d ] || rm -f asuro.d
set -e; avr-gcc -MM -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.lst test.c \
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > test.d; \
[ -s test.d ] || rm -f test.d
-------- begin --------
avr-gcc --version
avr-gcc (GCC) 3.3.1
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

avr-gcc -c -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.lst test.c -o test.o
test.c: In function `main':
test.c:38: error: `BRAKE' undeclared (first use in this function)
test.c:38: error: (Each undeclared identifier is reported only once
test.c:38: error: for each function it appears in.)
make: *** [test.o] Error 1

> Process Exit Code: 2

radbruch
19.05.2012, 19:36
Hallo

"BRAKE" ist keine Funktion, du meinst sicher "BREAK":


#define FWD (1 << PB5) /* (1 << PD5) */
#define RWD (1 << PB4) /* (1 << PD4) */
#define BREAK 0x00
#define FREE (1 << PB4) | (1 << PB5) /* (1 << PD4) | (1 << PD5)*/
(Aus asuro.h)

Nicht zu verwechseln mit "break":

#include "asuro.h"

char c=1;

int main(void)
{
Init();
MotorDir(FWD, BREAK);
switch(c)
{
case 1: StatusLED(RED); break;
default: StatusLED(YELLOW);
}
while(1);
return(0);
}(ungetestet)

Gruß

mic

ActiveRobo
20.05.2012, 13:32
Aso, Ich wusste nicht das es nicht BRAKE sondern BREAK heißt. Und was soll dann die Funktion BREAK? Währe dir echt dankbar für eine kurze Erklärung :) und Danke für das Programm. Wärde gleich mal schaun ob es funktoniert. :) Danke :)