-
        

Ergebnis 1 bis 8 von 8

Thema: PA0, PA1 benutzen

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    10.01.2012
    Beiträge
    20

    PA0, PA1 benutzen

    Anzeige

    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

  2. #2
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    27
    Beiträge
    3.517
    Blog-Einträge
    9
    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:

    http://www.roboternetz.de/community/...-um%C3%A4ndern

    Das ist zwar für Eingänge aber lässt sich genauso für Ausgänge anwenden.
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    10.01.2012
    Beiträge
    20
    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

  4. #4
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    27
    Beiträge
    3.517
    Blog-Einträge
    9
    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.
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    10.01.2012
    Beiträge
    20
    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ß

  6. #6
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    27
    Beiträge
    3.517
    Blog-Einträge
    9
    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
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791
    @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.
    Gruß
    Dirk

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    10.01.2012
    Beiträge
    20
    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

Ähnliche Themen

  1. SPI benutzen
    Von CodeX im Forum Elektronik
    Antworten: 0
    Letzter Beitrag: 20.04.2007, 06:04
  2. Messkarte Benutzen
    Von mabaosheng im Forum Sensoren / Sensorik
    Antworten: 0
    Letzter Beitrag: 27.12.2006, 16:35
  3. ADC in Basic benutzen
    Von shahri im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 18
    Letzter Beitrag: 01.05.2006, 20:03
  4. Zeichensatz benutzen
    Von Murus im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 30
    Letzter Beitrag: 01.02.2006, 10:48
  5. I²C Bus bei AVR's benutzen
    Von Goldenflash im Forum AVR Hardwarethemen
    Antworten: 13
    Letzter Beitrag: 12.09.2005, 16:01

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •