- 3D-Druck Einstieg und Tipps         
Seite 3 von 3 ErsteErste 123
Ergebnis 21 bis 26 von 26

Thema: Asuros SerWrite(..) - Verständnisproblem

  1. #21
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.04.2005
    Ort
    Weilburg
    Beiträge
    676
    Anzeige

    Praxistest und DIY Projekte
    Zitat Zitat von Sternthaler
    ... hoffe ihr schaut alle nochmal genau nach was ich diesmal kaputt gemacht habe.
    Ist ja schon eine Weile her - aber es hat mir keine Ruhe gelassen.
    Ich habe die serielle IO jetzt komplett mit Interrupt zum laufen bekomme.

    In der asuro.c habe ich mal eine Debug-Anzeige stehen gelassen.
    Code:
    BackLED((tx_aktiv) ? ON : OFF, (rx_aktiv) ? ON : OFF); //Debug Debug Debug Debug Debug Debug
    Da kann man sehen wie ich das Problem mit dem Empfang der selbt gesendeten Zeichen gelöst habe.
    Angehängte Dateien Angehängte Dateien
    Prostetnic Vogon Jeltz

    2B | ~2B, That is the Question?
    The Answer is FF!

  2. #22
    Neuer Benutzer Öfters hier
    Registriert seit
    13.01.2006
    Ort
    Hagen
    Beiträge
    9
    @Vogon
    Zunächst einmal meine Anerkennung für die Weiterverarbeitung des Themas.
    Was ich mir allerdings wünschen würde, ist eine weniger trickreiche C-programmierung. (Wie mir wird es sicher noch manchem anderen gehen, der in C nicht sattelfest ist.)
    Ich meine die Zeile

    if (rx_aktiv) if (! --rx_aktiv) ;

    in SIGNAL (SIG_ADC).

    Mit freundlichem Gruß
    Dieter Groß

  3. #23
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.04.2005
    Ort
    Weilburg
    Beiträge
    676
    Zitat Zitat von dgrobot
    .. eine weniger trickreiche C-programmierung. ..

    if (rx_aktiv) if (! --rx_aktiv) ;
    Ich habe mir das so angewöhnt weil es für mich so besser zu lesen ist.

    Um mein Gewissen zu beruhigen hab ich mal im "Kernigan + Ritchi" nachgelesen.

    Zitat aus dem Kapitel:
    2.6 Vergleiche und logische Verknüpfungen
    Der Negationsoperator !, der wie ein Vorzeichen verwendet wird, liefert 0, wenn sein Operand nicht 0 ist, und 1, wenn sein Operand 0 ist. (in C gilt jeder numerische Wert, der von 0 verschieden ist, in Bedingungen als wahr, und der numerische Wert 0 gilt in Bedingungen als falsch.) Der Operatur ! wird häufig bei

    if (!inword)
    verwendet, anstelle von
    if (inword == 0)

    Man kann nicht völlig verallgemeinern, welche Schreibweise besser ist. Angaben wie !inword sind gut verständlich ("wenn nicht innerhalb eines Wortes"), aber kompliziertere Formulierungen sind oft scher verständlich.


    Der letzten Satz drückt es ja schon aus. Das war den Erfindern schon 1977 klar. (Meine Ausgabe ist von 1983)
    Prostetnic Vogon Jeltz

    2B | ~2B, That is the Question?
    The Answer is FF!

  4. #24
    Neuer Benutzer Öfters hier
    Registriert seit
    13.01.2006
    Ort
    Hagen
    Beiträge
    9

    C-Programmierung

    @Vogon,
    danke für die schnelle Antwort; aber:

    Code:
     if (rx_aktiv) if (! --rx_aktiv) ;
    Meine Frage bezieht sich nicht auf das Negations-Zeichen allein, sondern auf die zweite if-Bedingung, nach der ja nichts kommt. Das übersetze ich so, dass eigenlich nur rx_aktiv dekrementiert wird, wenn es vorher nicht 0 war;
    also könnte es doch einfach so heissen:
    Code:
     if (rx_aktiv)  rx_aktiv-- ;

  5. #25
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.08.2004
    Ort
    Zwolle
    Alter
    67
    Beiträge
    531
    Hallo,

    Ich glaube die Losung vom Warteschleife Ratsel ist eigentlich ganz einfach.
    Mir begegnete es weil es Tx Probleme gab.


    Vorbild:

    - die Asuro sendet einige Daten mittels den

    SerWrite() Funktion

    - die Asuro schaltet direkt um nach empfangen mittels den

    SerRead() Funktion

    ohne diesen Warteschleiffe in die SerWrite() Funktion werden
    die letzten drei Karakter vom transmitter nicht mehr
    ausgestrahlt.

    Warum nicht?

    Guck mal in die SerRead() Funktion.

    Dort steht u.a.

    UCSRB = 0x10; //enable receiver

    Mit diesen Kode wird die receiver eingeschaltet ABER
    damit wird auch die transmitter direkt AUSgeschaltet.

    Die Warteschleife ist lange genug um 3 Karakter zu versenden,
    damit die zwei Karakter im UDR Puffer und das eine Karakter
    im Tx-Schieberegister nach aussen geschieben sind wenn dass
    Program die SerWrite() Funktion verlasst.


    Eine schonere losung ware es die Warteschleife zu ersetzen
    mit Folgendes:

    //warte bis UDR und Schieberegister leer sind

    while ( ! ( UCSRA | (1<<TXC) ) );

    //reset handmassig den TXC bit durch schreiben einen '1' !
    UCSRA |= (1<<TXC);


    Dies alles hab ich ausprobiert und mit einem Oszi recherchiert.

    Funktioniert Tadelos!


    Gruss

    Henk

  6. #26
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.04.2005
    Ort
    Weilburg
    Beiträge
    676

    Re: C-Programmierung

    Zitat Zitat von dgrobot
    Code:
     if (rx_aktiv)  rx_aktiv-- ;
    Code:
    	if (tx_aktiv) if (! --tx_aktiv) UCSRB |= ( 1 << RXEN ) ; // enable receiver interrupt + receiver
    Hier, eine Zeile höher hat das if dann doch einen Sinn.

    Du hast ja recht, da brauchts das nicht.
    Aber die Zeile hatte ich kopiert und angepasst. (bin nicht nur denkfaul sondern auch schreibfaul!)

    Arexx-Henk: Ich bin jetzt am überlegen wie du das meint ????
    Wenn du eine Lösung ohne die Umschaltverzögerung kennst, dann baue es doch mal ein.
    Es ist ja auch noch das Problem, das sich durch die gegenseitige Störung, nur der Transmitter oder der Receiver arbeiten darf.

    Warum das alles ?
    Ich möchte mit einem anderen ASURO oder Roboter und mit einem PC Daten austauschen können, ohne den eigentlichen Programmablauf zu unterbrechen. Da kann es nur von Vorteil sein, wenn der Datenaustausch per Interrupt und ausreichendem Puffer ablaufen kann.
    https://www.roboternetz.de/phpBB2/vi...=176551#176551

    Ich habe aber gerade einen ernsten Fehler gefunden für den ich noch keinen Ursache und Lösung gefunden habe.
    Durch Zufall habe ich mal auf eine IR-Fernbedienung gedrückt - und das Testprogramm bleibt hängen ? ! ? ! ?

    Edit: Habe den Fehler gefunden.
    Ein ungültiges Zeichen muss von der UART abgeholt werden. Sonst wird der Interrupt ja nicht gelöscht ? ! ?
    Code:
    SIGNAL(SIG_UART_RECV)
    {
    	int head_next;
    	head_next = rx_buf_head;
    	if ((UCSRA & ((1 << FE) | (1 << DOR) | (1 << PE ))) == 0)
    	{
    		rx_buf[head_next++] = UDR;		// Das Zeichen im Buffer speichern 
    		if (head_next >= UART_RX_BUF_LEN) head_next = 0;	// Buffergrenze beachten
    		if (head_next != rx_buf_tail) rx_buf_head = head_next;	// Überlauf ? noch Platz im Buffer  ?
    	}
    	else head_next = UDR;
    	rx_aktiv = 5; // Transmitter erst einschalten wenn die Wartezeit abgelaufen ist.
    }
    Prostetnic Vogon Jeltz

    2B | ~2B, That is the Question?
    The Answer is FF!

Seite 3 von 3 ErsteErste 123

Berechtigungen

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

Solar Speicher und Akkus Tests