Software Uart Timergesteuert?

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • Software Uart Timergesteuert?

      New

      Hallo,
      Ein Mega8, evt 328 soll zweimal 485 sprechen und zuhören (gleichzeitig) können. Einmal mit 1200 Baud Software und 9600-115000Baud mit dem HW Uard.
      Das geht natürlich nur wenn der SW-Uart den Avr jedes Bit in einer Timer isr verarbeitet. Hat das schon mal jemand gemacht?
      (Wegen "Das Rad neu erfinden") ;)
    • New

      Michael wrote:

      die SW UART von Bascom funktioniert doch ohne Timer?

      Oder an einem Intx Eingang und die Pausen messen.
      Ja, damit hat ein Byte die volle Aufmerksamkeit wodurch 7-9 Byte vom zweiten übersehen werden bzw das SW-Byte schreddern wenn die Ints nicht abgeschaltet würden.

      Wäre eine andere Rangehensweise als jedes Bit abzupassen, bräuchte dann noch eine weitere Erkennung wenn kein weiterer Int Passiert ($FF) . Ob's schneller geht? Schon versucht?
    • New

      Das mit den Pausen hatte ich nicht auf den Schirm (daher die andere Rangehensweise.)
      Ich dachte daran das Startbit per int zu erkennen und dann die Bits per Timerint zu sammeln. Dann bleibt Zeit die Bytes vom HW Uart einzusammeln. Da kommen ne Menge zusammen. 8 bei 9600 und ca 100 bei 115k (was ich wohl eher vergessen kann. )

      Wenn der Timer die Pausen zählt spart das zwar einige int aber die Umrechnug braucht vermutlich mehr Zeit als sie einfach einzusammeln. Zeitgewinn bei FF oder 7e aber bei $55 wirds dann sehr zeitkritisch.

      The post was edited 1 time, last by Pluto25 ().

    • New

      Warum sollst du das vergessen können? Du kannst du doch bei dem HW UARt auch in der Zwischenzeit Bytes verarbeiten.
      Ich habe den Empfang des SW UART tatsächlich über einen PCINT Eingang und einen freilaufenden Timer gemacht. Du bekommst dann nicht direkt jedes Bit mit, sondern nur den Wechsel von 0->1 und umgekehrt. Aus der Diff der Timerwerte kannst du erkennen, wie viele 0er bzw 1er Bits dazwischen waren.
    • New

      Franz wrote:

      Aus der Diff der Timerwerte
      Ich würde ihn zurücksetzen? Die zeitaufwändige Division macht mir Sorgen. Dann noch ne Scleif um die errechneten Bits einzuräumen. Wie sieht der Code aus? Den könnt ich mal durch den Simulator jagen um ein Gefühl fürs Timing zu bekommen.
      @Six gerade erst gesehen. Danke, ich werd heut abend mal reinschauen.
    • New

      Pluto25 wrote:

      Ja aber 1-10 Bytes vom HW Uart die bearbeitet werden müssen.
      Wo siehst du genau das Problem?
      Glaubst du, dass du ein Bit (bzw. eine Flanke) vom SW UART verpasst, während du auf dem HW einliest und verarbeitest? Dann solltest du immer nur ein Byte einlesen und in der Main verarbeiten. Außerdem kannst du den ICP anstelle des PCINT für den SW UART verwenden, sodass du die Timerwerte gespeichert bekommst.
      Oder andersherum, dass du ein Byte auf dem HW UART verpasst, während du eine Flanke vom SW UART verarbeitest? Auch hier der Hinweis, die Verarbeitung in die Main zu verlegen.
      Bei 115200 verpasst du in 8ms übrigens ein paar Byte mehr als nur 7. Je nachdem wieviele hintereinander gesendet werden sind es eher 100.
      Das Einlesen eines Bytes in der ISR benötigt mit rein- und rausspringen höchstens 200 Takte, genau wie eine Flanke beim SW UART. Bei 16MHz ist das gerade mal 1-2 Bit bei 115200 Baud.