Go Down

Topic: Problem mit mehreren UARTs (Mega <> ATtiny) (Read 5075 times) previous topic - next topic

combie

Es ist offensichtlich, dass uns die Umstände alleine nicht glücklich oder unglücklich machen.
Es ist die Art unserer Reaktion darauf, die unsere Gefühle bestimmt.

Doc_Arduino

Hallo,

ich denke ich muss mich korrigieren. Der Ringbuffer ist allein für den Datenempfang da. Sonst gebe es Kaos. Der Ringbuffer kann nicht unterscheiden zwischen Empfangs- und Sendedaten.   8)
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Doc_Arduino

#32
Mar 06, 2017, 11:00 pm Last Edit: Mar 06, 2017, 11:06 pm by Doc_Arduino
Hallo,

ich habe nun erstmal die uart Lib von Peter Fleury zum laufen gebracht und meinen Code angepaßt.
Das gleiche serielle Handling dauert jetzt allerdings 5,5µs statt vorher 3,1µs. Scheinbar durch den zusätzlichen Overhead des Ringsbuffers. Nun gibt es 2 Ringbuffer, einen fürs senden und einen fürs empfangen. Die Größe kann man nur 2er Potenzen einstellen. Habe nun erstmal 64/64 eingestellt. Die nächste Stufe ist diese beiden zu kombinieren für den Kalibriermesswertbuffer.

Kann auch sein wenn ich mit der Übung fertig bin, haue ich die Lib wieder raus ... und verwende nur die Erkenntnisse der Doppelverwendung des Buffers weiter.

Das als Zwischeninfo.


Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Doc_Arduino

Hallo,

vorm umschalten der USART Pins von USART auf normale Pinfunktion muss ich sicherstellen das alle zusendenten Zeichen auch raus sind, wegen Datensalat. Nun dachte ich mir, wegen dem Ringbuffer, nutzt dazu die Variablen der usart Lib. Nur das geht nicht, sind angeblich nicht deklariert.

In der Lib sind die in der usart.c wie folgt deklariert. Die Lib wird ja zu Begin eingebunden, deswegen dachte ich, dass alles was ich davon verwende vorher dem Compiler bekannt ist. Scheinbar ist dem nicht so. Warum kann ich die nicht verwenden?

Code: [Select]
static volatile unsigned char UART0_TxHead;
static volatile unsigned char UART0_TxTail;
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Whandall

Da static mehrere Bedeutungen hat, kann man ohne Kontext keine Aussage machen.

Wie war das noch mit dem vollständigen Kode?

Ach so, das gilt wohl nur wenn man auch eine Antwort haben will.  ;)
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

combie

Statische Variabeln in Funktionen bleiben über Aufrufe hinweg erhalten.
Sind nur in dieser Funktion sichtbar.

Statische Variablen, und auch Funktionen, in *.c oder *.cpp Dateien, sind nur innerhalb dieser Datei sichtbar!

Sind diese in einer *.h Datei, sind sie in allen Dateien sichtbar, in die diese *.h eingebunden wurde.


Es ist offensichtlich, dass uns die Umstände alleine nicht glücklich oder unglücklich machen.
Es ist die Art unserer Reaktion darauf, die unsere Gefühle bestimmt.

Whandall

Das gilt nicht für static Klassen Variablen.

Im Klassen-Kontext bedeutet static 'nicht an ein Objekt gebunden, immer verfügbar'.
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

combie

#37
Mar 09, 2017, 06:57 pm Last Edit: Mar 09, 2017, 06:58 pm by combie
Quote
Das gilt nicht für static Klassen Variablen.
Da hast du Wahr!
Auch wenn ich die Dinger "Eigenschaften" nenne.
Konkreter:
Klassen Eigenschaft vs. Objekt, oder Instanz Eigenschaft.

Und die anderen Dinger, nenne ich Methoden.
Klassen, oder Objekt Methoden.
Es ist offensichtlich, dass uns die Umstände alleine nicht glücklich oder unglücklich machen.
Es ist die Art unserer Reaktion darauf, die unsere Gefühle bestimmt.

Whandall

Ich habe das versucht zu übersetzen, anscheinend nicht üblich genug.

Es sind (für mich) class members und class methods.

Aber jeder wie er mag.
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

combie

#39
Mar 09, 2017, 07:10 pm Last Edit: Mar 09, 2017, 07:11 pm by combie
Quote
Es sind (für mich) class members
class members finde ich nicht schön...

Da ist "Attribut" schon besser.
Aber leider vom gcc schon für andere Zwecke belegt. (inline, weak, usw.)

Geschmackssache.

Wikipedia sagt dazu:
Quote
In der Regel ist in objektorientierten Ansätzen das Konzept der Vererbung zu finden, bei dem Eigenschaften und Methoden zwischen Klassen hierarchisch ausgetauscht beziehungsweise ergänzt werden können.
Egal...
Es ist offensichtlich, dass uns die Umstände alleine nicht glücklich oder unglücklich machen.
Es ist die Art unserer Reaktion darauf, die unsere Gefühle bestimmt.

Doc_Arduino

Hallo,

Sorry, ich dachte ich muss den Code nicht immer wiederholen und es wäre eindeutig was ich für ein Problem habe, weil das sonst den Thread sprengt, hoffe ich den entscheidenden Teil vom Code zu posten. Ansonsten müsstet ihr 3 Einzelfiles öffnen oder ein .zip.  ;)

in der usart.cpp steht am Anfang
Code: [Select]
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include "usart.h"

/*
 *  constants and macros
 */

