Forum: Mikrocontroller und Digitale Elektronik Bascom vs. Assembler


von tinywill! (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe ein kleines Projekt zur Temperaturregelung und dabei voll auf 
den Tiny13 gesetzt. Jetzt ist das Material für 4 Exemplare da und die 
Platinen in Arbeit.
Leider passt der Code nicht auf den Tiny.. Ich programmiere in Bascom 
und frage mich nun ob es in Assembler passen würde. Leider habe ich so 
gut wie keinen Plan von Assembler..
Ich habe übrigens schon alle Variablen weggelassen und durch feste Werte 
ersetzt, nützt nix. Ich komme immer über 105% Flash raus.
Eigentlich sollte noch ein Taster und ne LED ran und evtl noch...


Was sagen die Assembler Pro's?

von Peter II (Gast)


Lesenswert?

tinywill! schrieb:
> Leider passt der Code nicht auf den Tiny

kein wunder bei dem Datentype Single

schmeiss das raus, dann geht es auch in Bacom oder C.

von tinywill! (Gast)


Lesenswert?

Die Variable 2 nimmt er nur als Single. Alles andere war schon raus.

von Hammel (Gast)


Lesenswert?

1. Der Tiny13 hat 1KB Flash, 64 Byte SRAM, 64 Byte EEProm. Wieso
   hast du dich nicht für den Tiny85 entschieden, mit 8KB Flash, 512 
Bytes
   SRAM und 512 Byte EEProm ???
   Übrigens ist das Pinout von Tiny13 und Tiny85 das gleiche...man
   kann also austauschen ohne Platine zu ändern.
2. Wieso programmierst du den Tiny nicht in C? Das ist nicht so
   kompliziert wie Assembler, dafür von der Speichernutzung bestimmt
   besser als Bascom. Vermute ich jetzt einfach mal...

von Peter II (Gast)


Lesenswert?

tinywill! schrieb:
> Die Variable 2 nimmt er nur als Single

alles Singles raus, sobalt eines drin ist ist es schon zu spät. In ASM 
hättest du überhaupt kein Single oder vergleichbares.

von Hammel (Gast)


Lesenswert?

Peter II schrieb:
> In ASM
> hättest du überhaupt kein Single oder vergleichbares.

was ist mit AvrLib floating point...?

von Peter II (Gast)


Lesenswert?

Hammel schrieb:
> was ist mit AvrLib floating point...

ist das denn ASM? Verwendet jemand diese lib etwas mit ASM?

Schau doch mal die verwendung von dem Single an, das macht überhaupt 
keinen sinn. Wenn er mal testweise byte daraus macht, ist der code 
bestimmt nur noch 1/10 so gross.

von Hammel (Gast)


Lesenswert?

@Peter: aus Asm nutzbar, frage deinen Linker...

von Fox Mulder (Gast)


Lesenswert?

tinywill! schrieb:
> Leider habe ich so
> gut wie keinen Plan von Assembler..

> Variable2 = Variable1 / 2

Aber von Variablen auch nicht. Für eine Halbierung einer Byte-Variablen 
braucht man keine Single.

von tinywill! (Gast)


Lesenswert?

Oh Gott, ich Hirni hab das parallel auf Atmega8 laufen und die falsche 
Datei kompiliert.. Beim Mega8 will Bascom das Single nicht, beim Tiny 
gehts. Habe das verwechselt und wieder mal zu schnell gepostet, sorry.

Der Flash ist nur noch zu 58% voll, geil! Kann ich meinen Taster doch 
noch ranmachen.

von Peter II (Gast)


Lesenswert?

Hammel schrieb:
> @Peter: aus Asm nutzbar, frage deinen Linker..

wo ist die passende doku damit ich die labels finden kann? Wie binde ich 
die lib in ein ASM Projekt ein? Da habe ich keinen linker.

von Peter II (Gast)


Lesenswert?

tinywill! schrieb:
> Der Flash ist nur noch zu 58% voll, geil! Kann ich meinen Taster doch
> noch ranmachen.

ändere auf jeden fall den Datentyp dann hast du noch viel mehr Platz und 
es wird auch schneller.

von spess53 (Gast)


Lesenswert?

Hi

>Die Variable 2 nimmt er nur als Single. Alles andere war schon raus.

Dann solltest du diese Zeile:

>Variable2 = Variable1 / 2

mal überdenken. Bascom kann bestimmt auch Ganzzahl-Division.

MfG Spess

von Hammel (Gast)


Lesenswert?

-lm

von Hammel (Gast)


Lesenswert?


von Joe (Gast)


Lesenswert?

Einfachste Variable verwenden.

Statt Variable/2 einfach nach rechts schieben.

Die Zeilen:

1wreset                        '1wire Bus Reset senden
1wwrite &HCC

in ein Unterprogramm stecken.

Und dein Wait-Bafehl in Assembler schreiben, das geht auch für Anfänger.

Joe

von tinywill! (Gast)


Lesenswert?

Das Programm läuft doch nicht wie es soll. Mit dem wait geht es nicht, 
am Ausgang liegt immer voller Pegel. Wenn ich das wait weglasse macht 
der Ausgang was er will, mal an mal aus. Am Mega8 hatte ich vorher ein 
LCD und konnte die Werte kontrollieren, jetzt "sehe" ich nichts mehr.

Achja, wie macht man wait in Assembler?

von Hannes L. (hannes)


Lesenswert?

tinywill! schrieb:
> wie macht man wait in Assembler?

Möglichst gar nicht, höchstens für ganz kurze Zeiten im µs-Bereich. Denn 
für alles Andere gibt es Timer.

Der Anfänger, der sich noch nicht an Timer herantraut, kann 
Warteschleifen programmieren. Das sind Zählschleifen, die einfach nur 
Register (Variablen) hoch oder besser herunter zählen und damit die CPU 
für eine genau definierte Zeit beschäftigen. Um diese Zeit zu berechnen, 
addiert man die von jedem Befehl benötigten Zyklen und verrechnet sie 
mit der Taktfrequenz. Weiß man noch nicht, welcher Befehl wieviele 
Zyklen dauert, dann schaut man im Datenblatt des Controllers unter 
"Instruction Set Summary" nach. Als Anfänger sollte man sich diese 
Tabelle ausdrucken und als Arbeitsblatt benutzen, ebenso wie die Tabelle 
"Register Summary", in der die I/O-Register und deren Bits beim Namen 
genannt werden.

Weitere Infos gibt es sicherlich hier:
http://www.mikrocontroller.net/articles/AVR-Tutorial
Ich benutze dieses Tutorial zwar schon seit Jahren nicht mehr, aber ich 
kann mir nicht vorstellen, dass dieses Tutorial das Thema Warteschleifen 
nicht behandelt.

...

von Norbert S. (norberts)


Lesenswert?

Hi,

was für ein Bascom ist das? Ganz alte Versionen können nur Byte für 
wait.

Ansonsten poste mal den aktuellen Code. Das obige kann nicht gehen, 
compiliert nichtmal weil Temp nicht deklariert ist.
Wenn ich richtig sehe reichen Byte für alle Variablen.

Mach das mit dem Elseif bitte anders. Ich weiß nicht was Albert sich 
dabei gedacht hat, das ist ein so fehlerträchtiges Kontrukt.
Edit: Select case ist Dein Freund für sowas.

Dein Temp  wird nirgendwo benutzt, das ist immer 0.

Also poste mal bitte den aktuellen Code.

Gruß,
Norbert

von Bernd S. (Firma: Anscheinend Corner-Cases ;-)) (bernd_stein)


Lesenswert?

tinywill! schrieb:
> ...
> Der Flash ist nur noch zu 58% voll, geil! Kann ich meinen Taster doch
> noch ranmachen.
>
Wenn das das ganze Programm ist, was DU oben im ersten Posting 
hinterlegt hast, dann kann ich nur dem Vorposter Hammel zum Punkt 1 
zustimmen.

Beitrag "Re: Bascom vs. Assembler"

Hätte nicht gedacht, das BASCOM soviel Programmspeicher braucht.
Das es langsam ist schon.
Bin zwar nicht der Assemblerexperte, aber denke das man da sehr sehr 
viel weiniger Programmspeicher für das bischen Software benötigt.

Bernd_Stein

von Fox Mulder (Gast)


Lesenswert?

Bernd Stein schrieb:
> Hätte nicht gedacht, das BASCOM soviel Programmspeicher braucht.
> Das es langsam ist schon.
> Bin zwar nicht der Assemblerexperte, aber denke das man da sehr sehr
> viel weiniger Programmspeicher für das bischen Software benötigt.

Ach du Schlaumeier, es ist nicht die Schuld von Bascom wenn er nicht 
programmieren kann. Mit einer anderen Sprache wird es da kaum besser. 
Außerdem war dieses Programm noch nicht mal kompilierbar. Mit ein paar 
Änderungen kommt das raus:

##############################################
Compiler     : BASCOM-AVR LIBRARY V 2.0.7.3
Processor    : ATTINY13
SRAM         : 40 hex
EEPROM       : 40 hex
ROMSIZE      : 400 hex

ROMIMAGE     : 224 hex  -> Will fit into ROM
ROMIMAGE     :  548 dec
FLASH USED   :  53  %
##############################################

Schaffst du das auch?

von Norbert S. (norberts)


Lesenswert?

Hi,

das liegt an der Single-Rechnerei, das bläst den Code bei jedem Compiler 
auf.
Bascom mag da vielleicht nicht das Optimum sein aber ist soo schlecht 
auch nicht.
Ich hatte mal einen Vergleich mit einem Forumsmitglied hier gemacht (das 
war in einem anderen Forum) und Bascom ist da nur in wenigen Dingen 
verschwenderischer und langsamer als Keil gewesen und das war dann auch 
nur marginal.

Langsam ist Bascom nur bei Ints, weil alle Register per default 
gesichert werden. Das kann man aber auch abschalten, wenn die ca 50 
Takte weh tun. Meist ist das aber egal.

Das Imageproblem von Bascom ist, daß auch absolute Anfänger damit recht 
schnell zu Ergebnissen kommen und dann hier absolut dämliche Fragen mit 
Murks-Code auftauchen.
Die Sache mit den Single hier ist ein gutes Beispiel, absoluter 
Schwachsinn und das fällt auf Bascom zurück.

Gruß,
Norbert

von Norbert S. (norberts)


Lesenswert?

Fox Mulder schrieb:
> Mit ein paar
> Änderungen kommt das raus:

Mit Select case komme ich auf 10 Byte weniger.

von Bernd S. (Firma: Anscheinend Corner-Cases ;-)) (bernd_stein)


Angehängte Dateien:

Lesenswert?

Fox Mulder schrieb:
> ...
> ##############################################
> Compiler     : BASCOM-AVR LIBRARY V 2.0.7.3
> Processor    : ATTINY13
> SRAM         : 40 hex
> EEPROM       : 40 hex
> ROMSIZE      : 400 hex
>
> ROMIMAGE     : 224 hex  -> Will fit into ROM
> ROMIMAGE     :  548 dec
> FLASH USED   :  53  %
> ##############################################
>
> Schaffst du das auch?
>
Wie bereits geschrieben - ich bin kein Assemblerexperte.

Von BASCOM habe ich gar keine Ahnung und weiß auch gar nicht,
ob das angehängte Programm überhaupt lauffähig ist. Aber das bischen was 
ich da glaube zu verstehen, sind in Assembler ein paar Bytes des 
Programmspeichers. Wahrscheinlich unter fünfzig.
Bei hundert Bytes, wärs knapp 10% des Programmspeichers.

