Forum: Mikrocontroller und Digitale Elektronik Reset HW-Stack Bascom


von 0815User:) (Gast)


Lesenswert?

Hallo,
Wie im Betreff vermerkt suche ich eine Lösung, den Hardwarestack in 
Bascom zu löschen. Ich möchte ähnlich wie der Watchdog den Controller 
neu initisieren. Allerdings über einen einen externen Interrupt.

Nun war die Idee aus der Interruptroutine zum Programmstart zu springen. 
Leider bekomme ich den HWStack nicht resetet was nach geraumer Zeit zum 
überlaufen und anschließend zur Fehlfunktion des uc führt.

Bin führ alle Ideen offen!

von MWS (Gast)


Lesenswert?

Das hört sich nach Murks an.
Die Lösung den WDT einen Reset machen zu lassen ist bekannt ?
Ansonsten, den Stack muss man nicht löschen, wozu auch ? Aber der 
Stackpointer SP müsste neu initialisiert werden.

von 0815User:) (Gast)


Lesenswert?

Da muss ich dir zustimmen. Sauber Programmiert ist das nicht, aber ich 
sehe in dem Zusammenhang keine andere Lösung. Es wäre auch nur eine 
Vorübergehende Lösung. Die aktuelle Beschaltung des uc erfordert leider 
solch verzweifelten Taten :).

Das der Watchdog einen Reset durchführen kann ist mir bekannt. 
Allerdings nach einer gewissen Zeit. Ich bräuchte quasi einen Watchdog 
der von externen Signalen ausgelöst werden kann.

Beim Stackpointer hab ich mich Vllt etwas falsch ausgedrückt. Ich möchte 
die Rucksprungadresse sowie die Registerinformation welche bei auslösen 
des Interrupts auf den von Bascom angelegt HW-Stack gepusht werden 
wieder Popen damit der Stack nicht überläuft.

Die Frage ist nun wie ich das in Bascom implementiere. Ich meine gelesen 
zu haben dass der HW-Stack in Bascom je nach Größe des Programms und das 
Stacks an unterschiedlichen Adressen im Speicher stehen kann. Eine von 
mir angelegt Funktion welche einfach die Infos vom Stack popt ist damit 
schwer zu realsieren.

von spess53 (Gast)


Lesenswert?

Hi

Um welchen Controller geht es denn überhaupt? HW-Stack ist keine 
Funktion von Bascom, sondern ist im Aufbau einiger AVRs begründet. Bei 
einem AVR mit HW-Stack (z.B. ATTiny15) gibt es keine Möglichkeit den 
Stack manuell zurückzusetzen. In keiner Programmiersprache.

MfG Spess

von 0815User:) (Gast)


Lesenswert?

Es handelt sich um einen AT-Mega 128. Dass es keine Methode gibt würde 
ich jetzt nicht auf Anhieb unterschreiben. Schließlich wird jedes mal 
wenn ein "Return" aufgerufen wird ebenfalls vom Stack gepopt. Leider 
auch anschließend an die entsprechende Stelle gesprungen weswegen ich 
das nicht verwenden kann.
Weiterhin steht in der Bascom Hilfe das der HW-Stack sich im SRAM 
befindet also zwischen sämtlichen Variablen die im Programm definiert 
werden.

Wenn man allerdings weiß an welcher Adresse genau sich der Stack 
befindet, sollte es doch ein leichtes sein via Assembler den 
Stackpointer zu manipulieren.

Noch ein Argument was gegen die Behauptung spricht, der Hardwarestack 
habe einen exklusiven Speicherplatz, ist die Definition. Wenn im ATMega 
ein Stück Speicher für den HW-Stack allokiert ist, macht es keinen Sinn 
ihn zu definieren. Da er immer eine bestimmte Größe haben muss. Im SRAM 
macht es hingegen schon mehr Sinn da unnötig allokierter Speicher 
unnötig viel SRAM verbraucht.

Trotzdem danke für die Antworten ;)

von spess53 (Gast)


Lesenswert?

Hi

Irgendwie ist die Bezeichnung 'Hardwarestack' von Bascom irreführend. 
Bei AVRs hat das eine andere Bedeutung.

