- 3D-Druck Einstieg und Tipps         
Seite 2 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 11 bis 20 von 38

Thema: ACS an NIBObee

  1. #11
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Anzeige

    Powerstation Test
    Hallo

    Da ich selbst viele Anregungen und Infos aus dem Forum ziehe ist es nur fair, wenn ich auch etwas einbringe.

    Es ist gut, wenn man die Anschlußbelegung im Programmkopf als Kommentar dokumentiert. Ich füge auch immer den Link zum entsprechenden Thread mit ein.

    Zu 1: Ja, wenn die Kathoden auch auf einen Pin gehen muss dieser ein Low ausgeben. Aber Achtung! Ein Ausgang kann nur begrenzt viel Strom vertragen, egal ob High oder Low. 20mA sollten kein Problem sein, aber je nach Bemessung der Vorwiderstände für die IR-Leds muss man bei der Parallelschaltung beider Seiten diese Stromgrenze beachten. Vor allem bei der Dauerschaltung könnten gefährliche Werte auftreten, später im Pulsbetrieb ist es nicht mehr so kritisch. Vorsichtshalber erwähne ich es nochmals: Vorwiderstände nicht vergessen!

    Zu 2: Eingehende Daten oder gar Werte gibt es nicht wirklich. Es wird nur der Pegel des TSOP-Ausgang geprüft. Wenn er ein 36kHz-IR-Signal erkennt schaltet dieser Ausgang von High nach Low.

    Zu 3: Die +/- Anschlüsse der Erweiterungssteckplätze sind dauerhaft mit Vcc und GND verbunden und brauchen nicht extra aktiviert werden.

    Zu 4: Ja, du kannst dazu vorerst auch die Funktionen aus delay.h verwenden, diese sind allerdings unter gewissen Umständen nicht sehr genau und die Wartezeit sollte unbedingt vor dem Kopilieren bekannt sein. Infos dazu stehen in Programmkopf von delay.h. Später kannst du den 36kHz-Takt auch als Zeitbasis für eine eigene Zeitfunktion nutzen.

    Zu 5 kann ich nichts sagen, weil ich das AVR-Studio nicht verwende. Möglicherweise muss man delay.c einbinden.

    Ich werde versuchen, diesen Thread an den ACS-Thread anzuhängen. Der befindet sich allerdings in einer Rubrik in der ich dann keine Mod-Recht mehr habe...

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  2. #12
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.02.2011
    Alter
    29
    Beiträge
    104
    Vielen Dank!... ohne dich jetzt irgendwie nerven zu wollen, habe ich noch eine Frage bezüglich dem Programm
    Ich habe also meine Anode an PA0 und meine Kathode an PA3. Also erst einmal PA0 als high definieren: DDRA = DDRA | 1; PORTA = PORTA | 1;
    Wie definiere ich PA3 als low? Und wie bringe ich das ganze in ein Programm unter, das die LEDs zum leuchten bringt?

  3. #13
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Der Einstieg ist immer schwierig. Also machen wir mal weiter.

    PA3 ist das dritte Bit von rechts in den Portregistern mit der Wertigkeit 2^3 oder 8 bzw. binär 0b00001000. Anhand der binären schreibweise (erkennbar an der vorangestellten 0b) versuche ich mal zu erklären, wie man in einem Byte genau dieses Bit3 löschen kann. Dazu verwenden wir die bitweise Und-Verknüpfung & (UMSCHALT und 6). Diese setzt im Ergebniss nur dann das Bit, wenn in beiden Operanten dieses Bit auch gesetzt war. Operanten sind in diesem Fall der Inhalt des Ausgaberegisters und ein Bitmuster, gewöhnlich nennt man es Maske, das nur dieses eine Bit beeinflusst. Als Programmcode sieht das dann so aus:

    PORTA = PORTA & 0b11110111

    Alle im Ausgangsregister schon gesetzten Bits bleiben gesetzt außer Bit3 (Zählung beginnt rechts mit 0!).

    Um beide Pins "in einem Rutsch" zu ändern kann man die Masken auch kombinieren:

    DDRA |= 0b00001001; // PA0 und PA3 als Ausgang betreiben
    PORTA |= 1; // High an PA0 ausgeben
    PORTA &= ~8 // Low an PA3 ausgeben

    - Das Datenrichtungsregister muss man natürlich nur ändern wenn sich auch was geändert hat.
    - Die Tilde ~ (ALTGR und +) bewirkt, dass alle Bits im nachfolgenden Wert invertiert werden, aus 1 wird 0, aus 0 wird 1 und aus der Maske 0b00001000 (oder 8) wird 0b11110111 ;)
    - Die Kommentare sind für Anfänger, bei einem echten Programm würde ich dich dafür erschlagen! Besser wäre später als Fortgeschrittener z.B.:

    // Pins für IR-LEDs auf Ausgang setzen
    // Anoden mit 5V versorgen
    // Kathoden an 36kHz

    oder so ähnlich... ;)

    Um das Thema abzurunden vielleicht noch ein paar Zeilen zur Erzeugung der Maske. Die binäre Darstellung ist recht unübersichtlich und fehleranfällig. Deshalb verwendet man häufig die Bitschiebereien mit dem << (oder eher selten >>) -Operator dazu. Erster Operant ist das Bitmuster welches rechtsbündig in die Maske geschrieben wird. Der zweite Operand gibt an, wie oft dieses Muster, entsprechend dem Operator, geschoben wird. Mit

    Maske = 1 << 0

    schreibt man in Bit 0 der Maske eine 1 und schiebt diese 0 mal nach links, Maske sieht dann so aus: 0b00000001. Ein paar weitere Beispiele:

    Maske = 1 << 3 ergibt 0b00001000
    Maske = ~(1<<3) ergibt 0b11110111
    Maske = (1<<3) | (1<<0) entspricht 0b00001000 | 0b00000001 und ergibt 0b00001001

    Wenn man nun noch weiß, wie #define funktioniert und dass in io.h die Portpins PA0 bis PA7 als 0 bis 7 definiert werden, kann man schnell recht übersichtliche Masken erzeugen:

    DDRA |= (1<<PA3) | (1<<PA0);
    PORTA |= (1<<PA0);
    PORTB &= ~(1<<PA3);

    So, Ende für Heute ;)

    Viel Spass beim Ausprobieren.

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  4. #14
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.02.2011
    Alter
    29
    Beiträge
    104
    So viel Imput auf einmal... ..aber trotzdem vielen, vielen Dank für diese ausführliche Erklärung!
    Ich denke ich werde mir das morgen alles noch einmal in Ruhe durchlesen, für Heute ist es zu spät

  5. #15
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Die Threads sind jetzt zusammengeführt. Beim Durchlesen ist mir noch etwas aufgefallen:

    "die Anoden der rechten IR-LEDs an Signal 1 von X1 angeschlossen, die Anoden der linken an Signal 2 von X1"

    Das bedeutet, die LEDs sind parallel angeschlossen und jede LED hat einen eigenen Vorwiderstand? Einfacher wäre es, wenn die LEDs in Reihe geschaltet werden, so sieht das z.B. beim probot aus:

    Bild hier  
    (Bildausschnitt aus der probot-Beschreibung Seite 37)

    Das sind zwar 3mm-LEDs und die Polung stimmt nicht, aber es zeigt das Prinzip. (Mit geänderter Ansteuerung würde das auch bei der bee funktionieren, aber es wäre unnötig komplizierter;)

    Gruß

    mic
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken probot-acs-irleds.gif  
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  6. #16
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.02.2011
    Alter
    29
    Beiträge
    104
    Hallo,

    ich habe die LEDs so angeschlossen wie in der angehängten Grafik.

    Allerdings habe ich noch eine Frage zu dem Programm, das die LEDs erst einmal leuchten lassen soll. Am Anfang werden normal die header-dateien "included" und dann die Ports definiert? ..Und wie sieht die Endlos-Schleife dann aus?
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken Unbenannt.PNG  

  7. #17
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Prima, allerdings scheint mir der 470er etwas groß. Aber vielleicht ist das auch ein Vorteil weil das ACS dann nicht so empfindlich ist.

    Ich habe meine bee jetzt reaktiviert und ein kleines Demo zusammengebastelt. Da mir die Library der bee noch nie gefallen hat, und als kleine Herausforderung für mich, verzichte ich vorerst auf den Einsatz der Lib. Ich hoffe, die Funktionen sind trotzdem nachvollziehbar.

    Da meine ACS-Erweiterung andere Pins verwendet habe ich die #defines auch für meine bee eingefügt und auskommentiert. Diese Version sollte deshalb auf deiner bee funktionieren:

    PHP-Code:
    // Übungen für ACS an Nibobee                                         9.6.11 mic

    // https://www.roboternetz.de/community/showthread.php?53494-ACS-an-NIBObee

    // Die Anoden der rechten IR-LEDs hängen mit Vorwiderstand an PA0 (X1-AN0)
    // Die Anoden der linken IR-LEDs hängen mit Vorwiderstand an PA1 (X1-AN1)
    // Die Kathoden beider IR-LEDs sind mit PA3 (X3-AN3) verbunden
    // Der IR-Empfänger ist mit PA2 (X2-AN2) verbunden

    // pacman-bee
    #define ddr_acs_led_l      DDRA     // Anoden der IR-LEDs links
    #define port_acs_led_l     PORTA
    #define pin_acs_led_l    (1<<PA1)

    #define ddr_acs_led_r      DDRA    // rechts
    #define port_acs_led_r     PORTA
    #define pin_acs_led_r     (1<<PA0)

    #define ddr_acs_36kHz      DDRA     // Kathoden der IR-LEDS mit 36kHz getaktet
    #define port_acs_36kHz     PORTA
    #define pin_acs_36kHz     (1<<PA3)

    #define ddr_acs_tsop      DDRA     // Eingang IR-Empfänger
    #define port_acs_tsop     PINA  // Achtung, das ist ein Eingang!
    #define pin_acs_tsop      (1<<PA2)

    /*
    // radbruch-bee
    #define ddr_acs_led_l      DDRA     // Anoden der IR-LEDs links
    #define port_acs_led_l     PORTA
    #define pin_acs_led_l    (1<<PA2)

    #define ddr_acs_led_r      DDRA    // rechts
    #define port_acs_led_r     PORTA
    #define pin_acs_led_r     (1<<PA3)

    #define ddr_acs_36kHz      DDRC     // Kathoden der IR-LEDS mit 36kHz getaktet
    #define port_acs_36kHz     PORTC
    #define pin_acs_36kHz     (1<<PC2)

    #define ddr_acs_tsop      DDRC     // Eingang IR-Empfänger
    #define port_acs_tsop     PINC  // Achtung, das ist ein Eingang!
    #define pin_acs_tsop      (1<<PC3)
    */

    #include <avr/io.h>
    #include <util/delay.h>

    void leds(uint8_t status)    // status bit0 bis 3 entspricht den LED0 bis 3
    {
        
    PORTB &= 0b11110000;    // alle LED ausschalten
        
    PORTB |= 0b1111 status;    // gewünschte LED einschalten
    }

    int main(void)
    {
        
    DDRB |= 0b1111// PB0 bis PB3 sind die LED 0 bis 3
        
    leds(0b1001); // LED 0 und 3 einschalten
        
    _delay_ms(1000); // eine Sekunde warten
        
    leds(0); // alle LED ausschalten

        
    ddr_acs_led_l |= pin_acs_led_l// linke ACS-LED Anode
        
    ddr_acs_36kHz |= pin_acs_36kHz// Kathoden beide LED
        
    port_acs_36kHz &= ~pin_acs_36kHz// Dauerlicht
       
        
    while(1)
        {
            
    port_acs_led_l |= pin_acs_led_l// linke IR-LED anschalten
            
    leds(0b0010); // LED1 zur Kontrolle einschalten
            
    _delay_ms(500);

            
    port_acs_led_l &= ~pin_acs_led_l// linke IR-LED ausschalten
            
    leds(0); // LED1 zur Kontrolle ausschalten
            
    _delay_ms(300);
        }
        return(
    0);

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  8. #18
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.02.2011
    Alter
    29
    Beiträge
    104
    Ach, ich weiß gar nicht wie oft und viel ich dir noch danken soll ich habe das Programm mal geflasht. Die LEDs leuchten auch, aber wie stelle ich fest, ob die IR-LEDs auch leuchten? habe mal gehört man kann das mit einer Kamera irgendwie sehen?

  9. #19
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Mit einer Digicam/Handycam kann man das IR-Licht erkennen. Gegenprobe wäre eine Fernbedienung die auch von der Kamera gesehen werden kann. Meine IR-LEDs (und auch der lötempfindliche IR-Empfänger) sind gesteckt, zum Testen kann ich sie gegen normale LEDs austauschen.
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  10. #20
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.02.2011
    Alter
    29
    Beiträge
    104
    Hallo!
    Ich habe mal deinen Code geflasht:
    Code:
    // Die Anoden der rechten IR-LEDs hängen mit Vorwiderstand an PA0 (X1-AN0) 
    // Die Anoden der linken IR-LEDs hängen mit Vorwiderstand an PA1 (X1-AN1) 
    // Die Kathoden beider IR-LEDs sind mit PA3 (X3-AN3) verbunden 
    // Der IR-Empfänger ist mit PA2 (X2-AN2) verbunden 
    
    // pacman-bee 
    #define ddr_acs_led_l      DDRA     // Anoden der IR-LEDs links 
    #define port_acs_led_l     PORTA 
    #define pin_acs_led_l    (1<<PA1) 
    
    #define ddr_acs_led_r      DDRA    // rechts 
    #define port_acs_led_r     PORTA 
    #define pin_acs_led_r     (1<<PA0) 
    
    #define ddr_acs_36kHz      DDRA     // Kathoden der IR-LEDS mit 36kHz getaktet 
    #define port_acs_36kHz     PORTA 
    #define pin_acs_36kHz     (1<<PA3) 
    
    #define ddr_acs_tsop      DDRA     // Eingang IR-Empfänger 
    #define port_acs_tsop     PINA  // Achtung, das ist ein Eingang! 
    #define pin_acs_tsop      (1<<PA2) 
    
    
    #include <avr/io.h> 
    #include <util/delay.h> 
    
    void leds(uint8_t status)    // status bit0 bis 3 entspricht den LED0 bis 3 
    { 
        PORTB &= 0b11110000;    // alle LED ausschalten 
        PORTB |= 0b1111 & status;    // gewünschte LED einschalten 
    } 
    
    int main(void) 
    { 
        DDRB |= 0b1111; // PB0 bis PB3 sind die LED 0 bis 3 
        leds(0b1001); // LED 0 und 3 einschalten 
        _delay_ms(10000); // eine Sekunde warten 
        leds(0); // alle LED ausschalten 
    
        ddr_acs_led_l |= pin_acs_led_l; // linke ACS-LED Anode 
        ddr_acs_36kHz |= pin_acs_36kHz; // Kathoden beide LED 
        port_acs_36kHz &= ~pin_acs_36kHz; // Dauerlicht 
        
        while(1) 
        { 
            port_acs_led_l |= pin_acs_led_l; // linke IR-LED anschalten 
            leds(0b0010); // LED1 zur Kontrolle einschalten 
            _delay_ms(5000); 
    
            port_acs_led_l &= ~pin_acs_led_l; // linke IR-LED ausschalten 
            leds(0); // LED1 zur Kontrolle ausschalten 
            _delay_ms(3000); 
        } 
        return(0); 
    }
    Bei diesem Programm leuchten zwar die LEDs wie vorgeschrieben, die IR-LEDs allerdings nicht. Die IR-LEDs sind alle richtig rum eingebaut und es gibt auch keine kalten Lötstellen. Danach habe ich mit dem Multimeter an den Anschlüssen von X1, X2 und X3 gemessen und festgestellt, dass dort überhaupt keine Spannung anliegt (bzw. 0,09 V).
    Wie kann das sein?

Seite 2 von 4 ErsteErste 1234 LetzteLetzte

Ähnliche Themen

  1. NiboBee und Windows 7
    Von m125 im Forum Sonstige Roboter- und artverwandte Modelle
    Antworten: 3
    Letzter Beitrag: 12.02.2015, 12:21
  2. nibobee IR-Abstandsmessung
    Von pinsel120866 im Forum Sonstige Roboter- und artverwandte Modelle
    Antworten: 39
    Letzter Beitrag: 10.10.2011, 11:19
  3. Nibobee: Rad-Getriebe
    Von c07 im Forum Sonstige Roboter- und artverwandte Modelle
    Antworten: 16
    Letzter Beitrag: 21.01.2011, 16:57
  4. Nibobee laden
    Von Blacky666 im Forum Sonstige Roboter- und artverwandte Modelle
    Antworten: 3
    Letzter Beitrag: 07.12.2010, 13:08
  5. USB-Programmierer vom Nibobee
    Von Silver-Drago im Forum AVR Hardwarethemen
    Antworten: 7
    Letzter Beitrag: 06.11.2010, 02:39

Berechtigungen

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

LiFePO4 Speicher Test