Bernd_Stein

von Fox Mulder (Gast)


Lesenswert?

Norbert S. schrieb:
> Mit Select case komme ich auf 10 Byte weniger.

Habe ich auch schon drin :-)

von test (Gast)


Lesenswert?

Bernd Stein schrieb:
>Aber das bischen was
> ich da glaube zu verstehen, sind in Assembler ein paar Bytes des
> Programmspeichers. Wahrscheinlich unter fünfzig.
> Bei hundert Bytes, wärs knapp 10% des Programmspeichers.

Vorsicht! Die paar Vergleiche sind in ASM schnell erledigt, aber ob man 
die 1-Wire-Ansteuerung mit "ein paar Bytes" erschlagen kann waage ich 
mal zu bewzweifeln...

von Norbert S. (norberts)


Angehängte Dateien:

Lesenswert?

Bernd Stein schrieb:
> sind in Assembler ein paar Bytes des
> Programmspeichers.

Dann mach das doch mal eben in Assembler.
Nix unterschlagen bitte, in dem Programm hat wohl noch nicht alles 
seinen Sinn.

von Fox Mulder (Gast)


Angehängte Dateien:

Lesenswert?

Meine Version.

von Norbert S. (norberts)


Angehängte Dateien:

Lesenswert?

geht noch etwas kleiner.

von tinywill! (Gast)


Lesenswert?

Mag sein das ich ein blutiger Anfänger bin und viele Befehle usw. (noch) 
nicht kenne. Eines ist jedoch fakt: Mein Programm lief auf einem Mega8 
problemlos, auf dem Tiny geht es nicht.
Auch eure zugegebenermaßen besseren Versionen haben das selbe Problem. 
Mein Code war vielleicht 5% grösser, die Probleme sind dieselben.

Entweder pulst der Ausgang im Takt von etwa 1 s oder das Programm hängt 
sich ganz auf.

Meine Vermutung ist das es an dem Wait-Befehl liegt. Schon mal wegen dem 
1 s Puls. Wenn ich das Wait ganz rausnehme geht gar nix mehr, hängt sich 
direkt auf. Leider habe ich keine guten Messmittel, nur ein Multimeter 
und ne Stoppuhr ;-) Deshgalb hatte ich es vorher auf nem Mega8 probiert, 
mit nem LCD dran, da konnte ich mir dann ein paar Werte anschauen.
Der Contoller funktioniert übrigens mit anderen Programmen super, auch 
die Fuses sind bestimmt richtig gesetzt.

Trotzdem vielen Dank für eure Interpretationen, habe da auch wieder was 
von gelernt :-)

von Fox Mulder (Gast)


Lesenswert?

tinywill! schrieb:
> Meine Vermutung ist das es an dem Wait-Befehl liegt. Schon mal wegen dem
> 1 s Puls. Wenn ich das Wait ganz rausnehme geht gar nix mehr, hängt sich
> direkt auf.

Typischer Anfängerfehler, Ursache und Wirkung verwechselt. 
Wahrscheinlich liegt es am Stack. Das hier wäre besser:

$hwstack=10
$swstack=8
$framesize=24

Der Simulator hat mit den alten Werten auch gemeckert.

von Norbert S. (norberts)


Lesenswert?

Hi,

welche Bascom Version benutzt Du denn? Wenn uralt dann probier mal wait 
1 statt waitms 1000.
Der Quellcode von ganz oben compiliert nicht! Das kann auf dem Mega8 so 
nicht gelaufen sein.

Lass das mal mit der PWM weg sondern lass ne LED blinken je nach 
Zustand.
Ich vermute, daß der PWM-Kram beim Tiny13 nicht so tut wie Du willst. 
Das ist bei Bascom leider alles nicht so toll mit den Timern, ich setze 
dafür die Register immer manuell.

Gruß,
Norbert

von Norbert S. (norberts)


Lesenswert?