Der ATMega128 besitzt einen Stackpointer, also die Register SPL und SPH. 
Normalerweise werden die beim Programmstart mit der höchsten RAM-Adresse 
initialisiert. Ob das BASCON anders macht weiß ich nicht.

MfG Spess

von MWS (Gast)


Lesenswert?

spess53 schrieb:
> Irgendwie ist die Bezeichnung 'Hardwarestack' von Bascom irreführend.

Bascom kennt auch einen Softwarestack, deshalb die Unterscheidung. Der 
Hardwarestack beginnt wie üblich bei RAMEND.

0815User:) schrieb:
> Das der Watchdog einen Reset durchführen kann ist mir bekannt.
> Allerdings nach einer gewissen Zeit. Ich bräuchte quasi einen Watchdog
> der von externen Signalen ausgelöst werden kann.

Man könnte die kleinste WD Zeit einstellen und dann den WDT in eine 
Do/Loop laufen lassen.

> Beim Stackpointer hab ich mich Vllt etwas falsch ausgedrückt. Ich möchte
> die Rucksprungadresse sowie die Registerinformation welche bei auslösen
> des Interrupts auf den von Bascom angelegt HW-Stack gepusht werden
> wieder Popen damit der Stack nicht überläuft.

Wenn Du an den Resetvektor springen willst, so kannst Du das mit:
1
Goto 0
erledigen.
Daraufhin wird von der Bascom-Init der Stack sowieso wieder neu 
initialisiert, also SPL/SPH auf RAMEND gesetzt. Eventuelle 
Rücksprungadressen oder gepushte Register sind damit "vergessen".

Die Bascom-Init löscht in Folge den SRam. Was allerdings nicht passiert, 
ist daß der IO-Bereich zurückgesetzt wird, ein Timer wird weiterlaufen 
und sobald die Interrupts wieder erlaubt sind, werden anstehende Ints 
auch ausgeführt.

Das hier würde den Stackpointer neu initialisieren, aber da solltest Du 
schon sehr genau wissen, was Du machst:
1
!LDI   R24,   lbyte(_HWSTACKSTART)
2
!OUT   SPL,   R24
3
!LDI   R24,   hbyte(_HWSTACKSTART)
4
!OUT   SPH,   R24

von 0815User:) (Gast)


Lesenswert?

Wird Goto 0 auch explizit ausgeführt wenn der Watchdog anspringt. Klingt 
ja nach interessanten Lösungen. Bin mir gerad aber unschlüssig ob das 
die richtigen Ansätze sind.
Deswegen gerad nochmal was ich eigentlich vorhab. Interrupt tritt auf 
und IR-Routine wird ausgeführt. Anschließend soll an eine bestimmte 
Adresse in der Hauptschleife gesprungen werden.
Dabei treten zwei Probleme auf. Erstens ist durch die gesetzten Register 
sämtliche anderen Interrupts blockiert und zweitens konnte der Stack 
überlaufen und den uc Abstürzen lassen.

Deswegen mein Plan die Register zu löschen und damit sämtliche Spuren 
des Interrupts zu löschen.

Was mir noch nicht ganz klar ist, was passiert genau bei einem goto 0?

vielen dank für die vielen Tipps

Mfg

von MWS (Gast)


Lesenswert?

0815User:) schrieb:
> Wird Goto 0 auch explizit ausgeführt wenn der Watchdog anspringt.

Wenn der WD anspringt, dann wird ein Hardwarereset ausgeführt, in dessen 
Folge der Resetvektor mit Programm- = Flashadresse 0 angesprungen wird. 
Nach dem Resetvektor sind im Flash die Interruptvektoren angeordnet, 
also enthält der Resetvektor wiederum einen Sprungbefehl auf das 
eigentliche Programm, welches dann unmittelbar nach den Interrupvektoren 
folgt.

Der Unterschied von Soft-Reboot zu Hard-Reboot ist, daß beim Hardboot 
der IO-Bereich auch auf vordefinierte Werte gesetzt wird, während beim 
Softboot dies nicht passiert.

0815User:) schrieb:
> Interrupt tritt auf
> und IR-Routine wird ausgeführt. Anschließend soll an eine bestimmte
> Adresse in der Hauptschleife gesprungen werden.

