PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bascom Programm läuft nicht richtig



dnggn
20.09.2011, 18:26
hallo leute,

mein ansinnen ist es, einen simplen roboter zu bauen, dessen einzige funktion es ist, sich autonom zu bewegen. ich habe vor, zwei IS471f-Sensoren an einen attiny85 anzuschließen. die ports werden allerdings nach meiner auffassung völlig willkürlich geschaltet und nicht dem quelltext entsprechend. könnte den vielleicht mal jemand überfliegen und mir sagen, ob ich einen fehler reingehauen habe? (verdrahtung sollte stimmen, habs mehrmals neu aufgebaut aber selber fehler) der qulltext sollte selbsterklärend sein, da recht simpel:


$regfile = "attiny85.dat"
$crystal = 1000000

Config Pinb.0 = Input
Config Pinb.1 = Input
Config Portb.2 = Output
Config Portb.3 = Output
Config Portb.4 = Output
Config Portb.5 = Output


Do

If Pinb.0 = 1 And Pinb.1 = 1 Then
Vorwaerts:
Portb.2 = 1
Portb.4 = 0
Portb.3 = 1
Portb.5 = 0
Else
End If

If Pinb.0 = 0 And Pinb.1 = 0 Then
Rueckwaerts:
Portb.2 = 0
Portb.4 = 1
Portb.3 = 0
Portb.5 = 1
Else
End If

If Pinb.0 = 0 And Pinb.1 = 1 Then
Rechtsdrehen:
Portb.2 = 1
Portb.4 = 0
Portb.3 = 0
Portb.5 = 1
Else
End If

If Pinb.0 = 1 And Pinb.1 = 0 Then
Linksdrehen:
Portb.2 = 0
Portb.4 = 1
Portb.3 = 1
Portb.5 = 0
Else
End If

Loop


vielen dank schon mal im vorraus

gruß sören ;)

radbruch
20.09.2011, 18:56
Hallo

Config Pinb.0 = Input
Config Pinb.1 = Input
Config Pinb.2 = Output
Config Pinb.3 = Output
Config Pinb.4 = Output
Config Pinb.5 = Output

btw. gibt es hier auch eine Bascom-Rubrik:
https://www.roboternetz.de/community/forums/41-Basic-Programmierung-(Bascom-Compiler)

Willkommen im RN-Forum.

Gruß

mic

Richard
20.09.2011, 19:38
Hallo

Config Pinb.0 = Input
Config Pinb.1 = Input
Config Pinb.2 = Output
Config Pinb.3 = Output
Config Pinb.4 = Output
Config Pinb.5 = Output

btw. gibt es hier auch eine Bascom-Rubrik:
https://www.roboternetz.de/community/forums/41-Basic-Programmierung-(Bascom-Compiler)

Willkommen im RN-Forum.

Gruß

mic

ja,ja Port.x und Pin.x ist leider etwas unglücklich gewählt, ich komme zwar damit klar aber MUSS auch nach Jahren immer vorher Hirn einschalten was denn wo denn wie denn....Da sind mir dann doch die Register eindeutiger beschrieben b.z.w. eindeutiger zu merken. Aber ich bin ja auch langsam senil. :-( In der Regel helfe ich mir damit, Port schaltet pull-Up ein/aus Pin legt die Datenrichtung b.z.w. Lesen/Schreiben fest. Obwohl mit dem ein/aus von Pull-up lasst sich auch (in Grenzen) eine Schaltfunktion "simulieren", was aber kaum im Sinne des Erfinders sein sollte.

Gruß Richard

radbruch
20.09.2011, 19:48
Aber ich bin ja auch langsam senil.Willkommen im Club. ;)

http://avrhelp.mcselec.com/config_port.htm
http://avrhelp.mcselec.com/index.html

(Immerhin kennen wir noch die Regeln für Groß- und Kleinschreibung...)

Searcher
20.09.2011, 21:04
Hallo dnggn,
beim ATtiny85 ist PB5 der Reset Pin. Hast Du daran gedacht?
Eigentlich bleibt der Reset bei ISP Programmierung für die Reset Funktion reserviert. Könnte mir bei Deinem Programm vorsellen, das der Tiny dauern resettet.

Vor kurzem gab es hier einen thread zur Stromaufnahme des IS471. Nicht das hohe Stromspizen auch noch zu Resets führen.

Gruß
Searcher

dnggn
21.09.2011, 21:04
danke schon mal für die antworten, aber ganz verstehe ich das nicht ... also nur pinb.0, pinb.1 usw. hat nicht funktioniert, selber fehler. muss ich jetzt beim input immer eine zahl und einen buchstaben eingeben und beim output nur buchstabe? tut mir leid, ich stehe total auf dem schlauch :D danke für die hilfe

EDIT: achja und reset pin hab ich jetzt nicht besonders drauf geachtet, heißt das ich kann diesen port gar nicht als solchen benutzen?

Kampi
21.09.2011, 21:20
Was genau meinst du? Ich verstehe die Frage leider nicht so ganz.

Sauerbruch
21.09.2011, 23:55
muss ich jetzt beim input immer eine zahl und einen buchstaben eingeben und beim output nur buchstabe? tut mir leid, ich stehe total auf dem schlauch

Das mit Config Port und Config Pin ist in der Tat verwirrend.
Eindeutig geht´s mit dem DDR-Register (DDR = Data Direction Register):

DDRX.Y = 0 bedeutet: Anschluss X.Y ist ein Eingang
DDRX.Y = 1 bedeutet: Anschluss X.Y ist ein Ausgang

Da bei Power-On-Reset alle DDDR-Register den Wert 0 enthalten, sind alle I/O-Anschlüsse zunächst mal Eingänge. Für diese Aufgabe muss man sie nicht konfigurieren, das sind sie ganz von alleine.

Soll ein Anschluss ein Ausgang werden, muss das entsprechende Bit im DDR-Register auf 1 gesetzt werden. Das kann entweder einzeln geschehen, also z.B.

DDRB.2 = 1
DDRB.3 = 1
DDRB.4 = 1
DDRB.5 = 1

oder Du setzt gleich alle 8 Bits des Registers:

DDRB = &B00111100 ("&B" heißt, dass die folgende Zahl binär ausgeschrieben wird)
Mit diesem Befehl sind die Anschlüsse B5,B4,B3 und B2 Ausgänge, der Rest sind Eingänge.

Und wenn Du den PullUp-Widerstand eines Eingangs aktivieren willst, musst Du eine 1 in das entsprechende PORT-Register schreiben. Also für Deine beiden Eingänge also z.B.

PORTB.0 = 1
PORTB.1 = 1

In anderen Worten:
1. Ob Ein- oder Ausgang, legt das DDR-Register fest.
2. Ist der Anschluss ein Ausgang, legt das PORT-Register seinen Pegel fest.
3. Ist er ein Eingang legt das PORT-Register fest, ob der PullUp-Widerstand aktiviert wird.

Jetzt etwas klarer?

Patrick Stern
22.09.2011, 01:00
Allgemein ist das Programm richtig geschrieben.
Wie Sauerbruch schon schreibt das aktivieren der internen Pullups (ist unten mal bei dein Programm eingebunden)
Allgemein versteh ich auch nicht warum du ein Attiny verwendest und den Reset aus programmierst.
Was für ein Programmiergerät verwendest du?
Überträgst du den Hexcode mit Basom oder mit ein anderes Programm.
Ich glaube eher das in der Richtung was nicht richtig eingestellt ist und dadurch keine (fehlerhafte) Übertragung erfolgt.

mfg

Rick


$regfile = "attiny85.dat"
$crystal = 1000000

Config Pinb.0 = Input
Portb.0 = 1
Config Pinb.1 = Input
Portb.1 = 1
Config Portb.2 = Output
Config Portb.3 = Output
Config Portb.4 = Output
Config Portb.5 = Output


Do

If Pinb.0 = 1 And Pinb.1 = 1 Then
Portb.2 = 1
Portb.4 = 0
Portb.3 = 1
Portb.5 = 0
Else
End If

If Pinb.0 = 0 And Pinb.1 = 0 Then
Portb.2 = 0
Portb.4 = 1
Portb.3 = 0
Portb.5 = 1
Else
End If

If Pinb.0 = 0 And Pinb.1 = 1 Then
Portb.2 = 1
Portb.4 = 0
Portb.3 = 0
Portb.5 = 1
Else
End If

If Pinb.0 = 1 And Pinb.1 = 0 Then
Portb.2 = 0
Portb.4 = 1
Portb.3 = 1
Portb.5 = 0
Else
End If

Loop

End

Searcher
22.09.2011, 11:01
EDIT: achja und reset pin hab ich jetzt nicht besonders drauf geachtet, heißt das ich kann diesen port gar nicht als solchen benutzen?
Ja, Du kannst ihn zunächst mal nicht als "normalen" I/O Portpin benutzen.

Es gibt folgende Beschreibung zum RESET Pin im Datenblatt:


RESET: External Reset input is active low and enabled by unprogramming (“1”) the RSTDISBL Fuse. Pullup is activated and output driver and digital input are deactivated when the pin is used as the RESET pin.

Wenn Du seit Kauf an den Fuses nichts verändert hast ist PB5 also RESET. Die output driver sind deaktiviert. Bedeutet,
PORTB.5 = 0 oder 1 hat zumindest nach außen keine Wirkung.

Nun kommt es auf die Deine Beschaltung des PB5 an. Sieht so aus, als wenn dort über die Motorbeschaltung ein GND auf RESET (PB5) kommen könnte und dann der µC resettet.

Wenn Du also nicht ganz genau weißt, was sich da tut, laß den PB5 frei bzw. verwende ihn nur als RESET

Schaltplan Deines Aufbaus würde weiterhelfen.

Gruß
Searcher

dnggn
24.09.2011, 11:14
ich hab mal einen schaltplan mit pc entworfen, ich bin mir jetzt ziemlich sicher dass es am reset pin liegt, denn die programmänderungen haben alle nichts bewirkt ... soll ich einfach noch einen zweiten attiny anschließen oder lieber einen größeren uC bestellen?

zum schaltplan, 1Y bis 4Y werden mit den beiden motoren verbunden.

Searcher
25.09.2011, 09:19
Hallo dnggn,

um bei Deiner Schaltung den Reset frei zu bekommen, brauchst Du mehr Pins an dem µC. zB ginge ein ATtiny44. Ein zweiter Tiny macht die Sache zu kompliziert, da die beiden ja miteinander kommunizieren müßten?

Leider kann ich Dir zu sonstigen Schaltung wenig sagen, da ich selbst die verwendeten Komponenten noch nicht genutzt habe.

Folgende Dinge, auf die mir aufgefallen sind:
- Reset ist klar. Den kannst Du so nicht als I/O benutzen.
- Die Batteriespannung ist mit 6V vor dem Spannungsregler sehr gering. Was ist das für einer? Möglicherweise gibt der Dir nicht genug Spannung am Ausgang. Vielleicht bricht Dir die Spannung ein, wenn die Motoren Strom bekommen? Wieviel Strom brauchen die Motoren?
- Kondensatoren am Spannungsregler und 100nF am µC sind nicht vorhanden.
- Die LEDs haben keine Vorwiderstände.

Gruß
Searcher