Lauflicht im BASCOM Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte
Autor |
|
|
|
BID = 823553
Offroad GTI Urgestein
Beiträge: 12742 Wohnort: Cottbus
|
|
Hallo Leute,
bin gerade dabei, mich etwas mit BASCOM auseinander zu setzten. Zu diesem Zweck wollte ich ein kleines Lauflicht programmieren.
Dies klappt allerdings nicht wie gewünscht.
Es soll (so wie man sich das eben vorstellt) eine LED nach der anderen aufleuchten und die zuvor leuchtende LED wieder erlöschen.
Was passiert ist aber, dass alle nacheinander aufleuchten (und auch weiter leuchten) und dann alle der Reihe nach ausgehen.
Sieht zwar ganz nett aus - soll so aber nicht sein.
Le programme:
Code : |
$regfile = "attiny2313.dat"
$crystal = 4000000
'Ausgangspins festlegen
Config Pind.0 = Output
Config Pind.1 = Output
Config Pind.2 = Output
Config Pind.3 = Output
'Pull-Up Widerstände abschalten
Pind.0 = 0
Pind.1 = 0
Pind.2 = 0
Pind.3 = 0
'Variablennamen für die Ausgänge
Led1 Alias Pind.0
Led2 Alias Pind.1
Led3 Alias Pind.2
Led4 Alias Pind.3
Do
Led1 = 1
Waitms 50
Led1 = 0
Led2 = 1
Waitms 50
Led2 = 0
Led3 = 1
Waitms 50
Led3 = 0
Led4 = 1
Waitms 50
Led4 = 0
Loop
|
|
Könnt ihr mir bitte mitteilen, wo der Fehler liegt.
...wohl an meinem Pseudo-Code
MfG Mathias
_________________
Theoretisch gibt es zwischen Theorie und Praxis keinen Unterschied. Praktisch gibt es ihn aber. |
|
BID = 823562
perl Ehrenmitglied
Beiträge: 11110,1 Wohnort: Rheinbach
|
|
Ich verwende Bascom zwar nicht, und sehe auch nicht, weshalb sich dein Program wie ein Johnson-Zähler verhält, zumal dein Programm ja weitestgehend diesem hier http://www.rn-wissen.de/index.php/B.....alten entspricht.
Der Code allerdings, den du als "Pull-Up Widerstände abschalten" bezeichnest, dürfte falsch sein.
Zum einen ist er überflüssig, da der Pullup hardwaremäßig automatisch abgeschaltet wird, wenn du einen Pin als Ausgang konfigurierst, aber außerdem sprichst du damit ja nicht ein Konfigurationsregister, sondern den Ausgang an, genau so, wie du es etwas später beim Schalten der LEDs machst.
P.S.:
Ich weiß nicht, wie Funktion waitms implementiert ist.
Möglicherweise verursacht sie einen Programmabsturz, weil du den Stack nicht initialisierst.
Ich bin zwar der Meinung, daß der Compiler das defaultmäßig erledigen sollte, aber wie gesagt vewende ich kein Bascom, sondern habe mittels Assembler lieber selber die Kontrolle über die Programmstruktur und die verwendeten Maschinenbefehle.
[ Diese Nachricht wurde geändert von: perl am 3 Apr 2012 3:11 ] |
|
BID = 823566
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Hallo,
Deine Aliase sind, wenn BASCOM sich ans Datenblatt hält, falsch, sie müssen statt LedN Alias Pind.N LedN Alias Portd.N heißen.
Das Register, was mit PIN(x) bezeichnet wird, dient zum Lesen!
(steht auch alles im Datenblatt, deshalb kann ich von BASCOM nur abraten, das ist käse).
@perl
Zitat :
|
Zum einen ist er überflüssig, da der Pullup hardwaremäßig automatisch abgeschaltet wird, wenn du einen Pin als Ausgang konfigurierst, aber außerdem sprichst du damit ja nicht ein Konfigurationsregister, sondern den Ausgang an, genau so, wie du es etwas später beim Schalten der LEDs machst.
|
Ja, Pullups abschalten ist hier blödsinnig.
Wird ein IO-Pin aber als Eingang definiert, kann man über das korrespondierende Bit im PORT-Register den Pullup an- (Bit=1) oder ab- (Bit=0) schalten.
Also:
PORTD(1) ist Ausgang:
DDRD(1) <- 1
PORTD(1) ist Eingang und Pullup soll aktiviert werden
DDRD(1) <- 0
PORTD(1) <- 1
Es gibt noch ein globales Register, wo man alle Pullups auf einen Schlag abschalten kann.
P.S.:
Es gibt saubere Wege, ein Lauflicht zu schreiben, praktisch jeder Prozessor kann Bits schieben. Auch die Operationen 'Mal 2' und 'Geteilt durch 2' können dazu benutzt werden, wenn man bei vorzeichenlosen Integern bleibt und der Compiler so intelligent ist, dass er für Zweierpotenzen optimierten Code (=Schiebeoperationen) statt Softwaremultiplikation erzeugt. Bei BASCOM bin ich mir da nicht so sicher.
_________________
[ Diese Nachricht wurde geändert von: DonComi am 3 Apr 2012 3:58 ]
[ Diese Nachricht wurde geändert von: DonComi am 3 Apr 2012 4:06 ]
|
BID = 823568
perl Ehrenmitglied
Beiträge: 11110,1 Wohnort: Rheinbach
|
Offtopic :
|
Zitat :
| Bei BASCOM bin ich mir da nicht so sicher | Nicht nur da!
Ich hatte vor Jahren mal ein Fortran-Programm für ein Rechenzentrum entwickelt und ausgetestet, und es funktionierte völlig normal.
Als ich es dann dem Betrieb zur Verfügung stellen wollte, habe ich es zu guter Letzt noch durch den optimierenden Compiler geschickt und einen letzten Test damit gemacht.
Die Folge war, daß sich dieses optimierte Programm in der Maschine festbiß und sich auch vom Operator nicht mehr abschießen liess.
Auf diese Weise hat es stundenlang einen Teil des Großrechners blockiert, bis man abends die Maschine neu gebootet hat.
Das war reproduzierbar! |
|
BID = 823576
Offroad GTI Urgestein
Beiträge: 12742 Wohnort: Cottbus
|
Zitat :
| sie müssen statt LedN Alias Pind.N LedN Alias Portd.N heißen |
Danke, genau das war der Fehler.
Mit PORTD.x ,x∈ℕ klappt es
Zitat :
| Es gibt saubere Wege, ein Lauflicht zu schreiben |
Die gibt es ganz sicher. Aber so war es für mich erst mal am logischsten.
Zitat :
| deshalb kann ich von BASCOM nur abraten, das ist käse |
Habe ich auch schon öfters gehört.
Im Ersten Semester haben wir mal C programmiert. Wäre es ratsam, sich da wieder reinzufitzen?
Ich vermute es mal stark...
_________________
Theoretisch gibt es zwischen Theorie und Praxis keinen Unterschied. Praktisch gibt es ihn aber.
|
BID = 823627
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Zitat :
|
Ich vermute es mal stark...
|
C ist eine Sprache, der man fast überall begegnet, sei es bei der Treiberprogrammierung, Systemprogrammierung oder auch den meisten älteren Applikationen in Linux.
C wird noch lange in diesem Bereich der Quasi-Standard sein, auch wenn einige „Embedded Systems“ mittlerweile sogar in .NET programmierbar sind (Unsitte, läuft aber ganz gut).
Andere Systeme werden in herstellerspezifischer Sprache programmiert.
BASCOM ist zwar für diejenigen nett, die dem AVR schnell etwas beibringen wollen, aber es ist halt AVR-spezifisch und erzeugt nicht grad den besten Code.
Hinzu kommt, und das ist eigentlich mein Hauptkritikpunkt: die Sprache ist mit Schlüsselwörtern überladen, für jeden Mist gibt es feste Schlüsselwörter, obwohl es auch normale Prozeduren oder Funktionen täten.
Außerdem wird nunmal die meiste freie Software für AVRs in C programmiert.
Als Compiler bietet sich der GCC an, der für AVRs recht ordentlichen Code erzeugt, wobei man das mit bestimmt 60, 70 Kommandozeilenparametern sehr genau anpassen kann.
Der Vorteil, wenn man mit dem GCC arbeitet ist, dass man für unzählige andere Plattformen und Architekturen bauen kann. Die Software, die beispielsweise auf meinen größeren AVRs läuft, kann ich fast 1:1 für x86 unter Linux kompilieren, zumindest die Teile, die hardwareunabhängig sind.
_________________
|
BID = 824194
Offroad GTI Urgestein
Beiträge: 12742 Wohnort: Cottbus
|
So, habe mir jetzt mal AVR Studio 4 besorgt, und auch schon ein wenig rumprobiert.
Eine einfache Portansteuerung (Ausgabe des Zählerstandes eines Binärzählers) hat auch schon geklappt. Werde dann wohl bei C bleiben, und BASCOM vorerst vergessen (nicht dass es da viel zu vergessen gäbe )
_________________
Theoretisch gibt es zwischen Theorie und Praxis keinen Unterschied. Praktisch gibt es ihn aber.
|
|
Zum Ersatzteileshop
Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum
Datenschutz
Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland
gerechnet auf die letzten 30 Tage haben wir 20 Beiträge im Durchschnitt pro Tag heute wurden bisher 10 Beiträge verfasst © x sparkkelsputz Besucher : 182396046 Heute : 3242 Gestern : 7548 Online : 888 25.11.2024 13:23 9 Besucher in den letzten 60 Sekunden alle 6.67 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
|
xcvb
ycvb
0.0306010246277
|