PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : eingang an M32



RP6ler
03.01.2010, 21:41
hallo, habe zu weihnachten den RP6 mit M32 bekommen. nun habe ich mich einige zeit eingearbeitet, so dass ich jetzt eigene schaltungen aufbauen will.

darum brauche ich jetzt auf der M32 einen pin als eingang. laut anleitung müsste das so gehen:



#include "RP6ControlLib.h"

void eingang(void)
{if (PINC & IO_PC6)
{writeString_P("PC6 is set to HIGH!\n");}

else
{writeString_P("PC6 is set to LOW!\n");}

}

int main(void)
{initRP6Control();

DDRD |= (1<<5); //PD5 als Ausgang

DDRC &= ~IO_PC6; //PC6 als Eingang


while(true)
{

eingang();
}
return 0;
}


aber irgendwie klappt das noch nicht so recht. die M32 gibt bei laufendem programm keine textausgaben aus.
wer kann mir weiterhelfen?

grüße

Xandi11
04.01.2010, 00:02
Versuchs mal so ...

while(true)
{
DDRC &= ~IO_PC6;
if(PINC & IO_PC6)
{
writeString_P("PC6 is HIGH!\n");
}
else
{
writeString_P("PC6 is LOW!\n");
}
}

Übrigens ... eine übersichliche Programmierung hat keine Nachteile.
Kopiert man den Code z.B. in ein Forum ist es viel einfacher für andere ihn zu lesen, wenn er übersichtlich geschrieben ist (auch Fehler bei den Klammern lassen sich dadurch leicht vermeiden).

PS:
Kann mir jemand erklären wie das mit den Codefenstern im Post geht?

KingTobi
04.01.2010, 00:55
Kann mir jemand erklären wie das mit den Codefenstern im Post geht?
Indem du auf den Code Button klickst oder von Hand die Code-Tags schreibst

RP6ler
04.01.2010, 10:58
@Xandi11: ich habe deinen code gerade mal auf deinen vorschlag umgeändert, aber auch das bringt nichts. es werden keine textmeldungen im terminal angezeigt.

vielleicht habe ich ja in meinem neu gegründeteten ordern Testprogramm_C etwas falsch gemacht.

dazu habe ich den ordner mit dem Example_02_Buttons komplett kopiert, und umbenannt. anschließend alles im neu gegründeteten ordner außer make all, make clean , makefile und C-datei gelöscht.

dann habe ich die c- datei auch in Testprogramm_C umbenannt. anschließend das makefile bei target mit Testprogramm_C umgeändert.

anschließend im Programmers Notepad die C-datei geöffnet, mein hier gepostetes programm hier eingefügt und anschließend mit make all in eine hexdatei kompiliert.

dann habe ich mit dem RP6loader mein programm ganz normal auf die M32 überspielt. auf die Base habe ich schon vorher mal das I2C_programm überspielt.


habe ich da irgendwas falsch gemacht?

weil die anderen programme auf der M32 laufen ganz normal.

vielen dank schon mal im voraus für eure hilfe.

mfg

Dirk
04.01.2010, 15:41
Hallo RP6ler,

das sieht doch alles ganz gut aus.

Dein Programm müßte ja irgend etwas ausgeben (im RP6Loader Fenster), wenn es fehlerfrei kompiliert wurde.
Was erscheint denn da?

Gruß Dirk

Xandi11
04.01.2010, 17:47
Low entspricht ja eigentlich 0V
und
High entspricht demnach 5V

Ohne irgendeine Schaltung hast du ja nichts an dem Pin.
Meiner Meinung nach entspricht nichts aber nicht 0V.

Du bräuchtest demnach also entweder 5V damit du high bekommst oder 0V um low zu bekommen (und das am Pin).

KingTobi
04.01.2010, 17:49
Richtig, unbeschaltet kann der Pin irgendeinen Zustand haben.
Dafür gibts ja auch Pull-Up Widerstände und die gibts auch intern!

RP6ler
04.01.2010, 18:54
achso, ja hab ich vergessen zu schreiben. ich habe schon mal GND und anschließend VDD auf den PC6 pin der M32 gebrückt.

aber im terminal werden bei mir einfach keine textmeldungen angezeigt. an was kann das liegen?

die beispielprogramm laufen alle fehlerfrei.

mfg

KingTobi
04.01.2010, 18:59
#include "RP6ControlLib.h"

void eingang(void)
{
writeString_P("PC6 is set to HIGH!\n");
}

int main(void)
{
initRP6Control();

while(true)
{
eingang();
}
return 0;
}


Funktioniert das?

RP6ler
04.01.2010, 19:11
@KingTobi: Nein, auch wenn ich dieses programm aufspiele, werden im terminal keine textmeldungen ausgegeben.
ich bin echt ratlos an was das liegt.

hab gerade noch mal ein anderes beispielprogramm aufgespielt und das hat einwandfrei funktioniert.

mfg

KingTobi
04.01.2010, 19:16
Ok, dann ist ja schonmal klar das es mit dem Eingang nichts zu tun hat, darauf wollte ich hinaus.

Poste mal bitte ein Beispielprogramm

RP6ler
04.01.2010, 19:29
mit beispielprogramm meinte ich nur ein mitgeliefertes beispielprogramm. ich habe vorher das programm mit den buttons ausprobiert. Example_01_Buttons heißt das, was ich getestet habe. das hast du bestimmt auch.

KingTobi
04.01.2010, 19:30
Nein, ich hab keinen RP6, deshalb die Frage ob dus mal posten kannst

RP6ler
04.01.2010, 19:43
achso, ja jetzt

/*
* ************************************************** **************************
* RP6 ROBOT SYSTEM - RP6 CONTROL M32 Examples
* ************************************************** **************************
* Example: Buttons and Beeper
* Author(s): Dominik S. Herwald
* ************************************************** **************************
* Description:
* This Example shows how to use the keys (and the beeper) on the RP6 Control
* board.
* We simply poll for pressed keys and output ADC value and key number on the
* LCD and serial interface, set some LEDs and play sounds with the beeper.
* You can use this program to get the real ADC values for your keypad.
* (They are different on each board, because of the 5% tolerance resistors.
* You may need to adjust some values in the RP6ControlLib in the
* getPressedKeyNumber() Function)
*
* ################################################## ##########################
* The Robot does NOT move in this example! You can simply put it on a table
* next to your PC and you should connect it to the PC via the USB Interface!
* ################################################## ##########################
* ************************************************** **************************
*/

/************************************************** ***************************/
// Includes:

#include "RP6ControlLib.h" // The RP6 Control Library.
// Always needs to be included!

/************************************************** ***************************/
// Main function - The program starts here:

int main(void)
{
initRP6Control(); // Always call this first! The Processor will not work
// correctly otherwise.

writeString_P("\n\nRP6Control Button Example Program!\n");

// Play two sounds:
sound(180,80,25);
sound(220,80,25);

setLEDs(0b1111); // Turn all LEDs on!
initLCD(); // Initialize the LC-Display (LCD)
// Always call this before using the LCD!
showScreenLCD("################", "################");
mSleep(500);
showScreenLCD("Buttons", "Example Program2");
mSleep(1000);
// ---------------------------------------
setLEDs(0b0000); // All LEDs off!

// This text is fixed on the LCD. Only the
// key and ADC values are changed later on!
showScreenLCD("ADC Value:", "Button: T");
while(true)
{
// Check if a key is pressed:
uint8_t key = getPressedKeyNumber();
// This function returns a 0 if no key is pressed and
// the key number from 1 to 5 otherwise.

if(key) // If a key is pressed... (key != 0)
{
// ... we update the values
// on the LCD display:
uint16_t key_adc = readADC(ADC_KEYPAD);
setCursorPosLCD(0, 11);
writeIntegerLengthLCD(key_adc, DEC, 4);
setCursorPosLCD(1, 9);
writeIntegerLCD(key, DEC);
// Please note that we did not output the whole screen again - we just
// overwrote the old numbers!

// Output key and ADC Value on serial Interface:
writeString_P(" ADC Value:");
writeInteger(key_adc,DEC);
writeString_P(" --> Pressed key:");
writeInteger(key,DEC);
writeChar('\n');

// ... wait until the key is released again...
while(getPressedKeyNumber());
writeString_P("Key released - playing sound!\n");
// ... and depending on which key was pressed, we
// turn some LEDs on and play different sounds:
switch(key)
{
case 1:
setLEDs(0b0001);
sound(200,10,10);
sound(175,10,10);
sound(215,10,10);
sound(135,50,40);
sound(225,20,25);
sound(205,50,50);
sound(135,120,120);
sound(95,50,10);
sound(145,40,10);
sound(200,30,15);
sound(175,30,20);
sound(135,50,25);
break;
case 2:
setLEDs(0b0010);
sound(235,11,1);
sound(225,12,2);
sound(215,13,3);
sound(205,14,4);
sound(195,15,5);
sound(185,16,6);
sound(175,17,7);
sound(165,18,8);
break;
case 3:
setLEDs(0b0100);
sound(245,10,0);
sound(235,20,0);
sound(225,40,0);
sound(215,60,0);
sound(205,80,0);
sound(215,60,0);
sound(225,40,0);
sound(235,20,0);
sound(245,10,0);
break;
case 4:
// Simple "Alarm" Sound using setBeeperFrequency function:
{
uint8_t i;
uint8_t j;
for(i = 1; i < 4; i++)
{
setLEDs(0b1111);
for(j = 230; j > 46; j-=2)
{
setBeeperPitch(j);
mSleep(5);
}
setLEDs(0b0000);
for(; j < 230; j+=2)
{
setBeeperPitch(j);
mSleep(5);
}
// Turn beeper off:
setBeeperPitch(0);
}
}
break;
case 5:
setLEDs(0b1001);
sound(220,80,10);
sound(175,20,20);
sound(220,80,10);
sound(175,20,20);
break;
}
}
}
return 0;
}

Xandi11
04.01.2010, 19:44
Ich hab auf meinem Webserver alle Beispielprogramme.

http://home.tele2.at/xandi11/roboternetz/RP6CONTROL_EXAMPLES.rar

KingTobi
04.01.2010, 19:47
@RP6ler
Bitte benutz die Code Tags!

Benutzt du die fertige Beispiel .Hex?? Oder Compilierst du den Beispiel Code selbst nochmal? Falls nein, compilier das Beispiel und guck ob es dann auch läuft.

Xandi11
04.01.2010, 19:54
Wenn das Beispielprogramm mit den Tastern funktioniert, müssen die IOs (als Eingänge) funktionieren.

Ich weiß zwar nicht genau wo die Taster genau angeschlossen sind, aber es muss entweder PC5 od. PC6 od. PC7.
Habe eine Erweiterungsplatine mit Transistorschaltungen für Beleuchtung bei der ich eben die 3 Pins verwende.
Ein Auswahl über die Taster ist dann nicht mehr möglich.

1.
Hast du schon mal versucht den Pin als Ausgang zu verwenden und einen wirklichen Verbraucher daran anzuschließen (z.B. low-current LED).





#include "RP6ControlLib.h"

void eingang(void)
{
writeString_P("PC6 is set to HIGH!\n");
}

int main(void)
{
initRP6Control();

while(true)
{
eingang();
}
return 0;
}



Funktioniert das?


Das versteh ich nicht ganz ... das ist doch eine Endlosschleife mit ner Ausgabe drin ...[/quote]

edit:
Ich habs geschafft ein Codefenster zu erstellen ... :Strahl 8)

KingTobi
04.01.2010, 19:59
@Xandi11
Liess doch erstmal meine Posts richtig durch.
Mit den Tastern scheint es nichts zu tun zu haben! Und ja Das ist eine Endlosschleife die was ausgeben soll und selbst das klappt nicht. Also liegt die nicht funktionierende Ausgabe nicht an den Tastern.

