- 3D-Druck Einstieg und Tipps         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 12 von 12

Thema: UART: PC->µC

  1. #11
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2004
    Ort
    Bielefeld / Paderborn
    Beiträge
    1.253
    Anzeige

    Powerstation Test
    Ich hatte zur Sicherheit nochmal TX und RX verbunden: Kommt nix zurück. Hab den Adapter gestern an den Hersteller geschickt. Der hat mir vorher Reparatur oder Austausch zugesichert.

  2. #12
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2004
    Ort
    Bielefeld / Paderborn
    Beiträge
    1.253
    So ich habe den Adapter wieder und er funktioniert nun auch. Ich habe nun nen Prog geschrieben, welches sich aus einem Datenstream, der über UART gesendet wird an einer bestimmten Stelle 12 Bytes raussucht und daraus 12 Software-PWMS zaubert. Die Software-PWMS funktionieren, wenn ich die PWM-Werte, die in einem Array stehen, hart code. Wenn ich meine Daten per RS232 sende, leuchten die 4 RGB-LEDS irgendwie nicht so wie sie sollen. Eine beispielsweise ist IMMER grün. Ich poste hier mal meinen Code für die UART-Abfrage und die Variablen, die ich benutze:

    Code:
    volatile uint16_t bytecnt;								// Zaehlt die Bytes des Datensatzes
    volatile uint8_t mybytes = 0;							// Wieviele Bytes hab ich schon empfangen?
    volatile uint8_t pwms[12]={0,0,0,0,0,0,0,0,0,0,0,0};	// Array mit den PWM-Werten
    volatile const uint16_t startwert = 1;					// Hier im Datensatz beginnen meine 12 Bytes
    Ein Datensatz ist also 255+Byte+Byte+...+Byte
    An einer definierten Stelle darin stehen die 12 Bytes (hintereinander), die mich interessieren. Diese Stelle steht in der Konstante "Startwert". In diesem Fall direkt hinter der 255.
    Hier der Code der den UART ausliest. Der ist das einzige was ausser der Timer-ISR läuft:

    Code:
    while(1)
         {
               while (!(UCSRA & (1<<RXC))) 				// Warten bis Zeichen verfuegbar
             ;
              {
                if(UDR==255) bytecnt=0;					// Wenn eine 255 gesendet ist, faengt Datensatz von vorne an
                bytecnt++;								// Bytes zaehlen
                if (bytecnt==startwert) mybytes++;		// Hier ist mein Byte #1
                if (mybytes > 0)						// Wenn Byte #1 gefunden wurde...
                {
    				pwms[mybytes-1] = UDR;				// ...Byte in PWM-Array schieben
    				mybytes++;							// ...Habe 1 Byte mehr gesammelt
    			}
                if (mybytes == 13) mybytes = 0;			// Wenn 12 Bytes da sind, sind die Daten komplett
              }
      }
    Der Plan ist:
    Wenn das Byte das empfangen wurde = 255 ist, wird der Zähler, der die Gesamt-Bytes des Datensatzes mitzählt auf Null gesetzt.
    Wenn der Gesamt-Byte-Zähler = dem Startwert der interessanten Region ist, geht der Zähler, der die interessanten und damit übernommenen Bytes zählt auf 1.
    Das ermöglicht, dass ab jetzt die folgende IF-Abfrage positiv wird, sodass Das aktuelle Byte ins Array geschrieben wird und mybytes, also die Anzahl der empfangenen Bytes erhöht wird. Wenn 12 Bytes empfangen wurden dann wird mybytes wieder 0, sodass keine weiteren Bytes übernommen werden.

    Hab ich da nen logischen Fehler drin? Oder nen Implementierungs-Fehler? Oder ist am Ende der Code in Ordnung und meine Sende-Software macht Mist? Oder liegt es vllt daran, dass ich "UDR" lieber am Anfang der Schleife in eine Variable packen sollte und mit dieser weiterarbeiten sollte?

    Danke für eure Hilfe!

Seite 2 von 2 ErsteErste 12

Berechtigungen

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

Solar Speicher und Akkus Tests