- Akku Tests und Balkonkraftwerk Speicher         
Seite 3 von 7 ErsteErste 12345 ... LetzteLetzte
Ergebnis 21 bis 30 von 66

Thema: Programm_Anpassungen

  1. #21
    Benutzer Stammmitglied
    Registriert seit
    09.07.2007
    Beiträge
    42
    Anzeige

    Praxistest und DIY Projekte
    Hallöchen!

    Zuerst - TOP 1: Verschiedene Versionen der ATmega8(L)-Beschreibung von Atmel

    Beim ADC ist mir aufgefallen, dass eine Atmel-Beschreibung bei der U-Messung der
    Akku-/Batt.-Spg. 8 bit breit sein soll, ich aber einen echten 10 bit-Wert erhielt.
    Dann nachgeguckt: auf meiner CD-(Kopie): Rev. 2486M-AVR-12/03
    Auf einem schon etwas früher geholten PDF-File: 2486Q-AVR-10/06
    (Steht unten auf der ersten Seite!)
    Vielleicht gibt es noch 'ne neuere Version! (Da ich auf dem Land, also in der DFÜ-
    Diaspora lebe, wäre es nett, wenn ein ADSL-Kollege sich bei Atmel schlau machen könnte!)

    TOP 2: Aus der Beschreibung von Atmel:
    C Code Example(1)

    void USART_Transmit( unsigned char data )
    {
    /* Wait for empty transmit buffer */
    while ( !( UCSRA & (1<<UDRE)) )
    ;
    /* Put data into buffer, sends the data */
    UDR = data;
    }

    [Note: 1. See "About Code Examples" on page 8.]

    The function simply waits for the transmit buffer to be empty by checking the UDRE
    Flag, before loading it with new data to be transmitted.
    If the Data Register Empty Interrupt
    is utilized, the interrupt routine writes the data into the buffer.
    (Page 140)
    ------------------------
    * Bit 6 - TXC: USART Transmit Complete
    This flag bit is set when the entire frame in the Transmit Shift Register has been shifted
    out and there are no new data currently present in the transmit buffer (UDR). The TXC
    Flag bit is automatically cleared when a transmit complete interrupt is executed, or it can
    be cleared by writing a one to its bit location. The TXC Flag can generate a Transmit
    Complete interrupt (see description of the TXCIE bit).

    * Bit 5 - UDRE: USART Data Register Empty
    The UDRE Flag indicates if the transmit buffer (UDR) is ready to receive new data. If
    UDRE is one, the buffer is empty, and therefore ready to be written. The UDRE Flag can
    generate a Data Register Empty interrupt (see description of the UDRIE bit).
    UDRE is set after a reset to indicate that the Transmitter is ready.
    (Page 154)
    ------------------------
    <table><tr><td>Bit</td><td>7</td><td>6</td><td>5</td><td>4</td><td>3</td><td>2</td><td>1</td>
    <td>0</td><td></td></tr>
    <tr><td></td><td>RXC</td><td>TXC</td><td>UDRE</td><td>FE</td><td>DOR</td><td>PE</td>
    <td>U2X</td><td>MPCM</td><td>UCSRA</td></tr>
    <tr><td>Read/Write </td><td>R</td><td>R/W</td><td>R</td><td>R</td><td>R</td><td>R</td>
    <td>R/W</td><td>R/W</td><td></td></tr>
    <tr><td>Initial Value </td><td>0</td><td>0</td><td>1</td><td>0</td><td>0</td>
    <td>0</td><td>0</td><td>0</td><td></td></tr></table>

    (wenn obige HTML-Tabelle nicht funktionieren:
    Bit 7 6 5 4 3 2 1 0
    RXC TXC UDRE FE DOR PE U2X MPCM UCSRA
    Read/Write R R/W R R R R R/W R/W
    Initial Value 0 0 1 0 0 0 0 0)
    -----------------
    Zu * Bit 6 - TXC: USART Transmit Complete -> 1. Satz ist eindeutig!
    Das mit dem "cleared" ist es leider nicht, da 'ne "1" so viel wie "gelöscht" bedeutet!

    Das Bsp. ganz oben von Atmel zeigt, dass "wir" es hier schon richtig machen! !)

    "or it can be cleared by writing a one to its bit location." machen wir ja auch am Anfang!
    (UCSRA=UCSRA | TXC; // clear transmitter flag )

    cu Helmut

  2. #22
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Hallo helmut_w,
    hast du auch manchmal das Gefühl eines "deja vu"?

    Zum TXC-Flag wird auch noch auf Seite 139, im Kapietel "Transmitter Flags and
    Interrupts", geschrieben:
    The Transmit Complete (TXC) Flag bit is set one when the entire frame in the transmit
    Shift Register has been shifted out and there are no new data currently present in the
    transmit buffer. The TXC Flag bit is automatically cleared when a transmit complete
    interrupt is executed, or it can be cleared by writing a one to its bit location. The TXC
    Flag is useful in half-duplex communication interfaces (like the RS485 standard), where
    a transmitting application must enter Receive mode and free the communication bus
    immediately after completing the transmission.
    Und da wird davon geredet, dass NACH dem letzen Transmit dieses Flag gecleard (also 1 reinschreiben) werden soll. So wie Arexx-Henk es macht.
    Lieber Asuro programieren als arbeiten gehen.

  3. #23
    Benutzer Stammmitglied
    Registriert seit
    09.07.2007
    Beiträge
    42
    Hi Sternthaler!

    (Wie heißt Du eigentlich mit richtigem Vornamen?)
    Ich heiße übrigens Helmut (ohne dem "underscore w"!)
    hast du auch manchmal das Gefühl eines "deja vu"?
    Natürlich hast Du mit dem "doppelten Lottchen" Recht! Aber ich wollte das in diesem Thread begackerte Problem insgesamt darstellen, denn es gibt Leute, die sehen nicht ganz den "Zusammenhang der Dinge"!)

    1. Du zitierst leider nicht ganz korrekt:
    Zum TXC-Flag wird auch noch auf Seite 139, im Kapitel "Transmitter Flags and
    Interrupts", geschrieben: ...
    Wenn Du richtig hingeguckt hättest, geht's dabei um "Interrupts", also in 'ner ISP! Aber die haben _wir_ in _unserem_ Programm doch garnicht!

    2. Leider muss ich den ganzen Sermon jetzt nochmals darstellen (Ich bitte um Gnade!)
    The Transmit Complete (TXC) Flag bit is set one when the entire frame in the transmit
    Shift Register has been shifted out and there are no new data currently present in the
    transmit buffer.
    Und da steht doch sinngemäß drin:
    TXC = 1, wenn
    * 1. das gesamte "Versand-Paket" (einschließlich "Start-", "Stopp-" und evtl. "Paritätsbit") hinausgeschoben (=versandt) wurde,
    und
    * 2. sich keine (weiteren/) neuen Daten im Transmit-Speicher (=UDR) befinden!

    ((Worauf willst Du noch warten, wenn Du den Sender ausschaltest und den Empfänger ein?))

    3. Die nächsten Sätze auf Deiner Seite 151 und auf _meiner_Seite_ 154 (wegen der unterschiedlichen Versionen der Beschreibung "ATmega8") beziehen sich doch wieder auf ISP's!
    (Hier wieder wie oben: unwichtig!)

    4. Dein besonders dick markierter Satz
    ... , or it can be cleared by writing a one to its bit location.
    ist 150 % RICHTIG!), denn das gibt's ja auch bei uns:
    "UCSRA |= 0x40; // clear transmitter flag "
    so ziemlich am Anfang der Funktion "UartPutc()" (und der von mir vorgeschlagenen).

    Ich hoffe, du bist mir jetzt nicht böse, weil ich diverse Sachen widerlegt bzw. richtig gestellt habe.

    Ich bin zwar Newby, aber ich lerne 'halt dazu und mache mir so meine Gedanken!)
    - Und wenn die falsch sind, so bitte ich Dich, sie zu widerlegen!
    (Bei einem falschen Gedanken meinerseits lade ich Dich dann auf ein Bierchen ein!)

    cu Helmut

    PS: Weiß vielleicht schon einer die neueste Rev.-Nr. der Beschreibung?

  4. #24
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Hallo Helmut (ohne _w) Namen sind Schall und Rauch.
    Gnade benötigt keiner. Es ist halt so, dass die eine Frage, eine Antwort mit noch mehr Fragen aufwirft.

    Ja, ich habe schon gesehen, dass die Beschreibung auch für die Interrupt-Behandlung vorhanden ist. In deiner Beschreibung hast du dich auf "[Note: 1. See "About Code Examples" " bezogen. Alles OK, nur, dass es zusätzlich eine Interrupt-Beschreibung gibt, die das selbe aussagt, ist von mir dazu gekommen.
    In beiden Beschreibungen finde ich aber die gleiche Aussage: "Cleare das Bit nachdem allles gesendet wurde."

    In unserer LIB wird das Bit aber in der SerWrite()-Funktion am Anfang gecleard. Deshalb mein Einwand/Vorschlag es a) so zu machen wie Arexx-Henk es beschreibt, oder b) auf alle Fälle vor dem Senden dieses Bit zu clearen.

    {
    Clear Bit
    senden
    }
    {
    empfangen
    }

    ist anders als

    {
    senden
    clear Bit
    }

    {
    empfangen
    }

    P.S.: Ich trinke jede Sorte Bier . Vorsicht, ich kann viel. Bei falschen Aussagen aber auch ausgeben!
    Lieber Asuro programieren als arbeiten gehen.

  5. #25
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.063
    aber das TXC bit wird doch von allein geclearded, sowie der TXC interrupt angenmmen wurden, oder nicht?
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  6. #26
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Hallo damaltor,
    ja, ist schon richtig, das TXC gecleard wird beim Interrupt. Aber leider eben NUR beim Interrupt. helmut_w hatte mich ja genau auf diesen Umstand oben hingewiesen, da ich ja die Beschreibung aus dem Interrupt-Bereich auch noch aufgeführt hatte.

    Ich glaube, dass wir uns mal genauestens um dieses Bit kümmern müssen um rauszubekommen, ob es nun Einfluss nimmt wenn man sendet, bzw. ja schon gesendet hat, und nun sofort empfangen will und dort als erstes der Sender ausgeschaltet wird.

    Also meine Frage:
    Warum muss ein TXC-Bit, welches von und GELESEN wird um rauszubekommen, ob alles gesendet wurde, noch mal mit 1 BESCHRIEBEN werden um da 'was auch immer' zu clearen? Was wird da eigendlich gecleard?
    Lieber Asuro programieren als arbeiten gehen.

  7. #27
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.063
    wenn man eine 1 schreibt, wird das bit gelöscht, also auf 0 gesetzt. ich vermute mal dass da was technisches hintersteckt, auch die fusebits sind beim AVR umgekehrt. wenn man eine 1 liest, bedeutet dass dass alles gesendet wurde. wenn man dann eine 1 reinschreibt, wird das bit auf 0 zurückgesetzt.

    der interrupt könnte aber auch mit einer return-anweisung angenommen werden... dann wäre das bit schnell gecleared.

    das mit dem UDRE bit hat sich dann wohl erledigt... ich glaube mich zu erinnern, dass es nur das sendende UDR register betrifft.

    aber was haltet ihr davon?
    es gibt im GCC eine vordefinierte funktioN:

    loop_while_bit_is_clear(REGISTER,BIT);

    wenn man da das statusregister und TXC einsetzt, loopt die funktion so lange wie das bit nicht gesetzt ist. würde man diese funktion am ende von serwrite anfügen, müsste die funktion so lange warten, bis der transffer wirklich fertig ist.
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  8. #28
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Hai,
    das "loop_while_bit_is_clear(REGISTER,BIT);" machen wir ja schon in der Sendefunktion mit:
    while (!(UCSRA & 0x40)) ; // Wait for transmit complete flag (TXC)

    Eine Interruptfunktion nur mit nichts drin machen, nur um das Bit zu clearen?

    Immer noch: Warum das Bit clearen?
    (Nicht gefragt, warum ne 1 zum clearen benutzt werde soll.)
    Lieber Asuro programieren als arbeiten gehen.

  9. #29
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.063
    das bit müsste gecleared werden, damit es für eine auswertung genutzt werden kann. ansonsten bleibt es doch dauerhaft 1, und hat damit eigentlich keinerlei wirkliche funktion. wenn man es immer rechtzeitig cleart, dann kann man sehen ob der aktuelle transfer beendet ist. zb mit einer loopwhilebitisclear schleife, die wartet, bis der transfer beendet ist (bit ist gesetzt), dann das bit cleart (1 schreibt) und dann das senden des nächsten chars zulässt bzw das programm weiterlaufen lässt - zB mit serread, was ja jetzt gefahrlos angewandt werden kann.
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  10. #30
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Ohhh, ich glaube wir sollten mehr Leerzeichen benutzen! (Oder lieber 2-3 !!! )
    Unser "while ( ! (UCSRA & 0x40)) ;"-Code dreht ja nun alles auf den Kopf. Das Bit bleibt also nicht dauerhaft auf 1, sondern auf 0. Denn nur dann kommen wir ja wieder aus dem while herraus, wenn es auf 0 gegangen ist.

    Also nochmal für mich:
    - TXC-Inhalt ist 1 (hier von mir angenommen)
    - Unser Programm schreibt nach UDR
    - Unser Programm geht zum "while ()" weiter
    - AVR moved UDR in's interne Schieberegister
    - AVR sendet aus Schieberegister
    - AVR setzt TXC auf 0 wenn alles geschoben ist.
    - unser "while ( ! ...) sieht dies und while bricht ab

    ---> wenn wir uns nicht um das TXC-Bit kümmern:

    - TXC-Inhalt ist 0
    - Unser Programm schreibt nach UDR
    - Unser Programm geht zum "while ()" weiter
    - AVR moved UDR in's interne Schieberegister
    - AVR sendet aus Schieberegister
    - AVR setzt TXC auf 0 wenn alles geschoben ist. <--- Ist es aber noch
    - unser "while ( ! ...) sieht dies und while bricht vor dem setzen durch AVR ab. Und damit bevor alle Bits das Schieberegister verlassen haben.

    ---> Wenn nun direkt zum Empfangen gewechselt wird:
    - wir schalten den Sender ab
    ---> Das letzte zu sendende Zeichen ist verloren.

    Da es ja nur in einer Interruptfunktion wieder gecleard (also 1) wird, müssen wir es demnach tatsächlich selber machen, wenn wir weitere Zeichen auf komplette Übertragung des zu sendenden Bytes prüfen wollen.

    Wann muss das TXC gecleard werden? Vor dem Beschreiben des UDR oder hinterher (wie bei Arexx-Henk)?

    Im Kapitel "USART Initialization" ist zu finden:
    The USART has to be initialized before any communication can take place. The initialization
    process normally consists of setting the baud rate, setting frame format and
    enabling the Transmitter or the Receiver depending on the usage. For interrupt driven
    USART operation, the Global Interrupt Flag should be cleared (and interrupts globally
    disabled) when doing the initialization.
    Before doing a re-initialization with changed baud rate or frame format, be sure that
    there are no ongoing transmissions during the period the registers are changed.
    The TXC Flag can be used to check that the Transmitter has completed all
    transfers,
    and the RXC Flag can be used to check that there are no unread data in
    the receive buffer.
    Note that the TXC Flag must be cleared before each transmission
    (before UDR is written) if it is used for this purpose
    --> Sieht so aus, als ob der Code der Asuro-LIB NICHT in Ordnung ist bei SerWrite() in uart.c.
    Aber wer hat es richtig gemacht?
    stochri mit seiner Funktion UartPutc() aus print.c die von helmut_w mit seinem ersten Eintrag schon gezeigt wurde.
    Und wer hat als erster hier auf die Kombination senden/empfangen hingewiesen?
    Ein "BRAVO" an m.a.r.v.i.n (kleines bravo an damaltor, der sich auch noch erinnern konnte.)

    Also bleibt eigendlich nur noch eine Änderung der Asuro-LIB übrig.
    Dann auch gleich die von helmut_w ja eigendlich gewünschten Verbesserungen einbauen und alle sind glücklich

    Jubel, ich glaube es nun kapiert zu haben.
    Sonst noch Fragen zum TXC? Was ist nun mit den Vorschlägen von helmut_w?
    - Stom sparen auf alle Fälle
    - for()-Schleife in SerWrite() entsorgen
    - TXC-Bit vor dem nutzen des UDR auf 1 setzen
    - Neue Funktions-"Gruppierung" á la m.a.r.v.i.n's #define ?
    - Von helmut_w vorgeschlagene Funktion, da aber ohne Möglichkeit zum senden eines 0x00-Bytes ?

    Bis morgen.
    Lieber Asuro programieren als arbeiten gehen.

Seite 3 von 7 ErsteErste 12345 ... LetzteLetzte

Berechtigungen

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

Solar Speicher und Akkus Tests