Bascom vs. Assembler

Gast #2476928
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?
Angehängte Dateien:
Gast #2476939
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...
Gast #2476949
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.
Gast #2476958
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.
Gast #2476966
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
Gast #2477002
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
Gast #2477572
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?
#2477639
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.

...
#2477723
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
(Firma: Anscheinend Corner-Cases ;-)) #2478711
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
Gast #2478734
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?
#2478742
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
(Firma: Anscheinend Corner-Cases ;-)) #2478757
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
Angehängte Dateien:
Gast #2478763
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...
Gast #2478842
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 :-)
Gast #2478869
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.
#2478872
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
Gast #2478890
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 
:-)
Gast #2478901
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"??
Gast #2478966
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 ?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren