-         

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 22

Thema: Hufiger Einsatz von SerPrint(); fhrt zu groen Problemen

  1. #1

    Hufiger Einsatz von SerPrint(); fhrt zu groen Problemen

    Anzeige

    hi,

    ich hab nun ein neues projekt angefangen, und wie htte es auch anders sein knnen, habe ich schon wieder ein unlsbares problem welches wohl auch dieses gefhrdet und mir den spass endgltig verdirbt

    es geht um folgende: ich mache gerade ein kleines programm welches mit dem hyperterminal arbeitet und ihm bei unterschiedlichen zustnden unterschiedliche sachen per SerPrint(); schickt. soweit so gut. das hat auch wunderbar funktioniert, bis zu einer bestimmten anzahl an gespeicherten strings. sobald ich sie berschreite, fngt der asuro an, smtliche strings in einen topf zu schmeissen, und ber serprint einfach irgendeinen mll auszugeben.

    da ich davon ausgegangen bin dass er ungefhr 8K ROM hat, wovon ich evtl 6-7K fr meine sachen verwenden kann, mssten es schon einige tausend zeichen sein die er ohne probleme speichern sollte.
    mein problem fngt aber schon bei ~600 zeichen an, was doch eigentlich schon sehr weit unterhalb der grenze liegen sollte..

    ich habe hier einen kleinen test-code erstellt um mein problem zu verdeutlichen: (einige stellen des codes sind auskommentiert, erklrung weiter unten)

    Code:
    #include "asuro.h"
    
    int main(void)  {
    
        Init();
    
    SerPrint("00ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n");
    SerPrint("01ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n");
    SerPrint("02ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n");
    SerPrint("03ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n");
    SerPrint("04ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n");
    SerPrint("05ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n");
    SerPrint("06ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n");
    SerPrint("07ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n");
    SerPrint("08ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n");
    SerPrint("09ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n");
    SerPrint("10ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n");
    SerPrint("11ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n");
    SerPrint("12ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n");
    SerPrint("13ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n");
    SerPrint("14ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n");
    SerPrint("15ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n");
    SerPrint("16ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n");
    SerPrint("17ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n");
    SerPrint("18ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n");
    SerPrint("19ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n");
    SerPrint("20ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n");
    SerPrint("21ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n");
    /*SerPrint("22ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n");
    SerPrint("23ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n");
    SerPrint("24ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n");
    SerPrint("25ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n");
    SerPrint("26ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n");
    SerPrint("27ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n");
    SerPrint("28ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n");
    SerPrint("29ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n");
    */
                                                                                                                        
    
    while(1);
    return 0;
    }
    wenn ich das an das terminal sende, kommt folgendes raus:

    Code:
    05ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
    06ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
    07ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
    08ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
    09ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
    10ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
    11ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
    12ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
    13ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
    14ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
    15ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
    16ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
    17ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHI18ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNO
    PQRSTUVWXYZ
    19ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
    20ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
    21ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
    man beachte dass es in der 5. zeile erst anfngt und dass die 18. zeile komplett zerhackt ist. (der fehler ist reproduzierbar und liegt nicht an der ir-verbindung).
    wenn ich die auskommentierten stellen des codes noch hinzufge, wird es noch viel hefitger, dann kommen noch mehr verwirrte zeichen an. jetzt wrde ich gerne wissen, woran das liegt. wieso geht es nicht, und warum fngt das problem schon bei so relativ wenigen zeichen an? was mache ich falsch? was kann ich anders machen?

    danke schonmal..

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    12.09.2007
    Alter
    23
    Beitrge
    98
    Der Asuro hat nur 1k Rom. Er 8k hat flash-speicher, wo bei schon 1k vom Bootloader besetzt sind. (s. http://www.roboternetz.de/wissen/index.php/Asuro) Das drfte die Lsung sein.

    mfg liggi
    Lieber am Asuro rumschrauben als alles andere.
    Meine Homepage

  3. #3
    ok hab das durcheinander gebracht. aber das macht ja nichts, die teile werden in den rom geladen, ausgefhrt, und wieder gelscht. (zumindest sollten sie das) und beim nchsten funktionsaufruf wieder ins rom geladen.


    oder nich? (bzw da es wohl nich so is, wie bring ich ihn dazu?)

  4. #4
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beitrge
    3.912
    das problem ist, dass die strings so wie du sie verwendest, zuerst in eine zwischenvariable im RAM geladen werden... und da der deutlich kleiner ist als die menge der zeichen die du senden willst (1024 bytes) luft er ganz stumpf ber.

    das hier knnte dir helfen, macht zwar die arbeit etwas umstndlicher, sorgt aber dafr dass die strings im flash gespeichert werden und auch direkt von dort gelesen werden:
    http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmspeicher_(Flash)
    achte auf die includes!!! etwas weiter unten ist ein absatz ber strings, trotzdem solltest du zuerst die grundlagen oben lesen.
    kleinschreibung ist cool!

  5. #5
    ok danke schonmal..ich verstehe zwar noch nich was da geschrieben steht, aber ich werde es mir nochmal durchlesen..

  6. #6
    guten morgen

    ich hab mich nochmal hingesetzt und denke dass ich das vom mikrocontroller.net verstanden habe, war doch nich so viel. aber lsen tut es mein problem nich.

    soweit ich verstanden habe muss ich den code in folgendes ndern:
    Code:
    #include "asuro.h"
    #include "avr/io.h"
    #include "avr/pgmspace.h"
    #include "string.h"
    
    int main(void)  {
    
        Init();
    
    const char a[] PROGMEM ="00ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n";
    const char b[] PROGMEM ="01ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n";
    const char c[] PROGMEM ="02ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n";
    const char d[] PROGMEM ="03ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n";
    const char e[] PROGMEM ="04ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n";
    const char f[] PROGMEM ="05ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n";
    const char g[] PROGMEM ="06ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n";
    const char h[] PROGMEM ="07ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n";
    const char i[] PROGMEM ="08ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n";
    const char j[] PROGMEM ="09ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n";
    const char k[] PROGMEM ="10ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n";
    const char l[] PROGMEM ="11ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n";
    const char m[] PROGMEM ="12ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n";
    const char n[] PROGMEM ="13ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n";
    const char o[] PROGMEM ="14ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n";
    const char p[] PROGMEM ="15ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n";
    const char q[] PROGMEM ="16ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n";
    const char r[] PROGMEM ="17ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n";
    const char s[] PROGMEM ="18ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n";
    const char t[] PROGMEM ="19ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n";
    const char u[] PROGMEM ="20ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n";
    const char v[] PROGMEM ="21ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n";
    /*SerPrint("22ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n");
    SerPrint("23ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n");
    SerPrint("24ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n");
    SerPrint("25ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n");
    SerPrint("26ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n");
    SerPrint("27ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n");
    SerPrint("28ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n");
    SerPrint("29ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n");
    */
                                                           
    
    SerPrint(a);
    SerPrint(b);
    SerPrint(c);
    SerPrint(d);
    SerPrint(e);
    SerPrint(f);
    SerPrint(g);
    SerPrint(h);
    SerPrint(i);
    SerPrint(j);
    SerPrint(k);
    SerPrint(l);
    SerPrint(m);
    SerPrint(n);
    SerPrint(o);
    SerPrint(p);
    SerPrint(q);
    SerPrint(r);
    SerPrint(s);
    SerPrint(t);
    SerPrint(u);
    SerPrint(v);
                                                               
    
    while(1);
    return 0;
    }
    wenn ich das tue startet asuro aber mit allen led's auf rot und strzt ab

    also entweder hab ich das falsch gemacht, oder es wird irgendwas erzeugt was ihn noch mehr belastet...

  7. #7
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beitrge
    3.912
    nicht SerPrint(xx); sondern SerPrint(PSTR(xx));

    ist recht verschachtelt, ich weiss... alternativ kannst du auch folgendes mal testen:
    SerPrint(PSTR("Text zum ausgeben\n\r"));
    kleinschreibung ist cool!

  8. #8
    Zitat Zitat von damaltor
    nicht SerPrint(xx); sondern SerPrint(PSTR(xx));
    will er nicht kompillieren!
    alternativ kannst du auch folgendes mal testen:
    SerPrint(PSTR("Text zum ausgeben\n\r"));
    geht, aber dann sendet er auch nur 1 zeichen und verstummt.

    im mikrocontroller.net steht ja "Zeichenketten knnen innerhalb des Quellcodes als "Flash-Konstanten" ausgewiesen werden. Dazu dient das Makro PSTR aus pgmspace.h. Dies erspart die getrennte Deklaration mit PROGMEM-Attribut."

    das bedeutet doch dass das nur ein ersatz fr progmem ist?

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beitrge
    2.236
    Hallo,
    leider ist es nicht so einfach Sachen aus dem Flash zu lesen, das bedarf einer Sonderfunktion, ich poste einfach mal ein Ausschnitt:
    Code:
    void push_flash(const char *string){
    char zeichen;
      while((zeichen = pgm_read_byte(string))) {
        while(!(UCSRA&(1<<UDRE)));
          UDR = zeichen;
        string++;
        }
    }
    So, an diese Funktion kann man dann Flashstrings berbeben z.B so
    Code:
    push_flash(PSTR("Hallo, ich bin im Flash!\r\n"));
    Ich hoffe geholfen zu haben

    Gru Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  10. #10
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beitrge
    3.912
    stimmt. htte mal genauer lesen knnen... 0_o genau so ist es bei mir auch...
    kleinschreibung ist cool!

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhnge hochladen: Nein
  • Beitrge bearbeiten: Nein
  •