Der Asuro hat nur 1k Rom. Er 8k hat flash-speicher, wo bei schon 1k vom Bootloader besetzt sind. (s. https://www.roboternetz.de/wissen/index.php/Asuro) Das dürfte die Lösung sein.
mfg liggi
hi,
ich hab nun ein neues projekt angefangen, und wie hätte es auch anders sein können, habe ich schon wieder ein unlösbares problem welches wohl auch dieses gefährdet und mir den spass endgültig verdirbt
es geht um folgende: ich mache gerade ein kleines programm welches mit dem hyperterminal arbeitet und ihm bei unterschiedlichen zuständen 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, fängt der asuro an, sämtliche strings in einen topf zu schmeissen, und über serprint einfach irgendeinen müll auszugeben.
da ich davon ausgegangen bin dass er ungefähr 8K ROM hat, wovon ich evtl 6-7K für meine sachen verwenden kann, müssten es schon einige tausend zeichen sein die er ohne probleme speichern sollte.
mein problem fängt 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, erklärung weiter unten)
wenn ich das an das terminal sende, kommt folgendes raus: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; }
man beachte dass es in der 5. zeile erst anfängt und dass die 18. zeile komplett zerhackt ist. (der fehler ist reproduzierbar und liegt nicht an der ir-verbindung).Code:05ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ 06ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ 07ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ 08ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ 09ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ 10ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ 11ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ 12ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ 13ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ 14ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ 15ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ 16ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ 17ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHI18ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNO PQRSTUVWXYZ 19ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ 20ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ 21ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
wenn ich die auskommentierten stellen des codes noch hinzufüge, wird es noch viel hefitger, dann kommen noch mehr verwirrte zeichen an. jetzt würde ich gerne wissen, woran das liegt. wieso geht es nicht, und warum fängt das problem schon bei so relativ wenigen zeichen an? was mache ich falsch? was kann ich anders machen?
danke schonmal..
Der Asuro hat nur 1k Rom. Er 8k hat flash-speicher, wo bei schon 1k vom Bootloader besetzt sind. (s. https://www.roboternetz.de/wissen/index.php/Asuro) Das dürfte die Lösung sein.
mfg liggi
Lieber am Asuro rumschrauben als alles andere.
Meine Homepage
ok hab das durcheinander gebracht. aber das macht ja nichts, die teile werden in den rom geladen, ausgeführt, und wieder gelöscht. (zumindest sollten sie das) und beim nächsten funktionsaufruf wieder ins rom geladen.
oder nich? (bzw da es wohl nich so is, wie bring ich ihn dazu?)
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) läuft er ganz stumpf über.
das hier könnte dir helfen, macht zwar die arbeit etwas umständlicher, sorgt aber dafür 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.
ok danke schonmal..ich verstehe zwar noch nich was da geschrieben steht, aber ich werde es mir nochmal durchlesen..
guten morgen
ich hab mich nochmal hingesetzt und denke dass ich das vom mikrocontroller.net verstanden habe, war doch nich so viel. aber lösen tut es mein problem nich.
soweit ich verstanden habe muss ich den code in folgendes ändern:
wenn ich das tue startet asuro aber mit allen led's auf rot und stürzt abCode:#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; }
also entweder hab ich das falsch gemacht, oder es wird irgendwas erzeugt was ihn noch mehr belastet...
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"));
will er nicht kompillieren!Zitat von damaltor
geht, aber dann sendet er auch nur 1 zeichen und verstummt.alternativ kannst du auch folgendes mal testen:
SerPrint(PSTR("Text zum ausgeben\n\r"));
im mikrocontroller.net steht ja "Zeichenketten können 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 für progmem ist?
Hallo,
leider ist es nicht so einfach Sachen aus dem Flash zu lesen, das bedarf einer Sonderfunktion, ich poste einfach mal ein Ausschnitt:
So, an diese Funktion kann man dann Flashstrings überbeben z.B soCode:void push_flash(const char *string){ char zeichen; while((zeichen = pgm_read_byte(string))) { while(!(UCSRA&(1<<UDRE))); UDR = zeichen; string++; } }
Ich hoffe geholfen zu habenCode:push_flash(PSTR("Hallo, ich bin im Flash!\r\n"));
Gruß Sebastian
Linus TorvaldSoftware is like s e x: its better when its free.
stimmt. hätte mal genauer lesen können... 0_o genau so ist es bei mir auch...
Lesezeichen