/* size of RX/TX buffers */
#define UART_RX_BUFFER_MASK ( UART_RX_BUFFER_SIZE - 1)
#define UART_TX_BUFFER_MASK ( UART_TX_BUFFER_SIZE - 1)

#if ( UART_RX_BUFFER_SIZE & UART_RX_BUFFER_MASK )
#error RX buffer size is not a 2^x
#endif
#if ( UART_TX_BUFFER_SIZE & UART_TX_BUFFER_MASK )
#error TX buffer size is not a 2^x
#endif

#if defined(__AVR_ATtiny841__)/* _-_-_-_-_-_-_-_-_-_-_*/
 /* ATtiny with two USARTs _-_-_-_-_-_-_-_-_-_-_-_-_-_*/
 #define ATMEGA_USART1
 #define UART0_RECEIVE_INTERRUPT   USART0_RX_vect
 #define UART0_TRANSMIT_INTERRUPT  USART0_UDRE_vect
 #define UART0_STATUS      UCSR0A
 #define UART0_CONTROL     UCSR0B
 #define UART0_CONTROLC    UCSR0C
 #define UART0_DATA        UDR0
 #define UART0_UDRIE       UDRIE0
 #define UART0_UBRRL       UBRR0L
 #define UART0_UBRRH       UBRR0H
 #define UART0_BIT_U2X     U2X0
 #define UART0_BIT_RXCIE   RXCIE0
 #define UART0_BIT_RXEN    RXEN0
 #define UART0_BIT_TXEN    TXEN0
 #define UART0_BIT_UCSZ0   UCSZ00
 #define UART0_BIT_UCSZ1   UCSZ01
 #define UART1_RECEIVE_INTERRUPT   USART1_RX_vect
 #define UART1_TRANSMIT_INTERRUPT  USART1_UDRE_vect
 #define UART1_STATUS      UCSR1A
 #define UART1_CONTROL     UCSR1B
 #define UART1_CONTROLC    UCSR1C
 #define UART1_DATA        UDR1
 #define UART1_UDRIE       UDRIE1
 #define UART1_UBRRL       UBRR1L
 #define UART1_UBRRH       UBRR1H
 #define UART1_BIT_U2X     U2X1
 #define UART1_BIT_RXCIE   RXCIE1
 #define UART1_BIT_RXEN    RXEN1
 #define UART1_BIT_TXEN    TXEN1
 #define UART1_BIT_UCSZ0   UCSZ10
 #define UART1_BIT_UCSZ1   UCSZ11
#else
 #error "no UART definition for MCU available"
#endif


/*
 *  module global variables
 */
static volatile unsigned char UART0_TxBuf[UART_TX_BUFFER_SIZE];
static volatile unsigned char UART0_RxBuf[UART_RX_BUFFER_SIZE];
static volatile unsigned char UART0_TxHead;
static volatile unsigned char UART0_TxTail;
static volatile unsigned char UART0_RxHead;
static volatile unsigned char UART0_RxTail;
static volatile unsigned char UART0_LastRxError;


In der main.cpp gehts bei mir los mit
Code: [Select]

#define F_CPU 8000000UL  // Systemtakt in Hz

#include <avr/io.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <util/atomic.h>   
#include "usart.h"


und nun wollte ich in meinem Code solange warten bis diese gleich sind. Allerdings kennt der Comiler diese beiden nicht.

Code: [Select]
while ( UART0_TxHead != UART0_TxTail )  {}  // warten bis beide gleich sind

Nach euren jetzigen Antworten denke ich, dass ich in den Header der Lib eine externe Funktion einbauen muss?

Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

combie

#41
Mar 09, 2017, 07:21 pm Last Edit: Mar 09, 2017, 07:22 pm by combie
Quote
Nach euren jetzigen Antworten denke ich, dass ich in den Header der Lib eine externe Funktion einbauen muss?
Das ist eine sehr sehr  gute Idee!




Es ist offensichtlich, dass uns die Umstände alleine nicht glücklich oder unglücklich machen.
Es ist die Art unserer Reaktion darauf, die unsere Gefühle bestimmt.

Whandall

Entferne static in den beiden Zeilen
Code: [Select]
static volatile unsigned char UART0_TxHead;
static volatile unsigned char UART0_TxTail;

und füge diese beiden Zeilen in Main ein
Code: [Select]
extern volatile unsigned char UART0_TxHead;
extern volatile unsigned char UART0_TxTail;
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

Doc_Arduino

#43
Mar 09, 2017, 07:42 pm Last Edit: Mar 09, 2017, 07:42 pm by Doc_Arduino
Hallo,

wenn ich das static entferne verlieren da nicht beide Variablen ihren Wert?
Der Variableninhalt darf nicht verloren gehen, weil darin die Indexpositionen des Ringbuffers gespeichert sind.

In der Zwischenzeit habe ich in der usart.cpp deklariert
Code: [Select]
bool usart0_leer()
{
if ( UART0_TxHead == UART0_TxTail) {  // Ringbuffer Inhalt wurde gesendet
return true;
}
else {
return false;
}
}


und in der usart.h nach außen bekannt gemacht
Code: [Select]
extern bool usart0_leer();

jetzt könnte ich neu testen ...
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Whandall

Beide Methoden (Linken oder gelinkte Funktion) sind äquivalent.

static an den globalen Variablen steuert nur deren Sichtbarkeit von anderen Modulen aus.

Hat nichts mit static an lokalen Variablen oder Klassen Eigenschaften zu tun, das ist beides etwas anderes.
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

Go Up