- LiFePO4 Speicher Test         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 29

Thema: UART stoppt nach einiger Zeit

  1. #11
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Anzeige

    Powerstation Test
    Hi, Surfer ! Ohne sicher zu sein, daß das der Hänger-Grund ist, ist die Methode auf jeden Fall nicht sauber und du wirst irgendwann Zeichen verlieren.
    Vergiß nicht, daß Interrupt und Normal völlig unsynchron ablaufen, d.h. sie hauen sich "Daten" gegenseitig nieder.
    der interrupt fährt dir ja u.U. genau zwischen
    if (daten == 'a')
    und
    daten = 0
    rein, und dann ist dieses Zeichen schon mal weg.
    Wie gesagt, weiß nicht, ob's der Grund ist, aber bäh ist es sicher.
    mfg robert

  2. #12
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    06.07.2004
    Beiträge
    122
    Das könnte wirklich ne fehlerquelle sein.
    Wie muss ich dann die Daten speichern ohne Interrupts?

  3. #13
    Gast
    Hi,
    unter der Annahme, daß dein programm schnell genug ist, was dzt. wohl so ist (sonst müßtest du buffern)
    Code:
    static char daten = 0;
    static char flag1  = 0;  // flag is immer gut
    
    SIGNAL(...)
    {
        flag |= 1;         // es is was da
    }
    
    main()
    ....
    ...
    
    while (1)
    {
        flag <<= 1;                  //   
        if (flag & 2)
       {
             flag &= ~2;              // löschen
             daten = UDR;           // holen
              .........                    // verwursteln if then else und überhaupt
        }
    }
    Der Shift ist EIN Cpu-Befehl, der nicht unterbrochen werden kann. dadurch ist der Flag vom Interrupt entweder vorher drin, dann haben wir ihn ja, oder nachher, dann kriegen wir ihn halt beim nächsten mal
    mfg robert

  4. #14
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Hopperla, so schön war's auch wieder nicht.
    tut mir leid, unterm H... ausgeloggt.

  5. #15
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    06.07.2004
    Beiträge
    122
    Tja. Ich habs jetzt nochmals ganz normal probiert (nachdem deine Methode auch nicht wirklich funktioniert hat). Hab jetzt herausgefunden, dass es nicht nur in den ersten 5s geht sondern eigentlich immer, das Problem ist nur, dass es nur in gewissen Zuständen funktioniert. Hab zwar keine Ahnung warum, aber wenn ich immer ein bisschen auf der Tastatur "rumhämmere", kommt das Signal manchmal durch....
    Gibt es vielleicht einen Buffer? Wo die Daten gespeichert und abgerufen werden können, oder ist das nur das UDR?

  6. #16
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Tscha, opfere mal 2 LED für die doch möglichen Errors
    die sind im UCSRA und heißen FE und DOR (Framing & Overflow)
    die mußt Du abfragen VOR daten = UDR
    ist einer "1" laß eine LED leuchten

    Nächster Vorschlag (einfacher, also zuerst probieren
    Pfeif auf die LED und mach einfach echo und sonst nix.
    SIGNAL(..)
    {
    UDR = UDR // (TXEN nicht vergessen)
    }

    PS Buffer gibt's schon, aber der ist gewissermassen transparent (nicht sichtbar) Kopf hoch, das ist ja lächerlich mfg robert

  7. #17
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    06.07.2004
    Beiträge
    122
    Also ich hab mal die Register-Error-Bits anzeigen lassen.
    Ich arbeite nicht viel mit diesen Registerbefehlen (ich siehe einfach im Datenblatt nach, welche Bits gesetzt werden müssen und dann schreibe ich den Wert z.B. 0x04 in das Register...) also weiss ich gar nicht ob dieses Programm stimmt... Auf jeden Fall leuchten die beiden Fehler-LED's.
    Das mit dem UDR=UDR funktioniert für ein einziges Zeichen, dann ist Schluss, ausser manchmal geht es per Zufall....

    Huiuiuiui

    Code:
    SIGNAL(SIG_UART_RECV)
    {
      if((USR<<FE))
      sbi(PORTC,2);
      if((USR<<DOR))
      sbi(PORTC,3);
    	
      switch(inp(UDR))
      {
        case 'a': sbi(PORTC,0); cbi(PORTC,1); break;
        case 's': sbi(PORTC,1); cbi(PORTC,0); break;
        default: break;
      }
    }

  8. #18
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    06.07.2004
    Beiträge
    122
    Hat vielleicht noch jemand eine Lösungsidee?
    Sonst könnt ihr mir mal einen Beispielcode geben, der bei euch läuft.
    Wenn er bei mir nicht funzt, wechsle ich mal den Quarz (+ andere Frequenz...). Ich habe jetzt 4MHz. Was benutzt ihr so? Welches sind gute Werte? Danke

  9. #19
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Ich stell ein Programm rein, das tut zwar im Detail was anderes, aber es funzt und gibt antwort.
    Ein Leidenskollege hatte USART-Probleme, er wird nicht böse sein, wenn ich dir den Code gebe.
    Deine sbi und cbi mußt du natürlich noch einbauen.

    Wie gesagt ES FUNZT , also wenn probleme, liegt's woanders.
    mfg robert
    Angehängte Dateien Angehängte Dateien

  10. #20
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    06.07.2004
    Beiträge
    122
    Danke für das Programm... Hab jetzt dadurch etwas weiteres herausgefunden... Immer dann, wenn das Zeichen erkannt wird, ist alles OK (manchmal wird es eben erkannt und es läuft alles). Aber in den meisten Fällen wird bei Eingabe ein RESET durchgeführt..... Denn ich glaube nicht, dass dein Programm bei jeder Eingabe den Titel nochmals neu schreibt...

    An was könnte das liegen?

    Ach und so nebenbei... am Quarz liegts wohl kaum, da ich im Datenblatt gesehen habe, dass bei 4MHz und 9600BAUD die Fehlerquote nur 0.2% beträgt..... Aber wieso ein RESET???????

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad