-
        

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: Komunikation zwischen zwei Atmegas

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    06.02.2007
    Beiträge
    139

    Komunikation zwischen zwei Atmegas

    Anzeige

    Hallo


    Ich möchte bei einem zukünftigen Projekt Messwerte auslesen und nach diesen Messwerten 2 Servos ansteuern. bis jetzt habe ich analog Servos benutzt die ich mit einem Atmega8 per PWM angesprochen habe. Leider wird wohl die restlich Rechenzeit die nach dem Servo PWM übrig bleibt nicht für die Berechnung und Erfassung der Messwerte Reichen.

    Nun würde ich gerne einen Atmega 644 zum erfassen der Messwerte benutzen und mit einem Atmega8 das PWMs für die Servos erzeugen.

    So wie bekomme ich nun die Information vom einen Atmega in den nächsten oder gibt es einen einfacheren Weg als einen 2ten Atmega?

    lg manhunt

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987
    Die einfachste Übertragungsart wäre der I2C-Bus. Die Hardware ist bei den ATMegas meistens schon mit drin.
    #ifndef MfG
    #define MfG

  3. #3
    Erfahrener Benutzer Roboter Experte Avatar von marvin42x
    Registriert seit
    02.08.2005
    Ort
    Berlin
    Alter
    68
    Beiträge
    703
    Im RN-Wissen Bereich gibt es gute Artikel zu I2C
    http://www.roboternetz.de/wissen/index.php/TWI_Praxis
    http://www.roboternetz.de/wissen/ind...is_Multimaster

    Für das RNBFRA Board, wo ein Mega32 und ein AT90S2313, oder ersatzweise ein ATtiny2313 als Co- Controller für 10 Servos ihren Dienst tun gibt es auch eine I2C Verbindung der beiden Controller.
    Dazu existiert auch ein Multimaster Beispiel.
    Also wie Jaecko schon sagte I2C ist eine übliche Art das zu machen.

    Netter Gruß
    Die ersten zehn Millionen Jahre waren die schlimmsten. Und die zweiten Zehn Millionen Jahre, die waren auch die schlimmsten.url

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    06.02.2007
    Beiträge
    139
    Danke für eure Infos, ich habe im netzt jetzt auch von der Möglichkeit per UART erfahren. Kann mir vielleicht jemand dazu etwas sagen? Bzw worauf muss ich achten, gleiche Quarze bei den Prozessoren?

    Weiß jemand zufällig wie ein Schaltung per UART aussehen würde?

    lg manhunt

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987
    Naja gleiche Quarze müssen nicht sein; man kann die Bitrate ja auswählen.
    Von der Schaltung her isses genau so einfach wie beim I2C.
    Tx vom einen Controller an Rx vom anderen. Nur bei RS232 kann man im Normalfall nur 2 Controller verbinden. Es gehen zwar dort auch mehr, man muss dann aber sicherstellen, dass immer nur einer senden kann, da es sonst Datensalat gibt.
    Also wenns nur 2 sein sollen, ginge RS232 auch.

    Meine persönliche "Vorliebe" ist aber I2C, da man dort problemlos mal weitere Geräte anstöpseln kann, ohne zusätzliche Pins zu besetzen... also mal kleine Tastaturen oder Displays für Debug-Ausgaben etc.
    #ifndef MfG
    #define MfG

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    06.02.2007
    Beiträge
    139
    Hallo

    Ich habe leider bis heute weder mit dem UART noch mit I2C am uC gearbeitet und würde die leichtere Variante bevorzugen, frage bei welchem von beiden ist weniger Programmieraufwand bzw rechenleistung notwendig?

    lg manhunt

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987
    Man kann beide Interrupt-gesteuert laufen lassen. Vom Aufwand her kommt mir RS232 einfacher vor; weil man hier keine Zustandsunterscheidung vom TWI braucht (Slave Receiver, Slave Transmitter, Master Receiver, Master Transmitter etc...)

    Beim RS232 könnte man noch nen FIFO einbauen (Code gibts glaub ich auch im Wiki hier), so dass man mit einer Funktion entweder einen Ascii-Code vom empfangenen Zeichen bekommt oder eben -1, falls nix neues da ist.

    Beim I2C/TWI kann man sich aber mitunter eine Protokollstruktur sparen, da hier keine "Steuerzeichen" benötigt werden, um eine neue Übertragung zu erkennen.
    #ifndef MfG
    #define MfG

  8. #8
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.557

    Re: Komunikation zwischen zwei Atmegas

    Zitat Zitat von manhunt
    ... 2 Servos ansteuern ... wird ... restlich Rechenzeit ... nicht ... Reichen ...
    UUUUps - dann hast Du entweder einen etwas langsamen Quarz oder Prozessortakt (1 MHz oder weniger?), oder eine viel zu umständliche Programmiererei.

    PWMs macht man möglichst mit Timern und den PWM-Ports. Da gibts was in der Suchfunktion etc.

    Wenn nur die PWM-Werte übertragen werden, dann dauert vermutlich die Kommunikation über die Schnittstellen zu einem anderen Controller länger als der PWM-Aufwand - wenn der ordentlich programmiert wurde. Notfalls nimm halt statt dem mega8 - der nur 16 MHz kann - einen m168, der kann 20 MHz. Die 4 MHz mehr sollten für einen ganzen Haufen PWM´s reichen . . .
    Ciao sagt der JoeamBerg

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    06.02.2007
    Beiträge
    139
    Hallo

    Ich benutze den Servo PWM code vom Wiki und wenn der wie im Wiki beschrieben alle 10uS aufgerufen wir geht das ganz schön in die Rechnenzeit.


    Hier der "Wiki" code wobei meiner noch auf 2 Servos ausgebohrt wurde.




    Code:
    #define SERVOPIN 7
    #define SERVOPORT PORTD
    #define DDRSERVO DDRD
    
    volatile unsigned char servopos;
    
    void servo_init()
    {
    	TIMSK|=(1<<OCIE2);
    	TCCR2 |= (1<<WGM21) | (1<<CS20);	//Prescale=1, CTC mode
    	OCR2 = F_CPU/100000;			//alle 10µS ein IRQ
    	DDRSERVO|=(1<<SERVOPIN);
    };
    
    ISR(TIMER2_COMP_vect)
    {
    	static int count;
    	if(count>servopos)SERVOPORT&=~(1<<SERVOPIN);
    	else SERVOPORT|=(1<<SERVOPIN);
    	if(count<2000+servopos)count++;
    	else count=0;
    };

    lg manhunt

  10. #10
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Gerade bei den etwas größeren Controllern hat man eigentlich genug Hardware PWM Kanäle, auch mit 16 Bit Auflösung. Man ist dann nur in der Wahl der Pins eingeschränkt. Wegen der relativ langen Pausen sollte man schon 16 Bit Auflösung nehmen. Als Nächst beste Alternative auch nur einen 8 Bit timer, dann aber für Pause und Puls getrennt und mit jeweils nur eine ISR Aufruf. Also 1 x warten für lange Pause (ca. 18 ms) 1 x Puls für 1. Servo und 1 x Puls für 2.ten Servo. Das sollte mit weniger Rechenzeit auskommen.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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