Xandi11
04.01.2010, 20:06
die beispielprogramm laufen alle fehlerfrei.



hab gerade noch mal ein anderes beispielprogramm aufgespielt und das hat einwandfrei funktioniert.


Die Beispielprogramme (die mit dem Roboter mitgeliefert sind) scheinen ja zu funktionieren ... bei denen sind aber auch Textausgaben eingebaut.

Warum dein Programm nicht funktioniert ist mir überhaupt nicht klar ... ich werde das jetzt mal schnell probieren.

KingTobi
04.01.2010, 20:10
Und deshalb meine Frage ob er die mitgelieferten fertigen .hex Datei benutzt oder die Beispieldateien erst selbst compiliert, das ist ein Unterschied!

Xandi11
04.01.2010, 20:16
... Habe die Programme jetzt ausprobiert

@KingTobi
Das Programm von dir funktioniert ... zumindest bei mir

das Programm (hab ich schon mal gepostet)


int main(void)
{
initRP6Control();

while(true)
{
DDRC &= ~IO_PC6;
if(PINC & IO_PC6)
{
writeString_P("PC6 is HIGH!\n");
}
else
{
writeString_P("PC6 is LOW!\n");
}
}
return 0;
}

funktioniert einwandfrei

... dann muss es bei dir an etwas anderem liegen



Hast du die neueste Version des RP6Loader ?
http://www.arexx.com/rp6/html/de/software.htm

edit:
@ KingTobi
Normalerweise dürfte es doch keinen Unterschied machen, ob man die Programme selbst kompiliert oder die fertigen hexfiles verwendet.
Hab das auch gerade probiert ... das macht (bei mir) überhaupt keinen Unterschied.

KingTobi
04.01.2010, 20:19
Hätte mich auch gewundert wenns nicht geht!
Dann wird beim Compilieren was falsch laufen

Xandi11
04.01.2010, 20:29
Noch ne Idee:

Vl hast du die Ordnerstrukturen nicht richtig angelegt?

Du musst den Ordner mit den Beispielprogrammen an irgendeinen Ort auf der Festplatte kopieren und IN DIESEN Ordner kannst du dann einen neuen Ordner erstellen, indem du dann ein Projekt erstellst (mit Makefile und so).

BSP:
...\RP6Control_Examples\LCD\ und das sind dann alle Daten des Projekt drin
nämlich (z.B.):
lcd.c
lcd_p.pnprog
makefile
make_all.bat
make_clean.bat
und ev. lcd_p.pnps

RP6ler
05.01.2010, 11:53
@KingTobi: ich habe das hexfile des beispielprogramm direkt genommen und es nicht nochmal extra kompiliert.

aber das bei mir grundsätzlich was beim kompilieren falsch läuft, kann ich ausschließen, da ich schon andere ordner erstellt habe und darin programme erstellt habe, welche auch korrekt liefen.

das am RP6Loader was nicht stimmt, kann ich daher auch ausschließen.

@Xandi11: wie ich das mit den ordner gemacht habe, habe ich in einem meiner letzten post schon ausführlich erklärt, aber ich glaube ich habe es genauso gemacht, wie du es mir hier erklärt hast.

was aber durchaus ein grund sein könnte, ist das, das irgendwas in genau diesem verzeichnis falsch kompiliert, wird, da irgendwelche orderdateien nicht korrekt sind.

das hier sind alle dateien in diesem ordner:

- Testprogramm_C (C-datei)
- make_all (einfach aus button-beispielprogramm kopiert)
-makefile(von buttons-beispielprogramm kopiert, bei target auf Testprogramm_C abgeändert)
- make clean(von buttons- beipsielprogramm kopiert)
- .dep ->Testprogramm_C.o.d.
- Testprogramm_C.elf
- Testprogramm_C.lss
- Testprogramm_C.map
- Testprogramm_C (Sym- datei)
- Testprogramm_C (hex.datei)
- Testprogramm_C.lst
- Testprogramm_C.o (O- datei)


leider kann ich gerade keiner eurer vorschläge ausprobieren, da ich erst am freitag wieder heim komme.

was mir jetzt gerade noch einfällt und evtl. wichtig sein könnte ist, dass ich den timer 1 auf 36khz CTC modus mit interrupt zur verwendung eines ir- kollisionssystems initialisiert habe. das sah folgendermaßen aus:




#include "RP6ControlLib.h"


uint8_t counter;


ISR(TIMER1_COMPA_vect)

{counter++;

if(counter <21)
{PORTD ^= (1<<PD5);
writeString_P("Interrupt Timer1 Compare\n");}

if(counter > 20 && interruptcounter <41)
{writeString_P("Interrupt Pause\n");}

if(counter == 41)
{counter =0;}



}





void infrarotempfang(void)
{if (PINC & (1<<6))



{writeString_P("Infrarot empfangen\n");
}


}

int main(void)
{initRP6Control();

DDRD |= (1<<PD5); //PD5 als Ausgang

DDRC &=~ (1<<6); //PC6 als Eingang

while(true)
{

infrarotempfang();
}
return 0;
}


timerinitialisierung:




TCCR1B = (0 << ICNC1)
| (0 << ICES1)
| (0 << WGM13)
| (1 << WGM12)
| (0 << CS12)
| (0 << CS11)
| (1 << CS10);

OCR1A = 221;



// Timer 2 - used for beeper:
TCCR2 = 0;
OCR2 = 0xFF;

// Enable timer interrupts:
TIMSK = (1 << OCIE0)|(1<<OCIE1A);
sei();

dieses programm hatte ich auch im Testprogramm_C ordner und bei diesem programm kamen alle textmeldungen des interrupts korrekt. nur die textmeldung am eingang kam nicht.

deshalb habe ich das programm anschließend abgeändert (ohne interrupt) um dem problem mit der eingangstextmeldung genauer auf den grund zu gehen.

alles ein bischen verwirrend, z.b. auch, warum das ganz einfache programm von KingTobi mit der Textmeldung jetzt auch keine textmeldung bringt.

vielleicht kann mir ja jetzt jemand entscheidend weiterhelfen.
danke auf jeden fall schon jetzt mal für euer großes bemühen.

mfg

Xandi11
05.01.2010, 22:35
Ich versteh jetzt nicht ganz was dein Programm mit der Interruptroutine mit dem Problem, dass du keine Textausgaben bekommst zu tun hat.

Edit:


dieses programm hatte ich auch im Testprogramm_C ordner

Du könntest versuchen einfach alles neu zu machen.
Nimm einfach nur mal den Code von KingTobi (der mit der Endlosschleife) und erstell einen ganz neuen Ordner, Projekt usw.
Dann könntest du auch ausschließen, dass es eine Verknüpfung mit deinem früheren Programm gibt.

Ich glaube allerdings, dass das nicht ändern wird ... aber nen Versuch ist allemal wert.

lg

RP6ler
06.01.2010, 08:57
danke Xandi für den tipp, ich werde es am freitag wenn ich wieder daheim bin ausprobieren.

bis dann

RP6ler
08.01.2010, 16:45
so, jetzt hab ich wieder daheim. also jetzt habe ich gerade mal den ordner mit dem Testprogramm_C komplett gelöscht und einen neuen Ordner mit M32Test erstellt. in diesen habe ich dann das makefile, make clean und die c datei des buttons- beispielprogramm kopiert und umbenannt.

anschließend habe ich im programmers notepad das ganze buttons programm, welches bei mir ja jetzt M32Test heißt kompiliert. das ging alles fehlerfrei.

anschließend habe ich die hexdatei des M32Test mit dem RP6Loader in die M32 geladen.

jetzt kommts:

Die M32 macht bei diesem programm gar nichts.

also muss bei mir irgendetwas beim kompilieren falsch laufen. komischerweise ging das bis vor ein paar wochen alles noch.

was noch auffällig ist, ist, dass die hexdatei des M32Test- programms 12,2Kb speicherplatz hat, während das original hexfile des buttonsprogramm nur 11,7Kb hat.

das alles lässt auf einen fehler beim kompilieren schließen.

auf jeden fall brauche ich jetzt mal gute ratschläge...

mfg

Xandi11
08.01.2010, 17:13
Auf die Schnelle fällt mir eigentlich nur eins ein ....

Die Software deinstallieren (wirklich alles löschen) und anschließend wieder neu installieren.

Einen Versuch wär das Wert, denn mehr als 10 Minunten dürfte das nicht dauern.
Lad dir für die Neuinstallation auch das Setup neu vom Internet herunter.

RP6ler
08.01.2010, 19:05
hallelujah, es geht.
alles neu installiert und nun geht es.

ich danke euch allen für eure hilfe.

mfg

RP6ler
09.01.2010, 11:03
so, jetzt habe ich herausgefunden, warum das programm nicht mehr funktioniert hat.

in meinem letzten post hab ich ja geschrieben, dass jetzt wieder alles funktioniert, seit ich alles neu installiert habe. das funktionierte aber nur so lange, bis ich meinen timer 1 in der library initialisiert habe. ab diesem zeitpunkt trat wieder das selbe problem auf.

darum habe ich die timerinitialisierung nun etwas abgeändert.

ursprünglich war der timer so initalisiert:



TCCR1B = (0 << ICNC1)
| (0 << ICES1)
| (0 << WGM13)
| (1 << WGM12)
| (0 << CS12)
| (0 << CS11)
| (1 << CS10);

OCR1A = 221;



// Timer 2 - used for beeper:
TCCR2 = 0;
OCR2 = 0xFF;

// Enable timer interrupts:
TIMSK = (1 << OCIE0)|(1<<OCIE1A);
sei();


als er so initialisiert war hat folgendes programm nur ausschließlich den interrupt abgearbeitet (war über textmeldungen erkennbar) und sonst gar ncihts gemacht, also auch keinen eingang abgefragt.


#include "RP6ControlLib.h"

uint8_t a;
uint8_t interruptcounter;


ISR(TIMER1_COMPA_vect)

{interruptcounter++;

if(interruptcounter <50)
{PORTD ^= (1<<PD5);
writeString_P("Interrupt Timer1 Compare\n");}

if(interruptcounter > 50 && interruptcounter <101)
{writeString_P("Interrupt Pause\n");}

if(interruptcounter > 100)
{interruptcounter =0;}



}





void infrarotempfang(void)
{if (PINC & (1<<PC3))
{
a++;
}

if (a >100)
{writeString_P("Infrarot empfangen\n");
startStopwatch1();}

if (getStopwatch1() >1000)
{setStopwatch1(0);}
}

int main(void)
{initRP6Control();

DDRD |= (1<<PD5); //PD5 als Ausgang

DDRC &=~ (1<<PC3); //PC3 als Eingang

while(true)
{

infrarotempfang();
}
return 0;
}


darum habe ich die timerinitialisierung so abgeändert, dass wieder der eingang abgefragt wird:


TCCR1B = (0 << ICNC1)
| (0 << ICES1)
| (0 << WGM13)
| (1 << WGM12)
| (0 << CS12)
| (0 << CS11)
| (1 << CS10);

OCR1A = 221;
TIMSK = (1<< OCIE1A);
sei();
// Timer 2 - used for beeper:
TCCR2 = 0;
OCR2 = 0xFF;

// Enable timer interrupts:
TIMSK = (1 << OCIE0);


nun ist es so, dass in meinem programm der eingang wieder abgefragt wird, aber nun kein interrupt mehr ausgelöst wird.

kann mir einer der RP6 experten sagen, warum das überhaupt so ist, dass die timerinitialisierung das programm derart beeinflusst?
was muss ich jetzt noch ändern, damit der eingang abgefragt wird und gleichzeitig der interrupt auslöst?

mfg