PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] PA0, PA1 benutzen



Mr.Deepbass
09.05.2012, 13:55
Hallo Forumgemeinde,

ich habe vor, die Ports ADC0 und ADC1 der Base als Augänge zu verwenden um eine LED anzusteuern. Da diese 30mA zieht habe ich schonmal eine entsprechende Treiberschaltung auf einer kleinen PLatine mit ienem BC547C realisiert.
Meine Frage an euch: welche Register muss ich nun genau beschreiben und wo ? Ich vermute die RP6 Base header Datei, wo ich die Ports als Ausgänge definieren muss um dann anschließend im Code mit einem Befehl diese auf 1 setzen zu können. Ich habe im Forum gesucht, gegoogelt usw. bin aber nicht so richtig schlau aus dem ganzen geworden. Danke im Vorraus.

Gruß Christian

Kampi
09.05.2012, 16:51
Hi,

also für Ausgänge muss das Data-Direction-Register (DDR) geändert werden. Dort muss für den dementsprechenden Pin eine 1 stehen. Dann ist dieser Pin als Ausgang geschaltet.
Es gab vor 2-3 Wochen schonmal eine ähnliche Frage.
Schau mal hier:

https://www.roboternetz.de/community/threads/57706-ADC0-1-Eing%C3%A4nge-um%C3%A4ndern

Das ist zwar für Eingänge aber lässt sich genauso für Ausgänge anwenden.

Mr.Deepbass
09.05.2012, 19:09
Hallo Kampi,

also ich wusel mich gerade durch die RP6RobotBase.h so durch und da steht ja folgendes:

// PORTA

#define UBAT (1 << PINA7) // ADC7 (Input)
#define MCURRENT_L (1 << PINA6) // ADC6 (Input)
#define MCURRENT_R (1 << PINA5) // ADC5 (Input)
#define E_INT1 (1 << PINA4) // INT1 (input per default... can be output)
#define LS_L (1 << PINA3) // ADC3 (Input)
#define LS_R (1 << PINA2) // ADC2 (Input)
#define ADC1 (1 << PINA1) // ADC1 (Input)
#define ADC0 (1 << PINA0) // ADC0 (Input)

// Initial value of port and direction registers.
#define INIT_DDRA 0b00000000
#define INIT_PRTA 0b00000000

// ---------------------------------------------------
// PORTA A/D Convertor channels

#define ADC_BAT 7
#define ADC_MCURRENT_L 6
#define ADC_MCURRENT_R 5
#define ADC_LS_L 3
#define ADC_LS_R 2
#define ADC_ADC1 1
#define ADC_ADC0 0

so jetzt habe ich mir den von dir empfohlenen Thread mal durchgelesen, schlau werde ich daraus allerdings nicht, denn was nun richtig und falsch ist bzw. konkretes steht da für mich nicht drinn.

Ich verstehe das folgendermaßen: #define INIT_DDRA 0b00000000 --> hier lege ich fest ob der PortA an entsprechender Stelle Ein-oder Ausgang ist.
Bsp.: #define INIT_DDRA 0b00000001 --> PortA PinA0 (ADC0) ist jetzt als Ausgang festgelegt weil ich diesen auf "1" setzte.

#define INIT_PRTA 0b00000000--> hier lege ich fest, welchen Anfangswert der entsprechende Pin bei dem Makro initPort() erhält. Dabei steht "0" für ausgeschaltet und "1" für eingeschaltet.

Ist das jetzt so richtig ?

Jetzt meine Frage wenn das alles so hinhaut.
(1): Soll ich das Makro initPort() in meinem Programm aufrufen in der Main oder wird die schon aufgerufen und automatisch initialisiert ? Ich denke das Passiert automatisch in der header datei der Base und muss nicht extra aufgerufen werden von mir.
(2): und jetzt WICHTIG: wie kann ich nun in meinem Programm den Port zum Beispiel ständig ein und ausschalten also eine LED z.B. zum blinken bringen ? Mit welchem Befehlsausdruck mache ich das?? ist das dieser kram hier ? DDRA &= ~(ADC1 | ADC2);
Wenn ja dann verstehe ich das nicht.

Danke schonmal

Grüße Christian

Kampi
09.05.2012, 19:26
Hi,

Zu 1): Das Makro musst du aufrufen. Sonst wird das nicht abgearbeitet. Die Header-Datei wird beim kompilieren nur mit eingefügt, sprich der Compiler kann kann mit initPort() auch was anfangen.
Zu 2):
Nein DDR legt nur die Richtung des Pins fest. Einen Pin einschalten machst du mit PORTX = 0x01 (schaltet Pin 1 beim PortX ein) und für aus PORTX ~= 0x01.

Mr.Deepbass
09.05.2012, 19:48
WOW,

du antwortest ja schneller als das ich nachschauen kann;) Also, ich habe jetzt bei :

// Initial value of port and direction registers.
#define INIT_DDRA 0b00000001

das letzte Bit auf "1" gesetzt , das sollte hinhauen oder ? Damit ist das Ding als Ausgang festgelegt.

jetzt habe ich ein Problem, sobald ich in meiner Main die portInit() einfüge, fällt mir auf das ich das Programm nichtmehr anhalten kann über den reset Taster an der Base ! Komisch oder ?

hier mein kleiner TestCode:

// includes:
#include "RP6RobotBaseLib.h"

//defines:

//variables:


int main(void)
{
initRobotBase();
portInit();

uint8_t runningLight = 1;

while(true)
{
setLEDs(runningLight);
runningLight <<= 1;

if(runningLight > 32)
runningLight = 1;

if(runningLight > 4)
{PORTA = ~0x01;}
else(PORTA = 0x01);

mSleep(100);
}
return 0;
}

KAnnst du dir vorstellen woran das liegt ? Hängt sich das ding auf ? Weil meine LED blinkt einwandfrei;) Wenigstens das ...

Gruß

Kampi
09.05.2012, 20:03
Hi,

ich hab keinen RP6 von daher kann ich das nicht testen ;)
Aber wenn es ein Reset-Taster ist wird der Controller damit denk ich mal resetet. Nach dem Reset führt er das Programm dann wieder aus. Das passiert wahrscheinlich so schnell das du es einfach nur nicht mit bekommst.
Wäre mir neu das du einen Reset abschalten kannst indem du an den I/Os was umstellst :)

Dirk
09.05.2012, 22:01
@Mr.Deepbass:

Ein paar Ratschläge:
1. Die RP6 Library würde ich NIE verändern, weil es dann zu Problemen mit anderen Programmen kommen kann.
2. Wenn du PA0 als Ausgang nehmen willst, ist DDRA |= (ADC0); der richtige Befehl in deinem Programm.
3. In deinem Programm darfst du portInit() NICHT aufrufen, sondern stattdessen den unter 2. gezeigten Befehl hinter initRobotBase(); einfügen.
4. Das EINschalten des Ports PA0 machst du dann mit PORTA |= ADC0; und das AUSschalten mit PORTA &= ~ADC0;

Dann sollte es klappen.

Mr.Deepbass
10.05.2012, 00:42
Guten Morgen,

ich bedanke mich für eure weitführenden Ratschläge. Ich habe der Anleitung von Dirk befologt und bin sofort auf erfolgreiches Ufer gestoßen, der Reset Taster funktioniert nun auch wie gehabt. Aber vielen Dank auch an Kampi, deine Lösungsvorschlöge waren auch sehr hilfreich, jedoch solltest du, wie Dirk es beschrieben hat auch in Zukunft so handeln, alles funktioniert problemlos und ich habe nun die Grundvorraussetzungen für meine Projekte erlangt.

Viele Grüße

Christian