Solche Verrenkungen sind bei vernünftiger Programmierung überhaupt nicht 
notwendig. Wenn die Hauptschleife immer durchlaufen wird, dann ist's 
kein Problem bei erfolgten IR-Befehl zu verzweigen. Da darf man 
natürlich nichts mit langen Waits gemacht haben.

Zeig' doch mal Deinen Code.

Tatsächlich wäre es möglich dem Prozessor eine beliebige 
Rücksprungadresse unterzumogeln, so daß der Return aus der ISR auf eben 
diese Adresse erfolgt.

Das sind aber richtig üble Tricks, die in 99.999% aller Fälle unnötig 
sind. Und 'ne simple IR-Code Erkennung ist da keine Ausnahme.

von spess53 (Gast)


Lesenswert?

Hi

>Wird Goto 0 auch explizit ausgeführt wenn der Watchdog anspringt.

Wenn als Frage gemeint: Ein Goto 0 ist nicht identisch mit einem, wie 
auch immer gearteten, Reset. Das gemeinsame ist, das das Programm an 
Adresse $00 anfängt. Aber bei einem Reset werden auch noch sämtliche 
I/O-Register auf Defaultwerte gesetzt.

MfG Spess

von 0815User:) (Gast)


Lesenswert?

OK also wird mit Goto 0 die Speicheradresse 0 angesprungen. Das schon 
mal ein guter Start. Nun schreibt ihr noch das beim Softboot die IOs 
nicht initialsiert werden. Das eigentlich kein Problem da am 
Programmstart sowieso explizit alle IOs zugewiesen werden.
Zuvor wurde geschrieben das bei einem Goto 0 der Stackpointer 
initalisiert wird. Das müsste dann ja implizit passieren da es nicht in 
meiner Initialisierung passiert. Ist dem so?

Dass der Sachverhalt in die Kategorie absolut schlechte Programmierung 
fällt ist mir klar. Es gibt auch alternative Lösungen. Diese beinhalten 
aber ein neu Design des Boards sowie eine komplette Überarbeitung der 
Software da es mit dem aktuellen Layout nicht möglich ist. Der At-Mega 
war zu Beginn nur dafür verantwortlich mehrere diverse Takte zu 
erzeugen. Alle Timer gesteuert. Das ist das hauptsächliche Problem.
Interessant ist also wie ich entweder die Rücksprungadresse der 
Interruptroutine auf eine fixe Adresse zeigen lassen kann, oder wie ich 
den Stack sauber initalisieren kann sodass keine Werte mehr darin 
enthalten sind. Dann kann die Interruptroutine via goto verlassen 
werden, da hier ja keine Rücksprungadresse auf dem Stack angelegt wird.

Den Code zu posten will ich euch nicht antun. Sind weit über 1000 
Zeilen, meiner Meinung nach sowieso unübersichtlichen Bascom 
geschrieben.

Mfg

von Peter D. (peda)


Lesenswert?

0815User:) schrieb:
> Die aktuelle Beschaltung des uc erfordert leider
> solch verzweifelten Taten :).

Es gibt keine Beschaltung, die einen schlechten Programmierstil 
erfordert. Alle Probleme kann man auch sauber und strukturiert lösen.

0815User:) schrieb:
> Sind weit über 1000
> Zeilen, meiner Meinung nach sowieso unübersichtlichen Bascom
> geschrieben.

Es gibt auch keine Programmiersprache, die unübersichtliches 
Programmieren erzwingt. Selbst in Assembler kann man sich Funktionen 
definieren und die dann aufrufen.

Du solltest mal den PC abschalten und mit Papier und Bleistift einen 
Programmablaufplan malen. Aber nicht als Spaghetticode sondern in 
einzelne Funktionsmodule unterteilt. Jedes Modul kriegt dann wieder 
seinen eigenen PAP. So als Richtwert, ein PAP sollte auf 1-2 A4 Seiten 
passen, ansonsten ist er zu lang und man verliert die Übersicht. Ist ein 
Modul zu groß, dann versucht man, es in Teilaufgaben zu zerlegen.

Ob nun Top-down oder Bottom-up oder beides, ist egal. Man fängt da an, 
wo man einen Ansatzpunkt sieht.
http://de.wikipedia.org/wiki/Top-down_und_Bottom-up

