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

Thema: Asuros SerWrite(..) - Verständnisproblem

  1. #11
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Anzeige

    Praxistest und DIY Projekte
    Zitat Zitat von Rakke
    einfach warten, bis der Puffer leer ist, dann schreiben und weitermachen.
    Auf diese Weise lässt sich die Interruptgeschichte dann flexibel nutzen:
    wenn nötig, wird auf die serielle Schnittstelle gewartet, wenn nicht erforderlich, nicht.
    Ja, genau das habe ich versucht in meinem letzten Beitrag zu sagen.

    Hab leider immer noch nix zum posten, da mein Pegel jetzt erst so langsam abklingt. (War auch leckere Whiskey von Weihnachten bis zum Jahreswechsel dabei )
    Ich werde versuchen einen funktionsfähigen Ausschnitt aus meinem Zeug mal nur zum Thema Senden zusammenzustellen.

    Viele Grüße vom Sternthaler

  2. #12
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    25.10.2005
    Alter
    71
    Beiträge
    157
    Hallo,

    vor einigen Jahrzehnten, als auch PCs nur wenige KB RAM hatten, kannte ich solche Dinger 'mal auswendig . Mal schauen, an was ich mich noch erinnern kann:

    Das Stichwort heißt "Ringpuffer". Es handelt sich um eine beliebige Anzahl Bytes im RAM und zwei Zeiger. Der eine dient als Schreibzeiger, der andere als Lesezeiger.
    Beim Schreiben wird an die Stelle geschrieben, auf die der Schreibzeiger zeigt. Danach wird der Zeiger inkrementiert. Kommt er ans Ende des Puffers, wird er auf den Anfang gesetzt (daher der Name Ringpuffer). Trifft der Schreibzeiger auf den Lesezeiger, ist der Puffer voll.

    Asynchron hierzu (z.B. durch Interrupt) kann gelesen werden (und z.B. dann an die USART geggeben werden). Es wird das Zeichen gelesen, auf das der Lesezeiger zeigt. Anschließend wird der Lesezeiger inkrementiert. Trifft der Lesezeiger auf den Schreibzeiger, ist der Puffer leer.

    Solch einen Puffer kann man sowohl zum Senden als auch zum Empfangen einsetzen. Nützlich sind ein paar Routinen zum Lesen oder Schreiben aus dem Puffer und solche, die Auskunft über seinen Zustand, z.B. Anzahl freie Bytes, Anzahl noch zu sendender Bytes, etc.

    Mögliche Interrupts wären:
    Serial Transfer Complete
    USART, Rx Complete
    USART Data Register Empty
    USART, Tx Complete
    Hier müsste man nachschauen, welches die geeigneten sind.

    Zu beachten: jedesmal wenn man eneut beginnt, Zeichen in den Puffer zu schreiben, d.h. es läuft gerade keine Übertragung, muss das Senden durch die schreibende Funktion erneut angestossen werden. Die nächsten Byte werden dann per Interrupt gesendet.

    Zum Echo: Man muss schon eindeutig zwischen Sende- und Empfangzustand unterscheiden (halbduplex). Wenn man sendet, kann man nicht empfangen und während des Empfangens, muss man strikt das Senden unterbinden. Die Kommunikationspartner müssen sich per Protokoll darüber einigen, wer senden und wer empfangen soll.

    Man muss auch damit rechnen, dass beide Stationen gleichzeitig mit dem Senden beginnen. Deshalb ist eine Kollisionserkennung sinnvoll.

    Aber solange man nur mit der IR-Ausrüstung arbeitet, ist das sowieso nicht besonders prickeld (Reichweite 20-100 cm (max.) und 2400 Baud). Oder habt ihr da eine andere Technik?

    Gruß Red Baron

  3. #13
    Erfahrener Benutzer Roboter Genie Avatar von m.a.r.v.i.n
    Registriert seit
    24.07.2005
    Ort
    Berlin
    Beiträge
    1.247
    Hallo,

    Es gibt ja auch die avrlib, eine sehr gut dokumentierte Bibliothek für die AVR-Familie.
    Dort gibt es auch fertige interruptgesteuerte Sende-Emfangs Routinen mit Ringbuffern. Die Funktionen kann man sich sicher anpassen.

    Als Alternative zur IR-Schnittstelle kommen eigentlich nur Funkmodule in Frage.
    Mein persönlicher Favorit sind die iDwaRF Funk-Module. Die sind aber leider noch nicht lieferbar.

    Gruß Peter

  4. #14
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Hallo zusammen,

    wie versprochen, kommt nun eine 'halbwegs' funktionsfähige INTERRUPT-getrieben Sendefunktion.

    Ich habe auf der ursprünglichen asuro.c/asuro.h aufgesetzt und liefer im ZIP-File aber eine vom Namen geänderte Version asuro-st.c/asuro-st.h, damit bei euch keinesfalls das Original, oder eine LIB hier aus dem Forum übermangelt wird. IST ALSO NICHT ALS LIB-ERSATZ ZU SEHEN.

    'Halbwegs funktionsfähig' soll hier heißen, dass es noch einen Bug gibt.
    Wenn ich aus der Test-Funktion den Button 6 gedrückt hatte (sendet sehr viele Daten), dann funktioniert der Fall Button 1 (genau ein Zeichen senden) danach nicht mehr.

    Zum Testen habe ich mal so einige hier im Thread aufgeführte Probleme auf die einzelnen Button gelegt. Kommentar sind im Source.

    Ich bin mal auf eure Reaktion gespannt. Ich hoffe, dass ihr den letzten Bug finden werdet. (So weit ICH weiss ist es der Letzte. Ihr müsst die anderen finden)

    EDITIERT vom Sternthaler am 15.01.06
    Entfernen des fehlerhaften Atachments, da ich etwas weiter unten eine FEHLERKORREKTUR gepostet habe.
    Lieber Asuro programieren als arbeiten gehen.

  5. #15
    Erfahrener Benutzer Roboter Genie Avatar von m.a.r.v.i.n
    Registriert seit
    24.07.2005
    Ort
    Berlin
    Beiträge
    1.247
    Hallo Sternthaler,

    klasse, das sieht doch sehr gut aus.

    Was den letzten Bug betrifft habe ich auch eine Vermutung.
    Liegt wohl an der PollSwitch Abfrage.
    PollSwitch 2x aufrufen und die beiden Ergebnisse vergleichen, hilft eigentlich immer.

    Code:
    ...
      unsigned char tmp;
    ...
        tmp = PollSwitch ();
        v_taster = PollSwitch ();
    
        if (v_taster > 0 && v_taster == tmp)
    ...
    Btw. die iDwaRF Module sind jetzt endlich erhältlich. Gestern habe ich 5 Stück bekommen.
    Leider kann ich die Module noch nicht flashen, weil mein AVR910 Programmer den mega168 nicht kennt.

    Gruß Peter

  6. #16
    Neuer Benutzer Öfters hier
    Registriert seit
    13.01.2006
    Ort
    Hagen
    Beiträge
    9

    ASURO Taster auslesen

    Hallo M.a.r.v.i.n, hallo Sternthaler,
    als Neuling, der gerade den ASURO zusammengebaut hat (alle Tests OK), habe ich eure Diskussion mit Interesse gelesen und sofort den Verbesserungsvorschlag von M.a.r.v.i.n eingebaut:

    Nutzt leider nichts, weiterhin wird nach Taste 6 der Punkt von Taste 1 nicht angezeigt.

    Gruß
    Dieter

  7. #17
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Hallo dgrobot,
    ersteinmal herzlich willkommen im Forum.

    Leider kann ich da nur zustimmen, dass die Tastenabfrage da wohl diesmal nicht die Schuld hat.
    Ich hatte auch versucht die beiden Funktionen von Taste 1 und 6 auf andere Tasten zu legen, da ich den Vorschlag von m.a.r.v.i.n nicht unversucht lassen wollt. Hat aber leider tatsächlich keine Auswirkung.

    Ich bin zur Zeit der Überzeugung, dass ich selbst Schuld bin, und irgendwo im Programm doch noch mit den Zeigern auf Tail und Head schlamper. Oder die Variable mit der Anzahl im Buffer vorhandener Zeichen ist noch nicht ganz sauber.
    Lieber Asuro programieren als arbeiten gehen.

  8. #18
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Der Vollständigkeit halber:

    Unter https://www.roboternetz.de/phpBB2/ze...ag.php?t=12790 hat Winne im Thread auch Source zu Interrupt-Thema gepostet.
    Das hatte ich gestern Nacht gefunden, aber noch nicht ausprobiert.
    Ich habe wohl schon gesehen, dass seine Sendefunktion nur C-Strings entgegen nehmen kann, was ich persöhnlich ja nicht für ausreichend halte. Das ist aber das kleinere Problem da etwas zu Ändern. Dafür hat er aber eine Funktion um ein einzelnes Byte zu senden. Das gefällt mir schon ganz gut.
    Lieber Asuro programieren als arbeiten gehen.

  9. #19
    Neuer Benutzer Öfters hier
    Registriert seit
    13.01.2006
    Ort
    Hagen
    Beiträge
    9

    ASURO Taster auslesen

    Hallo Sternthaler,
    nach einigen Versuchen bin ich zu dem Schluss gekommen, dass die Anzahl der von TASTE 6 gesendeten Zeichen zu hoch ist, es wird im Speicher des ASURO gerade das erste Zeichen des Textes von TASTE 1 gelöscht; da TASTE 1 nur 1 Zeichen sendet, sieht man gar nichts mehr!
    Das lässt sich sehr schön demonstrieren, wenn man im Programm die if-Anweisungen von TASTE 1 mit der von TASTE 2 in der Reihenfolge tauscht, dann fehlt nämlich das erste Zeichen von TASTE 2.
    Ohne mich da genau auszukennen, vermute ich, dass eine Art Buffer-Ueberlauf die Ursache ist. Der Buffer ist mit 30 Zeichen definiert, es werden aber viel mehr erzeugt.

    Bei der Gelegenheit: Bei mir scheint TASTE 6 den Code 0x21 zu senden. Dadurch wird wegen
    Code:
     if (v-Taster & 0x01)
    immer auch SerWrite() der TASTE 1 erzeugt. Abhilfe:
    Code:
     if (v-Taster == 0x01)
    Gruß
    Dieter

  10. #20
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    @dgrobot
    Ja, du hast absolut Recht mit deiner Vermutung das da ein Speicherbereich zu klein ist.
    P.S.: Der Sendebuffer ist in der Datei asuro_st.h am Ende mit #define UART_TX_BUF_LEN 50 nicht auf 30 Zeichen, sondern auf 50 angegeben.
    (Im übrigen ist dein angegeben Code für die Tastenabfrage für Testzwecke tatsächlich der sichere. Für eine echte Tastenabfrage vor einer 'angerumsten' Wand müsstest du dann aber ALLE Kombinationen der Tastewerte in einem Case abfragen.)

    Es liegt aber nicht an dem Sendebuffer mit seiner begrenzten Länge, sondern an meinem eigenen Testprogramm.
    Dort ist die Variable v_text mit 100 Zeichen definiert und ich Trottel schreibe beim Testfall auf Taste 6 102 Zeichen in diese Variable.

    Nun also im Anhang eine korrigiert UND MIT WINNE-CODE VERSCHMOLZENE funktionsfähige Version. Kommentar wie gehabt in den Sourcen (Kopf und Funktion)

    Ich hoffe ihr schaut alle nochmal genau nach was ich diesmal kaputt gemacht habe.
    Angehängte Dateien Angehängte Dateien
    Lieber Asuro programieren als arbeiten gehen.

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

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

Solar Speicher und Akkus Tests