- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 10 von 38

Thema: ACS an NIBObee

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.02.2011
    Alter
    28
    Beiträge
    104

    NIBObee-Erweiterung programmieren

    Hallo,
    ich habe mein NIBObee mit 4 IR-LEDs erweitert. Das Problem ist jetzt das Programm zu schreiben. Ich bin Programmieranfänger und habe versucht ein Programm zu schreiben, wo zumindest mal die LEDs leuchten. Mit dem Code hier, klappt es allerdings nicht (was für eine Überraschung ):
    Code:
    #include <nibobee/iodefs.h>
    #include <nibobee/led.h>
    #include <nibobee/delay.h>
    
    #define ddr_acs_led_l  	DDRA 
    #define port_acs_led_l 	PORTA
    #define pin_acs_led_l	(1<<PA1)
    
    #define ddr_acs_led_r  	DDRA   
    #define port_acs_led_r 	PORTA
    #define pin_acs_led_r 	(1<<PA0)
    
    #define ddr_acs_36kHz  	DDRA 	
    #define port_acs_36kHz 	PORTA
    #define pin_acs_36kHz 	(1<<PA3)
    
    #define ddr_acs_tsop  	DDRA 	
    #define port_acs_tsop 	PINA  
    #define pin_acs_tsop  	(1<<PA2)
    
    int main()
    {led_init();
     while(1==1)
    	{ led_set(ddr_acs_led_l, 1);
    	  led_set(ddr_acs_led_r, 1);
    	  }
    	  return 0;
    	  }
    Ich weiß, wenn ihr den Code seht, werdet ihr mich wahrscheinlich auslachen ..aber könnt ihr mir vielleicht trotzdem weiterhelfen?

  2. #2
    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

    Wenn man an den freien Erweiterungssteckern der bee etwas anschliesen möchte, kann man die Befehle der Library nicht so ohne weiteres verwenden. Man muss vielmehr die entsprechenden IO-Pins "von Hand" ansteuern. Dazu muss man allerdings ein paar Grundlagen kennen:

    Die Ein- bzw. Ausgänge des Kontrollers sind zu Ports mit (meist) 8 einzelnen Pins zusammengefasst und von 0 bis 7 durchnummeriert. Jeder Pin kann ein Eingang oder ein Ausgang sein, die jeweilige Funktion kann für jeden Pin einzeln festgelegt werden. Als Ausgang kann ein Pin entweder ein low (0V) oder ein high (5V) ausgeben. Als Eingang können alle Pins digital eingelesen werden, einige besondere (meist ein kompletter Port) können auch analoge Signale verarbeiten. Bei allen als Eingang verwendeten Pins kann man Bedarf einen zusätzlichen internen PullUp-Widerstand (OpenKollektor) aktivieren.

    Ohne PullUp ist ein Eingang sehr hochohmig, ein Pin kann deshalb drei Zustände annehmen: High, Low und Hochohmig (oder Z-State). Das ist wichtig für die gebräuchlichen Kommunikationsprotokolle wie SPI oder TWI(I2C) und sprengt den Rahmen des Beitrags ;)

    Jeder Port besitzt drei Register, das Eingangsregister, das Ausgangsregister und das Datenrichtungsregister. Sie ermöglichen den Zugriff auf die Daten und die Funktion des Ports. Diese Register sind 8 Bit (= ein Byte) breit, jedes Bit entspricht einem Pin im jeweiligen Port. Die Nummer des Pins bezeichnet deshalb die Stelle des Pins als Zweierpotenz im Registerbyte, 2^0 (mit Wert 1!) ist Pin0, 2^1 (Wert 2) ist Pin1 bis 2^7 (Wert 128) für Pin7.

    Mit dem Datenrichtungsregister (DDR + Portname A-D) entscheidet man, ob die Pins eines Ports jeweils als Ein- oder Ausgang geschaltet sind. Jeder Pin, dessen Bit im Registerbyte 1 ("gesetzt") ist, ist ein Ausgang, jeder Pin mit einer 0 in seinem Bit ("nicht gesetzt") ist ein Eingang. Ist ein Pin als Ausgang geschaltet, kann man mit dem entsprechenden Bit im Ausgangsregister (PORT + Portname) mit einem gesetzten Bit ein High und einem gelöschten Bit ein Low ausgeben. Wenn der Pin als Eingang geschaltet ist, wird das entsprechende Bit im Eingangsregister (PIN -Portname) in Abhängigkeit vom angelegten Spannungspegel gesetzt oder gelöscht. Bei Eingängen schaltet das Ausgaberegister die internen PullUp-Widerstände. Ein gesetztes Bit schaltet den PullUp für den Pin ein, ein gelöschtes Bit schalten ihn aus.

    Verwirrt? Keine Panik, das kann man alles auch in den bekannten AVR-Tutorials nachlesen. ;) Nach so vielen Grundlagen kommen wir nun endlich zur Praxis.

    Bei Start nach dem Einschalten oder einem Reset sind alle Pis auf Eingang ohne PullUp geschaltet. Das ist eine Vorsichtsmassnahme um zu verhindern, dass etwas abraucht. Die Init-Funktionen der Library setzt dann in den diversen Registern die zur externen Hardware passenden Bits. Bei einer eigenen Erweiterung muss man diese Bits selbst richtig setzen.

    Als Beispiel schliesen wir eine LED mit ihrem Vorwiderstand zwischen Pin0 von PortA (PA0) und GND (0V) an, die Kathode (der Strich im Schaltplan) zeigt dabei nach GND. Diese LED würde leuchten, wenn am PA0 5V (ein High) ausgegeben wird. Also müssen wir das Bit im Datenrichtungsregister setzen um einen Ausgang zu erhalten und das Bit im Ausgangsregister muss gesetzt sein für ein High:

    DDRA = 1;
    PORTA = 1;
    while(1);

    Jetzt sollte die LED leuchten :)

    Blöderweise haben wir so aber alle anderen Pins vom Port A auf Eingang geschaltet, das stört natürlich alle anderen Funktionen an diesem Port. Viel besser wäre es, wenn wir nur das benötigte Bit manipulieren würden und alle anderen Bits so lassen würden, wie sie sind. Das erreichen wir mit einer bitweisen Verknüpfung (nicht mit einer logischen Verknüpfung verwechseln!) des alten Registerwertes mit dem Bitwert für den zu ändernden Pin. Dazu muss man zuallererst den Registerwert auslesen, dann die gewünschte Verknüpfung ausführen und dann erst das Ergebniss wieder ins Register zurückschreiben. Für unser Beispiel mit der LED an PA0 würde das so aussehen:

    DDRA = DDRA | 1;
    PORTA = PORTA | 1;

    Oder die Kurzform:

    DDRA |= 1;
    PORTA |= 1;

    (Beide Schreibweisen erzeugen den selben Programmcode!)

    Ächz. Mehr zum Thema Bitmanipulationen findet man auch wieder in den Tutorials. Ich hatte das hier schonmal angeschnitten:
    https://www.roboternetz.de/community...l=1#post271532

    Es wäre natürlich schlau alle Fragen zu deiner IR-Erweiterung in einem Thread zusammenzufassen. ;)

    ich habe mein NIBObee mit 4 IR-LEDs erweitert.
    Desweiteren wäre ebenfalls schlau mitzuteilen, wo und wie die LEDs angeschlossen wurden. ;)

    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!

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.02.2011
    Alter
    28
    Beiträge
    104
    Hallo radbruch,
    ich finde es echt super, dass du dir die Mühe machst und die Zeit nimmst mir alles so genau zu erklären!
    Desweiteren wäre ebenfalls schlau mitzuteilen, wo und wie die LEDs angeschlossen wurden.
    Ich habe deinen Ratschlag befolgt und die Anoden der rechten IR-LEDs an Signal 1 von X1 angeschlossen, die Anoden der linken an Signal 2 von X1, die Kathoden beider Seiten an Signal 1 von X3 und den Empfänger an Signal 1 von X2.
    Fragen: 1. Also muss ich, wenn ich es richtig verstanden habe, die Kathoden der LEDs als Ausgang als low definieren?
    2. Wie kann ich die eingehenden Daten, die von meinem Empfänger ausgehen, sehen? (sprich die Werte)
    3. Muss ich die +/- Anschlüsse von z.B. X1 auch aktivieren? (für den Empfänger)
    4. Wie kann ich in einem Code schreiben, dass die LEDs z.B. jede Sekunde leuchten? Kann ich da auf die delay.h zurückgreifen?
    5. Muss ich an den Projekteinstellungen im AVR-Studio etwas ändern?
    Geändert von pacman (08.06.2011 um 20:16 Uhr)

  4. #4
    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

    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!

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.02.2011
    Alter
    28
    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?

  6. #6
    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!

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.02.2011
    Alter
    28
    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

Ähnliche Themen

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

Berechtigungen

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

Labornetzteil AliExpress