Niemals eine Aufgabe als großen monolithischen Block ansehen.


Peter

von me (Gast)


Lesenswert?

Ich kann Peter nur zustimmen, denn Programmieren bedeutet nicht, den PC 
anzuwerfen und irgendetwas in den Editor eines Compilers zu hacken. 
Programmieren bedeutet, sich die einzelnen Prozeduren und Funktionen als 
Ablaufdiagramm schriftlich aufzuzeichen, bis die gewünschten Reaktionen 
einzelner Programmschritte mit ihren Programmteilen definiert worden 
sind. Das Eintippen in der jeweiligen Sprache nennt man dann kodieren 
und hat in diesem Moment nichts mehr mit Programmieren zu tun.

von MWS (Gast)


Lesenswert?

0815User:) schrieb:
> Interessant ist also wie ich entweder die Rücksprungadresse der
> Interruptroutine auf eine fixe Adresse zeigen lassen kann, oder wie ich
> den Stack sauber initalisieren kann sodass keine Werte mehr darin
> enthalten sind. Dann kann die Interruptroutine via goto verlassen
> werden, da hier ja keine Rücksprungadresse auf dem Stack angelegt wird.

Ich denk' auch, daß das besser zu lösen ist.

Aber gut...

Die Rücksprungadresse wird vom Controller vor dem Sprung in die ISR auf 
den Stack geschoben. Wenn man weis wo die Adresse ist und sie popt und 
eine neue Adresse auf den Stack pusht, so wird beim RETI diese Adresse 
angesprungen. Es gibt ein paar Sachen die zu beachten sind, aber 
prinzipiell geht das.

Der Stack ist bereits mit Setzen des SPs auf RAMEND initialisiert.

von 0815User:) (Gast)


Lesenswert?

Mir ist durchaus klar wie man eine Software richtig entwirft und 
anschließend umsetzt. Das steht hier eigentlich auch nicht zur Debatte. 
Aber um mich ein wenig zu rechtfertigen, die Software stammt nicht von 
mir. Ich bin lediglich dafür verantwortlich eine weitere Funktion 
hinzuzufügen. Dabei ist es mir aus zeitlichen Gründen aktuell nicht 
möglich die Software komplett neu in einem sauberen Programmfluss zu 
implementieren.

Die eigentliche Frage lautete kann man den Hardwarestack so 
manipulieren, dass aus einem Interrupt gesprungen werden kann ohne dabei 
wieder in die Interruptroutine zurück kehren zu müssen. Meiner Meinung 
nach ist das in Bascom nicht möglich. Ich dachte allerdings dass ich 
mich hier noch einmal erkundigen sollte bevor ich die Software komplett 
neu schreiben muss. Dann natürlich nach bekannten Entwurfsrichtlinien 
die solche krassen Aktionen nicht verlangen.

Lg

von spess53 (Gast)


Lesenswert?

Hi

Wenn ich deine Äußerungen hier so lese, keimt der Verdacht auf, das du 
dich weder mit µCs, noch mit BASCOM so richtig auskennst.

Liege ich da falsch?

MfG Spess

von 0815User:) (Gast)


Lesenswert?

0815User:) schrieb:
> Meiner Meinung
> nach ist das in Bascom nicht möglich.

Gut dann muss ich das teilweise zurücknehmen. Problem was ich allerdings 
noch sehen, wenn ein Interrupt ausgelöst, so wird nicht nur die 
Rücksprungadresse auf den Stack gelegt sondern auch Registerinformation. 
Ich nehme an eben jene die für die Sperrung aller anderen Interrupts 
etc. verantwortlich sind. Diese müssten dann ebenfalls gelöscht werden 
um eine sauberen Programmablauf gewähren zu können. Dennoch stellt sich 
die Frage wo der Stack sich eigentlich befindet. In der Bascom-Hilfe 
steht ja wie schon gesagt lediglich das der Stack im SRAM angelegt wird.

Grundsätzliche gibt es ja zwei Möglichkeiten den Schabanack umzusetzen.

1. ich manipuliere die Rücksprungadresse der IR-Routine. Somit wird der 
Stack automatisch durch das Retrun gecleart und der µC in seinen 
Ursprungszustand versetzt.

2. ich setze in der IR-Routine einen Goto 0 oder andere Adresse. Damit 
spring ich aus der Routine heraus und muss anschließend dafür sorgen das 
sämtliche Informationen die der IR in den Stack geschreiben hat gelöscht 
werden.

Ich muss ehrlich dazu sagen, ich bin von der Idee überhaupt kein Freund. 
Schon allein deswegen nicht weil man damit den µC ganz schnell in einen 
undefinierten Zustand versetzen kann. Ihr könnt also auch ruhig posten 
wenn ihr die Idee einfach Kacke findet und ihr der Meinung seit ein 
Redesign von Soft- und Hardware ist zwingend notwendig. Allerdings bitte 
unter Angabe von Gründen! Einfach nur doof bringt keinem was ;)

von Leo H. (Gast)


Lesenswert?

Setz doch den Watchdog auf ein sehr kurzes Intervall (das sollten IMHO 
ein paar ms sein).

Edit: Datenblatt sagt 14ms bei VCC=5V, 14.8ms bei VCC=3V.

Hast du vielleicht noch einen I/O Pin frei?
Dann könntest du doch einfach damit einen Transistor ansteuern, der den 
Reset-Pin auf Masse zieht.
Mit einem Digitaltransistor (z.B. BCR135) kommst du dann sogar mit nur 
einem Bauteil aus.

von 0815User:) (Gast)


Lesenswert?

spess53 schrieb:
> Wenn ich deine Äußerungen hier so lese, keimt der Verdacht auf, das du
> dich weder mit µCs, noch mit BASCOM so richtig auskennst.
>
> Liege ich da falsch?

Nun sagen wirs mal so, ich finde Bascom zum entwickeln von blinkenden 
LED Leuchten und Hello-World Programmen ganz gut. Um damit Software zu 
entwickeln die wirklich 100% läuft und dabei mehr wie 50 Zeilen 
Quellcode beinhaltet dabei noch effizient in Maschinencode gewandelt 
wird jedoch ehr ungeeignet.

Mit µC kenne ich mich eigentlich sehr gut aus. Auch wenn das jetzt jeder 
auffassen kann wie er möchte ;) Was mich allerdings etwas enttäuscht 
sind die Beiträge al la wie schreibe ich ein Programm... und doofe Idee. 
Beides weiß ich selber und Helfen eigentlich auch nicht wirklich weiter. 
Zumindest ohne Begründung.

Das hier
MWS schrieb:
> Das hier würde den Stackpointer neu initialisieren, aber da solltest Du
> schon sehr genau wissen, was Du machst:!LDI   R24,   lbyte(_HWSTACKSTART)
> !OUT   SPL,   R24
> !LDI   R24,   hbyte(_HWSTACKSTART)
> !OUT   SPH,   R24
war bis jetzt auch der einzigste Beitrag der dem Problem auf dem Grund 
ging. Auch wenn ich bis jetzt noch keine Möglichkeit hatte das zu 
überprüfen.

Bitte nicht falsch verstehen an alle anderen. Ich bin für jede Teilnahme 
dankbar! Ich habe ja auch schon eingeräumt das es durchaus die beste 
Idee wäre das ganze neu aufzusetzen. Allerdings habe ich auch offen 
gelegt warum ich es nicht unbedingt darauf ankommen lassen möchte. 
Deinen Kommentar kann ich damit also eigentlich genau nicht verstehen...

von 0815User:) (Gast)


Lesenswert?

Leo-andres H. schrieb:
> Hast du vielleicht noch einen I/O Pin frei?
> Dann könntest du doch einfach damit einen Transistor ansteuern, der den
> Reset-Pin auf Masse zieht.
> Mit einem Digitaltransistor (z.B. BCR135) kommst du dann sogar mit nur
> einem Bauteil aus.


Klingt verlockend! Auch wenn mich die anderen jetzt Steinigen werden :D 
Ist halt Aufwand Hardware umzubauen aber als Übergangslösung vllt sogar 
noch ehr geeignet als die IR-Pointer Geschichten.

von Leo H. (Gast)


Lesenswert?

Wer oder was löst eigentlich den Interrupt aus?

Wenn das wirklich nur ein Reset-Signal ist kannst du doch damit direkt 
auf den Transistor gehen.

Die Schaltung wolltest du später noch umbauen wenn ich das richtig 
gelesen habe. Dann stört ein Transistor + Fädeldraht auf dem Prototypen 
wohl nicht wirklich, oder? ;)

Das würde mir persönlich besser gefallen wie so ein Software-Gewürge, 
was der Atmega eigentlich nicht unterstützt. Es wird wohl einen Grund 
haben, wieso das Atmega kein "reset();" kann.

Ein kleines Problem sehe ich noch bei der Länge des Reset-Impulses. Man 
müsste mal probieren, ob das ausreichend lang ist. Ansonsten wird es 
doch wieder aufwendig.

von 0815User:) (Gast)


Lesenswert?

Gerad im Datenblatt vom Atmega128 gelesen dass die Adresse 0 Reset bei 
mehreren Funktionen angesprungen wird. Einmal beim auslösen des externen 
Pins, beim Power-on Reset, Brown-out Reset, Watchdog Reset und beim JTAG 
AVR Reset.

Würde ja bedeuten dass ein externen Reset mit einem Goto 0 gleich 
zustellen ist.

von 0815User:) (Gast)


Lesenswert?

Leo-andres H. schrieb:
> Wer oder was löst eigentlich den Interrupt aus?

Es ist ein externes Signal was von einem Auswerter kommt. Der Impuls 
hängt von mehreren Faktoren ab, ist aber mindestens eine halbe Sekunde 
lang. Würde von Impulsdauer also sicher funktionieren. Wenn nicht würde 
es eine Kippstufe sicher erreichen. Sind dann statt einem zwei 
Transistoren.

Die Geschichte mit dem Umbau ist vllt. falsch rüber gekommen. Es sind 
aktuell weit über 100 Karten im Einsatz die alle umgebaut werden 
müssten. Da ist es natürlich einfacher neue Software aufzuspielen statt 
mit Lötkolben rum zu werkeln.

Mit vorübergehender Lösung meinte ich, dass ich die vorhanden Karten 
noch so gestalten wollte. Sobald neue beim PCB Hersteller geordert 
werden, dann sämtliche Hardware Änderungen mit berücksichtigt werden und 
natürlich auch neue Software dafür geschrieben wird.

von MWS (Gast)


Lesenswert?

0815User:) schrieb:
> Nun sagen wirs mal so, ich finde Bascom zum entwickeln von blinkenden
> LED Leuchten und Hello-World Programmen ganz gut. Um damit Software zu
> entwickeln die wirklich 100% läuft und dabei mehr wie 50 Zeilen
> Quellcode beinhaltet dabei noch effizient in Maschinencode gewandelt
> wird jedoch ehr ungeeignet.

Siehst Du, das ist jetzt schon mal ein Trugschluss.
Außerdem zeugt es nicht von überragender sozialer Intelligenz, sich von 
jemand der sich in Bascom gut auskennt Hilfe zu erwarten und 
gleichzeitig zu erklären Bascom wär' nur was für blinkende Leds.

Dann wünsch' ich mal weiter viel Spaß Murks für etwas zu schreiben, 
wovon Du nicht viel Ahnung hast.

Eine fast sichere Garantie für ein Desaster :D

von 0815User:) (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Es gibt keine Beschaltung, die einen schlechten Programmierstil
> erfordert. Alle Probleme kann man auch sauber und strukturiert lösen.

Naja wie beschrieben werden die Takte via Timer gesteuert. Das ist schon 
mal eine schlechte Beschaltung da hierfür ein PWM Modul vorhanden ist. 
Leider nicht auf dem selben Pin wie der Timer...

Peter Dannegger schrieb:
> Es gibt auch keine Programmiersprache, die unübersichtliches
> Programmieren erzwingt. Selbst in Assembler kann man sich Funktionen
> definieren und die dann aufrufen.

Ebenfalls naja! In Bascom ist die maximale Stringlänge 254. Mit 
Bigstrings.lib komme ich auf bischen größer 500. Ich meine 504. Wenn mir 
das nicht ausreicht muss ich anfangen zu experimentieren.
Weiterhin kennt Bascom oder hier viel mehr der AT-Mega keine 
Priorisierung der Interrupts was wiederum zu umständlichen Code führt.
Nochmal weiterhin erzeugt der Bascom Compiler 30% mehr Maschinencode wie 
der gcc-gnu Compiler für C. (Bitte nicht auf die genauen 30% festnageln. 
Habe das hier im Forum gelesen und meine es waren 30%)

Das sind nur ein paar Probleme die mir in Verbindung mit Bascom auf 
anhieb einfallen. In Summe zeigt es mir aber dennoch das es gewaltige 
Unterschiede zwischen den diversen Sprachen den damit verbunden 
Compilern und natürlich auch der Hardware gibt, die ich im großen und 
ganzen in meiner Software ausgleichen muss.

von 0815User:) (Gast)


Lesenswert?

MWS schrieb:
> Siehst Du, das ist jetzt schon mal ein Trugschluss.
> Außerdem zeugt es nicht von überragender sozialer Intelligenz, sich von
> jemand der sich in Bascom gut auskennt Hilfe zu erwarten und
> gleichzeitig zu erklären Bascom wär' nur was für blinkende Leds.
>
> Dann wünsch' ich mal weiter viel Spaß Murks für etwas zu schreiben,
> wovon Du nicht viel Ahnung hast.
>
> Eine fast sichere Garantie für ein Desaster :D

Ok... Das war sicherlich etwas doof und ich möchte mich dafür auch 
entschuldigen. Aber ich arbeite seit jeher in C oder Assembler. Dabei 
meistens in MP-Lab mit Pics aber auch schon des öfteren in AVR-Studio 
mit Atmegas. Du kannst es mir jetzt aber nicht übel nehmen wenn ich der 
Meinung bin das Bascom im Vergleich zu den anderen aufgeführten 
Programmen etwas laienhaft wirkt.
Ein ganz großer Zuspruch gibt mir meiner Meinung nach die Tatsache das 
Bascom keine Debugger unterstützt.

von 0815User:) (Gast)


Lesenswert?

Da ich mit der Aussage Bascom wirkt etwas laienhaft sicherlich wieder 
Gefahr laufe jemanden zu verärgern möchte ich das an einem Beispiel 
belegen.

2x16 Display Hello World

Bascom: (Basic)

Locate 1 , 1
lcd "Hello World"

------------------------------------------------------------------------ 
---

MP-Lab: (C)

putrsXLCD( Hello World , 1 , 1);

auf Anhieb kein großer Unterschied. Beides stellt an identischen Stellen 
im Display Hello World dar. Genügt mir das, ist auch alle soweit in 
Ordnung.

Will ich jedoch tiefer in die Materie, aus welchen Gründen auch immer, 
bin ich in Bascom aufgeschmissen da ich nicht sehe was eigentlich hinter 
dem LCD "" steht.
In C MP-Lab öffne ich den eingebunden Header und schau auf welche Datei 
die Funktion putrsXLCD verweißt. Ein klick darauf und ich sehe die 
komplette Funktion putrsXLCD mit Timings etc. und kann diese nach meinen 
Wünschen manipulieren. Weil das 2x16 Zeilen Display z.B. keinen HD 4480 
Chip besitzt und daher ein anderes Timing verlangt oder was auch immer.

Genügt mir das immernoch nicht kann ich mir zur Programmlaufzeit via 
Debugger den ausgeführten Assemblercode anzeigen und manipulieren sodass 
er beim nächsten Durchlauf verändert ausgeführt wird. Ich finde das ist 
eine ganz andere Freiheit mit dem Tool zu arbeiten.

------------------------------------------------------------------------ 
---

Da ich jetzt aus beruflichen Gründen allerdings vorerst dazu gezwungen 
bin mit Bascom zu arbeiten, bringt es mir nicht viel zu erzählen wie 
toll andere Tools & Compiler sind und dass ich mich zugegebenermaßen mit 
Bascom nicht so recht anfreunden kann.

Ich wollte damit eigentlich nur meinen Standpunkt gegenüber MWS 
aufzeigen und mich nochmal bei allen entschuldigen denen ich mit meinen 
Aussagen über Bascom auf dem Slips getreten bin

MFG

von MWS (Gast)


Lesenswert?

0815User:) schrieb:
> Du kannst es mir jetzt aber nicht übel nehmen wenn ich der
> Meinung bin das Bascom im Vergleich zu den anderen aufgeführten
> Programmen etwas laienhaft wirkt.

Der Meinung kannst Du ja gern sein, der Umstand, daß Bascom dem User den 
Einstieg leicht macht und da dann halt auch mal Merkwürdiges daraus 
resultiert, sagt nichts darüber aus was man tatsächlich damit anstellen 
kann. Du wärst überrascht, in wievielen kommerziellen Produkten Bascom 
drinsteckt.

Wie Peter schon sagt, man kann in jeder Sprache strukturiert 
programmieren, so auch in Bascom. Strukturierter, oder auch durchdachter 
Code wurde hier offensichtlich nicht geschrieben, sonst würde man 
einfach in der ISR ein Flag setzen und in der regelmäßig durchlaufenen 
Mainloop auswerten.

0815User:) schrieb:
> Ebenfalls naja! In Bascom ist die maximale Stringlänge 254. Mit
> Bigstrings.lib komme ich auf bischen größer 500. Ich meine 504. Wenn mir
> das nicht ausreicht muss ich anfangen zu experimentieren.
Gerade einen String mit 1000 Byte definiert und gefüllt, mit AVR-Studio 
simuliert. Klappt einwandfrei.

Nur, ich muss Bascom nicht verteidigen, wer's mag soll's nehmen, wer C 
lieber mag, auch ok. Letzten Endes ist entscheidend wer vor der 
Mattscheibe sitzt ;-)

von 0815User:) (Gast)


Lesenswert?

Ich lass mich gerne verbessern. Hatte halt vor nem halbem Jahr den Fall 
einen String grösser 254 Zeichen zu gebrauchen. Das war damals laut mcs 
nicht möglich. Schön wenn es jetzt reibungslos funktioniert.

Mit dem Flag im Interrupt, das kam mir auch schon in den Sinn. 
Allerdings müsste ich es an mehreren Stellen abfragen um auch die 
benötigte Geschwindigkeit zu erreichen.
Es kann durchaus vorkommen das der uc in einer Unterroutine fest steckt 
um Beispielsweise FSK Daten zu verschicken. Das kann dann schon mal ne 
halbe Sekunde dauern. Die Verzögerung Interrupt bis Hauptschleife darf 
allerdings maximal 10 MS dauern. Um das zu erreichen musste ich 
vermutlich 50 Abfragen oder mehr Abfragen in den Code einfügen.

Mit der Behauptung das in vielen Produkten Bascom eingesetzt wird gebe 
ich dir 100% Recht. Hab Bascom im Studium mal angeschnitten, aber nicht 
erwartet das es mich mal so Verfolgen wird :D

Würdest du die hohe Anzahl an Abfragen in kauf nehmen und auf die 
Interrupt Geschichte verzichten? Um das noch mal klar zustellen, es wird 
an keiner Stelle im Programm ein Wait ausgeführt was die Abfragerei 
negativ beeinflussen könnte.

von MWS (Gast)


Lesenswert?

0815User:) schrieb:
> Würdest du die hohe Anzahl an Abfragen in kauf nehmen und auf die
> Interrupt Geschichte verzichten?

Da kein Code gezeigt wird (werden kann), ist das schlecht zu sagen, 
hängt tatsächlich vom Aufwand ab.

Die ganze Beschreibung ist etwas schwammig, aber gehen wir davon aus, 
daß einfach ein Reset erfolgen soll. Da ein Goto 0 aber wie gesagt die 
I/Os unangetastet lässt, muss sicher gestellt werden daß keine Int-Flags 
mehr gesetzt sind, sonst lösen die aus sobald die globalen Interrupts 
wieder erlaubt werden.

Ein:
1
Config Int0 = Rising
2
On Int0 Int0_ISR
3
Enable Int0
4
Enable Interrupts
5
' ...
6
Int0_ISR:
7
' ...
8
  Goto 0
9
Return
führt bei steigender Flanke einen Softreset aus, initialisiert den Stack 
neu und löscht das SRam. Ein Stacküberlauf wird nicht vorkommen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.