Fox Mulder schrieb:
> Wahrscheinlich liegt es am Stack

Der wird doch gar nicht genutzt. Kein Sub, kein Int, nix.

von Hellseher (Gast)


Lesenswert?

Norbert S. schrieb:
> Der wird doch gar nicht genutzt. Kein Sub, kein Int, nix.
Eben, das ist ja das fatale an BASCOM, ein CALL <sub> sieht der Anwender 
nicht. Und wenns nicht läuft, wird hier solange gepostet, bis ein 
erfahrener Programmierer sagt, er solle die Stackgrösse mal hochsetzen 
:-)

von Fox Mulder (Gast)


Lesenswert?

Norbert S. schrieb:
> Der wird doch gar nicht genutzt. Kein Sub, kein Int, nix.

Aber die 1wire-Befehle brauchen wohl etwas. Schau dir das mal mit dem 
Simulator an, ganz unten steht da "Frame or stack overlap". Bei 
$framesize=24 ist das weg.

von Hellseher (Gast)


Lesenswert?

Norbert S. schrieb:
> Kein Sub, kein Int, nix.
Das glaubst aber nur du. Schau dir mal ein BASCOM-HEX mit dem AVR Studio 
als Disassembling an, da kannst du schön sehen, wie die einzelnen 
Basic-Befehle ihre Unterroutinen aufrufen. Und das braucht auch den 
Stack.

von tinywill (Gast)


Lesenswert?

Kein Unterschied, echt! Mal tut es eine Weile was es soll, also die drei 
Stufen schalten. Die gedimmte ist immer von dem 1 s Takt überlagert. 
Habe eine Spule an den Ausgang gemacht und messe jetzt die halbe 
Spannung mit dem 1 s Takt drauf. Und es hängt sich immer auf, garantiert 
in unter 2 min.

Also jetzt "Simulator vs. Praxis"??

von Norbert S. (norberts)


Lesenswert?

ahh, 1wire hatte ich nicht auf dem Schirm.

Es wäre wirklich schön, wenn Bascom das mal automatisch machen könnte.
Ich drehe das immer ziemlich weit hoch um diese Probleme zu vermeiden 
aber ich mache auch fast nichts unter Mega8, da hat man ja genug RAM.

von Fox Mulder (Gast)


Lesenswert?

tinywill schrieb:
> Spule an den Ausgang

Oje, Spule direkt am Ausgang? Das kann nicht gut gehen.

von tinywill (Gast)


Lesenswert?

Ne, Ausgang --> Logiclevel FET mit 120 RGate und 82k pulldown. Der FET 
schaltet halt einen Step-down, an dem hängt die Last (3 PC Lüfter).

von tinywill (Gast)


Lesenswert?

Ich bin der Lösung auf der Spur (Achtung! Gefährliches Halbwissen!).
Ich habe das Wait durch ein for i = 1 to 50 , nop , next ersetzt. Das 
Programm läuft jetzt und bleibt auch nicht mehr stecken. Warum weiss ich 
nicht.

Ein Problem gibt es noch, Im Bereich "Dimmung" wackelt meine 
Ausgangsspannung noch, da stimmt etwas nicht. Es ist aber nicht die 
"Pause" die Schleife macht. Ich habe die Werte für i (Long) zwischen 50 
und 10000 geändert, es ergibt sich kein zeitlicher Zusammenhang. Würde 
zugerne die Spannung des Ausgangspins mit dem Oszi anschauen..
Kann es sein das ich soetwas wie Hysterese brauche? Eigentlich war die 
ja durch die 0,5 °C Genauigkeit gegeben. Und ändern die Select Befehle 
daran denn etwas ?

von Starflight (Gast)


Lesenswert?

Norbert S. schrieb:
> Es wäre wirklich schön, wenn Bascom das mal automatisch machen könnte.
Schau dir dazu mal die Anweisung "STCHECK" von BASCOM an, dann weißt du, 
worum es geht.

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.